diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..615d5fcd --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "testbed/extern/nanogui"] + path = testbed/extern/nanogui + url = https://github.com/mitsuba-renderer/nanogui.git diff --git a/testbed/CMakeLists.txt b/testbed/CMakeLists.txt index 0ff2051f..cf3a5a8c 100755 --- a/testbed/CMakeLists.txt +++ b/testbed/CMakeLists.txt @@ -4,7 +4,29 @@ cmake_minimum_required(VERSION 3.8) # Project configuration project(Testbed) -add_subdirectory(nanogui/) +# Disable building extras of nanogui we won't need (pure C++ project) +set(NANOGUI_BUILD_EXAMPLES OFF CACHE BOOL " " FORCE) +set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL " " FORCE) +set(NANOGUI_INSTALL OFF CACHE BOOL " " FORCE) + +# ---- Make sure to recursively clone all the git submodules for external libraries (nanogui) --- # +find_package(Git QUIET) +if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") + # Update submodules as needed + option(CLONE_GIT_SUBMODULES "Check submodules during build" ON) + if(CLONE_GIT_SUBMODULES) + message(STATUS "Git Submodules update") + execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE GIT_SUBMOD_RESULT) + if(NOT GIT_SUBMOD_RESULT EQUAL "0") + message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMOD_RESULT}, please checkout submodules") + endif() + endif() +endif() + +# Add the configurations from nanogui +add_subdirectory(extern/nanogui) # Copy the shaders used for the demo into the build directory file(COPY "shaders/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/shaders/") @@ -12,9 +34,6 @@ file(COPY "shaders/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/shaders/") # Copy the meshes used for the demo into the build directory file(COPY "meshes/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/meshes/") -# Headers -include_directories("src/" "nanogui/include/" "opengl-framework/src/" "common/" "scenes/" ${NANOGUI_EXTRA_INCS}) - # OpenGLFramework source files set(OPENGLFRAMEWORK_SOURCES opengl-framework/src/maths/Color.h @@ -120,15 +139,29 @@ set(VS_USERFILE_WORKING_DIRECTORY_DEBUG ${EXECUTABLE_OUTPUT_PATH}) set(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE}) configure_file(VisualStudioUserTemplate.user ${USER_FILE} @ONLY) -# Compile definitions -add_definitions(${NANOGUI_EXTRA_DEFS}) - # Create the executable add_executable(testbed ${TESTBED_SOURCES} ${SCENES_SOURCES} ${COMMON_SOURCES} ${OPENGLFRAMEWORK_SOURCES}) -# Enable C++11 features -set_property(TARGET testbed PROPERTY CXX_STANDARD 11) -set_property(TARGET testbed PROPERTY CXX_STANDARD_REQUIRED ON) +# Headers +target_include_directories(testbed PRIVATE + $ + $ + $ + $ + $ +) +foreach(p ${NANOGUI_EXTRA_INCS}) + target_include_directories(testbed PRIVATE $<1:${p}>) +endforeach() + + +# Compile definitions +target_compile_definitions(testbed PRIVATE ${NANOGUI_EXTRA_DEFS}) + +# C++17 compiler features +target_compile_features(testbed PUBLIC cxx_std_17) +set_target_properties(testbed PROPERTIES CXX_EXTENSIONS OFF) # Link with libraries target_link_libraries(testbed reactphysics3d nanogui ${NANOGUI_EXTRA_LIBS}) + diff --git a/testbed/extern/nanogui b/testbed/extern/nanogui new file mode 160000 index 00000000..21e5cbc8 --- /dev/null +++ b/testbed/extern/nanogui @@ -0,0 +1 @@ +Subproject commit 21e5cbc880b2e26b28b2a35085a9e6706da1e2a8 diff --git a/testbed/nanogui/CMakeLists.txt b/testbed/nanogui/CMakeLists.txt deleted file mode 100755 index f175d863..00000000 --- a/testbed/nanogui/CMakeLists.txt +++ /dev/null @@ -1,575 +0,0 @@ -cmake_minimum_required (VERSION 2.8.12) - -if (POLICY CMP0048) - # cmake warns if loaded from a min-3.0-required parent dir, so silence the warning: - cmake_policy(SET CMP0048 NEW) -endif() - -project("NanoGUI") - -if (POLICY CMP0058) - cmake_policy(SET CMP0058 NEW) -endif() - -if (NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/src") - message(FATAL_ERROR "The NanoGUI dependency repositories (GLFW, etc.) are missing! " - "You probably did not clone the project with --recursive. It is possible to recover " - "by calling \"git submodule update --init --recursive\"") -endif() - -if (WIN32) - set(NANOGUI_USE_GLAD_DEFAULT ON) -else() - set(NANOGUI_USE_GLAD_DEFAULT OFF) -endif() - -option(NANOGUI_BUILD_EXAMPLE "Build NanoGUI example application?" OFF) -option(NANOGUI_BUILD_SHARED "Build NanoGUI as a shared library?" ON) -option(NANOGUI_BUILD_PYTHON "Build a Python plugin for NanoGUI?" OFF) -option(NANOGUI_USE_GLAD "Use Glad OpenGL loader library?" ${NANOGUI_USE_GLAD_DEFAULT}) -option(NANOGUI_INSTALL "Install NanoGUI on `make install`?" ON) - -set(NANOGUI_PYTHON_VERSION "" CACHE STRING "Python version to use for compiling the Python plugin") - -# Required libraries, flags, and include files for compiling and linking against nanogui (all targets) -set(NANOGUI_EXTRA_LIBS "") -set(NANOGUI_EXTRA_DEFS "") -set(NANOGUI_EXTRA_INCS "") - -# Platform-dependent files for libnanogui -set(LIBNANOGUI_EXTRA_SOURCE "") -set(LIBNANOGUI_PYTHON_EXTRA_SOURCE "") - -if(APPLE AND NANOGUI_BUILD_SHARED) - set(CMAKE_MACOSX_RPATH ON) -endif() - -include(CheckCXXCompilerFlag) -include(CheckCXXSourceRuns) - -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - message(STATUS "Setting build type to 'Release' as none was specified.") - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" - "MinSizeRel" "RelWithDebInfo") -endif() -string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE) - -macro(CHECK_CXX_COMPILER_AND_LINKER_FLAGS _RESULT _CXX_FLAGS _LINKER_FLAGS) - set(CMAKE_REQUIRED_FLAGS ${_CXX_FLAGS}) - set(CMAKE_REQUIRED_LIBRARIES ${_LINKER_FLAGS}) - set(CMAKE_REQUIRED_QUIET TRUE) - check_cxx_source_runs("int main(int argc, char **argv) { return 0; }" ${_RESULT}) - set(CMAKE_REQUIRED_FLAGS "") - set(CMAKE_REQUIRED_LIBRARIES "") -endmacro() - -# Compile GLFW -set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL " " FORCE) -set(GLFW_BUILD_TESTS OFF CACHE BOOL " " FORCE) -set(GLFW_BUILD_DOCS OFF CACHE BOOL " " FORCE) -set(GLFW_BUILD_INSTALL OFF CACHE BOOL " " FORCE) -set(GLFW_INSTALL OFF CACHE BOOL " " FORCE) -set(GLFW_USE_CHDIR OFF CACHE BOOL " " FORCE) -set(BUILD_SHARED_LIBS ${NANOGUI_BUILD_SHARED} CACHE BOOL " " FORCE) - -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # Quench annoying deprecation warnings when compiling GLFW on OSX - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") -endif() - -add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw" "ext_build/glfw") -# Two targets have now been defined: `glfw_objects`, which will be merged into -# NanoGUI at the end, and `glfw`. The `glfw` target is the library itself -# (e.g., libglfw.so), but can be skipped as we do not need to link against it -# (because we merge `glfw_objects` into NanoGUI). Skipping is required for -# XCode, but preferable for all build systems (reduces build artifacts). -set_target_properties(glfw PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) - -# Python support: add NANOGUI_PYTHON flag to all targets -if (NANOGUI_BUILD_PYTHON) - list(APPEND NANOGUI_EXTRA_DEFS -DNANOGUI_PYTHON) -endif() - -# Shared library mode: add dllimport/dllexport flags to all symbols -if (NANOGUI_BUILD_SHARED) - list(APPEND NANOGUI_EXTRA_DEFS -DNANOGUI_SHARED -DNVG_SHARED -DGLAD_GLAPI_EXPORT) -endif() - -if (MSVC) - # Disable annoying MSVC warnings (all targets) - add_definitions(/D "_CRT_SECURE_NO_WARNINGS") - - # Parallel build on MSVC (all targets) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") - - if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") - - # Disable Eigen vectorization for Windows 32 bit builds (issues with unaligned access segfaults) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DNANOGUI_EIGEN_DONT_ALIGN") - endif() -endif() - -# Compile with compiler warnings turned on -if(MSVC) - if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") - endif() -elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") -endif() - -if (CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|Intel)$") - CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG) - CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG) - - if (HAS_CPP14_FLAG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") - elseif (HAS_CPP11_FLAG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") - else() - message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!") - endif() -endif() - -# Various optimizations for shared library release builds -if (NANOGUI_BUILD_SHARED) - if (U_CMAKE_BUILD_TYPE MATCHES REL AND CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$") - # Set the default symbol visibility to hidden - if (NOT CMAKE_CXX_FLAGS MATCHES "-fvisibility") - set(CMAKE_CXX_FLAGS "-fvisibility=hidden ${CMAKE_CXX_FLAGS}") - endif() - - # Enable link time optimization - if (NOT CMAKE_CXX_FLAGS MATCHES "-flto") - if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(LTO_CXX_FLAGS "-flto=thin") - set(LTO_LINKER_FLAGS "-flto=thin") - if (NOT APPLE AND U_CMAKE_BUILD_TYPE MATCHES MINSIZEREL) - # Clang Gold plugin does not support -Os - set(LTO_CXX_FLAGS "${LTO_CXX_FLAGS} -O3") - endif() - else() - set(LTO_CXX_FLAGS "-flto -fno-fat-lto-objects") - set(LTO_LINKER_FLAGS "-flto") - endif() - - CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LTO ${LTO_CXX_FLAGS} ${LTO_LINKER_FLAGS}) - - if (HAS_LTO) - message(STATUS "NanoGUI: LTO support enabled.") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LTO_LINKER_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LTO_LINKER_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LTO_CXX_FLAGS}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LTO_CXX_FLAGS}") - else() - message(STATUS "NanoGUI: LTO not supported by the compiler.") - endif() - endif() - elseif(MSVC) - set(Configurations RELEASE RELWITHDEBINFO MINSIZEREL) - set(LinkTypes EXE SHARED MODULE STATIC) - foreach(Configuration ${Configurations}) - set("CMAKE_CXX_FLAGS_${Configuration}" "${CMAKE_CXX_FLAGS_${Configuration}} /GL") - foreach(LinkType ${LinkTypes}) - set("CMAKE_${LinkType}_LINKER_FLAGS_${Configuration}" "${CMAKE_${LinkType}_LINKER_FLAGS_${Configuration}} /LTCG") - endforeach() - endforeach() - message(STATUS "NanoGUI: LTO support enabled.") - endif() -endif() - -# Always use libc++ on Clang -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LIBCPP "-stdlib=libc++" "-stdlib=libc++") - if (HAS_LIBCPP) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++") - CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LIBCPPABI "-stdlib=libc++" "-stdlib=libc++ -lc++abi") - if(HAS_LIBCPPABI) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++abi") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lc++abi") - message(STATUS "NanoGUI: using libc++ and libc++abi.") - else() - message(STATUS "NanoGUI: using libc++.") - endif() - else() - message(STATUS "NanoGUI: NOT using libc++.") - endif() -endif() - -if (NANOGUI_USE_GLAD) - # Build and include GLAD on Windows - list(APPEND LIBNANOGUI_EXTRA_SOURCE - "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/src/glad.c" - "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/include/glad/glad.h" - "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/include/KHR/khrplatform.h") - if (MSVC) - set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/src/glad.c" - PROPERTIES COMPILE_FLAGS "/wd4055 ") - endif() - include_directories(ext/glad/include) - list(APPEND NANOGUI_EXTRA_DEFS -DNANOGUI_GLAD) - list(APPEND NANOGUI_EXTRA_INCS "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/include") -endif() - -list(APPEND NANOGUI_EXTRA_INCS - "${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/include" - "${CMAKE_CURRENT_SOURCE_DIR}/ext/nanovg/src" -) - -if (NOT NANOGUI_EIGEN_INCLUDE_DIR) - set(NANOGUI_EIGEN_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ext/eigen") - list(APPEND NANOGUI_EXTRA_INCS "${NANOGUI_EIGEN_INCLUDE_DIR}") -endif() - -if (${CMAKE_SYSTEM_NAME} MATCHES "BSD") - include_directories(/usr/local/include) - link_directories(/usr/local/lib) - if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") - include_directories(/usr/X11R6/include/) - link_directories(/usr/X11R6/lib) - endif() -endif() - -# Required core libraries on various platforms -if (WIN32) - list(APPEND NANOGUI_EXTRA_LIBS opengl32) -elseif (APPLE) - find_library(cocoa_library Cocoa) - find_library(opengl_library OpenGL) - find_library(corevideo_library CoreVideo) - find_library(iokit_library IOKit) - list(APPEND NANOGUI_EXTRA_LIBS ${cocoa_library} ${opengl_library} ${corevideo_library} ${iokit_library}) - list(APPEND LIBNANOGUI_EXTRA_SOURCE src/darwin.mm) -elseif(CMAKE_SYSTEM MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "BSD") - list(APPEND NANOGUI_EXTRA_LIBS GL Xxf86vm Xrandr Xinerama Xcursor Xi X11 pthread ) - if (NOT CMAKE_SYSTEM_NAME MATCHES "OpenBSD") - list(APPEND NANOGUI_EXTRA_LIBS rt) - endif() - if(CMAKE_SYSTEM MATCHES "Linux") - list(APPEND NANOGUI_EXTRA_LIBS dl) - endif() -endif() - -include_directories(${NANOGUI_EIGEN_INCLUDE_DIR} ext/glfw/include ext/nanovg/src include ${CMAKE_CURRENT_BINARY_DIR}) - - -# Run simple cmake converter to put font files into the data segment - -# Glob up resource files -file(GLOB resources "${CMAKE_CURRENT_SOURCE_DIR}/resources/*.ttf") - -# Concatenate resource files into a comma separated string -string (REGEX REPLACE "([^\\]|^);" "\\1," resources_string "${resources}") -string (REGEX REPLACE "[\\](.)" "\\1" resources_string "${resources_string}") - -# Create command line for running bin2c cmake script -set(bin2c_cmdline - -DOUTPUT_C=nanogui_resources.cpp - -DOUTPUT_H=nanogui_resources.h - "-DINPUT_FILES=${resources_string}" - -P "${CMAKE_CURRENT_SOURCE_DIR}/resources/bin2c.cmake") - -# Run bin2c on resource files -add_custom_command( - OUTPUT nanogui_resources.cpp nanogui_resources.h - COMMAND ${CMAKE_COMMAND} ARGS ${bin2c_cmdline} - DEPENDS ${resources} - COMMENT "Running bin2c" - PRE_BUILD VERBATIM) - -# Needed to generated files -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -# Set library type -if (NANOGUI_BUILD_SHARED) - set(NANOGUI_LIBRARY_TYPE "SHARED") -else() - set(NANOGUI_LIBRARY_TYPE "STATIC") -endif() - -if (APPLE OR CMAKE_SYSTEM MATCHES "Linux") - # Include coroutine support for running the mainloop in detached mode - add_definitions(-DCORO_SJLJ) - include_directories(ext/coro) - list(APPEND LIBNANOGUI_PYTHON_EXTRA_SOURCE ext/coro/coro.c) -endif() - -if (APPLE) - # Use automatic reference counting for Objective-C portions - add_compile_options(-fobjc-arc) -endif() - -add_definitions(${NANOGUI_EXTRA_DEFS}) - -# Compile main NanoGUI library -add_library(nanogui-obj OBJECT - # Merge NanoVG into the NanoGUI library - ext/nanovg/src/nanovg.c - # Merge GLAD into the NanoGUI library (only if needed) - ${LIBNANOGUI_EXTRA_SOURCE} - # Fonts etc. - nanogui_resources.cpp - include/nanogui/glutil.h src/glutil.cpp - include/nanogui/common.h src/common.cpp - include/nanogui/widget.h src/widget.cpp - include/nanogui/theme.h src/theme.cpp - include/nanogui/layout.h src/layout.cpp - include/nanogui/screen.h src/screen.cpp - include/nanogui/label.h src/label.cpp - include/nanogui/window.h src/window.cpp - include/nanogui/popup.h src/popup.cpp - include/nanogui/checkbox.h src/checkbox.cpp - include/nanogui/button.h src/button.cpp - include/nanogui/popupbutton.h src/popupbutton.cpp - include/nanogui/combobox.h src/combobox.cpp - include/nanogui/progressbar.h src/progressbar.cpp - include/nanogui/slider.h src/slider.cpp - include/nanogui/messagedialog.h src/messagedialog.cpp - include/nanogui/textbox.h src/textbox.cpp - include/nanogui/imagepanel.h src/imagepanel.cpp - include/nanogui/imageview.h src/imageview.cpp - include/nanogui/vscrollpanel.h src/vscrollpanel.cpp - include/nanogui/colorwheel.h src/colorwheel.cpp - include/nanogui/colorpicker.h src/colorpicker.cpp - include/nanogui/graph.h src/graph.cpp - include/nanogui/stackedwidget.h src/stackedwidget.cpp - include/nanogui/tabheader.h src/tabheader.cpp - include/nanogui/tabwidget.h src/tabwidget.cpp - include/nanogui/glcanvas.h src/glcanvas.cpp - include/nanogui/formhelper.h - include/nanogui/toolbutton.h - include/nanogui/opengl.h - include/nanogui/nanogui.h - include/nanogui/serializer/core.h - include/nanogui/serializer/opengl.h - include/nanogui/serializer/sparse.h - src/serializer.cpp -) - -# XCode has a serious bug where the XCode project produces an invalid target -# that will not get linked if it consists only of objects from object libraries, -# it will not generate any products (executables, libraries). The only work -# around is to add a dummy source file to the library definition. This is an -# XCode, not a CMake bug. See: https://itk.org/Bug/view.php?id=14044 -if (CMAKE_GENERATOR STREQUAL Xcode) - set(XCODE_DUMMY ${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.cpp) - file(WRITE ${XCODE_DUMMY} "") - add_library(nanogui ${NANOGUI_LIBRARY_TYPE} - ${XCODE_DUMMY} - $ - $ - ) -else() - add_library(nanogui ${NANOGUI_LIBRARY_TYPE} - $ - $ - ) -endif() - -if (NANOGUI_BUILD_SHARED) - set_property(TARGET nanogui-obj PROPERTY POSITION_INDEPENDENT_CODE ON) -endif() - -# Compile/link flags for NanoGUI -set_property(TARGET nanogui-obj APPEND PROPERTY COMPILE_DEFINITIONS "NANOGUI_BUILD;NVG_BUILD") - -if (NANOGUI_USE_GLAD AND NANOGUI_BUILD_SHARED) - set_property(TARGET nanogui-obj APPEND PROPERTY COMPILE_DEFINITIONS - "GLAD_GLAPI_EXPORT;GLAD_GLAPI_EXPORT_BUILD") -endif() - -if (NANOGUI_BUILD_SHARED) - target_link_libraries(nanogui ${NANOGUI_EXTRA_LIBS}) -endif() - -if (NANOGUI_INSTALL) - install(TARGETS nanogui - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - - install(DIRECTORY include/nanogui DESTINATION include - FILES_MATCHING PATTERN "*.h") -endif() - -if (NANOGUI_BUILD_SHARED) - # When GLFW is merged into the NanoGUI library, this flag must be specified - set_property(TARGET nanogui-obj APPEND PROPERTY COMPILE_DEFINITIONS "_GLFW_BUILD_DLL;NVG_SHARED") -endif() - -if (NANOGUI_BUILD_SHARED AND NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEB) - # Platform-specific strip flags for reducing the library size. - if (APPLE) - # Strip .dylib library on OSX - add_custom_command(TARGET nanogui POST_BUILD COMMAND strip -u -r "$/$") - elseif(UNIX) - # Strip .so library on Linux - add_custom_command(TARGET nanogui POST_BUILD COMMAND strip "$/$") - endif() -endif() - -# Quench warnings while compiling NanoVG -if (CMAKE_COMPILER_IS_GNUCC) - set_source_files_properties(ext/nanovg/src/nanovg.c PROPERTIES COMPILE_FLAGS -Wno-unused-result) -elseif(MSVC) - set_source_files_properties(ext/nanovg/src/nanovg.c PROPERTIES COMPILE_FLAGS "/wd4005 /wd4456 /wd4457") -endif() - -# Build example application if desired -if(NANOGUI_BUILD_EXAMPLE) - add_executable(example1 src/example1.cpp) - add_executable(example2 src/example2.cpp) - add_executable(example3 src/example3.cpp) - add_executable(example4 src/example4.cpp) - add_executable(example_icons src/example_icons.cpp) - target_link_libraries(example1 nanogui ${NANOGUI_EXTRA_LIBS}) - target_link_libraries(example2 nanogui ${NANOGUI_EXTRA_LIBS}) - target_link_libraries(example3 nanogui ${NANOGUI_EXTRA_LIBS}) - target_link_libraries(example4 nanogui ${NANOGUI_EXTRA_LIBS}) - target_link_libraries(example_icons nanogui ${NANOGUI_EXTRA_LIBS}) - - # Copy icons for example application - file(COPY resources/icons DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endif() - -if (NANOGUI_BUILD_PYTHON) - # Detect Python - - # Try to autodetect Python (can be overridden manually if needed) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/ext/pybind11/tools") - set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4) - find_package(PythonLibsNew ${NANOGUI_PYTHON_VERSION}) - if (NOT PYTHONLIBS_FOUND) - # Python not found -- disable the plugin - set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL "Build a Python plugin for NanoGUI?" FORCE) - message(WARNING "NanoGUI: not building the Python plugin!") - else() - message(STATUS "NanoGUI: building the Python plugin.") - endif() -endif() - -if (NANOGUI_BUILD_PYTHON) - # Need PIC code in libnanogui even when compiled as a static library - set_target_properties(nanogui-obj PROPERTIES POSITION_INDEPENDENT_CODE ON) - set_target_properties(glfw_objects PROPERTIES POSITION_INDEPENDENT_CODE ON) - - include_directories("ext/pybind11/include" ${PYTHON_INCLUDE_DIR}) - add_library(nanogui-python-obj OBJECT - python/main.cpp - python/constants_glfw.cpp - python/constants_entypo.cpp - python/eigen.cpp - python/widget.cpp - python/layout.cpp - python/basics.cpp - python/button.cpp - python/tabs.cpp - python/textbox.cpp - python/glcanvas.cpp - python/formhelper.cpp - python/misc.cpp - python/glutil.cpp - python/nanovg.cpp - python/python.h python/py_doc.h - ${LIBNANOGUI_PYTHON_EXTRA_SOURCE}) - - add_library(nanogui-python SHARED $) - set_property(TARGET nanogui-python-obj PROPERTY POSITION_INDEPENDENT_CODE ON) - set_target_properties(nanogui-python PROPERTIES OUTPUT_NAME "nanogui") - target_link_libraries(nanogui-python nanogui ${NANOGUI_EXTRA_LIBS}) - - # Quench warnings on GCC - if (CMAKE_COMPILER_IS_GNUCC) - set_property(TARGET nanogui-python-obj APPEND PROPERTY COMPILE_OPTIONS "-Wno-unused-variable") - endif() - - set_target_properties(nanogui-python PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/python) - # The prefix and extension are provided by FindPythonLibsNew.cmake - set_target_properties(nanogui-python PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}") - set_target_properties(nanogui-python PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}") - - if (WIN32) - # Set output path - set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELEASE "Release/python") - set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_DEBUG "Debug/python") - set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "MinSizeRel/python") - set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "RelWithDebInfo/python") - set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "Release/python") - set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "Debug/python") - set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "MinSizeRel/python") - set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "RelWithDebInfo/python") - - # Link against the Python shared library - target_link_libraries(nanogui-python ${PYTHON_LIBRARY}) - - if (MSVC) - # Optimize for size, /bigobj is needed for due to the heavy template metaprogramming in pybind11 - set_property(TARGET nanogui-python-obj APPEND PROPERTY COMPILE_OPTIONS - "/bigobj" "$<$:/Os>" "$<$:/Os>" - "$<$:/Os>") - endif() - elseif(UNIX) - # Optimize for size - if (U_CMAKE_BUILD_TYPE MATCHES REL) - set_property(TARGET nanogui-python-obj APPEND PROPERTY COMPILE_OPTIONS "-Os") - endif() - - # Strip unnecessary sections of the binary on Linux/Mac OS - if(APPLE) - set_target_properties(nanogui-python PROPERTIES MACOSX_RPATH ".") - set_target_properties(nanogui-python PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ") - - if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEB) - add_custom_command(TARGET nanogui-python POST_BUILD COMMAND strip -u -r $) - endif() - else() - if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEB) - add_custom_command(TARGET nanogui-python POST_BUILD COMMAND strip $) - endif() - endif() - endif() - - if (NANOGUI_INSTALL) - install(TARGETS nanogui-python - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - endif() -endif() - -get_directory_property(NANOGUI_HAS_PARENT PARENT_DIRECTORY) -if(NANOGUI_HAS_PARENT) - # This project is included from somewhere else. Export NANOGUI_EXTRA_LIBS variable - set(NANOGUI_EXTRA_LIBS ${NANOGUI_EXTRA_LIBS} PARENT_SCOPE) - set(NANOGUI_EXTRA_DEFS ${NANOGUI_EXTRA_DEFS} PARENT_SCOPE) - set(NANOGUI_EXTRA_INCS ${NANOGUI_EXTRA_INCS} PARENT_SCOPE) -else() - # Create documentation for python plugin (optional target for developers) - - string(REPLACE " " ";" MKDOC_CXX_FLAGS_LIST ${CMAKE_CXX_FLAGS}) - get_property(MKDOC_INCLUDE_DIRECTORIES DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) - get_property(MKDOC_COMPILE_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS) - - foreach (value ${MKDOC_INCLUDE_DIRECTORIES}) - list(APPEND MKDOC_CXX_FLAGS_LIST -I${value}) - endforeach() - - # Make sure platform specific code gets kept in py_doc.h (specifically __doc_nanogui_chdir_to_bundle_parent) - list(APPEND MKDOC_COMPILE_DEFINITIONS "DOXYGEN_DOCUMENTATION_BUILD") - foreach (value ${MKDOC_COMPILE_DEFINITIONS}) - list(APPEND MKDOC_CXX_FLAGS_LIST -D${value}) - endforeach() - - add_custom_target(mkdoc COMMAND - python3 ${PROJECT_SOURCE_DIR}/docs/mkdoc_rst.py - ${MKDOC_CXX_FLAGS_LIST} - ${PROJECT_SOURCE_DIR}/include/nanogui/*.h - > ${CMAKE_CURRENT_SOURCE_DIR}/python/py_doc.h) - -endif() - -# vim: set et ts=2 sw=2 ft=cmake nospell: diff --git a/testbed/nanogui/CONTRIBUTING.rst b/testbed/nanogui/CONTRIBUTING.rst deleted file mode 100644 index e660202c..00000000 --- a/testbed/nanogui/CONTRIBUTING.rst +++ /dev/null @@ -1,48 +0,0 @@ -Contributing -======================================================================================== - -Thank you for your interest in this project! Please refer to the following sections on -how to contribute code and bug reports. - -Reporting bugs ----------------------------------------------------------------------------------------- - -At the moment, this project is run in the spare time of a single person -(`Wenzel Jakob `_) with very limited resources for -issue tracker tickets. Thus, before submitting a question or bug report, please take a -moment of your time and ensure that your issue isn't already discussed in the project -documentation elsewhere on this site. - -Feature requests are generally closed unless they come with a pull request -that implements the desired functionality. - -Assuming that you have identified a previously unknown problem or an important question, -it's essential that you submit a self-contained and minimal piece of code that -reproduces the problem. In other words: no external dependencies, isolate the -function(s) that cause breakage, submit matched and complete C++ or Python snippets -(depending on how you are using NanoGUI) that can be easily compiled and run on my end. - -Pull requests ----------------------------------------------------------------------------------------- -Contributions are submitted, reviewed, and accepted using Github pull requests. Please -refer to `this article `_ for -details and adhere to the following rules to make the process as smooth as possible: - -- Make a new branch for every feature you're working on. -- Make small and clean pull requests that are easy to review but make sure they do add - value by themselves. -- Make sure you have tested any new functionality (e.g. if you made a new Widget). -- This project has a strong focus on providing general solutions using a minimal amount - of code, thus small pull requests are greatly preferred. -- Read the remainder of this document, adhering to the bindings and documentation - requirements. -- If making a purely documentation PR, please prefix the commit with ``[docs]`` - - - E.g. ``[docs] Adding documentation for class X.`` - - -Specific activities for contributions ----------------------------------------------------------------------------------------- - -For a list of specific parts of nanogui which would benefit from outside contributions, -refer to the bottom part of `this page `_. diff --git a/testbed/nanogui/LICENSE.txt b/testbed/nanogui/LICENSE.txt deleted file mode 100644 index 6a13fac9..00000000 --- a/testbed/nanogui/LICENSE.txt +++ /dev/null @@ -1,36 +0,0 @@ -Copyright (c) 2017 Wenzel Jakob , All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You are under no obligation whatsoever to provide any bug fixes, patches, or -upgrades to the features, functionality or performance of the source code -("Enhancements") to anyone; however, if you choose to make your Enhancements -available either publicly, or directly to the author of this software, without -imposing a separate written license agreement for such Enhancements, then you -hereby grant the following license: a non-exclusive, royalty-free perpetual -license to install, use, modify, prepare derivative works, incorporate into -other computer software, distribute, and sublicense such enhancements or -derivative works thereof, in binary and source code form. diff --git a/testbed/nanogui/README.md b/testbed/nanogui/README.md deleted file mode 100644 index 63f00938..00000000 --- a/testbed/nanogui/README.md +++ /dev/null @@ -1,142 +0,0 @@ -# NanoGUI - -[![Build Status](https://travis-ci.org/wjakob/nanogui.svg?branch=master)](https://travis-ci.org/wjakob/nanogui) -[![Build status](https://ci.appveyor.com/api/projects/status/m8h3uyvdb4ej2i02/branch/master?svg=true)](https://ci.appveyor.com/project/wjakob/nanogui/branch/master) - -NanoGUI is a a minimalistic cross-platform widget library for OpenGL 3.x. -It supports automatic layout generation, stateful C++11 lambdas callbacks, -a variety of useful widget types and Retina-capable rendering on Apple devices -thanks to [NanoVG](https://github.com/memononen/NanoVG) by Mikko Mononen. -Python bindings of all functionality are provided using -[pybind11](https://github.com/wjakob/pybind11). - -## Example screenshot -![Screenshot](https://github.com/wjakob/nanogui/raw/master/resources/screenshot.png "Screenshot") - -## Description -NanoGUI builds on [GLFW](http://www.glfw.org/) for cross-platform OpenGL context -creation and event handling, [GLEW](http://glew.sourceforge.net/) to use OpenGL -3.x Windows, [Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page) for -basic vector types, and [NanoVG](https://github.com/memononen/NanoVG) to draw -2D primitives. - -Note that the depencency library NanoVG already includes some basic example -code to draw good-looking static widgets; what NanoGUI does is to flesh it -out into a complete GUI toolkit with event handling, layout generation, etc. - -NanoGUI currently works on Mac OS X (Clang) Linux (GCC or Clang) and Windows -(Visual Studio ≥ 2015); it requires a recent C++11 capable compiler. All -dependencies are jointly built using a CMake-based build system. - -## Creating widgets -NanoGUI makes it easy to instantiate widgets, set layout constraints, and -register event callbacks using high-level C++11 code. For instance, the -following two lines from the included example application add a new button to -an existing window `window` and register an event callback. -```C++ -Button *b = new Button(window, "Plain button"); -b->setCallback([] { cout << "pushed!" << endl; }); -``` - -The following lines from the example application create the coupled -slider and text box on the bottom of the second window (see the screenshot). -```C++ -/* Create an empty panel with a horizontal layout */ -Widget *panel = new Widget(window); -panel->setLayout(new BoxLayout(BoxLayout::Horizontal, BoxLayout::Middle, 0, 20)); - -/* Add a slider and set defaults */ -Slider *slider = new Slider(panel); -slider->setValue(0.5f); -slider->setFixedWidth(80); - -/* Add a textbox and set defaults */ -TextBox *textBox = new TextBox(panel); -textBox->setFixedSize(Vector2i(60, 25)); -textBox->setValue("50"); -textBox->setUnits("%"); - -/* Propagate slider changes to the text box */ -slider->setCallback([textBox](float value) { - textBox->setValue(std::to_string((int) (value * 100))); -}); -``` - -The Python version of this same piece of code looks like this: -```Python -# Create an empty panel with a horizontal layout -panel = Widget(window) -panel.setLayout(BoxLayout(BoxLayout.Horizontal, BoxLayout.Middle, 0, 20)) - -# Add a slider and set defaults -slider = Slider(panel) -slider.setValue(0.5f) -slider.setFixedWidth(80) - -# Add a textbox and set defaults -textBox = TextBox(panel) -textBox.setFixedSize(Vector2i(60, 25)) -textBox.setValue("50") -textBox.setUnits("%") - -# Propagate slider changes to the text box -def cb(value): - textBox.setValue("%i" % int(value * 100)) -slider.setCallback(cb) -``` - -## "Simple mode" - -Christian Schüller contributed a convenience class that makes it possible to -create AntTweakBar-style variable manipulators using just a few lines of code. -For instance, the source code below was used to create the following example -application. - -![Screenshot](https://github.com/wjakob/nanogui/raw/master/resources/screenshot2.png "Screenshot") - - -```C++ -/// dvar, bar, strvar, etc. are double/bool/string/.. variables - -FormHelper *gui = new FormHelper(screen); -ref window = gui->addWindow(Eigen::Vector2i(10, 10), "Form helper example"); -gui->addGroup("Basic types"); -gui->addVariable("bool", bvar); -gui->addVariable("string", strvar); - -gui->addGroup("Validating fields"); -gui->addVariable("int", ivar); -gui->addVariable("float", fvar); -gui->addVariable("double", dvar); - -gui->addGroup("Complex types"); -gui->addVariable("Enumeration", enumval, enabled) - ->setItems({"Item 1", "Item 2", "Item 3"}); -gui->addVariable("Color", colval); - -gui->addGroup("Other widgets"); -gui->addButton("A button", [](){ std::cout << "Button pressed." << std::endl; }); - -screen->setVisible(true); -screen->performLayout(); -window->center(); -``` - -## Compiling -Clone the repository and all dependencies (with `git clone --recursive`), -run CMake to generate Makefiles or CMake/Visual Studio project files, and -the rest should just work automatically. - -On Debian/Ubuntu, make sure that you have installed the following packages -```bash -$ apt-get install cmake xorg-dev libglu1-mesa-dev -``` -To also get the Python bindings, you'll need to run -```bash -$ apt-get install python-dev -``` -### License - -nanogui is provided under a BSD-style license that can be found in the -``LICENSE.txt`` file. By using, distributing, or contributing to this project, -you agree to the terms and conditions of this license. diff --git a/testbed/nanogui/README.rst b/testbed/nanogui/README.rst deleted file mode 100644 index 791dd021..00000000 --- a/testbed/nanogui/README.rst +++ /dev/null @@ -1,217 +0,0 @@ -NanoGUI -======================================================================================== -|docs| |travis| |appveyor| - -.. |docs| image:: https://readthedocs.org/projects/nanogui/badge/?version=latest - :target: http://nanogui.readthedocs.org/en/latest/?badge=latest - :alt: Docs - -.. |travis| image:: https://travis-ci.org/wjakob/nanogui.svg?branch=master - :target: https://travis-ci.org/wjakob/nanogui - :alt: Travis Build Status - -.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/m8h3uyvdb4ej2i02/branch/master?svg=true - :target: https://ci.appveyor.com/project/wjakob/nanogui/branch/master - :alt: Appveyor Build Status - -.. begin_brief_description - -NanoGUI is a minimalistic cross-platform widget library for OpenGL 3.x or higher. It -supports automatic layout generation, stateful C++11 lambdas callbacks, a variety of -useful widget types and Retina-capable rendering on Apple devices thanks to NanoVG_ by -Mikko Mononen. Python bindings of all functionality are provided using pybind11_. - -.. _NanoVG: https://github.com/memononen/NanoVG -.. _pybind11: https://github.com/wjakob/pybind11 - -.. end_brief_description - -- `Documentation `_ - -.. contents:: Contents - :local: - :backlinks: none - -Example screenshot ----------------------------------------------------------------------------------------- - -.. image:: https://github.com/wjakob/nanogui/raw/master/resources/screenshot.png - :alt: Screenshot of Example 1. - :align: center - -Description ----------------------------------------------------------------------------------------- - -.. begin_long_description - -NanoGUI builds on GLFW_ for cross-platform OpenGL context creation and event handling, -GLAD_ to use OpenGL 3.x or higher Windows, Eigen_ for basic vector types, and NanoVG_ to -draw 2D primitives. - -Note that the dependency library NanoVG already includes some basic example code to draw -good-looking static widgets; what NanoGUI does is to flesh it out into a complete GUI -toolkit with event handling, layout generation, etc. - -NanoGUI currently works on Mac OS X (Clang) Linux (GCC or Clang) and Windows (Visual -Studio ≥ 2015); it requires a recent C++11 capable compiler. All dependencies are -jointly built using a CMake-based build system. - -.. _GLFW: http://www.glfw.org/ -.. _GLAD: https://github.com/Dav1dde/glad -.. _Eigen: http://eigen.tuxfamily.org/index.php?title=Main_Page - -.. end_long_description - -Creating widgets ----------------------------------------------------------------------------------------- - -NanoGUI makes it easy to instantiate widgets, set layout constraints, and -register event callbacks using high-level C++11 code. For instance, the -following two lines from the included example application add a new button to -an existing window `window` and register an event callback. - -.. code-block:: cpp - - Button *b = new Button(window, "Plain button"); - b->setCallback([] { cout << "pushed!" << endl; }); - - -The following lines from the example application create the coupled -slider and text box on the bottom of the second window (see the screenshot). - -.. code-block:: cpp - - /* Create an empty panel with a horizontal layout */ - Widget *panel = new Widget(window); - panel->setLayout(new BoxLayout(BoxLayout::Horizontal, BoxLayout::Middle, 0, 20)); - - /* Add a slider and set defaults */ - Slider *slider = new Slider(panel); - slider->setValue(0.5f); - slider->setFixedWidth(80); - - /* Add a textbox and set defaults */ - TextBox *textBox = new TextBox(panel); - textBox->setFixedSize(Vector2i(60, 25)); - textBox->setValue("50"); - textBox->setUnits("%"); - - /* Propagate slider changes to the text box */ - slider->setCallback([textBox](float value) { - textBox->setValue(std::to_string((int) (value * 100))); - }); - - -The Python version of this same piece of code looks like this: - -.. code-block:: py - - # Create an empty panel with a horizontal layout - panel = Widget(window) - panel.setLayout(BoxLayout(BoxLayout.Horizontal, BoxLayout.Middle, 0, 20)) - - # Add a slider and set defaults - slider = Slider(panel) - slider.setValue(0.5f) - slider.setFixedWidth(80) - - # Add a textbox and set defaults - textBox = TextBox(panel) - textBox.setFixedSize(Vector2i(60, 25)) - textBox.setValue("50") - textBox.setUnits("%") - - # Propagate slider changes to the text box - def cb(value): - textBox.setValue("%i" % int(value * 100)) - slider.setCallback(cb) - -"Simple mode" ----------------------------------------------------------------------------------------- - -Christian Schüller contributed a convenience class that makes it possible to -create AntTweakBar-style variable manipulators using just a few lines of code. -For instance, the source code below was used to create the following example -application. - -.. image:: https://github.com/wjakob/nanogui/raw/master/resources/screenshot2.png - :alt: Screenshot - :align: center - - -.. code-block:: cpp - - /// dvar, bar, strvar, etc. are double/bool/string/.. variables - - FormHelper *gui = new FormHelper(screen); - ref window = gui->addWindow(Eigen::Vector2i(10, 10), "Form helper example"); - gui->addGroup("Basic types"); - gui->addVariable("bool", bvar); - gui->addVariable("string", strvar); - - gui->addGroup("Validating fields"); - gui->addVariable("int", ivar); - gui->addVariable("float", fvar); - gui->addVariable("double", dvar); - - gui->addGroup("Complex types"); - gui->addVariable("Enumeration", enumval, enabled) - ->setItems({"Item 1", "Item 2", "Item 3"}); - gui->addVariable("Color", colval); - - gui->addGroup("Other widgets"); - gui->addButton("A button", [](){ std::cout << "Button pressed." << std::endl; }); - - screen->setVisible(true); - screen->performLayout(); - window->center(); - -Compiling ----------------------------------------------------------------------------------------- - -Clone the repository and all dependencies (with ``git clone --recursive``), -run CMake to generate Makefiles or CMake/Visual Studio project files, and -the rest should just work automatically. - -On Debian/Ubuntu, make sure that you have installed the following packages - -.. code-block:: bash - - $ apt-get install cmake xorg-dev libglu1-mesa-dev - -To also get the Python bindings, you'll need to run - -.. code-block:: bash - - $ apt-get install python-dev - -On RedHat/Fedora, make sure that you have installed the following packages - -.. code-block:: bash - - $ sudo dnf install cmake mesa-libGLU-devel libXi-devel libXcursor-devel libXinerama-devel libXrandr-devel xorg-x11-server-devel - -To also get the Python bindings, you'll need to run - -.. code-block:: bash - - $ sudo dnf install python3-devel - -License ----------------------------------------------------------------------------------------- - -.. begin_license - -NanoGUI is provided under a BSD-style license that can be found in the LICENSE_ -file. By using, distributing, or contributing to this project, you agree to the -terms and conditions of this license. - -.. _LICENSE: https://github.com/wjakob/nanogui/blob/master/LICENSE.txt - -NanoGUI uses Daniel Bruce's `Entypo+ `_ font for the -icons used on various widgets. This work is licensed under a -`CC BY-SA 4.0 `_ license. -Commercial entities using NanoGUI should consult the proper legal counsel for -how to best adhere to the attribution clause of the license. - -.. end_license diff --git a/testbed/nanogui/ext/coro/LICENSE b/testbed/nanogui/ext/coro/LICENSE deleted file mode 100644 index 5c9c3bb6..00000000 --- a/testbed/nanogui/ext/coro/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2000-2009 Marc Alexander Lehmann - -Redistribution and use in source and binary forms, with or without modifica- -tion, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- -CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- -CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- -ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -Alternatively, the following files carry an additional notice that -explicitly allows relicensing under the GPLv2: coro.c, coro.h. - diff --git a/testbed/nanogui/ext/coro/README b/testbed/nanogui/ext/coro/README deleted file mode 100644 index 28b0a6f5..00000000 --- a/testbed/nanogui/ext/coro/README +++ /dev/null @@ -1,6 +0,0 @@ -Configuration, documentation etc. is provided in the coro.h file. Please -note that the file conftest.c in this distribution is under the GPL. It is -not needed for proper operation of this library though, for that, coro.h -and coro.c suffice. - -Marc Lehmann diff --git a/testbed/nanogui/ext/coro/coro.c b/testbed/nanogui/ext/coro/coro.c deleted file mode 100644 index 0bd070dd..00000000 --- a/testbed/nanogui/ext/coro/coro.c +++ /dev/null @@ -1,803 +0,0 @@ -/* - * Copyright (c) 2001-2011 Marc Alexander Lehmann - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - * - * This library is modelled strictly after Ralf S. Engelschalls article at - * http://www.gnu.org/software/pth/rse-pmt.ps. So most of the credit must - * go to Ralf S. Engelschall . - */ - -#include "coro.h" - -#include -#include - -/*****************************************************************************/ -/* ucontext/setjmp/asm backends */ -/*****************************************************************************/ -#if CORO_UCONTEXT || CORO_SJLJ || CORO_LOSER || CORO_LINUX || CORO_IRIX || CORO_ASM - -# if CORO_UCONTEXT -# include -# endif - -# if !defined(STACK_ADJUST_PTR) -# if __sgi -/* IRIX is decidedly NON-unix */ -# define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss) - 8) -# define STACK_ADJUST_SIZE(sp,ss) ((ss) - 8) -# elif (__i386__ && CORO_LINUX) || (_M_IX86 && CORO_LOSER) -# define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss)) -# define STACK_ADJUST_SIZE(sp,ss) (ss) -# elif (__amd64__ && CORO_LINUX) || ((_M_AMD64 || _M_IA64) && CORO_LOSER) -# define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss) - 8) -# define STACK_ADJUST_SIZE(sp,ss) (ss) -# else -# define STACK_ADJUST_PTR(sp,ss) (sp) -# define STACK_ADJUST_SIZE(sp,ss) (ss) -# endif -# endif - -# include - -# if CORO_SJLJ -# include -# include -# include -# endif - -static coro_func coro_init_func; -static void *coro_init_arg; -static coro_context *new_coro, *create_coro; - -static void -coro_init (void) -{ - volatile coro_func func = coro_init_func; - volatile void *arg = coro_init_arg; - - coro_transfer (new_coro, create_coro); - -#if __GCC_HAVE_DWARF2_CFI_ASM && __amd64 - asm (".cfi_undefined rip"); -#endif - - func ((void *)arg); - - /* the new coro returned. bad. just abort() for now */ - abort (); -} - -# if CORO_SJLJ - -static volatile int trampoline_done; - -/* trampoline signal handler */ -static void -trampoline (int sig) -{ - if (coro_setjmp (new_coro->env)) - coro_init (); /* start it */ - else - trampoline_done = 1; -} - -# endif - -# if CORO_ASM - - #if __arm__ && \ - (defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \ - || defined __ARM_ARCH_7R__ || defined __ARM_ARCH_7M__ \ - || __ARCH_ARCH == 7) - #define CORO_ARM 1 - #endif - - #if _WIN32 || __CYGWIN__ - #define CORO_WIN_TIB 1 - #endif - - asm ( - "\t.text\n" - #if _WIN32 || __CYGWIN__ - "\t.globl _coro_transfer\n" - "_coro_transfer:\n" - #else - "\t.globl coro_transfer\n" - "coro_transfer:\n" - #endif - /* windows, of course, gives a shit on the amd64 ABI and uses different registers */ - /* http://blogs.msdn.com/freik/archive/2005/03/17/398200.aspx */ - #if __amd64 - - #if _WIN32 || __CYGWIN__ - #define NUM_SAVED 29 - "\tsubq $168, %rsp\t" /* one dummy qword to improve alignment */ - "\tmovaps %xmm6, (%rsp)\n" - "\tmovaps %xmm7, 16(%rsp)\n" - "\tmovaps %xmm8, 32(%rsp)\n" - "\tmovaps %xmm9, 48(%rsp)\n" - "\tmovaps %xmm10, 64(%rsp)\n" - "\tmovaps %xmm11, 80(%rsp)\n" - "\tmovaps %xmm12, 96(%rsp)\n" - "\tmovaps %xmm13, 112(%rsp)\n" - "\tmovaps %xmm14, 128(%rsp)\n" - "\tmovaps %xmm15, 144(%rsp)\n" - "\tpushq %rsi\n" - "\tpushq %rdi\n" - "\tpushq %rbp\n" - "\tpushq %rbx\n" - "\tpushq %r12\n" - "\tpushq %r13\n" - "\tpushq %r14\n" - "\tpushq %r15\n" - #if CORO_WIN_TIB - "\tpushq %fs:0x0\n" - "\tpushq %fs:0x8\n" - "\tpushq %fs:0xc\n" - #endif - "\tmovq %rsp, (%rcx)\n" - "\tmovq (%rdx), %rsp\n" - #if CORO_WIN_TIB - "\tpopq %fs:0xc\n" - "\tpopq %fs:0x8\n" - "\tpopq %fs:0x0\n" - #endif - "\tpopq %r15\n" - "\tpopq %r14\n" - "\tpopq %r13\n" - "\tpopq %r12\n" - "\tpopq %rbx\n" - "\tpopq %rbp\n" - "\tpopq %rdi\n" - "\tpopq %rsi\n" - "\tmovaps (%rsp), %xmm6\n" - "\tmovaps 16(%rsp), %xmm7\n" - "\tmovaps 32(%rsp), %xmm8\n" - "\tmovaps 48(%rsp), %xmm9\n" - "\tmovaps 64(%rsp), %xmm10\n" - "\tmovaps 80(%rsp), %xmm11\n" - "\tmovaps 96(%rsp), %xmm12\n" - "\tmovaps 112(%rsp), %xmm13\n" - "\tmovaps 128(%rsp), %xmm14\n" - "\tmovaps 144(%rsp), %xmm15\n" - "\taddq $168, %rsp\n" - #else - #define NUM_SAVED 6 - "\tpushq %rbp\n" - "\tpushq %rbx\n" - "\tpushq %r12\n" - "\tpushq %r13\n" - "\tpushq %r14\n" - "\tpushq %r15\n" - "\tmovq %rsp, (%rdi)\n" - "\tmovq (%rsi), %rsp\n" - "\tpopq %r15\n" - "\tpopq %r14\n" - "\tpopq %r13\n" - "\tpopq %r12\n" - "\tpopq %rbx\n" - "\tpopq %rbp\n" - #endif - "\tpopq %rcx\n" - "\tjmpq *%rcx\n" - - #elif __i386__ - - #define NUM_SAVED 4 - "\tpushl %ebp\n" - "\tpushl %ebx\n" - "\tpushl %esi\n" - "\tpushl %edi\n" - #if CORO_WIN_TIB - #undef NUM_SAVED - #define NUM_SAVED 7 - "\tpushl %fs:0\n" - "\tpushl %fs:4\n" - "\tpushl %fs:8\n" - #endif - "\tmovl %esp, (%eax)\n" - "\tmovl (%edx), %esp\n" - #if CORO_WIN_TIB - "\tpopl %fs:8\n" - "\tpopl %fs:4\n" - "\tpopl %fs:0\n" - #endif - "\tpopl %edi\n" - "\tpopl %esi\n" - "\tpopl %ebx\n" - "\tpopl %ebp\n" - "\tpopl %ecx\n" - "\tjmpl *%ecx\n" - - #elif CORO_ARM /* untested, what about thumb, neon, iwmmxt? */ - - #if __ARM_PCS_VFP - "\tvpush {d8-d15}\n" - #define NUM_SAVED (9 + 8 * 2) - #else - #define NUM_SAVED 9 - #endif - "\tpush {r4-r11,lr}\n" - "\tstr sp, [r0]\n" - "\tldr sp, [r1]\n" - "\tpop {r4-r11,lr}\n" - #if __ARM_PCS_VFP - "\tvpop {d8-d15}\n" - #endif - "\tmov r15, lr\n" - - #elif __mips__ && 0 /* untested, 32 bit only */ - - #define NUM_SAVED (12 + 8 * 2) - /* TODO: n64/o64, lw=>ld */ - - "\t.set nomips16\n" - "\t.frame $sp,112,$31\n" - #if __mips_soft_float - "\taddiu $sp,$sp,-44\n" - #else - "\taddiu $sp,$sp,-112\n" - "\ts.d $f30,88($sp)\n" - "\ts.d $f28,80($sp)\n" - "\ts.d $f26,72($sp)\n" - "\ts.d $f24,64($sp)\n" - "\ts.d $f22,56($sp)\n" - "\ts.d $f20,48($sp)\n" - #endif - "\tsw $28,40($sp)\n" - "\tsw $31,36($sp)\n" - "\tsw $fp,32($sp)\n" - "\tsw $23,28($sp)\n" - "\tsw $22,24($sp)\n" - "\tsw $21,20($sp)\n" - "\tsw $20,16($sp)\n" - "\tsw $19,12($sp)\n" - "\tsw $18,8($sp)\n" - "\tsw $17,4($sp)\n" - "\tsw $16,0($sp)\n" - "\tsw $sp,0($4)\n" - "\tlw $sp,0($5)\n" - #if !__mips_soft_float - "\tl.d $f30,88($sp)\n" - "\tl.d $f28,80($sp)\n" - "\tl.d $f26,72($sp)\n" - "\tl.d $f24,64($sp)\n" - "\tl.d $f22,56($sp)\n" - "\tl.d $f20,48($sp)\n" - #endif - "\tlw $28,40($sp)\n" - "\tlw $31,36($sp)\n" - "\tlw $fp,32($sp)\n" - "\tlw $23,28($sp)\n" - "\tlw $22,24($sp)\n" - "\tlw $21,20($sp)\n" - "\tlw $20,16($sp)\n" - "\tlw $19,12($sp)\n" - "\tlw $18,8($sp)\n" - "\tlw $17,4($sp)\n" - "\tlw $16,0($sp)\n" - "\tj $31\n" - #if __mips_soft_float - "\taddiu $sp,$sp,44\n" - #else - "\taddiu $sp,$sp,112\n" - #endif - - #else - #error unsupported architecture - #endif - ); - -# endif - -void -coro_create (coro_context *ctx, coro_func coro, void *arg, void *sptr, size_t ssize) -{ - coro_context nctx; -# if CORO_SJLJ - stack_t ostk, nstk; - struct sigaction osa, nsa; - sigset_t nsig, osig; -# endif - - if (!coro) - return; - - coro_init_func = coro; - coro_init_arg = arg; - - new_coro = ctx; - create_coro = &nctx; - -# if CORO_SJLJ - /* we use SIGUSR2. first block it, then fiddle with it. */ - - sigemptyset (&nsig); - sigaddset (&nsig, SIGUSR2); - sigprocmask (SIG_BLOCK, &nsig, &osig); - - nsa.sa_handler = trampoline; - sigemptyset (&nsa.sa_mask); - nsa.sa_flags = SA_ONSTACK; - - if (sigaction (SIGUSR2, &nsa, &osa)) - { - perror ("sigaction"); - abort (); - } - - /* set the new stack */ - nstk.ss_sp = STACK_ADJUST_PTR (sptr, ssize); /* yes, some platforms (IRIX) get this wrong. */ - nstk.ss_size = STACK_ADJUST_SIZE (sptr, ssize); - nstk.ss_flags = 0; - - if (sigaltstack (&nstk, &ostk) < 0) - { - perror ("sigaltstack"); - abort (); - } - - trampoline_done = 0; - kill (getpid (), SIGUSR2); - sigfillset (&nsig); sigdelset (&nsig, SIGUSR2); - - while (!trampoline_done) - sigsuspend (&nsig); - - sigaltstack (0, &nstk); - nstk.ss_flags = SS_DISABLE; - if (sigaltstack (&nstk, 0) < 0) - perror ("sigaltstack"); - - sigaltstack (0, &nstk); - if (~nstk.ss_flags & SS_DISABLE) - abort (); - - if (~ostk.ss_flags & SS_DISABLE) - sigaltstack (&ostk, 0); - - sigaction (SIGUSR2, &osa, 0); - sigprocmask (SIG_SETMASK, &osig, 0); - -# elif CORO_LOSER - - coro_setjmp (ctx->env); - #if __CYGWIN__ && __i386__ - ctx->env[8] = (long) coro_init; - ctx->env[7] = (long) ((char *)sptr + ssize) - sizeof (long); - #elif __CYGWIN__ && __x86_64__ - ctx->env[7] = (long) coro_init; - ctx->env[6] = (long) ((char *)sptr + ssize) - sizeof (long); - #elif defined __MINGW32__ - ctx->env[5] = (long) coro_init; - ctx->env[4] = (long) ((char *)sptr + ssize) - sizeof (long); - #elif defined _M_IX86 - ((_JUMP_BUFFER *)&ctx->env)->Eip = (long) coro_init; - ((_JUMP_BUFFER *)&ctx->env)->Esp = (long) STACK_ADJUST_PTR (sptr, ssize) - sizeof (long); - #elif defined _M_AMD64 - ((_JUMP_BUFFER *)&ctx->env)->Rip = (__int64) coro_init; - ((_JUMP_BUFFER *)&ctx->env)->Rsp = (__int64) STACK_ADJUST_PTR (sptr, ssize) - sizeof (__int64); - #elif defined _M_IA64 - ((_JUMP_BUFFER *)&ctx->env)->StIIP = (__int64) coro_init; - ((_JUMP_BUFFER *)&ctx->env)->IntSp = (__int64) STACK_ADJUST_PTR (sptr, ssize) - sizeof (__int64); - #else - #error "microsoft libc or architecture not supported" - #endif - -# elif CORO_LINUX - - coro_setjmp (ctx->env); - #if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 0 && defined (JB_PC) && defined (JB_SP) - ctx->env[0].__jmpbuf[JB_PC] = (long) coro_init; - ctx->env[0].__jmpbuf[JB_SP] = (long) STACK_ADJUST_PTR (sptr, ssize) - sizeof (long); - #elif __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 0 && defined (__mc68000__) - ctx->env[0].__jmpbuf[0].__aregs[0] = (long int)coro_init; - ctx->env[0].__jmpbuf[0].__sp = (int *) ((char *)sptr + ssize) - sizeof (long); - #elif defined (__GNU_LIBRARY__) && defined (__i386__) - ctx->env[0].__jmpbuf[0].__pc = (char *) coro_init; - ctx->env[0].__jmpbuf[0].__sp = (void *) ((char *)sptr + ssize) - sizeof (long); - #elif defined (__GNU_LIBRARY__) && defined (__x86_64__) - ctx->env[0].__jmpbuf[JB_PC] = (long) coro_init; - ctx->env[0].__jmpbuf[0].__sp = (void *) ((char *)sptr + ssize) - sizeof (long); - #else - #error "linux libc or architecture not supported" - #endif - -# elif CORO_IRIX - - coro_setjmp (ctx->env, 0); - ctx->env[JB_PC] = (__uint64_t)coro_init; - ctx->env[JB_SP] = (__uint64_t)STACK_ADJUST_PTR (sptr, ssize) - sizeof (long); - -# elif CORO_ASM - - #if __i386__ || __x86_64__ - ctx->sp = (void **)(ssize + (char *)sptr); - *--ctx->sp = (void *)abort; /* needed for alignment only */ - *--ctx->sp = (void *)coro_init; - #if CORO_WIN_TIB - *--ctx->sp = 0; /* ExceptionList */ - *--ctx->sp = (char *)sptr + ssize; /* StackBase */ - *--ctx->sp = sptr; /* StackLimit */ - #endif - #elif CORO_ARM - /* return address stored in lr register, don't push anything */ - #else - #error unsupported architecture - #endif - - ctx->sp -= NUM_SAVED; - memset (ctx->sp, 0, sizeof (*ctx->sp) * NUM_SAVED); - - #if __i386__ || __x86_64__ - /* done already */ - #elif CORO_ARM - ctx->sp[0] = coro; /* r4 */ - ctx->sp[1] = arg; /* r5 */ - ctx->sp[8] = (char *)coro_init; /* lr */ - #else - #error unsupported architecture - #endif - -# elif CORO_UCONTEXT - - getcontext (&(ctx->uc)); - - ctx->uc.uc_link = 0; - ctx->uc.uc_stack.ss_sp = sptr; - ctx->uc.uc_stack.ss_size = (size_t)ssize; - ctx->uc.uc_stack.ss_flags = 0; - - makecontext (&(ctx->uc), (void (*)())coro_init, 0); - -# endif - - coro_transfer (create_coro, new_coro); -} - -/*****************************************************************************/ -/* pthread backend */ -/*****************************************************************************/ -#elif CORO_PTHREAD - -/* this mutex will be locked by the running coroutine */ -pthread_mutex_t coro_mutex = PTHREAD_MUTEX_INITIALIZER; - -struct coro_init_args -{ - coro_func func; - void *arg; - coro_context *self, *main; -}; - -static pthread_t null_tid; - -/* I'd so love to cast pthread_mutex_unlock to void (*)(void *)... */ -static void -mutex_unlock_wrapper (void *arg) -{ - pthread_mutex_unlock ((pthread_mutex_t *)arg); -} - -static void * -coro_init (void *args_) -{ - struct coro_init_args *args = (struct coro_init_args *)args_; - coro_func func = args->func; - void *arg = args->arg; - - pthread_mutex_lock (&coro_mutex); - - /* we try to be good citizens and use deferred cancellation and cleanup handlers */ - pthread_cleanup_push (mutex_unlock_wrapper, &coro_mutex); - coro_transfer (args->self, args->main); - func (arg); - pthread_cleanup_pop (1); - - return 0; -} - -void -coro_transfer (coro_context *prev, coro_context *next) -{ - pthread_cond_signal (&next->cv); - pthread_cond_wait (&prev->cv, &coro_mutex); -#if __FreeBSD__ /* freebsd is of course broken and needs manual testcancel calls... yay... */ - pthread_testcancel (); -#endif -} - -void -coro_create (coro_context *ctx, coro_func coro, void *arg, void *sptr, size_t ssize) -{ - static coro_context nctx; - static int once; - - if (!once) - { - once = 1; - - pthread_mutex_lock (&coro_mutex); - pthread_cond_init (&nctx.cv, 0); - null_tid = pthread_self (); - } - - pthread_cond_init (&ctx->cv, 0); - - if (coro) - { - pthread_attr_t attr; - struct coro_init_args args; - - args.func = coro; - args.arg = arg; - args.self = ctx; - args.main = &nctx; - - pthread_attr_init (&attr); -#if __UCLIBC__ - /* exists, but is borked */ - /*pthread_attr_setstacksize (&attr, (size_t)ssize);*/ -#elif __CYGWIN__ - /* POSIX, not here */ - pthread_attr_setstacksize (&attr, (size_t)ssize); -#else - pthread_attr_setstack (&attr, sptr, (size_t)ssize); -#endif - pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS); - pthread_create (&ctx->id, &attr, coro_init, &args); - - coro_transfer (args.main, args.self); - } - else - ctx->id = null_tid; -} - -void -coro_destroy (coro_context *ctx) -{ - if (!pthread_equal (ctx->id, null_tid)) - { - pthread_cancel (ctx->id); - pthread_mutex_unlock (&coro_mutex); - pthread_join (ctx->id, 0); - pthread_mutex_lock (&coro_mutex); - } - - pthread_cond_destroy (&ctx->cv); -} - -/*****************************************************************************/ -/* fiber backend */ -/*****************************************************************************/ -#elif CORO_FIBER - -#define WIN32_LEAN_AND_MEAN -#if _WIN32_WINNT < 0x0400 - #undef _WIN32_WINNT - #define _WIN32_WINNT 0x0400 -#endif -#include - -VOID CALLBACK -coro_init (PVOID arg) -{ - coro_context *ctx = (coro_context *)arg; - - ctx->coro (ctx->arg); -} - -void -coro_transfer (coro_context *prev, coro_context *next) -{ - if (!prev->fiber) - { - prev->fiber = GetCurrentFiber (); - - if (prev->fiber == 0 || prev->fiber == (void *)0x1e00) - prev->fiber = ConvertThreadToFiber (0); - } - - SwitchToFiber (next->fiber); -} - -void -coro_create (coro_context *ctx, coro_func coro, void *arg, void *sptr, size_t ssize) -{ - ctx->fiber = 0; - ctx->coro = coro; - ctx->arg = arg; - - if (!coro) - return; - - ctx->fiber = CreateFiber (ssize, coro_init, ctx); -} - -void -coro_destroy (coro_context *ctx) -{ - DeleteFiber (ctx->fiber); -} - -#else - #error unsupported backend -#endif - -/*****************************************************************************/ -/* stack management */ -/*****************************************************************************/ -#if CORO_STACKALLOC - -#include - -#ifndef _WIN32 -# include -#endif - -#if CORO_USE_VALGRIND -# include -#endif - -#if _POSIX_MAPPED_FILES -# include -# define CORO_MMAP 1 -# ifndef MAP_ANONYMOUS -# ifdef MAP_ANON -# define MAP_ANONYMOUS MAP_ANON -# else -# undef CORO_MMAP -# endif -# endif -# include -#else -# undef CORO_MMAP -#endif - -#if _POSIX_MEMORY_PROTECTION -# ifndef CORO_GUARDPAGES -# define CORO_GUARDPAGES 4 -# endif -#else -# undef CORO_GUARDPAGES -#endif - -#if !CORO_MMAP -# undef CORO_GUARDPAGES -#endif - -#if !__i386__ && !__x86_64__ && !__powerpc__ && !__arm__ && !__aarch64__ && !__m68k__ && !__alpha__ && !__mips__ && !__sparc64__ -# undef CORO_GUARDPAGES -#endif - -#ifndef CORO_GUARDPAGES -# define CORO_GUARDPAGES 0 -#endif - -#if !PAGESIZE - #if !CORO_MMAP - #define PAGESIZE 4096 - #else - static size_t - coro_pagesize (void) - { - static size_t pagesize; - - if (!pagesize) - pagesize = sysconf (_SC_PAGESIZE); - - return pagesize; - } - - #define PAGESIZE coro_pagesize () - #endif -#endif - -int -coro_stack_alloc (struct coro_stack *stack, unsigned int size) -{ - if (!size) - size = 256 * 1024; - - stack->sptr = 0; - stack->ssze = ((size_t)size * sizeof (void *) + PAGESIZE - 1) / PAGESIZE * PAGESIZE; - -#if CORO_FIBER - - stack->sptr = (void *)stack; - return 1; - -#else - - size_t ssze = stack->ssze + CORO_GUARDPAGES * PAGESIZE; - void *base; - - #if CORO_MMAP - /* mmap supposedly does allocate-on-write for us */ - base = mmap (0, ssze, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - if (base == (void *)-1) - { - /* some systems don't let us have executable heap */ - /* we assume they won't need executable stack in that case */ - base = mmap (0, ssze, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - if (base == (void *)-1) - return 0; - } - - #if CORO_GUARDPAGES - mprotect (base, CORO_GUARDPAGES * PAGESIZE, PROT_NONE); - #endif - - base = (void*)((char *)base + CORO_GUARDPAGES * PAGESIZE); - #else - base = malloc (ssze); - if (!base) - return 0; - #endif - - #if CORO_USE_VALGRIND - stack->valgrind_id = VALGRIND_STACK_REGISTER ((char *)base, ((char *)base) + ssze - CORO_GUARDPAGES * PAGESIZE); - #endif - - stack->sptr = base; - return 1; - -#endif -} - -void -coro_stack_free (struct coro_stack *stack) -{ -#if CORO_FIBER - /* nop */ -#else - #if CORO_USE_VALGRIND - VALGRIND_STACK_DEREGISTER (stack->valgrind_id); - #endif - - #if CORO_MMAP - if (stack->sptr) - munmap ((void*)((char *)stack->sptr - CORO_GUARDPAGES * PAGESIZE), - stack->ssze + CORO_GUARDPAGES * PAGESIZE); - #else - free (stack->sptr); - #endif -#endif -} - -#endif - diff --git a/testbed/nanogui/ext/coro/coro.h b/testbed/nanogui/ext/coro/coro.h deleted file mode 100644 index 8df287e0..00000000 --- a/testbed/nanogui/ext/coro/coro.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 2001-2012,2015 Marc Alexander Lehmann - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - * - * This library is modelled strictly after Ralf S. Engelschalls article at - * http://www.gnu.org/software/pth/rse-pmt.ps. So most of the credit must - * go to Ralf S. Engelschall . - * - * This coroutine library is very much stripped down. You should either - * build your own process abstraction using it or - better - just use GNU - * Portable Threads, http://www.gnu.org/software/pth/. - * - */ - -/* - * 2006-10-26 Include stddef.h on OS X to work around one of its bugs. - * Reported by Michael_G_Schwern. - * 2006-11-26 Use _setjmp instead of setjmp on GNU/Linux. - * 2007-04-27 Set unwind frame info if gcc 3+ and ELF is detected. - * Use _setjmp instead of setjmp on _XOPEN_SOURCE >= 600. - * 2007-05-02 Add assembly versions for x86 and amd64 (to avoid reliance - * on SIGUSR2 and sigaltstack in Crossfire). - * 2008-01-21 Disable CFI usage on anything but GNU/Linux. - * 2008-03-02 Switched to 2-clause BSD license with GPL exception. - * 2008-04-04 New (but highly unrecommended) pthreads backend. - * 2008-04-24 Reinstate CORO_LOSER (had wrong stack adjustments). - * 2008-10-30 Support assembly method on x86 with and without frame pointer. - * 2008-11-03 Use a global asm statement for CORO_ASM, idea by pippijn. - * 2008-11-05 Hopefully fix misaligned stacks with CORO_ASM/SETJMP. - * 2008-11-07 rbp wasn't saved in CORO_ASM on x86_64. - * introduce coro_destroy, which is a nop except for pthreads. - * speed up CORO_PTHREAD. Do no longer leak threads either. - * coro_create now allows one to create source coro_contexts. - * do not rely on makecontext passing a void * correctly. - * try harder to get _setjmp/_longjmp. - * major code cleanup/restructuring. - * 2008-11-10 the .cfi hacks are no longer needed. - * 2008-11-16 work around a freebsd pthread bug. - * 2008-11-19 define coro_*jmp symbols for easier porting. - * 2009-06-23 tentative win32-backend support for mingw32 (Yasuhiro Matsumoto). - * 2010-12-03 tentative support for uclibc (which lacks all sorts of things). - * 2011-05-30 set initial callee-saved-registers to zero with CORO_ASM. - * use .cfi_undefined rip on linux-amd64 for better backtraces. - * 2011-06-08 maybe properly implement weird windows amd64 calling conventions. - * 2011-07-03 rely on __GCC_HAVE_DWARF2_CFI_ASM for cfi detection. - * 2011-08-08 cygwin trashes stacks, use pthreads with double stack on cygwin. - * 2012-12-04 reduce misprediction penalty for x86/amd64 assembly switcher. - * 2012-12-05 experimental fiber backend (allocates stack twice). - * 2012-12-07 API version 3 - add coro_stack_alloc/coro_stack_free. - * 2012-12-21 valgrind stack registering was broken. - * 2015-12-05 experimental asm be for arm7, based on a patch by Nick Zavaritsky. - * use __name__ for predefined symbols, as in libecb. - * enable guard pages on arm, aarch64 and mips. - */ - -#ifndef CORO_H -#define CORO_H - -#if __cplusplus -extern "C" { -#endif - -/* - * This library consists of only three files - * coro.h, coro.c and LICENSE (and optionally README) - * - * It implements what is known as coroutines, in a hopefully - * portable way. - * - * All compiletime symbols must be defined both when including coro.h - * (using libcoro) as well as when compiling coro.c (the implementation). - * - * You can manually specify which flavour you want. If you don't define - * any of these, libcoro tries to choose a safe and fast default: - * - * -DCORO_UCONTEXT - * - * This flavour uses SUSv2's get/set/swap/makecontext functions that - * unfortunately only some unices support, and is quite slow. - * - * -DCORO_SJLJ - * - * This flavour uses SUSv2's setjmp/longjmp and sigaltstack functions to - * do it's job. Coroutine creation is much slower than UCONTEXT, but - * context switching is a bit cheaper. It should work on almost all unices. - * - * -DCORO_LINUX - * - * CORO_SJLJ variant. - * Old GNU/Linux systems (<= glibc-2.1) only work with this implementation - * (it is very fast and therefore recommended over other methods, but - * doesn't work with anything newer). - * - * -DCORO_LOSER - * - * CORO_SJLJ variant. - * Microsoft's highly proprietary platform doesn't support sigaltstack, and - * this selects a suitable workaround for this platform. It might not work - * with your compiler though - it has only been tested with MSVC 6. - * - * -DCORO_FIBER - * - * Slower, but probably more portable variant for the Microsoft operating - * system, using fibers. Ignores the passed stack and allocates it internally. - * Also, due to bugs in cygwin, this does not work with cygwin. - * - * -DCORO_IRIX - * - * CORO_SJLJ variant. - * For SGI's version of Microsoft's NT ;) - * - * -DCORO_ASM - * - * Hand coded assembly, known to work only on a few architectures/ABI: - * GCC + arm7/x86/IA32/amd64/x86_64 + GNU/Linux and a few BSDs. Fastest - * choice, if it works. - * - * -DCORO_PTHREAD - * - * Use the pthread API. You have to provide and -lpthread. - * This is likely the slowest backend, and it also does not support fork(), - * so avoid it at all costs. - * - * If you define neither of these symbols, coro.h will try to autodetect - * the best/safest model. To help with the autodetection, you should check - * (e.g. using autoconf) and define the following symbols: HAVE_UCONTEXT_H - * / HAVE_SETJMP_H / HAVE_SIGALTSTACK. - */ - -/* - * Changes when the API changes incompatibly. - * This is ONLY the API version - there is no ABI compatibility between releases. - * - * Changes in API version 2: - * replaced bogus -DCORO_LOOSE with grammatically more correct -DCORO_LOSER - * Changes in API version 3: - * introduced stack management (CORO_STACKALLOC) - */ -#define CORO_VERSION 3 - -#include - -/* - * This is the type for the initialization function of a new coroutine. - */ -typedef void (*coro_func)(void *); - -/* - * A coroutine state is saved in the following structure. Treat it as an - * opaque type. errno and sigmask might be saved, but don't rely on it, - * implement your own switching primitive if you need that. - */ -typedef struct coro_context coro_context; - -/* - * This function creates a new coroutine. Apart from a pointer to an - * uninitialised coro_context, it expects a pointer to the entry function - * and the single pointer value that is given to it as argument. - * - * Allocating/deallocating the stack is your own responsibility. - * - * As a special case, if coro, arg, sptr and ssze are all zero, - * then an "empty" coro_context will be created that is suitable - * as an initial source for coro_transfer. - * - * This function is not reentrant, but putting a mutex around it - * will work. - */ -void coro_create (coro_context *ctx, /* an uninitialised coro_context */ - coro_func coro, /* the coroutine code to be executed */ - void *arg, /* a single pointer passed to the coro */ - void *sptr, /* start of stack area */ - size_t ssze); /* size of stack area in bytes */ - -/* - * The following prototype defines the coroutine switching function. It is - * sometimes implemented as a macro, so watch out. - * - * This function is thread-safe and reentrant. - */ -#if 0 -void coro_transfer (coro_context *prev, coro_context *next); -#endif - -/* - * The following prototype defines the coroutine destroy function. It - * is sometimes implemented as a macro, so watch out. It also serves no - * purpose unless you want to use the CORO_PTHREAD backend, where it is - * used to clean up the thread. You are responsible for freeing the stack - * and the context itself. - * - * This function is thread-safe and reentrant. - */ -#if 0 -void coro_destroy (coro_context *ctx); -#endif - -/*****************************************************************************/ -/* optional stack management */ -/*****************************************************************************/ -/* - * You can disable all of the stack management functions by - * defining CORO_STACKALLOC to 0. Otherwise, they are enabled by default. - * - * If stack management is enabled, you can influence the implementation via these - * symbols: - * - * -DCORO_USE_VALGRIND - * - * If defined, then libcoro will include valgrind/valgrind.h and register - * and unregister stacks with valgrind. - * - * -DCORO_GUARDPAGES=n - * - * libcoro will try to use the specified number of guard pages to protect against - * stack overflow. If n is 0, then the feature will be disabled. If it isn't - * defined, then libcoro will choose a suitable default. If guardpages are not - * supported on the platform, then the feature will be silently disabled. - */ -#ifndef CORO_STACKALLOC -# define CORO_STACKALLOC 1 -#endif - -#if CORO_STACKALLOC - -/* - * The only allowed operations on these struct members is to read the - * "sptr" and "ssze" members to pass it to coro_create, to read the "sptr" - * member to see if it is false, in which case the stack isn't allocated, - * and to set the "sptr" member to 0, to indicate to coro_stack_free to - * not actually do anything. - */ - -struct coro_stack -{ - void *sptr; - size_t ssze; -#if CORO_USE_VALGRIND - int valgrind_id; -#endif -}; - -/* - * Try to allocate a stack of at least the given size and return true if - * successful, or false otherwise. - * - * The size is *NOT* specified in bytes, but in units of sizeof (void *), - * i.e. the stack is typically 4(8) times larger on 32 bit(64 bit) platforms - * then the size passed in. - * - * If size is 0, then a "suitable" stack size is chosen (usually 1-2MB). - */ -int coro_stack_alloc (struct coro_stack *stack, unsigned int size); - -/* - * Free the stack allocated by coro_stack_alloc again. It is safe to - * call this function on the coro_stack structure even if coro_stack_alloc - * failed. - */ -void coro_stack_free (struct coro_stack *stack); - -#endif - -/* - * That was it. No other user-serviceable parts below here. - */ - -/*****************************************************************************/ - -#if !defined CORO_LOSER && !defined CORO_UCONTEXT \ - && !defined CORO_SJLJ && !defined CORO_LINUX \ - && !defined CORO_IRIX && !defined CORO_ASM \ - && !defined CORO_PTHREAD && !defined CORO_FIBER -# if defined WINDOWS && (defined __i386__ || (__x86_64__ || defined _M_IX86 || defined _M_AMD64)) -# define CORO_ASM 1 -# elif defined WINDOWS || defined _WIN32 -# define CORO_LOSER 1 /* you don't win with windoze */ -# elif __linux && (__i386__ || (__x86_64__ && !__ILP32__) || (__arm__ && __ARCH_ARCH == 7)) -# define CORO_ASM 1 -# elif defined HAVE_UCONTEXT_H -# define CORO_UCONTEXT 1 -# elif defined HAVE_SETJMP_H && defined HAVE_SIGALTSTACK -# define CORO_SJLJ 1 -# else -error unknown or unsupported architecture -# endif -#endif - -/*****************************************************************************/ - -#if CORO_UCONTEXT - -# include - -struct coro_context -{ - ucontext_t uc; -}; - -# define coro_transfer(p,n) swapcontext (&((p)->uc), &((n)->uc)) -# define coro_destroy(ctx) (void *)(ctx) - -#elif CORO_SJLJ || CORO_LOSER || CORO_LINUX || CORO_IRIX - -# if defined(CORO_LINUX) && !defined(_GNU_SOURCE) -# define _GNU_SOURCE /* for glibc */ -# endif - -# if !CORO_LOSER -# include -# endif - -/* solaris is hopelessly borked, it expands _XOPEN_UNIX to nothing */ -# if __sun -# undef _XOPEN_UNIX -# define _XOPEN_UNIX 1 -# endif - -# include - -# if _XOPEN_UNIX > 0 || defined (_setjmp) -# define coro_jmp_buf jmp_buf -# define coro_setjmp(env) _setjmp (env) -# define coro_longjmp(env) _longjmp ((env), 1) -# elif CORO_LOSER -# define coro_jmp_buf jmp_buf -# define coro_setjmp(env) setjmp (env) -# define coro_longjmp(env) longjmp ((env), 1) -# else -# define coro_jmp_buf sigjmp_buf -# define coro_setjmp(env) sigsetjmp (env, 0) -# define coro_longjmp(env) siglongjmp ((env), 1) -# endif - -struct coro_context -{ - coro_jmp_buf env; -}; - -# define coro_transfer(p,n) do { if (!coro_setjmp ((p)->env)) coro_longjmp ((n)->env); } while (0) -# define coro_destroy(ctx) (void *)(ctx) - -#elif CORO_ASM - -struct coro_context -{ - void **sp; /* must be at offset 0 */ -}; - -#if __i386__ || __x86_64__ -void __attribute__ ((__noinline__, __regparm__(2))) -#else -void __attribute__ ((__noinline__)) -#endif -coro_transfer (coro_context *prev, coro_context *next); - -# define coro_destroy(ctx) (void *)(ctx) - -#elif CORO_PTHREAD - -# include - -extern pthread_mutex_t coro_mutex; - -struct coro_context -{ - pthread_cond_t cv; - pthread_t id; -}; - -void coro_transfer (coro_context *prev, coro_context *next); -void coro_destroy (coro_context *ctx); - -#elif CORO_FIBER - -struct coro_context -{ - void *fiber; - /* only used for initialisation */ - coro_func coro; - void *arg; -}; - -void coro_transfer (coro_context *prev, coro_context *next); -void coro_destroy (coro_context *ctx); - -#endif - -#if __cplusplus -} -#endif - -#endif - diff --git a/testbed/nanogui/ext/eigen/CMakeLists.txt b/testbed/nanogui/ext/eigen/CMakeLists.txt deleted file mode 100644 index fe4227cb..00000000 --- a/testbed/nanogui/ext/eigen/CMakeLists.txt +++ /dev/null @@ -1,597 +0,0 @@ -project(Eigen3) - -cmake_minimum_required(VERSION 2.8.5) - -# guard against in-source builds - -if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) - message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. ") -endif() - -# Alias Eigen_*_DIR to Eigen3_*_DIR: - -set(Eigen_SOURCE_DIR ${Eigen3_SOURCE_DIR}) -set(Eigen_BINARY_DIR ${Eigen3_BINARY_DIR}) - -# guard against bad build-type strings - -if (NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release") -endif() - -string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_tolower) -if( NOT cmake_build_type_tolower STREQUAL "debug" - AND NOT cmake_build_type_tolower STREQUAL "release" - AND NOT cmake_build_type_tolower STREQUAL "relwithdebinfo") - message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\". Allowed values are Debug, Release, RelWithDebInfo (case-insensitive).") -endif() - - -############################################################################# -# retrieve version information # -############################################################################# - -# automatically parse the version number -file(READ "${PROJECT_SOURCE_DIR}/Eigen/src/Core/util/Macros.h" _eigen_version_header) -string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen_world_version_match "${_eigen_version_header}") -set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}") -string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen_major_version_match "${_eigen_version_header}") -set(EIGEN_MAJOR_VERSION "${CMAKE_MATCH_1}") -string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen_minor_version_match "${_eigen_version_header}") -set(EIGEN_MINOR_VERSION "${CMAKE_MATCH_1}") -set(EIGEN_VERSION_NUMBER ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION}) - -# if the mercurial program is absent, this will leave the EIGEN_HG_CHANGESET string empty, -# but won't stop CMake. -execute_process(COMMAND hg tip -R ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE EIGEN_HGTIP_OUTPUT) -execute_process(COMMAND hg branch -R ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE EIGEN_BRANCH_OUTPUT) - -# if this is the default (aka development) branch, extract the mercurial changeset number from the hg tip output... -if(EIGEN_BRANCH_OUTPUT MATCHES "default") -string(REGEX MATCH "^changeset: *[0-9]*:([0-9;a-f]+).*" EIGEN_HG_CHANGESET_MATCH "${EIGEN_HGTIP_OUTPUT}") -set(EIGEN_HG_CHANGESET "${CMAKE_MATCH_1}") -endif(EIGEN_BRANCH_OUTPUT MATCHES "default") -#...and show it next to the version number -if(EIGEN_HG_CHANGESET) - set(EIGEN_VERSION "${EIGEN_VERSION_NUMBER} (mercurial changeset ${EIGEN_HG_CHANGESET})") -else(EIGEN_HG_CHANGESET) - set(EIGEN_VERSION "${EIGEN_VERSION_NUMBER}") -endif(EIGEN_HG_CHANGESET) - - -include(CheckCXXCompilerFlag) -include(GNUInstallDirs) - -set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) - -############################################################################# -# find how to link to the standard libraries # -############################################################################# - -find_package(StandardMathLibrary) - - -set(EIGEN_TEST_CUSTOM_LINKER_FLAGS "" CACHE STRING "Additional linker flags when linking unit tests.") -set(EIGEN_TEST_CUSTOM_CXX_FLAGS "" CACHE STRING "Additional compiler flags when compiling unit tests.") - -set(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO "") - -if(NOT STANDARD_MATH_LIBRARY_FOUND) - - message(FATAL_ERROR - "Can't link to the standard math library. Please report to the Eigen developers, telling them about your platform.") - -else() - - if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) - set(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO "${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO} ${STANDARD_MATH_LIBRARY}") - else() - set(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO "${STANDARD_MATH_LIBRARY}") - endif() - -endif() - -if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) - message(STATUS "Standard libraries to link to explicitly: ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}") -else() - message(STATUS "Standard libraries to link to explicitly: none") -endif() - -option(EIGEN_BUILD_BTL "Build benchmark suite" OFF) - -# Disable pkgconfig only for native Windows builds -if(NOT WIN32 OR NOT CMAKE_HOST_SYSTEM_NAME MATCHES Windows) - option(EIGEN_BUILD_PKGCONFIG "Build pkg-config .pc file for Eigen" ON) -endif() - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -option(EIGEN_SPLIT_LARGE_TESTS "Split large tests into smaller executables" ON) - -option(EIGEN_DEFAULT_TO_ROW_MAJOR "Use row-major as default matrix storage order" OFF) -if(EIGEN_DEFAULT_TO_ROW_MAJOR) - add_definitions("-DEIGEN_DEFAULT_TO_ROW_MAJOR") -endif() - -set(EIGEN_TEST_MAX_SIZE "320" CACHE STRING "Maximal matrix/vector size, default is 320") - -macro(ei_add_cxx_compiler_flag FLAG) - string(REGEX REPLACE "-" "" SFLAG1 ${FLAG}) - string(REGEX REPLACE "\\+" "p" SFLAG ${SFLAG1}) - check_cxx_compiler_flag(${FLAG} COMPILER_SUPPORT_${SFLAG}) - if(COMPILER_SUPPORT_${SFLAG}) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}") - endif() -endmacro(ei_add_cxx_compiler_flag) - -if(NOT MSVC) - # We assume that other compilers are partly compatible with GNUCC - - # clang outputs some warnings for unknown flags that are not caught by check_cxx_compiler_flag - # adding -Werror turns such warnings into errors - check_cxx_compiler_flag("-Werror" COMPILER_SUPPORT_WERROR) - if(COMPILER_SUPPORT_WERROR) - set(CMAKE_REQUIRED_FLAGS "-Werror") - endif() - ei_add_cxx_compiler_flag("-pedantic") - ei_add_cxx_compiler_flag("-Wall") - ei_add_cxx_compiler_flag("-Wextra") - #ei_add_cxx_compiler_flag("-Weverything") # clang - - ei_add_cxx_compiler_flag("-Wundef") - ei_add_cxx_compiler_flag("-Wcast-align") - ei_add_cxx_compiler_flag("-Wchar-subscripts") - ei_add_cxx_compiler_flag("-Wnon-virtual-dtor") - ei_add_cxx_compiler_flag("-Wunused-local-typedefs") - ei_add_cxx_compiler_flag("-Wpointer-arith") - ei_add_cxx_compiler_flag("-Wwrite-strings") - ei_add_cxx_compiler_flag("-Wformat-security") - ei_add_cxx_compiler_flag("-Wshorten-64-to-32") - ei_add_cxx_compiler_flag("-Wlogical-op") - ei_add_cxx_compiler_flag("-Wenum-conversion") - ei_add_cxx_compiler_flag("-Wc++11-extensions") - ei_add_cxx_compiler_flag("-Wdouble-promotion") -# ei_add_cxx_compiler_flag("-Wconversion") - - # -Wshadow is insanely too strict with gcc, hopefully it will become usable with gcc 6 - # if(NOT CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "5.0.0")) - if(NOT CMAKE_COMPILER_IS_GNUCXX) - ei_add_cxx_compiler_flag("-Wshadow") - endif() - - ei_add_cxx_compiler_flag("-Wno-psabi") - ei_add_cxx_compiler_flag("-Wno-variadic-macros") - ei_add_cxx_compiler_flag("-Wno-long-long") - - ei_add_cxx_compiler_flag("-fno-check-new") - ei_add_cxx_compiler_flag("-fno-common") - ei_add_cxx_compiler_flag("-fstrict-aliasing") - ei_add_cxx_compiler_flag("-wd981") # disable ICC's "operands are evaluated in unspecified order" remark - ei_add_cxx_compiler_flag("-wd2304") # disable ICC's "warning #2304: non-explicit constructor with single argument may cause implicit type conversion" produced by -Wnon-virtual-dtor - - - # The -ansi flag must be added last, otherwise it is also used as a linker flag by check_cxx_compiler_flag making it fails - # Moreover we should not set both -strict-ansi and -ansi - check_cxx_compiler_flag("-strict-ansi" COMPILER_SUPPORT_STRICTANSI) - ei_add_cxx_compiler_flag("-Qunused-arguments") # disable clang warning: argument unused during compilation: '-ansi' - - if(COMPILER_SUPPORT_STRICTANSI) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -strict-ansi") - else() - ei_add_cxx_compiler_flag("-ansi") - endif() - - if(ANDROID_NDK) - ei_add_cxx_compiler_flag("-pie") - ei_add_cxx_compiler_flag("-fPIE") - endif() - - set(CMAKE_REQUIRED_FLAGS "") - - option(EIGEN_TEST_SSE2 "Enable/Disable SSE2 in tests/examples" OFF) - if(EIGEN_TEST_SSE2) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") - message(STATUS "Enabling SSE2 in tests/examples") - endif() - - option(EIGEN_TEST_SSE3 "Enable/Disable SSE3 in tests/examples" OFF) - if(EIGEN_TEST_SSE3) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3") - message(STATUS "Enabling SSE3 in tests/examples") - endif() - - option(EIGEN_TEST_SSSE3 "Enable/Disable SSSE3 in tests/examples" OFF) - if(EIGEN_TEST_SSSE3) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mssse3") - message(STATUS "Enabling SSSE3 in tests/examples") - endif() - - option(EIGEN_TEST_SSE4_1 "Enable/Disable SSE4.1 in tests/examples" OFF) - if(EIGEN_TEST_SSE4_1) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1") - message(STATUS "Enabling SSE4.1 in tests/examples") - endif() - - option(EIGEN_TEST_SSE4_2 "Enable/Disable SSE4.2 in tests/examples" OFF) - if(EIGEN_TEST_SSE4_2) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2") - message(STATUS "Enabling SSE4.2 in tests/examples") - endif() - - option(EIGEN_TEST_AVX "Enable/Disable AVX in tests/examples" OFF) - if(EIGEN_TEST_AVX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx") - message(STATUS "Enabling AVX in tests/examples") - endif() - - option(EIGEN_TEST_FMA "Enable/Disable FMA in tests/examples" OFF) - if(EIGEN_TEST_FMA AND NOT EIGEN_TEST_NEON) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfma") - message(STATUS "Enabling FMA in tests/examples") - endif() - - option(EIGEN_TEST_AVX512 "Enable/Disable AVX512 in tests/examples" OFF) - if(EIGEN_TEST_AVX512) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512f -fabi-version=6 -DEIGEN_ENABLE_AVX512") - message(STATUS "Enabling AVX512 in tests/examples") - endif() - - option(EIGEN_TEST_F16C "Enable/Disable F16C in tests/examples" OFF) - if(EIGEN_TEST_F16C) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mf16c") - message(STATUS "Enabling F16C in tests/examples") - endif() - - option(EIGEN_TEST_ALTIVEC "Enable/Disable AltiVec in tests/examples" OFF) - if(EIGEN_TEST_ALTIVEC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec -mabi=altivec") - message(STATUS "Enabling AltiVec in tests/examples") - endif() - - option(EIGEN_TEST_VSX "Enable/Disable VSX in tests/examples" OFF) - if(EIGEN_TEST_VSX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -mvsx") - message(STATUS "Enabling VSX in tests/examples") - endif() - - option(EIGEN_TEST_NEON "Enable/Disable Neon in tests/examples" OFF) - if(EIGEN_TEST_NEON) - if(EIGEN_TEST_FMA) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon-vfpv4") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon") - endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard") - message(STATUS "Enabling NEON in tests/examples") - endif() - - option(EIGEN_TEST_NEON64 "Enable/Disable Neon in tests/examples" OFF) - if(EIGEN_TEST_NEON64) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - message(STATUS "Enabling NEON in tests/examples") - endif() - - option(EIGEN_TEST_ZVECTOR "Enable/Disable S390X(zEC13) ZVECTOR in tests/examples" OFF) - if(EIGEN_TEST_ZVECTOR) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=z13 -mzvector") - message(STATUS "Enabling S390X(zEC13) ZVECTOR in tests/examples") - endif() - - check_cxx_compiler_flag("-fopenmp" COMPILER_SUPPORT_OPENMP) - if(COMPILER_SUPPORT_OPENMP) - option(EIGEN_TEST_OPENMP "Enable/Disable OpenMP in tests/examples" OFF) - if(EIGEN_TEST_OPENMP) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") - message(STATUS "Enabling OpenMP in tests/examples") - endif() - endif() - -else(NOT MSVC) - - # C4127 - conditional expression is constant - # C4714 - marked as __forceinline not inlined (I failed to deactivate it selectively) - # We can disable this warning in the unit tests since it is clear that it occurs - # because we are oftentimes returning objects that have a destructor or may - # throw exceptions - in particular in the unit tests we are throwing extra many - # exceptions to cover indexing errors. - # C4505 - unreferenced local function has been removed (impossible to deactive selectively) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /wd4127 /wd4505 /wd4714") - - # replace all /Wx by /W4 - string(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - - check_cxx_compiler_flag("/openmp" COMPILER_SUPPORT_OPENMP) - if(COMPILER_SUPPORT_OPENMP) - option(EIGEN_TEST_OPENMP "Enable/Disable OpenMP in tests/examples" OFF) - if(EIGEN_TEST_OPENMP) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp") - message(STATUS "Enabling OpenMP in tests/examples") - endif() - endif() - - option(EIGEN_TEST_SSE2 "Enable/Disable SSE2 in tests/examples" OFF) - if(EIGEN_TEST_SSE2) - if(NOT CMAKE_CL_64) - # arch is not supported on 64 bit systems, SSE is enabled automatically. - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") - endif(NOT CMAKE_CL_64) - message(STATUS "Enabling SSE2 in tests/examples") - endif(EIGEN_TEST_SSE2) -endif(NOT MSVC) - -option(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION "Disable explicit vectorization in tests/examples" OFF) -option(EIGEN_TEST_X87 "Force using X87 instructions. Implies no vectorization." OFF) -option(EIGEN_TEST_32BIT "Force generating 32bit code." OFF) - -if(EIGEN_TEST_X87) - set(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION ON) - if(CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=387") - message(STATUS "Forcing use of x87 instructions in tests/examples") - else() - message(STATUS "EIGEN_TEST_X87 ignored on your compiler") - endif() -endif() - -if(EIGEN_TEST_32BIT) - if(CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") - message(STATUS "Forcing generation of 32-bit code in tests/examples") - else() - message(STATUS "EIGEN_TEST_32BIT ignored on your compiler") - endif() -endif() - -if(EIGEN_TEST_NO_EXPLICIT_VECTORIZATION) - add_definitions(-DEIGEN_DONT_VECTORIZE=1) - message(STATUS "Disabling vectorization in tests/examples") -endif() - -option(EIGEN_TEST_NO_EXPLICIT_ALIGNMENT "Disable explicit alignment (hence vectorization) in tests/examples" OFF) -if(EIGEN_TEST_NO_EXPLICIT_ALIGNMENT) - add_definitions(-DEIGEN_DONT_ALIGN=1) - message(STATUS "Disabling alignment in tests/examples") -endif() - -option(EIGEN_TEST_NO_EXCEPTIONS "Disables C++ exceptions" OFF) -if(EIGEN_TEST_NO_EXCEPTIONS) - ei_add_cxx_compiler_flag("-fno-exceptions") - message(STATUS "Disabling exceptions in tests/examples") -endif() - -option(EIGEN_TEST_CXX11 "Enable testing with C++11 and C++11 features (e.g. Tensor module)." OFF) - -set(EIGEN_CUDA_COMPUTE_ARCH 30 CACHE STRING "The CUDA compute architecture level to target when compiling CUDA code") - -include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) - -# Backward compatibility support for EIGEN_INCLUDE_INSTALL_DIR -if(EIGEN_INCLUDE_INSTALL_DIR) - message(WARNING "EIGEN_INCLUDE_INSTALL_DIR is deprecated. Use INCLUDE_INSTALL_DIR instead.") -endif() - -if(EIGEN_INCLUDE_INSTALL_DIR AND NOT INCLUDE_INSTALL_DIR) - set(INCLUDE_INSTALL_DIR ${EIGEN_INCLUDE_INSTALL_DIR} - CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed") -else() - set(INCLUDE_INSTALL_DIR - "${CMAKE_INSTALL_INCLUDEDIR}/eigen3" - CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where Eigen header files are installed" - ) -endif() -set(CMAKEPACKAGE_INSTALL_DIR - "${CMAKE_INSTALL_DATADIR}/eigen3/cmake" - CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where Eigen3Config.cmake is installed" - ) -set(PKGCONFIG_INSTALL_DIR - "${CMAKE_INSTALL_DATADIR}/pkgconfig" - CACHE PATH "The directory relative to CMAKE_PREFIX_PATH where eigen3.pc is installed" - ) - - -# similar to set_target_properties but append the property instead of overwriting it -macro(ei_add_target_property target prop value) - - get_target_property(previous ${target} ${prop}) - # if the property wasn't previously set, ${previous} is now "previous-NOTFOUND" which cmake allows catching with plain if() - if(NOT previous) - set(previous "") - endif(NOT previous) - set_target_properties(${target} PROPERTIES ${prop} "${previous} ${value}") -endmacro(ei_add_target_property) - -install(FILES - signature_of_eigen3_matrix_library - DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel - ) - -if(EIGEN_BUILD_PKGCONFIG) - configure_file(eigen3.pc.in eigen3.pc @ONLY) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/eigen3.pc - DESTINATION ${PKGCONFIG_INSTALL_DIR} - ) -endif() - -add_subdirectory(Eigen) - -add_subdirectory(doc EXCLUDE_FROM_ALL) - -option(BUILD_TESTING "Enable creation of Eigen tests." ON) -if(BUILD_TESTING) - include(EigenConfigureTesting) - - if(EIGEN_LEAVE_TEST_IN_ALL_TARGET) - add_subdirectory(test) # can't do EXCLUDE_FROM_ALL here, breaks CTest - else() - add_subdirectory(test EXCLUDE_FROM_ALL) - endif() -endif() - -if(EIGEN_LEAVE_TEST_IN_ALL_TARGET) - add_subdirectory(blas) - add_subdirectory(lapack) -else() - add_subdirectory(blas EXCLUDE_FROM_ALL) - add_subdirectory(lapack EXCLUDE_FROM_ALL) -endif() - -# add SYCL -option(EIGEN_TEST_SYCL "Add Sycl support." OFF) -if(EIGEN_TEST_SYCL) - set (CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" "cmake/Modules/" "${CMAKE_MODULE_PATH}") - include(FindComputeCpp) -endif() - -add_subdirectory(unsupported) - -add_subdirectory(demos EXCLUDE_FROM_ALL) - -# must be after test and unsupported, for configuring buildtests.in -add_subdirectory(scripts EXCLUDE_FROM_ALL) - -# TODO: consider also replacing EIGEN_BUILD_BTL by a custom target "make btl"? -if(EIGEN_BUILD_BTL) - add_subdirectory(bench/btl EXCLUDE_FROM_ALL) -endif(EIGEN_BUILD_BTL) - -if(NOT WIN32) - add_subdirectory(bench/spbench EXCLUDE_FROM_ALL) -endif(NOT WIN32) - -configure_file(scripts/cdashtesting.cmake.in cdashtesting.cmake @ONLY) - -if(BUILD_TESTING) - ei_testing_print_summary() -endif() - -message(STATUS "") -message(STATUS "Configured Eigen ${EIGEN_VERSION_NUMBER}") -message(STATUS "") - -option(EIGEN_FAILTEST "Enable failtests." OFF) -if(EIGEN_FAILTEST) - add_subdirectory(failtest) -endif() - -string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_tolower) -if(cmake_generator_tolower MATCHES "makefile") - message(STATUS "Some things you can do now:") - message(STATUS "--------------+--------------------------------------------------------------") - message(STATUS "Command | Description") - message(STATUS "--------------+--------------------------------------------------------------") - message(STATUS "make install | Install Eigen. Headers will be installed to:") - message(STATUS " | /") - message(STATUS " | Using the following values:") - message(STATUS " | CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") - message(STATUS " | INCLUDE_INSTALL_DIR: ${INCLUDE_INSTALL_DIR}") - message(STATUS " | Change the install location of Eigen headers using:") - message(STATUS " | cmake . -DCMAKE_INSTALL_PREFIX=yourprefix") - message(STATUS " | Or:") - message(STATUS " | cmake . -DINCLUDE_INSTALL_DIR=yourdir") - message(STATUS "make doc | Generate the API documentation, requires Doxygen & LaTeX") - message(STATUS "make check | Build and run the unit-tests. Read this page:") - message(STATUS " | http://eigen.tuxfamily.org/index.php?title=Tests") - message(STATUS "make blas | Build BLAS library (not the same thing as Eigen)") - message(STATUS "make uninstall| Removes files installed by make install") - message(STATUS "--------------+--------------------------------------------------------------") -else() - message(STATUS "To build/run the unit tests, read this page:") - message(STATUS " http://eigen.tuxfamily.org/index.php?title=Tests") -endif() - -message(STATUS "") - - -set ( EIGEN_VERSION_STRING ${EIGEN_VERSION_NUMBER} ) -set ( EIGEN_VERSION_MAJOR ${EIGEN_WORLD_VERSION} ) -set ( EIGEN_VERSION_MINOR ${EIGEN_MAJOR_VERSION} ) -set ( EIGEN_VERSION_PATCH ${EIGEN_MINOR_VERSION} ) -set ( EIGEN_DEFINITIONS "") -set ( EIGEN_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_DIR}" ) -set ( EIGEN_ROOT_DIR ${CMAKE_INSTALL_PREFIX} ) - -# Interface libraries require at least CMake 3.0 -if (NOT CMAKE_VERSION VERSION_LESS 3.0) - include (CMakePackageConfigHelpers) - - # Imported target support - add_library (eigen INTERFACE) - - target_compile_definitions (eigen INTERFACE ${EIGEN_DEFINITIONS}) - target_include_directories (eigen INTERFACE - $ - $ - ) - - # Export as title case Eigen - set_target_properties (eigen PROPERTIES EXPORT_NAME Eigen) - - install (TARGETS eigen EXPORT Eigen3Targets) - - configure_package_config_file ( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake - PATH_VARS EIGEN_INCLUDE_DIR EIGEN_ROOT_DIR - INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR} - NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components - ) - # Remove CMAKE_SIZEOF_VOID_P from Eigen3ConfigVersion.cmake since Eigen does - # not depend on architecture specific settings or libraries. More - # specifically, an Eigen3Config.cmake generated from a 64 bit target can be - # used for 32 bit targets as well (and vice versa). - set (_Eigen3_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) - unset (CMAKE_SIZEOF_VOID_P) - write_basic_package_version_file (Eigen3ConfigVersion.cmake - VERSION ${EIGEN_VERSION_NUMBER} - COMPATIBILITY SameMajorVersion) - set (CMAKE_SIZEOF_VOID_P ${_Eigen3_CMAKE_SIZEOF_VOID_P}) - - # The Eigen target will be located in the Eigen3 namespace. Other CMake - # targets can refer to it using Eigen3::Eigen. - export (TARGETS eigen NAMESPACE Eigen3:: FILE Eigen3Targets.cmake) - # Export Eigen3 package to CMake registry such that it can be easily found by - # CMake even if it has not been installed to a standard directory. - export (PACKAGE Eigen3) - - install (EXPORT Eigen3Targets NAMESPACE Eigen3:: DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}) - -else (NOT CMAKE_VERSION VERSION_LESS 3.0) - # Fallback to legacy Eigen3Config.cmake without the imported target - - # If CMakePackageConfigHelpers module is available (CMake >= 2.8.8) - # create a relocatable Config file, otherwise leave the hardcoded paths - include(CMakePackageConfigHelpers OPTIONAL RESULT_VARIABLE CPCH_PATH) - - if(CPCH_PATH) - configure_package_config_file ( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3ConfigLegacy.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake - PATH_VARS EIGEN_INCLUDE_DIR EIGEN_ROOT_DIR - INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR} - NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components - ) - else() - # The PACKAGE_* variables are defined by the configure_package_config_file - # but without it we define them manually to the hardcoded paths - set(PACKAGE_INIT "") - set(PACKAGE_EIGEN_INCLUDE_DIR ${EIGEN_INCLUDE_DIR}) - set(PACKAGE_EIGEN_ROOT_DIR ${EIGEN_ROOT_DIR}) - configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3ConfigLegacy.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake - @ONLY ESCAPE_QUOTES ) - endif() - - write_basic_package_version_file( Eigen3ConfigVersion.cmake - VERSION ${EIGEN_VERSION_NUMBER} - COMPATIBILITY SameMajorVersion ) - -endif (NOT CMAKE_VERSION VERSION_LESS 3.0) - -install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UseEigen3.cmake - ${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/Eigen3ConfigVersion.cmake - DESTINATION ${CMAKEPACKAGE_INSTALL_DIR} ) - -# Add uninstall target -add_custom_target ( uninstall - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/EigenUninstall.cmake) diff --git a/testbed/nanogui/ext/eigen/COPYING.BSD b/testbed/nanogui/ext/eigen/COPYING.BSD deleted file mode 100644 index 11971ffe..00000000 --- a/testbed/nanogui/ext/eigen/COPYING.BSD +++ /dev/null @@ -1,26 +0,0 @@ -/* - Copyright (c) 2011, Intel Corporation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Intel Corporation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/COPYING.GPL b/testbed/nanogui/ext/eigen/COPYING.GPL deleted file mode 100644 index 94a9ed02..00000000 --- a/testbed/nanogui/ext/eigen/COPYING.GPL +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/testbed/nanogui/ext/eigen/COPYING.LGPL b/testbed/nanogui/ext/eigen/COPYING.LGPL deleted file mode 100644 index 4362b491..00000000 --- a/testbed/nanogui/ext/eigen/COPYING.LGPL +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/testbed/nanogui/ext/eigen/COPYING.MINPACK b/testbed/nanogui/ext/eigen/COPYING.MINPACK deleted file mode 100644 index 11d8a9a6..00000000 --- a/testbed/nanogui/ext/eigen/COPYING.MINPACK +++ /dev/null @@ -1,52 +0,0 @@ -Minpack Copyright Notice (1999) University of Chicago. All rights reserved - -Redistribution and use in source and binary forms, with or -without modification, are permitted provided that the -following conditions are met: - -1. Redistributions of source code must retain the above -copyright notice, this list of conditions and the following -disclaimer. - -2. Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following -disclaimer in the documentation and/or other materials -provided with the distribution. - -3. The end-user documentation included with the -redistribution, if any, must include the following -acknowledgment: - - "This product includes software developed by the - University of Chicago, as Operator of Argonne National - Laboratory. - -Alternately, this acknowledgment may appear in the software -itself, if and wherever such third-party acknowledgments -normally appear. - -4. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" -WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE -UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND -THEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE -OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY -OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR -USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF -THE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4) -DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION -UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL -BE CORRECTED. - -5. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT -HOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF -ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT, -INCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF -ANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF -PROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER -SUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT -(INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE, -EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE -POSSIBILITY OF SUCH LOSS OR DAMAGES. - diff --git a/testbed/nanogui/ext/eigen/COPYING.MPL2 b/testbed/nanogui/ext/eigen/COPYING.MPL2 deleted file mode 100644 index 14e2f777..00000000 --- a/testbed/nanogui/ext/eigen/COPYING.MPL2 +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/testbed/nanogui/ext/eigen/COPYING.README b/testbed/nanogui/ext/eigen/COPYING.README deleted file mode 100644 index de5b6321..00000000 --- a/testbed/nanogui/ext/eigen/COPYING.README +++ /dev/null @@ -1,18 +0,0 @@ -Eigen is primarily MPL2 licensed. See COPYING.MPL2 and these links: - http://www.mozilla.org/MPL/2.0/ - http://www.mozilla.org/MPL/2.0/FAQ.html - -Some files contain third-party code under BSD or LGPL licenses, whence the other -COPYING.* files here. - -All the LGPL code is either LGPL 2.1-only, or LGPL 2.1-or-later. -For this reason, the COPYING.LGPL file contains the LGPL 2.1 text. - -If you want to guarantee that the Eigen code that you are #including is licensed -under the MPL2 and possibly more permissive licenses (like BSD), #define this -preprocessor symbol: - EIGEN_MPL2_ONLY -For example, with most compilers, you could add this to your project CXXFLAGS: - -DEIGEN_MPL2_ONLY -This will cause a compilation error to be generated if you #include any code that is -LGPL licensed. diff --git a/testbed/nanogui/ext/eigen/CTestConfig.cmake b/testbed/nanogui/ext/eigen/CTestConfig.cmake deleted file mode 100644 index 4c002782..00000000 --- a/testbed/nanogui/ext/eigen/CTestConfig.cmake +++ /dev/null @@ -1,17 +0,0 @@ -## This file should be placed in the root directory of your project. -## Then modify the CMakeLists.txt file in the root directory of your -## project to incorporate the testing dashboard. -## # The following are required to uses Dart and the Cdash dashboard -## ENABLE_TESTING() -## INCLUDE(CTest) -set(CTEST_PROJECT_NAME "Eigen") -set(CTEST_NIGHTLY_START_TIME "00:00:00 UTC") - -set(CTEST_DROP_METHOD "http") -set(CTEST_DROP_SITE "manao.inria.fr") -set(CTEST_DROP_LOCATION "/CDash/submit.php?project=Eigen") -set(CTEST_DROP_SITE_CDASH TRUE) -set(CTEST_PROJECT_SUBPROJECTS -Official -Unsupported -) diff --git a/testbed/nanogui/ext/eigen/CTestCustom.cmake.in b/testbed/nanogui/ext/eigen/CTestCustom.cmake.in deleted file mode 100644 index 9fed9d32..00000000 --- a/testbed/nanogui/ext/eigen/CTestCustom.cmake.in +++ /dev/null @@ -1,3 +0,0 @@ - -set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS "2000") -set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS "2000") diff --git a/testbed/nanogui/ext/eigen/Eigen/CMakeLists.txt b/testbed/nanogui/ext/eigen/Eigen/CMakeLists.txt deleted file mode 100644 index 9eb502b7..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -include(RegexUtils) -test_escape_string_as_regex() - -file(GLOB Eigen_directory_files "*") - -escape_string_as_regex(ESCAPED_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") - -foreach(f ${Eigen_directory_files}) - if(NOT f MATCHES "\\.txt" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/[.].+" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/src") - list(APPEND Eigen_directory_files_to_install ${f}) - endif() -endforeach(f ${Eigen_directory_files}) - -install(FILES - ${Eigen_directory_files_to_install} - DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen COMPONENT Devel - ) - -install(DIRECTORY src DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen COMPONENT Devel FILES_MATCHING PATTERN "*.h") diff --git a/testbed/nanogui/ext/eigen/Eigen/Cholesky b/testbed/nanogui/ext/eigen/Eigen/Cholesky deleted file mode 100644 index 369d1f5e..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Cholesky +++ /dev/null @@ -1,41 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CHOLESKY_MODULE_H -#define EIGEN_CHOLESKY_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** \defgroup Cholesky_Module Cholesky module - * - * - * - * This module provides two variants of the Cholesky decomposition for selfadjoint (hermitian) matrices. - * Those decompositions are also accessible via the following methods: - * - MatrixBase::llt() - * - MatrixBase::ldlt() - * - SelfAdjointView::llt() - * - SelfAdjointView::ldlt() - * - * \code - * #include - * \endcode - */ - -#include "src/Cholesky/LLT.h" -#include "src/Cholesky/LDLT.h" -#ifdef EIGEN_USE_LAPACKE -#include "src/misc/lapacke.h" -#include "src/Cholesky/LLT_LAPACKE.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_CHOLESKY_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/CholmodSupport b/testbed/nanogui/ext/eigen/Eigen/CholmodSupport deleted file mode 100644 index bed8924d..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/CholmodSupport +++ /dev/null @@ -1,48 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CHOLMODSUPPORT_MODULE_H -#define EIGEN_CHOLMODSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -extern "C" { - #include -} - -/** \ingroup Support_modules - * \defgroup CholmodSupport_Module CholmodSupport module - * - * This module provides an interface to the Cholmod library which is part of the suitesparse package. - * It provides the two following main factorization classes: - * - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization. - * - class CholmodDecomposiiton: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial). - * - * For the sake of completeness, this module also propose the two following classes: - * - class CholmodSimplicialLLT - * - class CholmodSimplicialLDLT - * Note that these classes does not bring any particular advantage compared to the built-in - * SimplicialLLT and SimplicialLDLT factorization classes. - * - * \code - * #include - * \endcode - * - * In order to use this module, the cholmod headers must be accessible from the include paths, and your binary must be linked to the cholmod library and its dependencies. - * The dependencies depend on how cholmod has been compiled. - * For a cmake based project, you can use our FindCholmod.cmake module to help you in this task. - * - */ - -#include "src/CholmodSupport/CholmodSupport.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_CHOLMODSUPPORT_MODULE_H - diff --git a/testbed/nanogui/ext/eigen/Eigen/Core b/testbed/nanogui/ext/eigen/Eigen/Core deleted file mode 100644 index d1883561..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Core +++ /dev/null @@ -1,540 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2007-2011 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CORE_H -#define EIGEN_CORE_H - -// first thing Eigen does: stop the compiler from committing suicide -#include "src/Core/util/DisableStupidWarnings.h" - -// Handle NVCC/CUDA/SYCL -#if defined(__CUDACC__) || defined(__SYCL_DEVICE_ONLY__) - // Do not try asserts on CUDA and SYCL! - #ifndef EIGEN_NO_DEBUG - #define EIGEN_NO_DEBUG - #endif - - #ifdef EIGEN_INTERNAL_DEBUGGING - #undef EIGEN_INTERNAL_DEBUGGING - #endif - - #ifdef EIGEN_EXCEPTIONS - #undef EIGEN_EXCEPTIONS - #endif - - // All functions callable from CUDA code must be qualified with __device__ - #ifdef __CUDACC__ - // Do not try to vectorize on CUDA and SYCL! - #ifndef EIGEN_DONT_VECTORIZE - #define EIGEN_DONT_VECTORIZE - #endif - - #define EIGEN_DEVICE_FUNC __host__ __device__ - // We need math_functions.hpp to ensure that that EIGEN_USING_STD_MATH macro - // works properly on the device side - #include - #else - #define EIGEN_DEVICE_FUNC - #endif -#else - #define EIGEN_DEVICE_FUNC -#endif - -// When compiling CUDA device code with NVCC, pull in math functions from the -// global namespace. In host mode, and when device doee with clang, use the -// std versions. -#if defined(__CUDA_ARCH__) && defined(__NVCC__) - #define EIGEN_USING_STD_MATH(FUNC) using ::FUNC; -#else - #define EIGEN_USING_STD_MATH(FUNC) using std::FUNC; -#endif - -#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(__CUDA_ARCH__) && !defined(EIGEN_EXCEPTIONS) && !defined(EIGEN_USE_SYCL) - #define EIGEN_EXCEPTIONS -#endif - -#ifdef EIGEN_EXCEPTIONS - #include -#endif - -// then include this file where all our macros are defined. It's really important to do it first because -// it's where we do all the alignment settings (platform detection and honoring the user's will if he -// defined e.g. EIGEN_DONT_ALIGN) so it needs to be done before we do anything with vectorization. -#include "src/Core/util/Macros.h" - -// Disable the ipa-cp-clone optimization flag with MinGW 6.x or newer (enabled by default with -O3) -// See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556 for details. -#if EIGEN_COMP_MINGW && EIGEN_GNUC_AT_LEAST(4,6) - #pragma GCC optimize ("-fno-ipa-cp-clone") -#endif - -#include - -// this include file manages BLAS and MKL related macros -// and inclusion of their respective header files -#include "src/Core/util/MKL_support.h" - -// if alignment is disabled, then disable vectorization. Note: EIGEN_MAX_ALIGN_BYTES is the proper check, it takes into -// account both the user's will (EIGEN_MAX_ALIGN_BYTES,EIGEN_DONT_ALIGN) and our own platform checks -#if EIGEN_MAX_ALIGN_BYTES==0 - #ifndef EIGEN_DONT_VECTORIZE - #define EIGEN_DONT_VECTORIZE - #endif -#endif - -#if EIGEN_COMP_MSVC - #include // for _aligned_malloc -- need it regardless of whether vectorization is enabled - #if (EIGEN_COMP_MSVC >= 1500) // 2008 or later - // Remember that usage of defined() in a #define is undefined by the standard. - // a user reported that in 64-bit mode, MSVC doesn't care to define _M_IX86_FP. - #if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || EIGEN_ARCH_x86_64 - #define EIGEN_SSE2_ON_MSVC_2008_OR_LATER - #endif - #endif -#else - // Remember that usage of defined() in a #define is undefined by the standard - #if (defined __SSE2__) && ( (!EIGEN_COMP_GNUC) || EIGEN_COMP_ICC || EIGEN_GNUC_AT_LEAST(4,2) ) - #define EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC - #endif -#endif - -#ifndef EIGEN_DONT_VECTORIZE - - #if defined (EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER) - - // Defines symbols for compile-time detection of which instructions are - // used. - // EIGEN_VECTORIZE_YY is defined if and only if the instruction set YY is used - #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_SSE - #define EIGEN_VECTORIZE_SSE2 - - // Detect sse3/ssse3/sse4: - // gcc and icc defines __SSE3__, ... - // there is no way to know about this on msvc. You can define EIGEN_VECTORIZE_SSE* if you - // want to force the use of those instructions with msvc. - #ifdef __SSE3__ - #define EIGEN_VECTORIZE_SSE3 - #endif - #ifdef __SSSE3__ - #define EIGEN_VECTORIZE_SSSE3 - #endif - #ifdef __SSE4_1__ - #define EIGEN_VECTORIZE_SSE4_1 - #endif - #ifdef __SSE4_2__ - #define EIGEN_VECTORIZE_SSE4_2 - #endif - #ifdef __AVX__ - #define EIGEN_VECTORIZE_AVX - #define EIGEN_VECTORIZE_SSE3 - #define EIGEN_VECTORIZE_SSSE3 - #define EIGEN_VECTORIZE_SSE4_1 - #define EIGEN_VECTORIZE_SSE4_2 - #endif - #ifdef __AVX2__ - #define EIGEN_VECTORIZE_AVX2 - #define EIGEN_VECTORIZE_AVX - #define EIGEN_VECTORIZE_SSE3 - #define EIGEN_VECTORIZE_SSSE3 - #define EIGEN_VECTORIZE_SSE4_1 - #define EIGEN_VECTORIZE_SSE4_2 - #endif - #ifdef __FMA__ - #define EIGEN_VECTORIZE_FMA - #endif - #if defined(__AVX512F__) - #define EIGEN_VECTORIZE_AVX512 - #define EIGEN_VECTORIZE_AVX2 - #define EIGEN_VECTORIZE_AVX - #define EIGEN_VECTORIZE_FMA - #define EIGEN_VECTORIZE_SSE3 - #define EIGEN_VECTORIZE_SSSE3 - #define EIGEN_VECTORIZE_SSE4_1 - #define EIGEN_VECTORIZE_SSE4_2 - #ifdef __AVX512DQ__ - #define EIGEN_VECTORIZE_AVX512DQ - #endif - #endif - - // include files - - // This extern "C" works around a MINGW-w64 compilation issue - // https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354 - // In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do). - // However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations - // with conflicting linkage. The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know; - // so, to avoid compile errors when windows.h is included after Eigen/Core, ensure intrinsics are extern "C" here too. - // notice that since these are C headers, the extern "C" is theoretically needed anyways. - extern "C" { - // In theory we should only include immintrin.h and not the other *mmintrin.h header files directly. - // Doing so triggers some issues with ICC. However old gcc versions seems to not have this file, thus: - #if EIGEN_COMP_ICC >= 1110 - #include - #else - #include - #include - #include - #ifdef EIGEN_VECTORIZE_SSE3 - #include - #endif - #ifdef EIGEN_VECTORIZE_SSSE3 - #include - #endif - #ifdef EIGEN_VECTORIZE_SSE4_1 - #include - #endif - #ifdef EIGEN_VECTORIZE_SSE4_2 - #include - #endif - #if defined(EIGEN_VECTORIZE_AVX) || defined(EIGEN_VECTORIZE_AVX512) - #include - #endif - #endif - } // end extern "C" - #elif defined __VSX__ - #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_VSX - #include - // We need to #undef all these ugly tokens defined in - // => use __vector instead of vector - #undef bool - #undef vector - #undef pixel - #elif defined __ALTIVEC__ - #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_ALTIVEC - #include - // We need to #undef all these ugly tokens defined in - // => use __vector instead of vector - #undef bool - #undef vector - #undef pixel - #elif (defined __ARM_NEON) || (defined __ARM_NEON__) - #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_NEON - #include - #elif (defined __s390x__ && defined __VEC__) - #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_ZVECTOR - #include - #endif -#endif - -#if defined(__F16C__) && !defined(EIGEN_COMP_CLANG) - // We can use the optimized fp16 to float and float to fp16 conversion routines - #define EIGEN_HAS_FP16_C -#endif - -#if defined __CUDACC__ - #define EIGEN_VECTORIZE_CUDA - #include - #if defined __CUDACC_VER__ && __CUDACC_VER__ >= 70500 - #define EIGEN_HAS_CUDA_FP16 - #endif -#endif - -#if defined EIGEN_HAS_CUDA_FP16 - #include - #include -#endif - -#if (defined _OPENMP) && (!defined EIGEN_DONT_PARALLELIZE) - #define EIGEN_HAS_OPENMP -#endif - -#ifdef EIGEN_HAS_OPENMP -#include -#endif - -// MSVC for windows mobile does not have the errno.h file -#if !(EIGEN_COMP_MSVC && EIGEN_OS_WINCE) && !EIGEN_COMP_ARM -#define EIGEN_HAS_ERRNO -#endif - -#ifdef EIGEN_HAS_ERRNO -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // for CHAR_BIT -// for min/max: -#include - -// for std::is_nothrow_move_assignable -#ifdef EIGEN_INCLUDE_TYPE_TRAITS -#include -#endif - -// for outputting debug info -#ifdef EIGEN_DEBUG_ASSIGN -#include -#endif - -// required for __cpuid, needs to be included after cmath -#if EIGEN_COMP_MSVC && EIGEN_ARCH_i386_OR_x86_64 && !EIGEN_OS_WINCE - #include -#endif - -#if defined(__SYCL_DEVICE_ONLY__) - #undef min - #undef max - #undef isnan - #undef isinf - #undef isfinite - #include -#endif - -/** \brief Namespace containing all symbols from the %Eigen library. */ -namespace Eigen { - -inline static const char *SimdInstructionSetsInUse(void) { -#if defined(EIGEN_VECTORIZE_AVX512) - return "AVX512, FMA, AVX2, AVX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2"; -#elif defined(EIGEN_VECTORIZE_AVX) - return "AVX SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2"; -#elif defined(EIGEN_VECTORIZE_SSE4_2) - return "SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2"; -#elif defined(EIGEN_VECTORIZE_SSE4_1) - return "SSE, SSE2, SSE3, SSSE3, SSE4.1"; -#elif defined(EIGEN_VECTORIZE_SSSE3) - return "SSE, SSE2, SSE3, SSSE3"; -#elif defined(EIGEN_VECTORIZE_SSE3) - return "SSE, SSE2, SSE3"; -#elif defined(EIGEN_VECTORIZE_SSE2) - return "SSE, SSE2"; -#elif defined(EIGEN_VECTORIZE_ALTIVEC) - return "AltiVec"; -#elif defined(EIGEN_VECTORIZE_VSX) - return "VSX"; -#elif defined(EIGEN_VECTORIZE_NEON) - return "ARM NEON"; -#elif defined(EIGEN_VECTORIZE_ZVECTOR) - return "S390X ZVECTOR"; -#else - return "None"; -#endif -} - -} // end namespace Eigen - -#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS || defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API || defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS || defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API || defined EIGEN2_SUPPORT -// This will generate an error message: -#error Eigen2-support is only available up to version 3.2. Please go to "http://eigen.tuxfamily.org/index.php?title=Eigen2" for further information -#endif - -namespace Eigen { - -// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to -// ensure QNX/QCC support -using std::size_t; -// gcc 4.6.0 wants std:: for ptrdiff_t -using std::ptrdiff_t; - -} - -/** \defgroup Core_Module Core module - * This is the main module of Eigen providing dense matrix and vector support - * (both fixed and dynamic size) with all the features corresponding to a BLAS library - * and much more... - * - * \code - * #include - * \endcode - */ - -#include "src/Core/util/Constants.h" -#include "src/Core/util/Meta.h" -#include "src/Core/util/ForwardDeclarations.h" -#include "src/Core/util/StaticAssert.h" -#include "src/Core/util/XprHelper.h" -#include "src/Core/util/Memory.h" -#include "src/Core/util/IntegralConstant.h" -#include "src/Core/util/SymbolicIndex.h" - - -#include "src/Core/NumTraits.h" -#include "src/Core/MathFunctions.h" -#include "src/Core/GenericPacketMath.h" -#include "src/Core/MathFunctionsImpl.h" - -#if defined EIGEN_VECTORIZE_AVX512 - #include "src/Core/arch/SSE/PacketMath.h" - #include "src/Core/arch/AVX/PacketMath.h" - #include "src/Core/arch/AVX512/PacketMath.h" - #include "src/Core/arch/SSE/MathFunctions.h" - #include "src/Core/arch/AVX/MathFunctions.h" - #include "src/Core/arch/AVX512/MathFunctions.h" -#elif defined EIGEN_VECTORIZE_AVX - // Use AVX for floats and doubles, SSE for integers - #include "src/Core/arch/SSE/PacketMath.h" - #include "src/Core/arch/SSE/Complex.h" - #include "src/Core/arch/SSE/MathFunctions.h" - #include "src/Core/arch/AVX/PacketMath.h" - #include "src/Core/arch/AVX/MathFunctions.h" - #include "src/Core/arch/AVX/Complex.h" - #include "src/Core/arch/AVX/TypeCasting.h" -#elif defined EIGEN_VECTORIZE_SSE - #include "src/Core/arch/SSE/PacketMath.h" - #include "src/Core/arch/SSE/MathFunctions.h" - #include "src/Core/arch/SSE/Complex.h" - #include "src/Core/arch/SSE/TypeCasting.h" -#elif defined(EIGEN_VECTORIZE_ALTIVEC) || defined(EIGEN_VECTORIZE_VSX) - #include "src/Core/arch/AltiVec/PacketMath.h" - #include "src/Core/arch/AltiVec/MathFunctions.h" - #include "src/Core/arch/AltiVec/Complex.h" -#elif defined EIGEN_VECTORIZE_NEON - #include "src/Core/arch/NEON/PacketMath.h" - #include "src/Core/arch/NEON/MathFunctions.h" - #include "src/Core/arch/NEON/Complex.h" -#elif defined EIGEN_VECTORIZE_ZVECTOR - #include "src/Core/arch/ZVector/PacketMath.h" - #include "src/Core/arch/ZVector/MathFunctions.h" - #include "src/Core/arch/ZVector/Complex.h" -#endif - -// Half float support -#include "src/Core/arch/CUDA/Half.h" -#include "src/Core/arch/CUDA/PacketMathHalf.h" -#include "src/Core/arch/CUDA/TypeCasting.h" - -#if defined EIGEN_VECTORIZE_CUDA - #include "src/Core/arch/CUDA/PacketMath.h" - #include "src/Core/arch/CUDA/MathFunctions.h" -#endif - -#include "src/Core/arch/Default/Settings.h" - -#include "src/Core/functors/TernaryFunctors.h" -#include "src/Core/functors/BinaryFunctors.h" -#include "src/Core/functors/UnaryFunctors.h" -#include "src/Core/functors/NullaryFunctors.h" -#include "src/Core/functors/StlFunctors.h" -#include "src/Core/functors/AssignmentFunctors.h" - -// Specialized functors to enable the processing of complex numbers -// on CUDA devices -#include "src/Core/arch/CUDA/Complex.h" - -#include "src/Core/util/IndexedViewHelper.h" -#include "src/Core/ArithmeticSequence.h" -#include "src/Core/IO.h" -#include "src/Core/DenseCoeffsBase.h" -#include "src/Core/DenseBase.h" -#include "src/Core/MatrixBase.h" -#include "src/Core/EigenBase.h" - -#include "src/Core/Product.h" -#include "src/Core/CoreEvaluators.h" -#include "src/Core/AssignEvaluator.h" - -#ifndef EIGEN_PARSED_BY_DOXYGEN // work around Doxygen bug triggered by Assign.h r814874 - // at least confirmed with Doxygen 1.5.5 and 1.5.6 - #include "src/Core/Assign.h" -#endif - -#include "src/Core/ArrayBase.h" -#include "src/Core/util/BlasUtil.h" -#include "src/Core/DenseStorage.h" -#include "src/Core/NestByValue.h" - -// #include "src/Core/ForceAlignedAccess.h" - -#include "src/Core/ReturnByValue.h" -#include "src/Core/NoAlias.h" -#include "src/Core/PlainObjectBase.h" -#include "src/Core/Matrix.h" -#include "src/Core/Array.h" -#include "src/Core/CwiseTernaryOp.h" -#include "src/Core/CwiseBinaryOp.h" -#include "src/Core/CwiseUnaryOp.h" -#include "src/Core/CwiseNullaryOp.h" -#include "src/Core/CwiseUnaryView.h" -#include "src/Core/SelfCwiseBinaryOp.h" -#include "src/Core/Dot.h" -#include "src/Core/StableNorm.h" -#include "src/Core/Stride.h" -#include "src/Core/MapBase.h" -#include "src/Core/Map.h" -#include "src/Core/Ref.h" -#include "src/Core/Block.h" -#include "src/Core/VectorBlock.h" -#include "src/Core/IndexedView.h" -#include "src/Core/Transpose.h" -#include "src/Core/DiagonalMatrix.h" -#include "src/Core/Diagonal.h" -#include "src/Core/DiagonalProduct.h" -#include "src/Core/Redux.h" -#include "src/Core/Visitor.h" -#include "src/Core/Fuzzy.h" -#include "src/Core/Swap.h" -#include "src/Core/CommaInitializer.h" -#include "src/Core/GeneralProduct.h" -#include "src/Core/Solve.h" -#include "src/Core/Inverse.h" -#include "src/Core/SolverBase.h" -#include "src/Core/PermutationMatrix.h" -#include "src/Core/Transpositions.h" -#include "src/Core/TriangularMatrix.h" -#include "src/Core/SelfAdjointView.h" -#include "src/Core/products/GeneralBlockPanelKernel.h" -#include "src/Core/products/Parallelizer.h" -#include "src/Core/ProductEvaluators.h" -#include "src/Core/products/GeneralMatrixVector.h" -#include "src/Core/products/GeneralMatrixMatrix.h" -#include "src/Core/SolveTriangular.h" -#include "src/Core/products/GeneralMatrixMatrixTriangular.h" -#include "src/Core/products/SelfadjointMatrixVector.h" -#include "src/Core/products/SelfadjointMatrixMatrix.h" -#include "src/Core/products/SelfadjointProduct.h" -#include "src/Core/products/SelfadjointRank2Update.h" -#include "src/Core/products/TriangularMatrixVector.h" -#include "src/Core/products/TriangularMatrixMatrix.h" -#include "src/Core/products/TriangularSolverMatrix.h" -#include "src/Core/products/TriangularSolverVector.h" -#include "src/Core/BandMatrix.h" -#include "src/Core/CoreIterators.h" -#include "src/Core/ConditionEstimator.h" - -#include "src/Core/BooleanRedux.h" -#include "src/Core/Select.h" -#include "src/Core/VectorwiseOp.h" -#include "src/Core/Random.h" -#include "src/Core/Replicate.h" -#include "src/Core/Reverse.h" -#include "src/Core/ArrayWrapper.h" - -#ifdef EIGEN_USE_BLAS -#include "src/Core/products/GeneralMatrixMatrix_BLAS.h" -#include "src/Core/products/GeneralMatrixVector_BLAS.h" -#include "src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h" -#include "src/Core/products/SelfadjointMatrixMatrix_BLAS.h" -#include "src/Core/products/SelfadjointMatrixVector_BLAS.h" -#include "src/Core/products/TriangularMatrixMatrix_BLAS.h" -#include "src/Core/products/TriangularMatrixVector_BLAS.h" -#include "src/Core/products/TriangularSolverMatrix_BLAS.h" -#endif // EIGEN_USE_BLAS - -#ifdef EIGEN_USE_MKL_VML -#include "src/Core/Assign_MKL.h" -#endif - -#include "src/Core/GlobalFunctions.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_CORE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/Dense b/testbed/nanogui/ext/eigen/Eigen/Dense deleted file mode 100644 index 5768910b..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Dense +++ /dev/null @@ -1,7 +0,0 @@ -#include "Core" -#include "LU" -#include "Cholesky" -#include "QR" -#include "SVD" -#include "Geometry" -#include "Eigenvalues" diff --git a/testbed/nanogui/ext/eigen/Eigen/Eigen b/testbed/nanogui/ext/eigen/Eigen/Eigen deleted file mode 100644 index 654c8dc6..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Eigen +++ /dev/null @@ -1,2 +0,0 @@ -#include "Dense" -#include "Sparse" diff --git a/testbed/nanogui/ext/eigen/Eigen/Eigenvalues b/testbed/nanogui/ext/eigen/Eigen/Eigenvalues deleted file mode 100644 index 009e529e..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Eigenvalues +++ /dev/null @@ -1,57 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_EIGENVALUES_MODULE_H -#define EIGEN_EIGENVALUES_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -#include "Cholesky" -#include "Jacobi" -#include "Householder" -#include "LU" -#include "Geometry" - -/** \defgroup Eigenvalues_Module Eigenvalues module - * - * - * - * This module mainly provides various eigenvalue solvers. - * This module also provides some MatrixBase methods, including: - * - MatrixBase::eigenvalues(), - * - MatrixBase::operatorNorm() - * - * \code - * #include - * \endcode - */ - -#include "src/misc/RealSvd2x2.h" -#include "src/Eigenvalues/Tridiagonalization.h" -#include "src/Eigenvalues/RealSchur.h" -#include "src/Eigenvalues/EigenSolver.h" -#include "src/Eigenvalues/SelfAdjointEigenSolver.h" -#include "src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h" -#include "src/Eigenvalues/HessenbergDecomposition.h" -#include "src/Eigenvalues/ComplexSchur.h" -#include "src/Eigenvalues/ComplexEigenSolver.h" -#include "src/Eigenvalues/RealQZ.h" -#include "src/Eigenvalues/GeneralizedEigenSolver.h" -#include "src/Eigenvalues/MatrixBaseEigenvalues.h" -#ifdef EIGEN_USE_LAPACKE -#include "src/misc/lapacke.h" -#include "src/Eigenvalues/RealSchur_LAPACKE.h" -#include "src/Eigenvalues/ComplexSchur_LAPACKE.h" -#include "src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_EIGENVALUES_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/Geometry b/testbed/nanogui/ext/eigen/Eigen/Geometry deleted file mode 100644 index 131a4edf..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Geometry +++ /dev/null @@ -1,61 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GEOMETRY_MODULE_H -#define EIGEN_GEOMETRY_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -#include "SVD" -#include "LU" -#include - -/** \defgroup Geometry_Module Geometry module - * - * This module provides support for: - * - fixed-size homogeneous transformations - * - translation, scaling, 2D and 3D rotations - * - \link Quaternion quaternions \endlink - * - cross products (\ref MatrixBase::cross, \ref MatrixBase::cross3) - * - orthognal vector generation (\ref MatrixBase::unitOrthogonal) - * - some linear components: \link ParametrizedLine parametrized-lines \endlink and \link Hyperplane hyperplanes \endlink - * - \link AlignedBox axis aligned bounding boxes \endlink - * - \link umeyama least-square transformation fitting \endlink - * - * \code - * #include - * \endcode - */ - -#include "src/Geometry/OrthoMethods.h" -#include "src/Geometry/EulerAngles.h" - -#include "src/Geometry/Homogeneous.h" -#include "src/Geometry/RotationBase.h" -#include "src/Geometry/Rotation2D.h" -#include "src/Geometry/Quaternion.h" -#include "src/Geometry/AngleAxis.h" -#include "src/Geometry/Transform.h" -#include "src/Geometry/Translation.h" -#include "src/Geometry/Scaling.h" -#include "src/Geometry/Hyperplane.h" -#include "src/Geometry/ParametrizedLine.h" -#include "src/Geometry/AlignedBox.h" -#include "src/Geometry/Umeyama.h" - -// Use the SSE optimized version whenever possible. At the moment the -// SSE version doesn't compile when AVX is enabled -#if defined EIGEN_VECTORIZE_SSE && !defined EIGEN_VECTORIZE_AVX -#include "src/Geometry/arch/Geometry_SSE.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_GEOMETRY_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/Householder b/testbed/nanogui/ext/eigen/Eigen/Householder deleted file mode 100644 index 89cd81b1..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Householder +++ /dev/null @@ -1,30 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_HOUSEHOLDER_MODULE_H -#define EIGEN_HOUSEHOLDER_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** \defgroup Householder_Module Householder module - * This module provides Householder transformations. - * - * \code - * #include - * \endcode - */ - -#include "src/Householder/Householder.h" -#include "src/Householder/HouseholderSequence.h" -#include "src/Householder/BlockHouseholder.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_HOUSEHOLDER_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/IterativeLinearSolvers b/testbed/nanogui/ext/eigen/Eigen/IterativeLinearSolvers deleted file mode 100644 index 957d5750..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/IterativeLinearSolvers +++ /dev/null @@ -1,48 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H -#define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H - -#include "SparseCore" -#include "OrderingMethods" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** - * \defgroup IterativeLinearSolvers_Module IterativeLinearSolvers module - * - * This module currently provides iterative methods to solve problems of the form \c A \c x = \c b, where \c A is a squared matrix, usually very large and sparse. - * Those solvers are accessible via the following classes: - * - ConjugateGradient for selfadjoint (hermitian) matrices, - * - LeastSquaresConjugateGradient for rectangular least-square problems, - * - BiCGSTAB for general square matrices. - * - * These iterative solvers are associated with some preconditioners: - * - IdentityPreconditioner - not really useful - * - DiagonalPreconditioner - also called Jacobi preconditioner, work very well on diagonal dominant matrices. - * - IncompleteLUT - incomplete LU factorization with dual thresholding - * - * Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport, UmfPackSupport, SuperLUSupport. - * - \code - #include - \endcode - */ - -#include "src/IterativeLinearSolvers/SolveWithGuess.h" -#include "src/IterativeLinearSolvers/IterativeSolverBase.h" -#include "src/IterativeLinearSolvers/BasicPreconditioners.h" -#include "src/IterativeLinearSolvers/ConjugateGradient.h" -#include "src/IterativeLinearSolvers/LeastSquareConjugateGradient.h" -#include "src/IterativeLinearSolvers/BiCGSTAB.h" -#include "src/IterativeLinearSolvers/IncompleteLUT.h" -#include "src/IterativeLinearSolvers/IncompleteCholesky.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_ITERATIVELINEARSOLVERS_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/Jacobi b/testbed/nanogui/ext/eigen/Eigen/Jacobi deleted file mode 100644 index 17c1d785..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Jacobi +++ /dev/null @@ -1,33 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_JACOBI_MODULE_H -#define EIGEN_JACOBI_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** \defgroup Jacobi_Module Jacobi module - * This module provides Jacobi and Givens rotations. - * - * \code - * #include - * \endcode - * - * In addition to listed classes, it defines the two following MatrixBase methods to apply a Jacobi or Givens rotation: - * - MatrixBase::applyOnTheLeft() - * - MatrixBase::applyOnTheRight(). - */ - -#include "src/Jacobi/Jacobi.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_JACOBI_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ - diff --git a/testbed/nanogui/ext/eigen/Eigen/LU b/testbed/nanogui/ext/eigen/Eigen/LU deleted file mode 100644 index 6f6c5562..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/LU +++ /dev/null @@ -1,46 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LU_MODULE_H -#define EIGEN_LU_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** \defgroup LU_Module LU module - * This module includes %LU decomposition and related notions such as matrix inversion and determinant. - * This module defines the following MatrixBase methods: - * - MatrixBase::inverse() - * - MatrixBase::determinant() - * - * \code - * #include - * \endcode - */ - -#include "src/misc/Kernel.h" -#include "src/misc/Image.h" -#include "src/LU/FullPivLU.h" -#include "src/LU/PartialPivLU.h" -#ifdef EIGEN_USE_LAPACKE -#include "src/misc/lapacke.h" -#include "src/LU/PartialPivLU_LAPACKE.h" -#endif -#include "src/LU/Determinant.h" -#include "src/LU/InverseImpl.h" - -// Use the SSE optimized version whenever possible. At the moment the -// SSE version doesn't compile when AVX is enabled -#if defined EIGEN_VECTORIZE_SSE && !defined EIGEN_VECTORIZE_AVX - #include "src/LU/arch/Inverse_SSE.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_LU_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/MetisSupport b/testbed/nanogui/ext/eigen/Eigen/MetisSupport deleted file mode 100644 index 85c41bf3..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/MetisSupport +++ /dev/null @@ -1,35 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_METISSUPPORT_MODULE_H -#define EIGEN_METISSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -extern "C" { -#include -} - - -/** \ingroup Support_modules - * \defgroup MetisSupport_Module MetisSupport module - * - * \code - * #include - * \endcode - * This module defines an interface to the METIS reordering package (http://glaros.dtc.umn.edu/gkhome/views/metis). - * It can be used just as any other built-in method as explained in \link OrderingMethods_Module here. \endlink - */ - - -#include "src/MetisSupport/MetisSupport.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_METISSUPPORT_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/OrderingMethods b/testbed/nanogui/ext/eigen/Eigen/OrderingMethods deleted file mode 100644 index d8ea3619..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/OrderingMethods +++ /dev/null @@ -1,73 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ORDERINGMETHODS_MODULE_H -#define EIGEN_ORDERINGMETHODS_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** - * \defgroup OrderingMethods_Module OrderingMethods module - * - * This module is currently for internal use only - * - * It defines various built-in and external ordering methods for sparse matrices. - * They are typically used to reduce the number of elements during - * the sparse matrix decomposition (LLT, LU, QR). - * Precisely, in a preprocessing step, a permutation matrix P is computed using - * those ordering methods and applied to the columns of the matrix. - * Using for instance the sparse Cholesky decomposition, it is expected that - * the nonzeros elements in LLT(A*P) will be much smaller than that in LLT(A). - * - * - * Usage : - * \code - * #include - * \endcode - * - * A simple usage is as a template parameter in the sparse decomposition classes : - * - * \code - * SparseLU > solver; - * \endcode - * - * \code - * SparseQR > solver; - * \endcode - * - * It is possible as well to call directly a particular ordering method for your own purpose, - * \code - * AMDOrdering ordering; - * PermutationMatrix perm; - * SparseMatrix A; - * //Fill the matrix ... - * - * ordering(A, perm); // Call AMD - * \endcode - * - * \note Some of these methods (like AMD or METIS), need the sparsity pattern - * of the input matrix to be symmetric. When the matrix is structurally unsymmetric, - * Eigen computes internally the pattern of \f$A^T*A\f$ before calling the method. - * If your matrix is already symmetric (at leat in structure), you can avoid that - * by calling the method with a SelfAdjointView type. - * - * \code - * // Call the ordering on the pattern of the lower triangular matrix A - * ordering(A.selfadjointView(), perm); - * \endcode - */ - -#ifndef EIGEN_MPL2_ONLY -#include "src/OrderingMethods/Amd.h" -#endif - -#include "src/OrderingMethods/Ordering.h" -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_ORDERINGMETHODS_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/PaStiXSupport b/testbed/nanogui/ext/eigen/Eigen/PaStiXSupport deleted file mode 100644 index de3a63b4..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/PaStiXSupport +++ /dev/null @@ -1,48 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_PASTIXSUPPORT_MODULE_H -#define EIGEN_PASTIXSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -extern "C" { -#include -#include -} - -#ifdef complex -#undef complex -#endif - -/** \ingroup Support_modules - * \defgroup PaStiXSupport_Module PaStiXSupport module - * - * This module provides an interface to the PaSTiX library. - * PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver. - * It provides the two following main factorization classes: - * - class PastixLLT : a supernodal, parallel LLt Cholesky factorization. - * - class PastixLDLT: a supernodal, parallel LDLt Cholesky factorization. - * - class PastixLU : a supernodal, parallel LU factorization (optimized for a symmetric pattern). - * - * \code - * #include - * \endcode - * - * In order to use this module, the PaSTiX headers must be accessible from the include paths, and your binary must be linked to the PaSTiX library and its dependencies. - * The dependencies depend on how PaSTiX has been compiled. - * For a cmake based project, you can use our FindPaSTiX.cmake module to help you in this task. - * - */ - -#include "src/PaStiXSupport/PaStiXSupport.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_PASTIXSUPPORT_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/PardisoSupport b/testbed/nanogui/ext/eigen/Eigen/PardisoSupport deleted file mode 100644 index 340edf51..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/PardisoSupport +++ /dev/null @@ -1,35 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_PARDISOSUPPORT_MODULE_H -#define EIGEN_PARDISOSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -#include - -/** \ingroup Support_modules - * \defgroup PardisoSupport_Module PardisoSupport module - * - * This module brings support for the Intel(R) MKL PARDISO direct sparse solvers. - * - * \code - * #include - * \endcode - * - * In order to use this module, the MKL headers must be accessible from the include paths, and your binary must be linked to the MKL library and its dependencies. - * See this \ref TopicUsingIntelMKL "page" for more information on MKL-Eigen integration. - * - */ - -#include "src/PardisoSupport/PardisoSupport.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_PARDISOSUPPORT_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/QR b/testbed/nanogui/ext/eigen/Eigen/QR deleted file mode 100644 index 80838e3b..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/QR +++ /dev/null @@ -1,47 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_QR_MODULE_H -#define EIGEN_QR_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -#include "Cholesky" -#include "Jacobi" -#include "Householder" - -/** \defgroup QR_Module QR module - * - * - * - * This module provides various QR decompositions - * This module also provides some MatrixBase methods, including: - * - MatrixBase::householderQr() - * - MatrixBase::colPivHouseholderQr() - * - MatrixBase::fullPivHouseholderQr() - * - * \code - * #include - * \endcode - */ - -#include "src/QR/HouseholderQR.h" -#include "src/QR/FullPivHouseholderQR.h" -#include "src/QR/ColPivHouseholderQR.h" -#include "src/QR/CompleteOrthogonalDecomposition.h" -#ifdef EIGEN_USE_LAPACKE -#include "src/misc/lapacke.h" -#include "src/QR/HouseholderQR_LAPACKE.h" -#include "src/QR/ColPivHouseholderQR_LAPACKE.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_QR_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/QtAlignedMalloc b/testbed/nanogui/ext/eigen/Eigen/QtAlignedMalloc deleted file mode 100644 index c6571f12..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/QtAlignedMalloc +++ /dev/null @@ -1,40 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_QTMALLOC_MODULE_H -#define EIGEN_QTMALLOC_MODULE_H - -#include "Core" - -#if (!EIGEN_MALLOC_ALREADY_ALIGNED) - -#include "src/Core/util/DisableStupidWarnings.h" - -void *qMalloc(std::size_t size) -{ - return Eigen::internal::aligned_malloc(size); -} - -void qFree(void *ptr) -{ - Eigen::internal::aligned_free(ptr); -} - -void *qRealloc(void *ptr, std::size_t size) -{ - void* newPtr = Eigen::internal::aligned_malloc(size); - memcpy(newPtr, ptr, size); - Eigen::internal::aligned_free(ptr); - return newPtr; -} - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif - -#endif // EIGEN_QTMALLOC_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/SPQRSupport b/testbed/nanogui/ext/eigen/Eigen/SPQRSupport deleted file mode 100644 index f70390c1..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SPQRSupport +++ /dev/null @@ -1,34 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SPQRSUPPORT_MODULE_H -#define EIGEN_SPQRSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -#include "SuiteSparseQR.hpp" - -/** \ingroup Support_modules - * \defgroup SPQRSupport_Module SuiteSparseQR module - * - * This module provides an interface to the SPQR library, which is part of the suitesparse package. - * - * \code - * #include - * \endcode - * - * In order to use this module, the SPQR headers must be accessible from the include paths, and your binary must be linked to the SPQR library and its dependencies (Cholmod, AMD, COLAMD,...). - * For a cmake based project, you can use our FindSPQR.cmake and FindCholmod.Cmake modules - * - */ - -#include "src/CholmodSupport/CholmodSupport.h" -#include "src/SPQRSupport/SuiteSparseQRSupport.h" - -#endif diff --git a/testbed/nanogui/ext/eigen/Eigen/SVD b/testbed/nanogui/ext/eigen/Eigen/SVD deleted file mode 100644 index 86143c23..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SVD +++ /dev/null @@ -1,47 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SVD_MODULE_H -#define EIGEN_SVD_MODULE_H - -#include "QR" -#include "Householder" -#include "Jacobi" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** \defgroup SVD_Module SVD module - * - * - * - * This module provides SVD decomposition for matrices (both real and complex). - * Two decomposition algorithms are provided: - * - JacobiSVD implementing two-sided Jacobi iterations is numerically very accurate, fast for small matrices, but very slow for larger ones. - * - BDCSVD implementing a recursive divide & conquer strategy on top of an upper-bidiagonalization which remains fast for large problems. - * These decompositions are accessible via the respective classes and following MatrixBase methods: - * - MatrixBase::jacobiSvd() - * - MatrixBase::bdcSvd() - * - * \code - * #include - * \endcode - */ - -#include "src/misc/RealSvd2x2.h" -#include "src/SVD/UpperBidiagonalization.h" -#include "src/SVD/SVDBase.h" -#include "src/SVD/JacobiSVD.h" -#include "src/SVD/BDCSVD.h" -#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT) -#include "src/misc/lapacke.h" -#include "src/SVD/JacobiSVD_LAPACKE.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_SVD_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/Eigen/Sparse b/testbed/nanogui/ext/eigen/Eigen/Sparse deleted file mode 100644 index 136e681a..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/Sparse +++ /dev/null @@ -1,36 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SPARSE_MODULE_H -#define EIGEN_SPARSE_MODULE_H - -/** \defgroup Sparse_Module Sparse meta-module - * - * Meta-module including all related modules: - * - \ref SparseCore_Module - * - \ref OrderingMethods_Module - * - \ref SparseCholesky_Module - * - \ref SparseLU_Module - * - \ref SparseQR_Module - * - \ref IterativeLinearSolvers_Module - * - \code - #include - \endcode - */ - -#include "SparseCore" -#include "OrderingMethods" -#ifndef EIGEN_MPL2_ONLY -#include "SparseCholesky" -#endif -#include "SparseLU" -#include "SparseQR" -#include "IterativeLinearSolvers" - -#endif // EIGEN_SPARSE_MODULE_H - diff --git a/testbed/nanogui/ext/eigen/Eigen/SparseCholesky b/testbed/nanogui/ext/eigen/Eigen/SparseCholesky deleted file mode 100644 index b6a320c4..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SparseCholesky +++ /dev/null @@ -1,45 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2013 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SPARSECHOLESKY_MODULE_H -#define EIGEN_SPARSECHOLESKY_MODULE_H - -#include "SparseCore" -#include "OrderingMethods" - -#include "src/Core/util/DisableStupidWarnings.h" - -/** - * \defgroup SparseCholesky_Module SparseCholesky module - * - * This module currently provides two variants of the direct sparse Cholesky decomposition for selfadjoint (hermitian) matrices. - * Those decompositions are accessible via the following classes: - * - SimplicialLLt, - * - SimplicialLDLt - * - * Such problems can also be solved using the ConjugateGradient solver from the IterativeLinearSolvers module. - * - * \code - * #include - * \endcode - */ - -#ifdef EIGEN_MPL2_ONLY -#error The SparseCholesky module has nothing to offer in MPL2 only mode -#endif - -#include "src/SparseCholesky/SimplicialCholesky.h" - -#ifndef EIGEN_MPL2_ONLY -#include "src/SparseCholesky/SimplicialCholesky_impl.h" -#endif - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_SPARSECHOLESKY_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/SparseCore b/testbed/nanogui/ext/eigen/Eigen/SparseCore deleted file mode 100644 index 76966c4c..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SparseCore +++ /dev/null @@ -1,69 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SPARSECORE_MODULE_H -#define EIGEN_SPARSECORE_MODULE_H - -#include "Core" - -#include "src/Core/util/DisableStupidWarnings.h" - -#include -#include -#include -#include -#include - -/** - * \defgroup SparseCore_Module SparseCore module - * - * This module provides a sparse matrix representation, and basic associated matrix manipulations - * and operations. - * - * See the \ref TutorialSparse "Sparse tutorial" - * - * \code - * #include - * \endcode - * - * This module depends on: Core. - */ - -#include "src/SparseCore/SparseUtil.h" -#include "src/SparseCore/SparseMatrixBase.h" -#include "src/SparseCore/SparseAssign.h" -#include "src/SparseCore/CompressedStorage.h" -#include "src/SparseCore/AmbiVector.h" -#include "src/SparseCore/SparseCompressedBase.h" -#include "src/SparseCore/SparseMatrix.h" -#include "src/SparseCore/SparseMap.h" -#include "src/SparseCore/MappedSparseMatrix.h" -#include "src/SparseCore/SparseVector.h" -#include "src/SparseCore/SparseRef.h" -#include "src/SparseCore/SparseCwiseUnaryOp.h" -#include "src/SparseCore/SparseCwiseBinaryOp.h" -#include "src/SparseCore/SparseTranspose.h" -#include "src/SparseCore/SparseBlock.h" -#include "src/SparseCore/SparseDot.h" -#include "src/SparseCore/SparseRedux.h" -#include "src/SparseCore/SparseView.h" -#include "src/SparseCore/SparseDiagonalProduct.h" -#include "src/SparseCore/ConservativeSparseSparseProduct.h" -#include "src/SparseCore/SparseSparseProductWithPruning.h" -#include "src/SparseCore/SparseProduct.h" -#include "src/SparseCore/SparseDenseProduct.h" -#include "src/SparseCore/SparseSelfAdjointView.h" -#include "src/SparseCore/SparseTriangularView.h" -#include "src/SparseCore/TriangularSolver.h" -#include "src/SparseCore/SparsePermutation.h" -#include "src/SparseCore/SparseFuzzy.h" -#include "src/SparseCore/SparseSolverBase.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_SPARSECORE_MODULE_H - diff --git a/testbed/nanogui/ext/eigen/Eigen/SparseLU b/testbed/nanogui/ext/eigen/Eigen/SparseLU deleted file mode 100644 index 38b38b53..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SparseLU +++ /dev/null @@ -1,46 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Désiré Nuentsa-Wakam -// Copyright (C) 2012 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SPARSELU_MODULE_H -#define EIGEN_SPARSELU_MODULE_H - -#include "SparseCore" - -/** - * \defgroup SparseLU_Module SparseLU module - * This module defines a supernodal factorization of general sparse matrices. - * The code is fully optimized for supernode-panel updates with specialized kernels. - * Please, see the documentation of the SparseLU class for more details. - */ - -// Ordering interface -#include "OrderingMethods" - -#include "src/SparseLU/SparseLU_gemm_kernel.h" - -#include "src/SparseLU/SparseLU_Structs.h" -#include "src/SparseLU/SparseLU_SupernodalMatrix.h" -#include "src/SparseLU/SparseLUImpl.h" -#include "src/SparseCore/SparseColEtree.h" -#include "src/SparseLU/SparseLU_Memory.h" -#include "src/SparseLU/SparseLU_heap_relax_snode.h" -#include "src/SparseLU/SparseLU_relax_snode.h" -#include "src/SparseLU/SparseLU_pivotL.h" -#include "src/SparseLU/SparseLU_panel_dfs.h" -#include "src/SparseLU/SparseLU_kernel_bmod.h" -#include "src/SparseLU/SparseLU_panel_bmod.h" -#include "src/SparseLU/SparseLU_column_dfs.h" -#include "src/SparseLU/SparseLU_column_bmod.h" -#include "src/SparseLU/SparseLU_copy_to_ucol.h" -#include "src/SparseLU/SparseLU_pruneL.h" -#include "src/SparseLU/SparseLU_Utils.h" -#include "src/SparseLU/SparseLU.h" - -#endif // EIGEN_SPARSELU_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/SparseQR b/testbed/nanogui/ext/eigen/Eigen/SparseQR deleted file mode 100644 index a6f3b7f7..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SparseQR +++ /dev/null @@ -1,37 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SPARSEQR_MODULE_H -#define EIGEN_SPARSEQR_MODULE_H - -#include "SparseCore" -#include "OrderingMethods" -#include "src/Core/util/DisableStupidWarnings.h" - -/** \defgroup SparseQR_Module SparseQR module - * \brief Provides QR decomposition for sparse matrices - * - * This module provides a simplicial version of the left-looking Sparse QR decomposition. - * The columns of the input matrix should be reordered to limit the fill-in during the - * decomposition. Built-in methods (COLAMD, AMD) or external methods (METIS) can be used to this end. - * See the \link OrderingMethods_Module OrderingMethods\endlink module for the list - * of built-in and external ordering methods. - * - * \code - * #include - * \endcode - * - * - */ - -#include "OrderingMethods" -#include "src/SparseCore/SparseColEtree.h" -#include "src/SparseQR/SparseQR.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif diff --git a/testbed/nanogui/ext/eigen/Eigen/StdDeque b/testbed/nanogui/ext/eigen/Eigen/StdDeque deleted file mode 100644 index bc68397b..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/StdDeque +++ /dev/null @@ -1,27 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// Copyright (C) 2009 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_STDDEQUE_MODULE_H -#define EIGEN_STDDEQUE_MODULE_H - -#include "Core" -#include - -#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */ - -#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...) - -#else - -#include "src/StlSupport/StdDeque.h" - -#endif - -#endif // EIGEN_STDDEQUE_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/StdList b/testbed/nanogui/ext/eigen/Eigen/StdList deleted file mode 100644 index 4c6262c0..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/StdList +++ /dev/null @@ -1,26 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_STDLIST_MODULE_H -#define EIGEN_STDLIST_MODULE_H - -#include "Core" -#include - -#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */ - -#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...) - -#else - -#include "src/StlSupport/StdList.h" - -#endif - -#endif // EIGEN_STDLIST_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/StdVector b/testbed/nanogui/ext/eigen/Eigen/StdVector deleted file mode 100644 index 0c4697ad..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/StdVector +++ /dev/null @@ -1,27 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// Copyright (C) 2009 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_STDVECTOR_MODULE_H -#define EIGEN_STDVECTOR_MODULE_H - -#include "Core" -#include - -#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */ - -#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...) - -#else - -#include "src/StlSupport/StdVector.h" - -#endif - -#endif // EIGEN_STDVECTOR_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/SuperLUSupport b/testbed/nanogui/ext/eigen/Eigen/SuperLUSupport deleted file mode 100644 index 59312a82..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/SuperLUSupport +++ /dev/null @@ -1,64 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SUPERLUSUPPORT_MODULE_H -#define EIGEN_SUPERLUSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -#ifdef EMPTY -#define EIGEN_EMPTY_WAS_ALREADY_DEFINED -#endif - -typedef int int_t; -#include -#include -#include - -// slu_util.h defines a preprocessor token named EMPTY which is really polluting, -// so we remove it in favor of a SUPERLU_EMPTY token. -// If EMPTY was already defined then we don't undef it. - -#if defined(EIGEN_EMPTY_WAS_ALREADY_DEFINED) -# undef EIGEN_EMPTY_WAS_ALREADY_DEFINED -#elif defined(EMPTY) -# undef EMPTY -#endif - -#define SUPERLU_EMPTY (-1) - -namespace Eigen { struct SluMatrix; } - -/** \ingroup Support_modules - * \defgroup SuperLUSupport_Module SuperLUSupport module - * - * This module provides an interface to the SuperLU library. - * It provides the following factorization class: - * - class SuperLU: a supernodal sequential LU factorization. - * - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods). - * - * \warning This wrapper requires at least versions 4.0 of SuperLU. The 3.x versions are not supported. - * - * \warning When including this module, you have to use SUPERLU_EMPTY instead of EMPTY which is no longer defined because it is too polluting. - * - * \code - * #include - * \endcode - * - * In order to use this module, the superlu headers must be accessible from the include paths, and your binary must be linked to the superlu library and its dependencies. - * The dependencies depend on how superlu has been compiled. - * For a cmake based project, you can use our FindSuperLU.cmake module to help you in this task. - * - */ - -#include "src/SuperLUSupport/SuperLUSupport.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_SUPERLUSUPPORT_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/UmfPackSupport b/testbed/nanogui/ext/eigen/Eigen/UmfPackSupport deleted file mode 100644 index 00eec808..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/UmfPackSupport +++ /dev/null @@ -1,40 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_UMFPACKSUPPORT_MODULE_H -#define EIGEN_UMFPACKSUPPORT_MODULE_H - -#include "SparseCore" - -#include "src/Core/util/DisableStupidWarnings.h" - -extern "C" { -#include -} - -/** \ingroup Support_modules - * \defgroup UmfPackSupport_Module UmfPackSupport module - * - * This module provides an interface to the UmfPack library which is part of the suitesparse package. - * It provides the following factorization class: - * - class UmfPackLU: a multifrontal sequential LU factorization. - * - * \code - * #include - * \endcode - * - * In order to use this module, the umfpack headers must be accessible from the include paths, and your binary must be linked to the umfpack library and its dependencies. - * The dependencies depend on how umfpack has been compiled. - * For a cmake based project, you can use our FindUmfPack.cmake module to help you in this task. - * - */ - -#include "src/UmfPackSupport/UmfPackSupport.h" - -#include "src/Core/util/ReenableStupidWarnings.h" - -#endif // EIGEN_UMFPACKSUPPORT_MODULE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LDLT.h b/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LDLT.h deleted file mode 100644 index 9b4fdb41..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LDLT.h +++ /dev/null @@ -1,668 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// Copyright (C) 2009 Keir Mierle -// Copyright (C) 2009 Benoit Jacob -// Copyright (C) 2011 Timothy E. Holy -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LDLT_H -#define EIGEN_LDLT_H - -namespace Eigen { - -namespace internal { - template struct LDLT_Traits; - - // PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef - enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite }; -} - -/** \ingroup Cholesky_Module - * - * \class LDLT - * - * \brief Robust Cholesky decomposition of a matrix with pivoting - * - * \tparam _MatrixType the type of the matrix of which to compute the LDL^T Cholesky decomposition - * \tparam _UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper. - * The other triangular part won't be read. - * - * Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite - * matrix \f$ A \f$ such that \f$ A = P^TLDL^*P \f$, where P is a permutation matrix, L - * is lower triangular with a unit diagonal and D is a diagonal matrix. - * - * The decomposition uses pivoting to ensure stability, so that L will have - * zeros in the bottom right rank(A) - n submatrix. Avoiding the square root - * on D also stabilizes the computation. - * - * Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky - * decomposition to determine whether a system of equations has a solution. - * - * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism. - * - * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt(), class LLT - */ -template class LDLT -{ - public: - typedef _MatrixType MatrixType; - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, - UpLo = _UpLo - }; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3 - typedef typename MatrixType::StorageIndex StorageIndex; - typedef Matrix TmpMatrixType; - - typedef Transpositions TranspositionType; - typedef PermutationMatrix PermutationType; - - typedef internal::LDLT_Traits Traits; - - /** \brief Default Constructor. - * - * The default constructor is useful in cases in which the user intends to - * perform decompositions via LDLT::compute(const MatrixType&). - */ - LDLT() - : m_matrix(), - m_transpositions(), - m_sign(internal::ZeroSign), - m_isInitialized(false) - {} - - /** \brief Default Constructor with memory preallocation - * - * Like the default constructor but with preallocation of the internal data - * according to the specified problem \a size. - * \sa LDLT() - */ - explicit LDLT(Index size) - : m_matrix(size, size), - m_transpositions(size), - m_temporary(size), - m_sign(internal::ZeroSign), - m_isInitialized(false) - {} - - /** \brief Constructor with decomposition - * - * This calculates the decomposition for the input \a matrix. - * - * \sa LDLT(Index size) - */ - template - explicit LDLT(const EigenBase& matrix) - : m_matrix(matrix.rows(), matrix.cols()), - m_transpositions(matrix.rows()), - m_temporary(matrix.rows()), - m_sign(internal::ZeroSign), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** \brief Constructs a LDLT factorization from a given matrix - * - * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref. - * - * \sa LDLT(const EigenBase&) - */ - template - explicit LDLT(EigenBase& matrix) - : m_matrix(matrix.derived()), - m_transpositions(matrix.rows()), - m_temporary(matrix.rows()), - m_sign(internal::ZeroSign), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** Clear any existing decomposition - * \sa rankUpdate(w,sigma) - */ - void setZero() - { - m_isInitialized = false; - } - - /** \returns a view of the upper triangular matrix U */ - inline typename Traits::MatrixU matrixU() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return Traits::getU(m_matrix); - } - - /** \returns a view of the lower triangular matrix L */ - inline typename Traits::MatrixL matrixL() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return Traits::getL(m_matrix); - } - - /** \returns the permutation matrix P as a transposition sequence. - */ - inline const TranspositionType& transpositionsP() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_transpositions; - } - - /** \returns the coefficients of the diagonal matrix D */ - inline Diagonal vectorD() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_matrix.diagonal(); - } - - /** \returns true if the matrix is positive (semidefinite) */ - inline bool isPositive() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_sign == internal::PositiveSemiDef || m_sign == internal::ZeroSign; - } - - /** \returns true if the matrix is negative (semidefinite) */ - inline bool isNegative(void) const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign; - } - - /** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A. - * - * This function also supports in-place solves using the syntax x = decompositionObject.solve(x) . - * - * \note_about_checking_solutions - * - * More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$ - * by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$, - * \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then - * \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the - * least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function - * computes the least-square solution of \f$ A x = b \f$ is \f$ A \f$ is singular. - * - * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt() - */ - template - inline const Solve - solve(const MatrixBase& b) const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - eigen_assert(m_matrix.rows()==b.rows() - && "LDLT::solve(): invalid number of rows of the right hand side matrix b"); - return Solve(*this, b.derived()); - } - - template - bool solveInPlace(MatrixBase &bAndX) const; - - template - LDLT& compute(const EigenBase& matrix); - - /** \returns an estimate of the reciprocal condition number of the matrix of - * which \c *this is the LDLT decomposition. - */ - RealScalar rcond() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return internal::rcond_estimate_helper(m_l1_norm, *this); - } - - template - LDLT& rankUpdate(const MatrixBase& w, const RealScalar& alpha=1); - - /** \returns the internal LDLT decomposition matrix - * - * TODO: document the storage layout - */ - inline const MatrixType& matrixLDLT() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_matrix; - } - - MatrixType reconstructedMatrix() const; - - /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint. - * - * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as: - * \code x = decomposition.adjoint().solve(b) \endcode - */ - const LDLT& adjoint() const { return *this; }; - - inline Index rows() const { return m_matrix.rows(); } - inline Index cols() const { return m_matrix.cols(); } - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was succesful, - * \c NumericalIssue if the matrix.appears to be negative. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "LDLT is not initialized."); - return m_info; - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void _solve_impl(const RhsType &rhs, DstType &dst) const; - #endif - - protected: - - static void check_template_parameters() - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); - } - - /** \internal - * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U. - * The strict upper part is used during the decomposition, the strict lower - * part correspond to the coefficients of L (its diagonal is equal to 1 and - * is not stored), and the diagonal entries correspond to D. - */ - MatrixType m_matrix; - RealScalar m_l1_norm; - TranspositionType m_transpositions; - TmpMatrixType m_temporary; - internal::SignMatrix m_sign; - bool m_isInitialized; - ComputationInfo m_info; -}; - -namespace internal { - -template struct ldlt_inplace; - -template<> struct ldlt_inplace -{ - template - static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign) - { - using std::abs; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename TranspositionType::StorageIndex IndexType; - eigen_assert(mat.rows()==mat.cols()); - const Index size = mat.rows(); - bool found_zero_pivot = false; - bool ret = true; - - if (size <= 1) - { - transpositions.setIdentity(); - if (numext::real(mat.coeff(0,0)) > static_cast(0) ) sign = PositiveSemiDef; - else if (numext::real(mat.coeff(0,0)) < static_cast(0)) sign = NegativeSemiDef; - else sign = ZeroSign; - return true; - } - - for (Index k = 0; k < size; ++k) - { - // Find largest diagonal element - Index index_of_biggest_in_corner; - mat.diagonal().tail(size-k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner); - index_of_biggest_in_corner += k; - - transpositions.coeffRef(k) = IndexType(index_of_biggest_in_corner); - if(k != index_of_biggest_in_corner) - { - // apply the transposition while taking care to consider only - // the lower triangular part - Index s = size-index_of_biggest_in_corner-1; // trailing size after the biggest element - mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k)); - mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s)); - std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner)); - for(Index i=k+1;i::IsComplex) - mat.coeffRef(index_of_biggest_in_corner,k) = numext::conj(mat.coeff(index_of_biggest_in_corner,k)); - } - - // partition the matrix: - // A00 | - | - - // lu = A10 | A11 | - - // A20 | A21 | A22 - Index rs = size - k - 1; - Block A21(mat,k+1,k,rs,1); - Block A10(mat,k,0,1,k); - Block A20(mat,k+1,0,rs,k); - - if(k>0) - { - temp.head(k) = mat.diagonal().real().head(k).asDiagonal() * A10.adjoint(); - mat.coeffRef(k,k) -= (A10 * temp.head(k)).value(); - if(rs>0) - A21.noalias() -= A20 * temp.head(k); - } - - // In some previous versions of Eigen (e.g., 3.2.1), the scaling was omitted if the pivot - // was smaller than the cutoff value. However, since LDLT is not rank-revealing - // we should only make sure that we do not introduce INF or NaN values. - // Remark that LAPACK also uses 0 as the cutoff value. - RealScalar realAkk = numext::real(mat.coeffRef(k,k)); - bool pivot_is_valid = (abs(realAkk) > RealScalar(0)); - - if(k==0 && !pivot_is_valid) - { - // The entire diagonal is zero, there is nothing more to do - // except filling the transpositions, and checking whether the matrix is zero. - sign = ZeroSign; - for(Index j = 0; j0) && pivot_is_valid) - A21 /= realAkk; - - if(found_zero_pivot && pivot_is_valid) ret = false; // factorization failed - else if(!pivot_is_valid) found_zero_pivot = true; - - if (sign == PositiveSemiDef) { - if (realAkk < static_cast(0)) sign = Indefinite; - } else if (sign == NegativeSemiDef) { - if (realAkk > static_cast(0)) sign = Indefinite; - } else if (sign == ZeroSign) { - if (realAkk > static_cast(0)) sign = PositiveSemiDef; - else if (realAkk < static_cast(0)) sign = NegativeSemiDef; - } - } - - return ret; - } - - // Reference for the algorithm: Davis and Hager, "Multiple Rank - // Modifications of a Sparse Cholesky Factorization" (Algorithm 1) - // Trivial rearrangements of their computations (Timothy E. Holy) - // allow their algorithm to work for rank-1 updates even if the - // original matrix is not of full rank. - // Here only rank-1 updates are implemented, to reduce the - // requirement for intermediate storage and improve accuracy - template - static bool updateInPlace(MatrixType& mat, MatrixBase& w, const typename MatrixType::RealScalar& sigma=1) - { - using numext::isfinite; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - const Index size = mat.rows(); - eigen_assert(mat.cols() == size && w.size()==size); - - RealScalar alpha = 1; - - // Apply the update - for (Index j = 0; j < size; j++) - { - // Check for termination due to an original decomposition of low-rank - if (!(isfinite)(alpha)) - break; - - // Update the diagonal terms - RealScalar dj = numext::real(mat.coeff(j,j)); - Scalar wj = w.coeff(j); - RealScalar swj2 = sigma*numext::abs2(wj); - RealScalar gamma = dj*alpha + swj2; - - mat.coeffRef(j,j) += swj2/alpha; - alpha += swj2/dj; - - - // Update the terms of L - Index rs = size-j-1; - w.tail(rs) -= wj * mat.col(j).tail(rs); - if(gamma != 0) - mat.col(j).tail(rs) += (sigma*numext::conj(wj)/gamma)*w.tail(rs); - } - return true; - } - - template - static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w, const typename MatrixType::RealScalar& sigma=1) - { - // Apply the permutation to the input w - tmp = transpositions * w; - - return ldlt_inplace::updateInPlace(mat,tmp,sigma); - } -}; - -template<> struct ldlt_inplace -{ - template - static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign) - { - Transpose matt(mat); - return ldlt_inplace::unblocked(matt, transpositions, temp, sign); - } - - template - static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w, const typename MatrixType::RealScalar& sigma=1) - { - Transpose matt(mat); - return ldlt_inplace::update(matt, transpositions, tmp, w.conjugate(), sigma); - } -}; - -template struct LDLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); } -}; - -template struct LDLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); } -}; - -} // end namespace internal - -/** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \a matrix - */ -template -template -LDLT& LDLT::compute(const EigenBase& a) -{ - check_template_parameters(); - - eigen_assert(a.rows()==a.cols()); - const Index size = a.rows(); - - m_matrix = a.derived(); - - // Compute matrix L1 norm = max abs column sum. - m_l1_norm = RealScalar(0); - // TODO move this code to SelfAdjointView - for (Index col = 0; col < size; ++col) { - RealScalar abs_col_sum; - if (_UpLo == Lower) - abs_col_sum = m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>(); - else - abs_col_sum = m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>(); - if (abs_col_sum > m_l1_norm) - m_l1_norm = abs_col_sum; - } - - m_transpositions.resize(size); - m_isInitialized = false; - m_temporary.resize(size); - m_sign = internal::ZeroSign; - - m_info = internal::ldlt_inplace::unblocked(m_matrix, m_transpositions, m_temporary, m_sign) ? Success : NumericalIssue; - - m_isInitialized = true; - return *this; -} - -/** Update the LDLT decomposition: given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T. - * \param w a vector to be incorporated into the decomposition. - * \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column vectors. Optional; default value is +1. - * \sa setZero() - */ -template -template -LDLT& LDLT::rankUpdate(const MatrixBase& w, const typename LDLT::RealScalar& sigma) -{ - typedef typename TranspositionType::StorageIndex IndexType; - const Index size = w.rows(); - if (m_isInitialized) - { - eigen_assert(m_matrix.rows()==size); - } - else - { - m_matrix.resize(size,size); - m_matrix.setZero(); - m_transpositions.resize(size); - for (Index i = 0; i < size; i++) - m_transpositions.coeffRef(i) = IndexType(i); - m_temporary.resize(size); - m_sign = sigma>=0 ? internal::PositiveSemiDef : internal::NegativeSemiDef; - m_isInitialized = true; - } - - internal::ldlt_inplace::update(m_matrix, m_transpositions, m_temporary, w, sigma); - - return *this; -} - -#ifndef EIGEN_PARSED_BY_DOXYGEN -template -template -void LDLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const -{ - eigen_assert(rhs.rows() == rows()); - // dst = P b - dst = m_transpositions * rhs; - - // dst = L^-1 (P b) - matrixL().solveInPlace(dst); - - // dst = D^-1 (L^-1 P b) - // more precisely, use pseudo-inverse of D (see bug 241) - using std::abs; - const typename Diagonal::RealReturnType vecD(vectorD()); - // In some previous versions, tolerance was set to the max of 1/highest and the maximal diagonal entry * epsilon - // as motivated by LAPACK's xGELSS: - // RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits::epsilon(),RealScalar(1) / NumTraits::highest()); - // However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the highest - // diagonal element is not well justified and leads to numerical issues in some cases. - // Moreover, Lapack's xSYTRS routines use 0 for the tolerance. - RealScalar tolerance = RealScalar(1) / NumTraits::highest(); - - for (Index i = 0; i < vecD.size(); ++i) - { - if(abs(vecD(i)) > tolerance) - dst.row(i) /= vecD(i); - else - dst.row(i).setZero(); - } - - // dst = L^-T (D^-1 L^-1 P b) - matrixU().solveInPlace(dst); - - // dst = P^-1 (L^-T D^-1 L^-1 P b) = A^-1 b - dst = m_transpositions.transpose() * dst; -} -#endif - -/** \internal use x = ldlt_object.solve(x); - * - * This is the \em in-place version of solve(). - * - * \param bAndX represents both the right-hand side matrix b and result x. - * - * \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD. - * - * This version avoids a copy when the right hand side matrix b is not - * needed anymore. - * - * \sa LDLT::solve(), MatrixBase::ldlt() - */ -template -template -bool LDLT::solveInPlace(MatrixBase &bAndX) const -{ - eigen_assert(m_isInitialized && "LDLT is not initialized."); - eigen_assert(m_matrix.rows() == bAndX.rows()); - - bAndX = this->solve(bAndX); - - return true; -} - -/** \returns the matrix represented by the decomposition, - * i.e., it returns the product: P^T L D L^* P. - * This function is provided for debug purpose. */ -template -MatrixType LDLT::reconstructedMatrix() const -{ - eigen_assert(m_isInitialized && "LDLT is not initialized."); - const Index size = m_matrix.rows(); - MatrixType res(size,size); - - // P - res.setIdentity(); - res = transpositionsP() * res; - // L^* P - res = matrixU() * res; - // D(L^*P) - res = vectorD().real().asDiagonal() * res; - // L(DL^*P) - res = matrixL() * res; - // P^T (LDL^*P) - res = transpositionsP().transpose() * res; - - return res; -} - -/** \cholesky_module - * \returns the Cholesky decomposition with full pivoting without square root of \c *this - * \sa MatrixBase::ldlt() - */ -template -inline const LDLT::PlainObject, UpLo> -SelfAdjointView::ldlt() const -{ - return LDLT(m_matrix); -} - -/** \cholesky_module - * \returns the Cholesky decomposition with full pivoting without square root of \c *this - * \sa SelfAdjointView::ldlt() - */ -template -inline const LDLT::PlainObject> -MatrixBase::ldlt() const -{ - return LDLT(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_LDLT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LLT.h b/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LLT.h deleted file mode 100644 index e6c02d80..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LLT.h +++ /dev/null @@ -1,533 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LLT_H -#define EIGEN_LLT_H - -namespace Eigen { - -namespace internal{ -template struct LLT_Traits; -} - -/** \ingroup Cholesky_Module - * - * \class LLT - * - * \brief Standard Cholesky decomposition (LL^T) of a matrix and associated features - * - * \tparam _MatrixType the type of the matrix of which we are computing the LL^T Cholesky decomposition - * \tparam _UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper. - * The other triangular part won't be read. - * - * This class performs a LL^T Cholesky decomposition of a symmetric, positive definite - * matrix A such that A = LL^* = U^*U, where L is lower triangular. - * - * While the Cholesky decomposition is particularly useful to solve selfadjoint problems like D^*D x = b, - * for that purpose, we recommend the Cholesky decomposition without square root which is more stable - * and even faster. Nevertheless, this standard Cholesky decomposition remains useful in many other - * situations like generalised eigen problems with hermitian matrices. - * - * Remember that Cholesky decompositions are not rank-revealing. This LLT decomposition is only stable on positive definite matrices, - * use LDLT instead for the semidefinite case. Also, do not use a Cholesky decomposition to determine whether a system of equations - * has a solution. - * - * Example: \include LLT_example.cpp - * Output: \verbinclude LLT_example.out - * - * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism. - * - * \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT - */ - /* HEY THIS DOX IS DISABLED BECAUSE THERE's A BUG EITHER HERE OR IN LDLT ABOUT THAT (OR BOTH) - * Note that during the decomposition, only the upper triangular part of A is considered. Therefore, - * the strict lower part does not have to store correct values. - */ -template class LLT -{ - public: - typedef _MatrixType MatrixType; - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime - }; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3 - typedef typename MatrixType::StorageIndex StorageIndex; - - enum { - PacketSize = internal::packet_traits::size, - AlignmentMask = int(PacketSize)-1, - UpLo = _UpLo - }; - - typedef internal::LLT_Traits Traits; - - /** - * \brief Default Constructor. - * - * The default constructor is useful in cases in which the user intends to - * perform decompositions via LLT::compute(const MatrixType&). - */ - LLT() : m_matrix(), m_isInitialized(false) {} - - /** \brief Default Constructor with memory preallocation - * - * Like the default constructor but with preallocation of the internal data - * according to the specified problem \a size. - * \sa LLT() - */ - explicit LLT(Index size) : m_matrix(size, size), - m_isInitialized(false) {} - - template - explicit LLT(const EigenBase& matrix) - : m_matrix(matrix.rows(), matrix.cols()), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** \brief Constructs a LDLT factorization from a given matrix - * - * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when - * \c MatrixType is a Eigen::Ref. - * - * \sa LLT(const EigenBase&) - */ - template - explicit LLT(EigenBase& matrix) - : m_matrix(matrix.derived()), - m_isInitialized(false) - { - compute(matrix.derived()); - } - - /** \returns a view of the upper triangular matrix U */ - inline typename Traits::MatrixU matrixU() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return Traits::getU(m_matrix); - } - - /** \returns a view of the lower triangular matrix L */ - inline typename Traits::MatrixL matrixL() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return Traits::getL(m_matrix); - } - - /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A. - * - * Since this LLT class assumes anyway that the matrix A is invertible, the solution - * theoretically exists and is unique regardless of b. - * - * Example: \include LLT_solve.cpp - * Output: \verbinclude LLT_solve.out - * - * \sa solveInPlace(), MatrixBase::llt(), SelfAdjointView::llt() - */ - template - inline const Solve - solve(const MatrixBase& b) const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - eigen_assert(m_matrix.rows()==b.rows() - && "LLT::solve(): invalid number of rows of the right hand side matrix b"); - return Solve(*this, b.derived()); - } - - template - void solveInPlace(MatrixBase &bAndX) const; - - template - LLT& compute(const EigenBase& matrix); - - /** \returns an estimate of the reciprocal condition number of the matrix of - * which \c *this is the Cholesky decomposition. - */ - RealScalar rcond() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - eigen_assert(m_info == Success && "LLT failed because matrix appears to be negative"); - return internal::rcond_estimate_helper(m_l1_norm, *this); - } - - /** \returns the LLT decomposition matrix - * - * TODO: document the storage layout - */ - inline const MatrixType& matrixLLT() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return m_matrix; - } - - MatrixType reconstructedMatrix() const; - - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was succesful, - * \c NumericalIssue if the matrix.appears to be negative. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "LLT is not initialized."); - return m_info; - } - - /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint. - * - * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as: - * \code x = decomposition.adjoint().solve(b) \endcode - */ - const LLT& adjoint() const { return *this; }; - - inline Index rows() const { return m_matrix.rows(); } - inline Index cols() const { return m_matrix.cols(); } - - template - LLT rankUpdate(const VectorType& vec, const RealScalar& sigma = 1); - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void _solve_impl(const RhsType &rhs, DstType &dst) const; - #endif - - protected: - - static void check_template_parameters() - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); - } - - /** \internal - * Used to compute and store L - * The strict upper part is not used and even not initialized. - */ - MatrixType m_matrix; - RealScalar m_l1_norm; - bool m_isInitialized; - ComputationInfo m_info; -}; - -namespace internal { - -template struct llt_inplace; - -template -static Index llt_rank_update_lower(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) -{ - using std::sqrt; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename MatrixType::ColXpr ColXpr; - typedef typename internal::remove_all::type ColXprCleaned; - typedef typename ColXprCleaned::SegmentReturnType ColXprSegment; - typedef Matrix TempVectorType; - typedef typename TempVectorType::SegmentReturnType TempVecSegment; - - Index n = mat.cols(); - eigen_assert(mat.rows()==n && vec.size()==n); - - TempVectorType temp; - - if(sigma>0) - { - // This version is based on Givens rotations. - // It is faster than the other one below, but only works for updates, - // i.e., for sigma > 0 - temp = sqrt(sigma) * vec; - - for(Index i=0; i g; - g.makeGivens(mat(i,i), -temp(i), &mat(i,i)); - - Index rs = n-i-1; - if(rs>0) - { - ColXprSegment x(mat.col(i).tail(rs)); - TempVecSegment y(temp.tail(rs)); - apply_rotation_in_the_plane(x, y, g); - } - } - } - else - { - temp = vec; - RealScalar beta = 1; - for(Index j=0; j struct llt_inplace -{ - typedef typename NumTraits::Real RealScalar; - template - static Index unblocked(MatrixType& mat) - { - using std::sqrt; - - eigen_assert(mat.rows()==mat.cols()); - const Index size = mat.rows(); - for(Index k = 0; k < size; ++k) - { - Index rs = size-k-1; // remaining size - - Block A21(mat,k+1,k,rs,1); - Block A10(mat,k,0,1,k); - Block A20(mat,k+1,0,rs,k); - - RealScalar x = numext::real(mat.coeff(k,k)); - if (k>0) x -= A10.squaredNorm(); - if (x<=RealScalar(0)) - return k; - mat.coeffRef(k,k) = x = sqrt(x); - if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint(); - if (rs>0) A21 /= x; - } - return -1; - } - - template - static Index blocked(MatrixType& m) - { - eigen_assert(m.rows()==m.cols()); - Index size = m.rows(); - if(size<32) - return unblocked(m); - - Index blockSize = size/8; - blockSize = (blockSize/16)*16; - blockSize = (std::min)((std::max)(blockSize,Index(8)), Index(128)); - - for (Index k=0; k A11(m,k, k, bs,bs); - Block A21(m,k+bs,k, rs,bs); - Block A22(m,k+bs,k+bs,rs,rs); - - Index ret; - if((ret=unblocked(A11))>=0) return k+ret; - if(rs>0) A11.adjoint().template triangularView().template solveInPlace(A21); - if(rs>0) A22.template selfadjointView().rankUpdate(A21,typename NumTraits::Literal(-1)); // bottleneck - } - return -1; - } - - template - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma) - { - return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); - } -}; - -template struct llt_inplace -{ - typedef typename NumTraits::Real RealScalar; - - template - static EIGEN_STRONG_INLINE Index unblocked(MatrixType& mat) - { - Transpose matt(mat); - return llt_inplace::unblocked(matt); - } - template - static EIGEN_STRONG_INLINE Index blocked(MatrixType& mat) - { - Transpose matt(mat); - return llt_inplace::blocked(matt); - } - template - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma) - { - Transpose matt(mat); - return llt_inplace::rankUpdate(matt, vec.conjugate(), sigma); - } -}; - -template struct LLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); } - static bool inplace_decomposition(MatrixType& m) - { return llt_inplace::blocked(m)==-1; } -}; - -template struct LLT_Traits -{ - typedef const TriangularView MatrixL; - typedef const TriangularView MatrixU; - static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); } - static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); } - static bool inplace_decomposition(MatrixType& m) - { return llt_inplace::blocked(m)==-1; } -}; - -} // end namespace internal - -/** Computes / recomputes the Cholesky decomposition A = LL^* = U^*U of \a matrix - * - * \returns a reference to *this - * - * Example: \include TutorialLinAlgComputeTwice.cpp - * Output: \verbinclude TutorialLinAlgComputeTwice.out - */ -template -template -LLT& LLT::compute(const EigenBase& a) -{ - check_template_parameters(); - - eigen_assert(a.rows()==a.cols()); - const Index size = a.rows(); - m_matrix.resize(size, size); - m_matrix = a.derived(); - - // Compute matrix L1 norm = max abs column sum. - m_l1_norm = RealScalar(0); - // TODO move this code to SelfAdjointView - for (Index col = 0; col < size; ++col) { - RealScalar abs_col_sum; - if (_UpLo == Lower) - abs_col_sum = m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>(); - else - abs_col_sum = m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>(); - if (abs_col_sum > m_l1_norm) - m_l1_norm = abs_col_sum; - } - - m_isInitialized = true; - bool ok = Traits::inplace_decomposition(m_matrix); - m_info = ok ? Success : NumericalIssue; - - return *this; -} - -/** Performs a rank one update (or dowdate) of the current decomposition. - * If A = LL^* before the rank one update, - * then after it we have LL^* = A + sigma * v v^* where \a v must be a vector - * of same dimension. - */ -template -template -LLT<_MatrixType,_UpLo> LLT<_MatrixType,_UpLo>::rankUpdate(const VectorType& v, const RealScalar& sigma) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType); - eigen_assert(v.size()==m_matrix.cols()); - eigen_assert(m_isInitialized); - if(internal::llt_inplace::rankUpdate(m_matrix,v,sigma)>=0) - m_info = NumericalIssue; - else - m_info = Success; - - return *this; -} - -#ifndef EIGEN_PARSED_BY_DOXYGEN -template -template -void LLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const -{ - dst = rhs; - solveInPlace(dst); -} -#endif - -/** \internal use x = llt_object.solve(x); - * - * This is the \em in-place version of solve(). - * - * \param bAndX represents both the right-hand side matrix b and result x. - * - * This version avoids a copy when the right hand side matrix b is not needed anymore. - * - * \sa LLT::solve(), MatrixBase::llt() - */ -template -template -void LLT::solveInPlace(MatrixBase &bAndX) const -{ - eigen_assert(m_isInitialized && "LLT is not initialized."); - eigen_assert(m_matrix.rows()==bAndX.rows()); - matrixL().solveInPlace(bAndX); - matrixU().solveInPlace(bAndX); -} - -/** \returns the matrix represented by the decomposition, - * i.e., it returns the product: L L^*. - * This function is provided for debug purpose. */ -template -MatrixType LLT::reconstructedMatrix() const -{ - eigen_assert(m_isInitialized && "LLT is not initialized."); - return matrixL() * matrixL().adjoint().toDenseMatrix(); -} - -/** \cholesky_module - * \returns the LLT decomposition of \c *this - * \sa SelfAdjointView::llt() - */ -template -inline const LLT::PlainObject> -MatrixBase::llt() const -{ - return LLT(derived()); -} - -/** \cholesky_module - * \returns the LLT decomposition of \c *this - * \sa SelfAdjointView::llt() - */ -template -inline const LLT::PlainObject, UpLo> -SelfAdjointView::llt() const -{ - return LLT(m_matrix); -} - -} // end namespace Eigen - -#endif // EIGEN_LLT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h b/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h deleted file mode 100644 index bc6489e6..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - Copyright (c) 2011, Intel Corporation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Intel Corporation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ******************************************************************************** - * Content : Eigen bindings to LAPACKe - * LLt decomposition based on LAPACKE_?potrf function. - ******************************************************************************** -*/ - -#ifndef EIGEN_LLT_LAPACKE_H -#define EIGEN_LLT_LAPACKE_H - -namespace Eigen { - -namespace internal { - -template struct lapacke_llt; - -#define EIGEN_LAPACKE_LLT(EIGTYPE, BLASTYPE, LAPACKE_PREFIX) \ -template<> struct lapacke_llt \ -{ \ - template \ - static inline Index potrf(MatrixType& m, char uplo) \ - { \ - lapack_int matrix_order; \ - lapack_int size, lda, info, StorageOrder; \ - EIGTYPE* a; \ - eigen_assert(m.rows()==m.cols()); \ - /* Set up parameters for ?potrf */ \ - size = convert_index(m.rows()); \ - StorageOrder = MatrixType::Flags&RowMajorBit?RowMajor:ColMajor; \ - matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \ - a = &(m.coeffRef(0,0)); \ - lda = convert_index(m.outerStride()); \ -\ - info = LAPACKE_##LAPACKE_PREFIX##potrf( matrix_order, uplo, size, (BLASTYPE*)a, lda ); \ - info = (info==0) ? -1 : info>0 ? info-1 : size; \ - return info; \ - } \ -}; \ -template<> struct llt_inplace \ -{ \ - template \ - static Index blocked(MatrixType& m) \ - { \ - return lapacke_llt::potrf(m, 'L'); \ - } \ - template \ - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \ - { return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); } \ -}; \ -template<> struct llt_inplace \ -{ \ - template \ - static Index blocked(MatrixType& m) \ - { \ - return lapacke_llt::potrf(m, 'U'); \ - } \ - template \ - static Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \ - { \ - Transpose matt(mat); \ - return llt_inplace::rankUpdate(matt, vec.conjugate(), sigma); \ - } \ -}; - -EIGEN_LAPACKE_LLT(double, double, d) -EIGEN_LAPACKE_LLT(float, float, s) -EIGEN_LAPACKE_LLT(dcomplex, lapack_complex_double, z) -EIGEN_LAPACKE_LLT(scomplex, lapack_complex_float, c) - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_LLT_LAPACKE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h b/testbed/nanogui/ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h deleted file mode 100644 index 61faf43b..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +++ /dev/null @@ -1,682 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CHOLMODSUPPORT_H -#define EIGEN_CHOLMODSUPPORT_H - -namespace Eigen { - -namespace internal { - -template struct cholmod_configure_matrix; - -template<> struct cholmod_configure_matrix { - template - static void run(CholmodType& mat) { - mat.xtype = CHOLMOD_REAL; - mat.dtype = CHOLMOD_DOUBLE; - } -}; - -template<> struct cholmod_configure_matrix > { - template - static void run(CholmodType& mat) { - mat.xtype = CHOLMOD_COMPLEX; - mat.dtype = CHOLMOD_DOUBLE; - } -}; - -// Other scalar types are not yet supported by Cholmod -// template<> struct cholmod_configure_matrix { -// template -// static void run(CholmodType& mat) { -// mat.xtype = CHOLMOD_REAL; -// mat.dtype = CHOLMOD_SINGLE; -// } -// }; -// -// template<> struct cholmod_configure_matrix > { -// template -// static void run(CholmodType& mat) { -// mat.xtype = CHOLMOD_COMPLEX; -// mat.dtype = CHOLMOD_SINGLE; -// } -// }; - -} // namespace internal - -/** Wraps the Eigen sparse matrix \a mat into a Cholmod sparse matrix object. - * Note that the data are shared. - */ -template -cholmod_sparse viewAsCholmod(Ref > mat) -{ - cholmod_sparse res; - res.nzmax = mat.nonZeros(); - res.nrow = mat.rows(); - res.ncol = mat.cols(); - res.p = mat.outerIndexPtr(); - res.i = mat.innerIndexPtr(); - res.x = mat.valuePtr(); - res.z = 0; - res.sorted = 1; - if(mat.isCompressed()) - { - res.packed = 1; - res.nz = 0; - } - else - { - res.packed = 0; - res.nz = mat.innerNonZeroPtr(); - } - - res.dtype = 0; - res.stype = -1; - - if (internal::is_same<_StorageIndex,int>::value) - { - res.itype = CHOLMOD_INT; - } - else if (internal::is_same<_StorageIndex,long>::value) - { - res.itype = CHOLMOD_LONG; - } - else - { - eigen_assert(false && "Index type not supported yet"); - } - - // setup res.xtype - internal::cholmod_configure_matrix<_Scalar>::run(res); - - res.stype = 0; - - return res; -} - -template -const cholmod_sparse viewAsCholmod(const SparseMatrix<_Scalar,_Options,_Index>& mat) -{ - cholmod_sparse res = viewAsCholmod(Ref >(mat.const_cast_derived())); - return res; -} - -template -const cholmod_sparse viewAsCholmod(const SparseVector<_Scalar,_Options,_Index>& mat) -{ - cholmod_sparse res = viewAsCholmod(Ref >(mat.const_cast_derived())); - return res; -} - -/** Returns a view of the Eigen sparse matrix \a mat as Cholmod sparse matrix. - * The data are not copied but shared. */ -template -cholmod_sparse viewAsCholmod(const SparseSelfAdjointView, UpLo>& mat) -{ - cholmod_sparse res = viewAsCholmod(Ref >(mat.matrix().const_cast_derived())); - - if(UpLo==Upper) res.stype = 1; - if(UpLo==Lower) res.stype = -1; - // swap stype for rowmajor matrices (only works for real matrices) - EIGEN_STATIC_ASSERT((_Options & RowMajorBit) == 0 || NumTraits<_Scalar>::IsComplex == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - if(_Options & RowMajorBit) res.stype *=-1; - - return res; -} - -/** Returns a view of the Eigen \b dense matrix \a mat as Cholmod dense matrix. - * The data are not copied but shared. */ -template -cholmod_dense viewAsCholmod(MatrixBase& mat) -{ - EIGEN_STATIC_ASSERT((internal::traits::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - typedef typename Derived::Scalar Scalar; - - cholmod_dense res; - res.nrow = mat.rows(); - res.ncol = mat.cols(); - res.nzmax = res.nrow * res.ncol; - res.d = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride(); - res.x = (void*)(mat.derived().data()); - res.z = 0; - - internal::cholmod_configure_matrix::run(res); - - return res; -} - -/** Returns a view of the Cholmod sparse matrix \a cm as an Eigen sparse matrix. - * The data are not copied but shared. */ -template -MappedSparseMatrix viewAsEigen(cholmod_sparse& cm) -{ - return MappedSparseMatrix - (cm.nrow, cm.ncol, static_cast(cm.p)[cm.ncol], - static_cast(cm.p), static_cast(cm.i),static_cast(cm.x) ); -} - -namespace internal { - -// template specializations for int and long that call the correct cholmod method - -#define EIGEN_CHOLMOD_SPECIALIZE0(ret, name) \ - template ret cm_ ## name (cholmod_common &Common) { return cholmod_ ## name (&Common); } \ - template<> ret cm_ ## name (cholmod_common &Common) { return cholmod_l_ ## name (&Common); } - -#define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1) \ - template ret cm_ ## name (t1& a1, cholmod_common &Common) { return cholmod_ ## name (&a1, &Common); } \ - template<> ret cm_ ## name (t1& a1, cholmod_common &Common) { return cholmod_l_ ## name (&a1, &Common); } - -EIGEN_CHOLMOD_SPECIALIZE0(int, start) -EIGEN_CHOLMOD_SPECIALIZE0(int, finish) - -EIGEN_CHOLMOD_SPECIALIZE1(int, free_factor, cholmod_factor*, L) -EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense, cholmod_dense*, X) -EIGEN_CHOLMOD_SPECIALIZE1(int, free_sparse, cholmod_sparse*, A) - -EIGEN_CHOLMOD_SPECIALIZE1(cholmod_factor*, analyze, cholmod_sparse, A) - -template cholmod_dense* cm_solve (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_solve (sys, &L, &B, &Common); } -template<> cholmod_dense* cm_solve (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_l_solve (sys, &L, &B, &Common); } - -template cholmod_sparse* cm_spsolve (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_spsolve (sys, &L, &B, &Common); } -template<> cholmod_sparse* cm_spsolve (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_l_spsolve (sys, &L, &B, &Common); } - -template -int cm_factorize_p (cholmod_sparse* A, double beta[2], _StorageIndex* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_factorize_p (A, beta, fset, fsize, L, &Common); } -template<> -int cm_factorize_p (cholmod_sparse* A, double beta[2], long* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_l_factorize_p (A, beta, fset, fsize, L, &Common); } - -#undef EIGEN_CHOLMOD_SPECIALIZE0 -#undef EIGEN_CHOLMOD_SPECIALIZE1 - -} // namespace internal - - -enum CholmodMode { - CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt -}; - - -/** \ingroup CholmodSupport_Module - * \class CholmodBase - * \brief The base class for the direct Cholesky factorization of Cholmod - * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT - */ -template -class CholmodBase : public SparseSolverBase -{ - protected: - typedef SparseSolverBase Base; - using Base::derived; - using Base::m_isInitialized; - public: - typedef _MatrixType MatrixType; - enum { UpLo = _UpLo }; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef MatrixType CholMatrixType; - typedef typename MatrixType::StorageIndex StorageIndex; - enum { - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime - }; - - public: - - CholmodBase() - : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) - { - EIGEN_STATIC_ASSERT((internal::is_same::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY); - m_shiftOffset[0] = m_shiftOffset[1] = 0.0; - internal::cm_start(m_cholmod); - } - - explicit CholmodBase(const MatrixType& matrix) - : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) - { - EIGEN_STATIC_ASSERT((internal::is_same::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY); - m_shiftOffset[0] = m_shiftOffset[1] = 0.0; - internal::cm_start(m_cholmod); - compute(matrix); - } - - ~CholmodBase() - { - if(m_cholmodFactor) - internal::cm_free_factor(m_cholmodFactor, m_cholmod); - internal::cm_finish(m_cholmod); - } - - inline StorageIndex cols() const { return internal::convert_index(m_cholmodFactor->n); } - inline StorageIndex rows() const { return internal::convert_index(m_cholmodFactor->n); } - - /** \brief Reports whether previous computation was successful. - * - * \returns \c Success if computation was successful, - * \c NumericalIssue if the matrix.appears to be negative. - */ - ComputationInfo info() const - { - eigen_assert(m_isInitialized && "Decomposition is not initialized."); - return m_info; - } - - /** Computes the sparse Cholesky decomposition of \a matrix */ - Derived& compute(const MatrixType& matrix) - { - analyzePattern(matrix); - factorize(matrix); - return derived(); - } - - /** Performs a symbolic decomposition on the sparsity pattern of \a matrix. - * - * This function is particularly useful when solving for several problems having the same structure. - * - * \sa factorize() - */ - void analyzePattern(const MatrixType& matrix) - { - if(m_cholmodFactor) - { - internal::cm_free_factor(m_cholmodFactor, m_cholmod); - m_cholmodFactor = 0; - } - cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView()); - m_cholmodFactor = internal::cm_analyze(A, m_cholmod); - - this->m_isInitialized = true; - this->m_info = Success; - m_analysisIsOk = true; - m_factorizationIsOk = false; - } - - /** Performs a numeric decomposition of \a matrix - * - * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed. - * - * \sa analyzePattern() - */ - void factorize(const MatrixType& matrix) - { - eigen_assert(m_analysisIsOk && "You must first call analyzePattern()"); - cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView()); - internal::cm_factorize_p(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod); - - // If the factorization failed, minor is the column at which it did. On success minor == n. - this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue); - m_factorizationIsOk = true; - } - - /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations. - * See the Cholmod user guide for details. */ - cholmod_common& cholmod() { return m_cholmod; } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal */ - template - void _solve_impl(const MatrixBase &b, MatrixBase &dest) const - { - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - const Index size = m_cholmodFactor->n; - EIGEN_UNUSED_VARIABLE(size); - eigen_assert(size==b.rows()); - - // Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref. - Ref > b_ref(b.derived()); - - cholmod_dense b_cd = viewAsCholmod(b_ref); - cholmod_dense* x_cd = internal::cm_solve(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod); - if(!x_cd) - { - this->m_info = NumericalIssue; - return; - } - // TODO optimize this copy by swapping when possible (be careful with alignment, etc.) - // NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve - dest = Matrix::Map(reinterpret_cast(x_cd->x),b.rows(),b.cols()); - internal::cm_free_dense(x_cd, m_cholmod); - } - - /** \internal */ - template - void _solve_impl(const SparseMatrixBase &b, SparseMatrixBase &dest) const - { - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - const Index size = m_cholmodFactor->n; - EIGEN_UNUSED_VARIABLE(size); - eigen_assert(size==b.rows()); - - // note: cs stands for Cholmod Sparse - Ref > b_ref(b.const_cast_derived()); - cholmod_sparse b_cs = viewAsCholmod(b_ref); - cholmod_sparse* x_cs = internal::cm_spsolve(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod); - if(!x_cs) - { - this->m_info = NumericalIssue; - return; - } - // TODO optimize this copy by swapping when possible (be careful with alignment, etc.) - // NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's sparse solver) - dest.derived() = viewAsEigen(*x_cs); - internal::cm_free_sparse(x_cs, m_cholmod); - } - #endif // EIGEN_PARSED_BY_DOXYGEN - - - /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization. - * - * During the numerical factorization, an offset term is added to the diagonal coefficients:\n - * \c d_ii = \a offset + \c d_ii - * - * The default is \a offset=0. - * - * \returns a reference to \c *this. - */ - Derived& setShift(const RealScalar& offset) - { - m_shiftOffset[0] = double(offset); - return derived(); - } - - /** \returns the determinant of the underlying matrix from the current factorization */ - Scalar determinant() const - { - using std::exp; - return exp(logDeterminant()); - } - - /** \returns the log determinant of the underlying matrix from the current factorization */ - Scalar logDeterminant() const - { - using std::log; - using numext::real; - eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()"); - - RealScalar logDet = 0; - Scalar *x = static_cast(m_cholmodFactor->x); - if (m_cholmodFactor->is_super) - { - // Supernodal factorization stored as a packed list of dense column-major blocs, - // as described by the following structure: - - // super[k] == index of the first column of the j-th super node - StorageIndex *super = static_cast(m_cholmodFactor->super); - // pi[k] == offset to the description of row indices - StorageIndex *pi = static_cast(m_cholmodFactor->pi); - // px[k] == offset to the respective dense block - StorageIndex *px = static_cast(m_cholmodFactor->px); - - Index nb_super_nodes = m_cholmodFactor->nsuper; - for (Index k=0; k < nb_super_nodes; ++k) - { - StorageIndex ncols = super[k + 1] - super[k]; - StorageIndex nrows = pi[k + 1] - pi[k]; - - Map, 0, InnerStride<> > sk(x + px[k], ncols, InnerStride<>(nrows+1)); - logDet += sk.real().log().sum(); - } - } - else - { - // Simplicial factorization stored as standard CSC matrix. - StorageIndex *p = static_cast(m_cholmodFactor->p); - Index size = m_cholmodFactor->n; - for (Index k=0; kis_ll) - logDet *= 2.0; - return logDet; - }; - - template - void dumpMemory(Stream& /*s*/) - {} - - protected: - mutable cholmod_common m_cholmod; - cholmod_factor* m_cholmodFactor; - double m_shiftOffset[2]; - mutable ComputationInfo m_info; - int m_factorizationIsOk; - int m_analysisIsOk; -}; - -/** \ingroup CholmodSupport_Module - * \class CholmodSimplicialLLT - * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization - * using the Cholmod library. - * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical interest. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLLT - */ -template -class CholmodSimplicialLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodSimplicialLLT() : Base() { init(); } - - CholmodSimplicialLLT(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodSimplicialLLT() {} - protected: - void init() - { - m_cholmod.final_asis = 0; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - m_cholmod.final_ll = 1; - } -}; - - -/** \ingroup CholmodSupport_Module - * \class CholmodSimplicialLDLT - * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization - * using the Cholmod library. - * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical interest. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLDLT - */ -template -class CholmodSimplicialLDLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodSimplicialLDLT() : Base() { init(); } - - CholmodSimplicialLDLT(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodSimplicialLDLT() {} - protected: - void init() - { - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - } -}; - -/** \ingroup CholmodSupport_Module - * \class CholmodSupernodalLLT - * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization - * using the Cholmod library. - * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM. - * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept - */ -template -class CholmodSupernodalLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodSupernodalLLT() : Base() { init(); } - - CholmodSupernodalLLT(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodSupernodalLLT() {} - protected: - void init() - { - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SUPERNODAL; - } -}; - -/** \ingroup CholmodSupport_Module - * \class CholmodDecomposition - * \brief A general Cholesky factorization and solver based on Cholmod - * - * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization - * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices - * X and B can be either dense or sparse. - * - * This variant permits to change the underlying Cholesky method at runtime. - * On the other hand, it does not provide access to the result of the factorization. - * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization. - * - * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<> - * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower - * or Upper. Default is Lower. - * - * \implsparsesolverconcept - * - * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed. - * - * \warning Only double precision real and complex scalar types are supported by Cholmod. - * - * \sa \ref TutorialSparseSolverConcept - */ -template -class CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecomposition<_MatrixType, _UpLo> > -{ - typedef CholmodBase<_MatrixType, _UpLo, CholmodDecomposition> Base; - using Base::m_cholmod; - - public: - - typedef _MatrixType MatrixType; - - CholmodDecomposition() : Base() { init(); } - - CholmodDecomposition(const MatrixType& matrix) : Base() - { - init(); - this->compute(matrix); - } - - ~CholmodDecomposition() {} - - void setMode(CholmodMode mode) - { - switch(mode) - { - case CholmodAuto: - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_AUTO; - break; - case CholmodSimplicialLLt: - m_cholmod.final_asis = 0; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - m_cholmod.final_ll = 1; - break; - case CholmodSupernodalLLt: - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SUPERNODAL; - break; - case CholmodLDLt: - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_SIMPLICIAL; - break; - default: - break; - } - } - protected: - void init() - { - m_cholmod.final_asis = 1; - m_cholmod.supernodal = CHOLMOD_AUTO; - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CHOLMODSUPPORT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ArithmeticSequence.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ArithmeticSequence.h deleted file mode 100644 index ada1571f..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ArithmeticSequence.h +++ /dev/null @@ -1,350 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARITHMETIC_SEQUENCE_H -#define EIGEN_ARITHMETIC_SEQUENCE_H - -namespace Eigen { - -namespace internal { - -#if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48) -template struct aseq_negate {}; - -template<> struct aseq_negate { - typedef Index type; -}; - -template struct aseq_negate > { - typedef FixedInt<-N> type; -}; - -// Compilation error in the following case: -template<> struct aseq_negate > {}; - -template::value, - bool SizeIsSymbolic =Symbolic::is_symbolic::value> -struct aseq_reverse_first_type { - typedef Index type; -}; - -template -struct aseq_reverse_first_type { - typedef Symbolic::AddExpr > >, - Symbolic::ValueExpr > - > type; -}; - -template -struct aseq_reverse_first_type_aux { - typedef Index type; -}; - -template -struct aseq_reverse_first_type_aux::type> { - typedef FixedInt<(SizeType::value-1)*IncrType::value> type; -}; - -template -struct aseq_reverse_first_type { - typedef typename aseq_reverse_first_type_aux::type Aux; - typedef Symbolic::AddExpr > type; -}; - -template -struct aseq_reverse_first_type { - typedef Symbolic::AddExpr > >, - Symbolic::ValueExpr >, - Symbolic::ValueExpr<> > type; -}; -#endif - -// Helper to cleanup the type of the increment: -template struct cleanup_seq_incr { - typedef typename cleanup_index_type::type type; -}; - -} - -//-------------------------------------------------------------------------------- -// seq(first,last,incr) and seqN(first,size,incr) -//-------------------------------------------------------------------------------- - -template > -class ArithmeticSequence; - -template -ArithmeticSequence::type, - typename internal::cleanup_index_type::type, - typename internal::cleanup_seq_incr::type > -seqN(FirstType first, SizeType size, IncrType incr); - -/** \class ArithmeticSequence - * \ingroup Core_Module - * - * This class represents an arithmetic progression \f$ a_0, a_1, a_2, ..., a_{n-1}\f$ defined by - * its \em first value \f$ a_0 \f$, its \em size (aka length) \em n, and the \em increment (aka stride) - * that is equal to \f$ a_{i+1}-a_{i}\f$ for any \em i. - * - * It is internally used as the return type of the Eigen::seq and Eigen::seqN functions, and as the input arguments - * of DenseBase::operator()(const RowIndices&, const ColIndices&), and most of the time this is the - * only way it is used. - * - * \tparam FirstType type of the first element, usually an Index, - * but internally it can be a symbolic expression - * \tparam SizeType type representing the size of the sequence, usually an Index - * or a compile time integral constant. Internally, it can also be a symbolic expression - * \tparam IncrType type of the increment, can be a runtime Index, or a compile time integral constant (default is compile-time 1) - * - * \sa Eigen::seq, Eigen::seqN, DenseBase::operator()(const RowIndices&, const ColIndices&), class IndexedView - */ -template -class ArithmeticSequence -{ -public: - ArithmeticSequence(FirstType first, SizeType size) : m_first(first), m_size(size) {} - ArithmeticSequence(FirstType first, SizeType size, IncrType incr) : m_first(first), m_size(size), m_incr(incr) {} - - enum { - SizeAtCompileTime = internal::get_fixed_value::value, - IncrAtCompileTime = internal::get_fixed_value::value - }; - - /** \returns the size, i.e., number of elements, of the sequence */ - Index size() const { return m_size; } - - /** \returns the first element \f$ a_0 \f$ in the sequence */ - Index first() const { return m_first; } - - /** \returns the value \f$ a_i \f$ at index \a i in the sequence. */ - Index operator[](Index i) const { return m_first + i * m_incr; } - - const FirstType& firstObject() const { return m_first; } - const SizeType& sizeObject() const { return m_size; } - const IncrType& incrObject() const { return m_incr; } - -protected: - FirstType m_first; - SizeType m_size; - IncrType m_incr; - -public: - -#if EIGEN_HAS_CXX11 && ((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48) - auto reverse() const -> decltype(Eigen::seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr)) { - return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr); - } -#else -protected: - typedef typename internal::aseq_negate::type ReverseIncrType; - typedef typename internal::aseq_reverse_first_type::type ReverseFirstType; -public: - ArithmeticSequence - reverse() const { - return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr); - } -#endif -}; - -/** \returns an ArithmeticSequence starting at \a first, of length \a size, and increment \a incr - * - * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) */ -template -ArithmeticSequence::type,typename internal::cleanup_index_type::type,typename internal::cleanup_seq_incr::type > -seqN(FirstType first, SizeType size, IncrType incr) { - return ArithmeticSequence::type,typename internal::cleanup_index_type::type,typename internal::cleanup_seq_incr::type>(first,size,incr); -} - -/** \returns an ArithmeticSequence starting at \a first, of length \a size, and unit increment - * - * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType) */ -template -ArithmeticSequence::type,typename internal::cleanup_index_type::type > -seqN(FirstType first, SizeType size) { - return ArithmeticSequence::type,typename internal::cleanup_index_type::type>(first,size); -} - -#ifdef EIGEN_PARSED_BY_DOXYGEN - -/** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and with positive (or negative) increment \a incr - * - * It is essentially an alias to: - * \code - * seqN(f, (l-f+incr)/incr, incr); - * \endcode - * - * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType) - */ -template -auto seq(FirstType f, LastType l, IncrType incr); - -/** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and unit increment - * - * It is essentially an alias to: - * \code - * seqN(f,l-f+1); - * \endcode - * - * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) - */ -template -auto seq(FirstType f, LastType l); - -#else // EIGEN_PARSED_BY_DOXYGEN - -#if EIGEN_HAS_CXX11 -template -auto seq(FirstType f, LastType l) -> decltype(seqN(typename internal::cleanup_index_type::type(f), - ( typename internal::cleanup_index_type::type(l) - - typename internal::cleanup_index_type::type(f)+fix<1>()))) -{ - return seqN(typename internal::cleanup_index_type::type(f), - (typename internal::cleanup_index_type::type(l) - -typename internal::cleanup_index_type::type(f)+fix<1>())); -} - -template -auto seq(FirstType f, LastType l, IncrType incr) - -> decltype(seqN(typename internal::cleanup_index_type::type(f), - ( typename internal::cleanup_index_type::type(l) - - typename internal::cleanup_index_type::type(f)+typename internal::cleanup_seq_incr::type(incr) - ) / typename internal::cleanup_seq_incr::type(incr), - typename internal::cleanup_seq_incr::type(incr))) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(typename internal::cleanup_index_type::type(f), - ( typename internal::cleanup_index_type::type(l) - -typename internal::cleanup_index_type::type(f)+CleanedIncrType(incr)) / CleanedIncrType(incr), - CleanedIncrType(incr)); -} -#else - -template -typename internal::enable_if::value || Symbolic::is_symbolic::value), - ArithmeticSequence::type,Index> >::type -seq(FirstType f, LastType l) -{ - return seqN(typename internal::cleanup_index_type::type(f), - Index((typename internal::cleanup_index_type::type(l)-typename internal::cleanup_index_type::type(f)+fix<1>()))); -} - -template -typename internal::enable_if::value, - ArithmeticSequence,Symbolic::ValueExpr<> >, - Symbolic::ValueExpr > > > >::type -seq(const Symbolic::BaseExpr &f, LastType l) -{ - return seqN(f.derived(),(typename internal::cleanup_index_type::type(l)-f.derived()+fix<1>())); -} - -template -typename internal::enable_if::value, - ArithmeticSequence::type, - Symbolic::AddExpr >, - Symbolic::ValueExpr > > > >::type -seq(FirstType f, const Symbolic::BaseExpr &l) -{ - return seqN(typename internal::cleanup_index_type::type(f),(l.derived()-typename internal::cleanup_index_type::type(f)+fix<1>())); -} - -template -ArithmeticSequence >,Symbolic::ValueExpr > > > -seq(const Symbolic::BaseExpr &f, const Symbolic::BaseExpr &l) -{ - return seqN(f.derived(),(l.derived()-f.derived()+fix<1>())); -} - - -template -typename internal::enable_if::value || Symbolic::is_symbolic::value), - ArithmeticSequence::type,Index,typename internal::cleanup_seq_incr::type> >::type -seq(FirstType f, LastType l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(typename internal::cleanup_index_type::type(f), - Index((typename internal::cleanup_index_type::type(l)-typename internal::cleanup_index_type::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr)), incr); -} - -template -typename internal::enable_if::value, - ArithmeticSequence, - Symbolic::ValueExpr<> >, - Symbolic::ValueExpr::type> >, - Symbolic::ValueExpr::type> >, - typename internal::cleanup_seq_incr::type> >::type -seq(const Symbolic::BaseExpr &f, LastType l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(f.derived(),(typename internal::cleanup_index_type::type(l)-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr); -} - -template -typename internal::enable_if::value, - ArithmeticSequence::type, - Symbolic::QuotientExpr >, - Symbolic::ValueExpr::type> >, - Symbolic::ValueExpr::type> >, - typename internal::cleanup_seq_incr::type> >::type -seq(FirstType f, const Symbolic::BaseExpr &l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(typename internal::cleanup_index_type::type(f), - (l.derived()-typename internal::cleanup_index_type::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr), incr); -} - -template -ArithmeticSequence >, - Symbolic::ValueExpr::type> >, - Symbolic::ValueExpr::type> >, - typename internal::cleanup_seq_incr::type> -seq(const Symbolic::BaseExpr &f, const Symbolic::BaseExpr &l, IncrType incr) -{ - typedef typename internal::cleanup_seq_incr::type CleanedIncrType; - return seqN(f.derived(),(l.derived()-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr); -} -#endif - -#endif // EIGEN_PARSED_BY_DOXYGEN - -namespace internal { - -// Convert a symbolic span into a usable one (i.e., remove last/end "keywords") -template -struct make_size_type { - typedef typename internal::conditional::value, Index, T>::type type; -}; - -template -struct IndexedViewCompatibleType, XprSize> { - typedef ArithmeticSequence::type,IncrType> type; -}; - -template -ArithmeticSequence::type,IncrType> -makeIndexedViewCompatible(const ArithmeticSequence& ids, Index size,SpecializedType) { - return ArithmeticSequence::type,IncrType>( - eval_expr_given_size(ids.firstObject(),size),eval_expr_given_size(ids.sizeObject(),size),ids.incrObject()); -} - -template -struct get_compile_time_incr > { - enum { value = get_fixed_value::value }; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_ARITHMETIC_SEQUENCE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Array.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Array.h deleted file mode 100644 index 0d34269f..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Array.h +++ /dev/null @@ -1,325 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARRAY_H -#define EIGEN_ARRAY_H - -namespace Eigen { - -namespace internal { -template -struct traits > : traits > -{ - typedef ArrayXpr XprKind; - typedef ArrayBase > XprBase; -}; -} - -/** \class Array - * \ingroup Core_Module - * - * \brief General-purpose arrays with easy API for coefficient-wise operations - * - * The %Array class is very similar to the Matrix class. It provides - * general-purpose one- and two-dimensional arrays. The difference between the - * %Array and the %Matrix class is primarily in the API: the API for the - * %Array class provides easy access to coefficient-wise operations, while the - * API for the %Matrix class provides easy access to linear-algebra - * operations. - * - * See documentation of class Matrix for detailed information on the template parameters - * storage layout. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAY_PLUGIN. - * - * \sa \blank \ref TutorialArrayClass, \ref TopicClassHierarchy - */ -template -class Array - : public PlainObjectBase > -{ - public: - - typedef PlainObjectBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Array) - - enum { Options = _Options }; - typedef typename Base::PlainObject PlainObject; - - protected: - template - friend struct internal::conservative_resize_like_impl; - - using Base::m_storage; - - public: - - using Base::base; - using Base::coeff; - using Base::coeffRef; - - /** - * The usage of - * using Base::operator=; - * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped - * the usage of 'using'. This should be done only for operator=. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const EigenBase &other) - { - return Base::operator=(other); - } - - /** Set all the entries to \a value. - * \sa DenseBase::setConstant(), DenseBase::fill() - */ - /* This overload is needed because the usage of - * using Base::operator=; - * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped - * the usage of 'using'. This should be done only for operator=. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const Scalar &value) - { - Base::setConstant(value); - return *this; - } - - /** Copies the value of the expression \a other into \c *this with automatic resizing. - * - * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), - * it will be initialized. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const DenseBase& other) - { - return Base::_set(other); - } - - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array& operator=(const Array& other) - { - return Base::_set(other); - } - - /** Default constructor. - * - * For fixed-size matrices, does nothing. - * - * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix - * is called a null matrix. This constructor is the unique way to create null matrices: resizing - * a matrix to 0 is not supported. - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array() : Base() - { - Base::_check_template_params(); - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - -#ifndef EIGEN_PARSED_BY_DOXYGEN - // FIXME is it still needed ?? - /** \internal */ - EIGEN_DEVICE_FUNC - Array(internal::constructor_without_unaligned_array_assert) - : Base(internal::constructor_without_unaligned_array_assert()) - { - Base::_check_template_params(); - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } -#endif - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - Array(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible::value) - : Base(std::move(other)) - { - Base::_check_template_params(); - if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic) - Base::_set_noalias(other); - } - EIGEN_DEVICE_FUNC - Array& operator=(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable::value) - { - other.swap(*this); - return *this; - } -#endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit Array(const T& x) - { - Base::_check_template_params(); - Base::template _init1(x); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1) - { - Base::_check_template_params(); - this->template _init2(val0, val1); - } - #else - /** \brief Constructs a fixed-sized array initialized with coefficients starting at \a data */ - EIGEN_DEVICE_FUNC explicit Array(const Scalar *data); - /** Constructs a vector or row-vector with given dimension. \only_for_vectors - * - * Note that this is only useful for dynamic-size vectors. For fixed-size vectors, - * it is redundant to pass the dimension here, so it makes more sense to use the default - * constructor Array() instead. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit Array(Index dim); - /** constructs an initialized 1x1 Array with the given coefficient */ - Array(const Scalar& value); - /** constructs an uninitialized array with \a rows rows and \a cols columns. - * - * This is useful for dynamic-size arrays. For fixed-size arrays, - * it is redundant to pass these parameters, so one should use the default constructor - * Array() instead. */ - Array(Index rows, Index cols); - /** constructs an initialized 2D vector with given coefficients */ - Array(const Scalar& val0, const Scalar& val1); - #endif - - /** constructs an initialized 3D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3) - m_storage.data()[0] = val0; - m_storage.data()[1] = val1; - m_storage.data()[2] = val2; - } - /** constructs an initialized 4D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2, const Scalar& val3) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4) - m_storage.data()[0] = val0; - m_storage.data()[1] = val1; - m_storage.data()[2] = val2; - m_storage.data()[3] = val3; - } - - /** Copy constructor */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const Array& other) - : Base(other) - { } - - /** \sa MatrixBase::operator=(const EigenBase&) */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Array(const EigenBase &other) - : Base(other.derived()) - { } - - EIGEN_DEVICE_FUNC inline Index innerStride() const { return 1; } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return this->innerSize(); } - - #ifdef EIGEN_ARRAY_PLUGIN - #include EIGEN_ARRAY_PLUGIN - #endif - - private: - - template - friend struct internal::matrix_swap_impl; -}; - -/** \defgroup arraytypedefs Global array typedefs - * \ingroup Core_Module - * - * Eigen defines several typedef shortcuts for most common 1D and 2D array types. - * - * The general patterns are the following: - * - * \c ArrayRowsColsType where \c Rows and \c Cols can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size, - * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd - * for complex double. - * - * For example, \c Array33d is a fixed-size 3x3 array type of doubles, and \c ArrayXXf is a dynamic-size matrix of floats. - * - * There are also \c ArraySizeType which are self-explanatory. For example, \c Array4cf is - * a fixed-size 1D array of 4 complex floats. - * - * \sa class Array - */ - -#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##SizeSuffix##SizeSuffix##TypeSuffix; \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##SizeSuffix##TypeSuffix; - -#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##Size##X##TypeSuffix; \ -/** \ingroup arraytypedefs */ \ -typedef Array Array##X##Size##TypeSuffix; - -#define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \ -EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ -EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ -EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ -EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4) - -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int, i) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float, f) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double, d) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex, cf) -EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex, cd) - -#undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES -#undef EIGEN_MAKE_ARRAY_TYPEDEFS - -#undef EIGEN_MAKE_ARRAY_TYPEDEFS_LARGE - -#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \ -using Eigen::Matrix##SizeSuffix##TypeSuffix; \ -using Eigen::Vector##SizeSuffix##TypeSuffix; \ -using Eigen::RowVector##SizeSuffix##TypeSuffix; - -#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \ - -#define EIGEN_USING_ARRAY_TYPEDEFS \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \ -EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd) - -} // end namespace Eigen - -#endif // EIGEN_ARRAY_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ArrayBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ArrayBase.h deleted file mode 100644 index 9da960f0..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ArrayBase.h +++ /dev/null @@ -1,226 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARRAYBASE_H -#define EIGEN_ARRAYBASE_H - -namespace Eigen { - -template class MatrixWrapper; - -/** \class ArrayBase - * \ingroup Core_Module - * - * \brief Base class for all 1D and 2D array, and related expressions - * - * An array is similar to a dense vector or matrix. While matrices are mathematical - * objects with well defined linear algebra operators, an array is just a collection - * of scalar values arranged in a one or two dimensionnal fashion. As the main consequence, - * all operations applied to an array are performed coefficient wise. Furthermore, - * arrays support scalar math functions of the c++ standard library (e.g., std::sin(x)), and convenient - * constructors allowing to easily write generic code working for both scalar values - * and arrays. - * - * This class is the base that is inherited by all array expression types. - * - * \tparam Derived is the derived type, e.g., an array or an expression type. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAYBASE_PLUGIN. - * - * \sa class MatrixBase, \ref TopicClassHierarchy - */ -template class ArrayBase - : public DenseBase -{ - public: -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** The base class for a given storage type. */ - typedef ArrayBase StorageBaseType; - - typedef ArrayBase Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - - typedef DenseBase Base; - using Base::RowsAtCompileTime; - using Base::ColsAtCompileTime; - using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - - using Base::derived; - using Base::const_cast_derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - using Base::lazyAssign; - using Base::operator-; - using Base::operator=; - using Base::operator+=; - using Base::operator-=; - using Base::operator*=; - using Base::operator/=; - - typedef typename Base::CoeffReturnType CoeffReturnType; - -#endif // not EIGEN_PARSED_BY_DOXYGEN - -#ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Base::PlainObject PlainObject; - - /** \internal Represents a matrix with all coefficients equal to one another*/ - typedef CwiseNullaryOp,PlainObject> ConstantReturnType; -#endif // not EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::ArrayBase -#define EIGEN_DOC_UNARY_ADDONS(X,Y) -# include "../plugins/MatrixCwiseUnaryOps.h" -# include "../plugins/ArrayCwiseUnaryOps.h" -# include "../plugins/CommonCwiseBinaryOps.h" -# include "../plugins/MatrixCwiseBinaryOps.h" -# include "../plugins/ArrayCwiseBinaryOps.h" -# ifdef EIGEN_ARRAYBASE_PLUGIN -# include EIGEN_ARRAYBASE_PLUGIN -# endif -#undef EIGEN_CURRENT_STORAGE_BASE_CLASS -#undef EIGEN_DOC_UNARY_ADDONS - - /** Special case of the template operator=, in order to prevent the compiler - * from generating a default operator= (issue hit with g++ 4.1) - */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const ArrayBase& other) - { - internal::call_assignment(derived(), other.derived()); - return derived(); - } - - /** Set all the entries to \a value. - * \sa DenseBase::setConstant(), DenseBase::fill() */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const Scalar &value) - { Base::setConstant(value); return derived(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const Scalar& scalar); - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const Scalar& scalar); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const ArrayBase& other); - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const ArrayBase& other); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator*=(const ArrayBase& other); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator/=(const ArrayBase& other); - - public: - EIGEN_DEVICE_FUNC - ArrayBase& array() { return *this; } - EIGEN_DEVICE_FUNC - const ArrayBase& array() const { return *this; } - - /** \returns an \link Eigen::MatrixBase Matrix \endlink expression of this array - * \sa MatrixBase::array() */ - EIGEN_DEVICE_FUNC - MatrixWrapper matrix() { return MatrixWrapper(derived()); } - EIGEN_DEVICE_FUNC - const MatrixWrapper matrix() const { return MatrixWrapper(derived()); } - -// template -// inline void evalTo(Dest& dst) const { dst = matrix(); } - - protected: - EIGEN_DEVICE_FUNC - ArrayBase() : Base() {} - - private: - explicit ArrayBase(Index); - ArrayBase(Index,Index); - template explicit ArrayBase(const ArrayBase&); - protected: - // mixing arrays and matrices is not legal - template Derived& operator+=(const MatrixBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} - // mixing arrays and matrices is not legal - template Derived& operator-=(const MatrixBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} -}; - -/** replaces \c *this by \c *this - \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator-=(const ArrayBase &other) -{ - call_assignment(derived(), other.derived(), internal::sub_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this + \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator+=(const ArrayBase& other) -{ - call_assignment(derived(), other.derived(), internal::add_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this * \a other coefficient wise. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator*=(const ArrayBase& other) -{ - call_assignment(derived(), other.derived(), internal::mul_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this / \a other coefficient wise. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -ArrayBase::operator/=(const ArrayBase& other) -{ - call_assignment(derived(), other.derived(), internal::div_assign_op()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_ARRAYBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ArrayWrapper.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ArrayWrapper.h deleted file mode 100644 index a04521a1..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ArrayWrapper.h +++ /dev/null @@ -1,207 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARRAYWRAPPER_H -#define EIGEN_ARRAYWRAPPER_H - -namespace Eigen { - -/** \class ArrayWrapper - * \ingroup Core_Module - * - * \brief Expression of a mathematical vector or matrix as an array object - * - * This class is the return type of MatrixBase::array(), and most of the time - * this is the only way it is use. - * - * \sa MatrixBase::array(), class MatrixWrapper - */ - -namespace internal { -template -struct traits > - : public traits::type > -{ - typedef ArrayXpr XprKind; - // Let's remove NestByRefBit - enum { - Flags0 = traits::type >::Flags, - Flags = Flags0 & ~NestByRefBit - }; -}; -} - -template -class ArrayWrapper : public ArrayBase > -{ - public: - typedef ArrayBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper) - typedef typename internal::remove_all::type NestedExpression; - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - typedef typename internal::ref_selector::non_const_type NestedExpressionType; - - using Base::coeffRef; - - EIGEN_DEVICE_FUNC - explicit EIGEN_STRONG_INLINE ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC - inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC - inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC - inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); } - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return m_expression.data(); } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return m_expression.coeffRef(rowId, colId); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - return m_expression.coeffRef(index); - } - - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& dst) const { dst = m_expression; } - - const typename internal::remove_all::type& - EIGEN_DEVICE_FUNC - nestedExpression() const - { - return m_expression; - } - - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index) */ - EIGEN_DEVICE_FUNC - void resize(Index newSize) { m_expression.resize(newSize); } - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index,Index)*/ - EIGEN_DEVICE_FUNC - void resize(Index rows, Index cols) { m_expression.resize(rows,cols); } - - protected: - NestedExpressionType m_expression; -}; - -/** \class MatrixWrapper - * \ingroup Core_Module - * - * \brief Expression of an array as a mathematical vector or matrix - * - * This class is the return type of ArrayBase::matrix(), and most of the time - * this is the only way it is use. - * - * \sa MatrixBase::matrix(), class ArrayWrapper - */ - -namespace internal { -template -struct traits > - : public traits::type > -{ - typedef MatrixXpr XprKind; - // Let's remove NestByRefBit - enum { - Flags0 = traits::type >::Flags, - Flags = Flags0 & ~NestByRefBit - }; -}; -} - -template -class MatrixWrapper : public MatrixBase > -{ - public: - typedef MatrixBase > Base; - EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper) - typedef typename internal::remove_all::type NestedExpression; - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - typedef typename internal::ref_selector::non_const_type NestedExpressionType; - - using Base::coeffRef; - - EIGEN_DEVICE_FUNC - explicit inline MatrixWrapper(ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC - inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC - inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC - inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); } - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return m_expression.data(); } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return m_expression.derived().coeffRef(rowId, colId); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - return m_expression.coeffRef(index); - } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - nestedExpression() const - { - return m_expression; - } - - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index) */ - EIGEN_DEVICE_FUNC - void resize(Index newSize) { m_expression.resize(newSize); } - /** Forwards the resizing request to the nested expression - * \sa DenseBase::resize(Index,Index)*/ - EIGEN_DEVICE_FUNC - void resize(Index rows, Index cols) { m_expression.resize(rows,cols); } - - protected: - NestedExpressionType m_expression; -}; - -} // end namespace Eigen - -#endif // EIGEN_ARRAYWRAPPER_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Assign.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Assign.h deleted file mode 100644 index 655412ef..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Assign.h +++ /dev/null @@ -1,90 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007 Michael Olbrich -// Copyright (C) 2006-2010 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ASSIGN_H -#define EIGEN_ASSIGN_H - -namespace Eigen { - -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase - ::lazyAssign(const DenseBase& other) -{ - enum{ - SameType = internal::is_same::value - }; - - EIGEN_STATIC_ASSERT_LVALUE(Derived) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived) - EIGEN_STATIC_ASSERT(SameType,YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) - - eigen_assert(rows() == other.rows() && cols() == other.cols()); - internal::call_assignment_no_alias(derived(),other.derived()); - - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& DenseBase::operator=(const DenseBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& DenseBase::operator=(const DenseBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const MatrixBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const DenseBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const EigenBase& other) -{ - internal::call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -EIGEN_STRONG_INLINE Derived& MatrixBase::operator=(const ReturnByValue& other) -{ - other.derived().evalTo(derived()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_ASSIGN_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/AssignEvaluator.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/AssignEvaluator.h deleted file mode 100644 index b0ec7b7c..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/AssignEvaluator.h +++ /dev/null @@ -1,935 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// Copyright (C) 2011-2014 Gael Guennebaud -// Copyright (C) 2011-2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ASSIGN_EVALUATOR_H -#define EIGEN_ASSIGN_EVALUATOR_H - -namespace Eigen { - -// This implementation is based on Assign.h - -namespace internal { - -/*************************************************************************** -* Part 1 : the logic deciding a strategy for traversal and unrolling * -***************************************************************************/ - -// copy_using_evaluator_traits is based on assign_traits - -template -struct copy_using_evaluator_traits -{ - typedef typename DstEvaluator::XprType Dst; - typedef typename Dst::Scalar DstScalar; - - enum { - DstFlags = DstEvaluator::Flags, - SrcFlags = SrcEvaluator::Flags - }; - -public: - enum { - DstAlignment = DstEvaluator::Alignment, - SrcAlignment = SrcEvaluator::Alignment, - DstHasDirectAccess = DstFlags & DirectAccessBit, - JointAlignment = EIGEN_PLAIN_ENUM_MIN(DstAlignment,SrcAlignment) - }; - -private: - enum { - InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime) - : int(DstFlags)&RowMajorBit ? int(Dst::ColsAtCompileTime) - : int(Dst::RowsAtCompileTime), - InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime) - : int(DstFlags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime) - : int(Dst::MaxRowsAtCompileTime), - OuterStride = int(outer_stride_at_compile_time::ret), - MaxSizeAtCompileTime = Dst::SizeAtCompileTime - }; - - // TODO distinguish between linear traversal and inner-traversals - typedef typename find_best_packet::type LinearPacketType; - typedef typename find_best_packet::type InnerPacketType; - - enum { - LinearPacketSize = unpacket_traits::size, - InnerPacketSize = unpacket_traits::size - }; - -public: - enum { - LinearRequiredAlignment = unpacket_traits::alignment, - InnerRequiredAlignment = unpacket_traits::alignment - }; - -private: - enum { - DstIsRowMajor = DstFlags&RowMajorBit, - SrcIsRowMajor = SrcFlags&RowMajorBit, - StorageOrdersAgree = (int(DstIsRowMajor) == int(SrcIsRowMajor)), - MightVectorize = bool(StorageOrdersAgree) - && (int(DstFlags) & int(SrcFlags) & ActualPacketAccessBit) - && bool(functor_traits::PacketAccess), - MayInnerVectorize = MightVectorize - && int(InnerSize)!=Dynamic && int(InnerSize)%int(InnerPacketSize)==0 - && int(OuterStride)!=Dynamic && int(OuterStride)%int(InnerPacketSize)==0 - && (EIGEN_UNALIGNED_VECTORIZE || int(JointAlignment)>=int(InnerRequiredAlignment)), - MayLinearize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & LinearAccessBit), - MayLinearVectorize = bool(MightVectorize) && MayLinearize && DstHasDirectAccess - && (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)) || MaxSizeAtCompileTime == Dynamic), - /* If the destination isn't aligned, we have to do runtime checks and we don't unroll, - so it's only good for large enough sizes. */ - MaySliceVectorize = bool(MightVectorize) && bool(DstHasDirectAccess) - && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=(EIGEN_UNALIGNED_VECTORIZE?InnerPacketSize:(3*InnerPacketSize))) - /* slice vectorization can be slow, so we only want it if the slices are big, which is - indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block - in a fixed-size matrix - However, with EIGEN_UNALIGNED_VECTORIZE and unrolling, slice vectorization is still worth it */ - }; - -public: - enum { - Traversal = int(MayLinearVectorize) && (LinearPacketSize>InnerPacketSize) ? int(LinearVectorizedTraversal) - : int(MayInnerVectorize) ? int(InnerVectorizedTraversal) - : int(MayLinearVectorize) ? int(LinearVectorizedTraversal) - : int(MaySliceVectorize) ? int(SliceVectorizedTraversal) - : int(MayLinearize) ? int(LinearTraversal) - : int(DefaultTraversal), - Vectorized = int(Traversal) == InnerVectorizedTraversal - || int(Traversal) == LinearVectorizedTraversal - || int(Traversal) == SliceVectorizedTraversal - }; - - typedef typename conditional::type PacketType; - -private: - enum { - ActualPacketSize = int(Traversal)==LinearVectorizedTraversal ? LinearPacketSize - : Vectorized ? InnerPacketSize - : 1, - UnrollingLimit = EIGEN_UNROLLING_LIMIT * ActualPacketSize, - MayUnrollCompletely = int(Dst::SizeAtCompileTime) != Dynamic - && int(Dst::SizeAtCompileTime) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit), - MayUnrollInner = int(InnerSize) != Dynamic - && int(InnerSize) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit) - }; - -public: - enum { - Unrolling = (int(Traversal) == int(InnerVectorizedTraversal) || int(Traversal) == int(DefaultTraversal)) - ? ( - int(MayUnrollCompletely) ? int(CompleteUnrolling) - : int(MayUnrollInner) ? int(InnerUnrolling) - : int(NoUnrolling) - ) - : int(Traversal) == int(LinearVectorizedTraversal) - ? ( bool(MayUnrollCompletely) && ( EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment))) - ? int(CompleteUnrolling) - : int(NoUnrolling) ) - : int(Traversal) == int(LinearTraversal) - ? ( bool(MayUnrollCompletely) ? int(CompleteUnrolling) - : int(NoUnrolling) ) -#if EIGEN_UNALIGNED_VECTORIZE - : int(Traversal) == int(SliceVectorizedTraversal) - ? ( bool(MayUnrollInner) ? int(InnerUnrolling) - : int(NoUnrolling) ) -#endif - : int(NoUnrolling) - }; - -#ifdef EIGEN_DEBUG_ASSIGN - static void debug() - { - std::cerr << "DstXpr: " << typeid(typename DstEvaluator::XprType).name() << std::endl; - std::cerr << "SrcXpr: " << typeid(typename SrcEvaluator::XprType).name() << std::endl; - std::cerr.setf(std::ios::hex, std::ios::basefield); - std::cerr << "DstFlags" << " = " << DstFlags << " (" << demangle_flags(DstFlags) << " )" << std::endl; - std::cerr << "SrcFlags" << " = " << SrcFlags << " (" << demangle_flags(SrcFlags) << " )" << std::endl; - std::cerr.unsetf(std::ios::hex); - EIGEN_DEBUG_VAR(DstAlignment) - EIGEN_DEBUG_VAR(SrcAlignment) - EIGEN_DEBUG_VAR(LinearRequiredAlignment) - EIGEN_DEBUG_VAR(InnerRequiredAlignment) - EIGEN_DEBUG_VAR(JointAlignment) - EIGEN_DEBUG_VAR(InnerSize) - EIGEN_DEBUG_VAR(InnerMaxSize) - EIGEN_DEBUG_VAR(LinearPacketSize) - EIGEN_DEBUG_VAR(InnerPacketSize) - EIGEN_DEBUG_VAR(ActualPacketSize) - EIGEN_DEBUG_VAR(StorageOrdersAgree) - EIGEN_DEBUG_VAR(MightVectorize) - EIGEN_DEBUG_VAR(MayLinearize) - EIGEN_DEBUG_VAR(MayInnerVectorize) - EIGEN_DEBUG_VAR(MayLinearVectorize) - EIGEN_DEBUG_VAR(MaySliceVectorize) - std::cerr << "Traversal" << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl; - EIGEN_DEBUG_VAR(SrcEvaluator::CoeffReadCost) - EIGEN_DEBUG_VAR(UnrollingLimit) - EIGEN_DEBUG_VAR(MayUnrollCompletely) - EIGEN_DEBUG_VAR(MayUnrollInner) - std::cerr << "Unrolling" << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl; - std::cerr << std::endl; - } -#endif -}; - -/*************************************************************************** -* Part 2 : meta-unrollers -***************************************************************************/ - -/************************ -*** Default traversal *** -************************/ - -template -struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling -{ - // FIXME: this is not very clean, perhaps this information should be provided by the kernel? - typedef typename Kernel::DstEvaluatorType DstEvaluatorType; - typedef typename DstEvaluatorType::XprType DstXprType; - - enum { - outer = Index / DstXprType::InnerSizeAtCompileTime, - inner = Index % DstXprType::InnerSizeAtCompileTime - }; - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - kernel.assignCoeffByOuterInner(outer, inner); - copy_using_evaluator_DefaultTraversal_CompleteUnrolling::run(kernel); - } -}; - -template -struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { } -}; - -template -struct copy_using_evaluator_DefaultTraversal_InnerUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer) - { - kernel.assignCoeffByOuterInner(outer, Index_); - copy_using_evaluator_DefaultTraversal_InnerUnrolling::run(kernel, outer); - } -}; - -template -struct copy_using_evaluator_DefaultTraversal_InnerUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index) { } -}; - -/*********************** -*** Linear traversal *** -***********************/ - -template -struct copy_using_evaluator_LinearTraversal_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) - { - kernel.assignCoeff(Index); - copy_using_evaluator_LinearTraversal_CompleteUnrolling::run(kernel); - } -}; - -template -struct copy_using_evaluator_LinearTraversal_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { } -}; - -/************************** -*** Inner vectorization *** -**************************/ - -template -struct copy_using_evaluator_innervec_CompleteUnrolling -{ - // FIXME: this is not very clean, perhaps this information should be provided by the kernel? - typedef typename Kernel::DstEvaluatorType DstEvaluatorType; - typedef typename DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::PacketType PacketType; - - enum { - outer = Index / DstXprType::InnerSizeAtCompileTime, - inner = Index % DstXprType::InnerSizeAtCompileTime, - SrcAlignment = Kernel::AssignmentTraits::SrcAlignment, - DstAlignment = Kernel::AssignmentTraits::DstAlignment - }; - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - kernel.template assignPacketByOuterInner(outer, inner); - enum { NextIndex = Index + unpacket_traits::size }; - copy_using_evaluator_innervec_CompleteUnrolling::run(kernel); - } -}; - -template -struct copy_using_evaluator_innervec_CompleteUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { } -}; - -template -struct copy_using_evaluator_innervec_InnerUnrolling -{ - typedef typename Kernel::PacketType PacketType; - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer) - { - kernel.template assignPacketByOuterInner(outer, Index_); - enum { NextIndex = Index_ + unpacket_traits::size }; - copy_using_evaluator_innervec_InnerUnrolling::run(kernel, outer); - } -}; - -template -struct copy_using_evaluator_innervec_InnerUnrolling -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &, Index) { } -}; - -/*************************************************************************** -* Part 3 : implementation of all cases -***************************************************************************/ - -// dense_assignment_loop is based on assign_impl - -template -struct dense_assignment_loop; - -/************************ -*** Default traversal *** -************************/ - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE run(Kernel &kernel) - { - for(Index outer = 0; outer < kernel.outerSize(); ++outer) { - for(Index inner = 0; inner < kernel.innerSize(); ++inner) { - kernel.assignCoeffByOuterInner(outer, inner); - } - } - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - copy_using_evaluator_DefaultTraversal_CompleteUnrolling::run(kernel); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - - const Index outerSize = kernel.outerSize(); - for(Index outer = 0; outer < outerSize; ++outer) - copy_using_evaluator_DefaultTraversal_InnerUnrolling::run(kernel, outer); - } -}; - -/*************************** -*** Linear vectorization *** -***************************/ - - -// The goal of unaligned_dense_assignment_loop is simply to factorize the handling -// of the non vectorizable beginning and ending parts - -template -struct unaligned_dense_assignment_loop -{ - // if IsAligned = true, then do nothing - template - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index, Index) {} -}; - -template <> -struct unaligned_dense_assignment_loop -{ - // MSVC must not inline this functions. If it does, it fails to optimize the - // packet access path. - // FIXME check which version exhibits this issue -#if EIGEN_COMP_MSVC - template - static EIGEN_DONT_INLINE void run(Kernel &kernel, - Index start, - Index end) -#else - template - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, - Index start, - Index end) -#endif - { - for (Index index = start; index < end; ++index) - kernel.assignCoeff(index); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - const Index size = kernel.size(); - typedef typename Kernel::Scalar Scalar; - typedef typename Kernel::PacketType PacketType; - enum { - requestedAlignment = Kernel::AssignmentTraits::LinearRequiredAlignment, - packetSize = unpacket_traits::size, - dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment), - dstAlignment = packet_traits::AlignedOnScalar ? int(requestedAlignment) - : int(Kernel::AssignmentTraits::DstAlignment), - srcAlignment = Kernel::AssignmentTraits::JointAlignment - }; - const Index alignedStart = dstIsAligned ? 0 : internal::first_aligned(kernel.dstDataPtr(), size); - const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize; - - unaligned_dense_assignment_loop::run(kernel, 0, alignedStart); - - for(Index index = alignedStart; index < alignedEnd; index += packetSize) - kernel.template assignPacket(index); - - unaligned_dense_assignment_loop<>::run(kernel, alignedEnd, size); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::PacketType PacketType; - - enum { size = DstXprType::SizeAtCompileTime, - packetSize =unpacket_traits::size, - alignedSize = (size/packetSize)*packetSize }; - - copy_using_evaluator_innervec_CompleteUnrolling::run(kernel); - copy_using_evaluator_DefaultTraversal_CompleteUnrolling::run(kernel); - } -}; - -/************************** -*** Inner vectorization *** -**************************/ - -template -struct dense_assignment_loop -{ - typedef typename Kernel::PacketType PacketType; - enum { - SrcAlignment = Kernel::AssignmentTraits::SrcAlignment, - DstAlignment = Kernel::AssignmentTraits::DstAlignment - }; - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - const Index innerSize = kernel.innerSize(); - const Index outerSize = kernel.outerSize(); - const Index packetSize = unpacket_traits::size; - for(Index outer = 0; outer < outerSize; ++outer) - for(Index inner = 0; inner < innerSize; inner+=packetSize) - kernel.template assignPacketByOuterInner(outer, inner); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - copy_using_evaluator_innervec_CompleteUnrolling::run(kernel); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::AssignmentTraits Traits; - const Index outerSize = kernel.outerSize(); - for(Index outer = 0; outer < outerSize; ++outer) - copy_using_evaluator_innervec_InnerUnrolling::run(kernel, outer); - } -}; - -/*********************** -*** Linear traversal *** -***********************/ - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - const Index size = kernel.size(); - for(Index i = 0; i < size; ++i) - kernel.assignCoeff(i); - } -}; - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - copy_using_evaluator_LinearTraversal_CompleteUnrolling::run(kernel); - } -}; - -/************************** -*** Slice vectorization *** -***************************/ - -template -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::Scalar Scalar; - typedef typename Kernel::PacketType PacketType; - enum { - packetSize = unpacket_traits::size, - requestedAlignment = int(Kernel::AssignmentTraits::InnerRequiredAlignment), - alignable = packet_traits::AlignedOnScalar || int(Kernel::AssignmentTraits::DstAlignment)>=sizeof(Scalar), - dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment), - dstAlignment = alignable ? int(requestedAlignment) - : int(Kernel::AssignmentTraits::DstAlignment) - }; - const Scalar *dst_ptr = kernel.dstDataPtr(); - if((!bool(dstIsAligned)) && (UIntPtr(dst_ptr) % sizeof(Scalar))>0) - { - // the pointer is not aligend-on scalar, so alignment is not possible - return dense_assignment_loop::run(kernel); - } - const Index packetAlignedMask = packetSize - 1; - const Index innerSize = kernel.innerSize(); - const Index outerSize = kernel.outerSize(); - const Index alignedStep = alignable ? (packetSize - kernel.outerStride() % packetSize) & packetAlignedMask : 0; - Index alignedStart = ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned(dst_ptr, innerSize); - - for(Index outer = 0; outer < outerSize; ++outer) - { - const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask); - // do the non-vectorizable part of the assignment - for(Index inner = 0; inner(outer, inner); - - // do the non-vectorizable part of the assignment - for(Index inner = alignedEnd; inner -struct dense_assignment_loop -{ - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel) - { - typedef typename Kernel::DstEvaluatorType::XprType DstXprType; - typedef typename Kernel::PacketType PacketType; - - enum { size = DstXprType::InnerSizeAtCompileTime, - packetSize =unpacket_traits::size, - vectorizableSize = (size/packetSize)*packetSize }; - - for(Index outer = 0; outer < kernel.outerSize(); ++outer) - { - copy_using_evaluator_innervec_InnerUnrolling::run(kernel, outer); - copy_using_evaluator_DefaultTraversal_InnerUnrolling::run(kernel, outer); - } - } -}; -#endif - - -/*************************************************************************** -* Part 4 : Generic dense assignment kernel -***************************************************************************/ - -// This class generalize the assignment of a coefficient (or packet) from one dense evaluator -// to another dense writable evaluator. -// It is parametrized by the two evaluators, and the actual assignment functor. -// This abstraction level permits to keep the evaluation loops as simple and as generic as possible. -// One can customize the assignment using this generic dense_assignment_kernel with different -// functors, or by completely overloading it, by-passing a functor. -template -class generic_dense_assignment_kernel -{ -protected: - typedef typename DstEvaluatorTypeT::XprType DstXprType; - typedef typename SrcEvaluatorTypeT::XprType SrcXprType; -public: - - typedef DstEvaluatorTypeT DstEvaluatorType; - typedef SrcEvaluatorTypeT SrcEvaluatorType; - typedef typename DstEvaluatorType::Scalar Scalar; - typedef copy_using_evaluator_traits AssignmentTraits; - typedef typename AssignmentTraits::PacketType PacketType; - - - EIGEN_DEVICE_FUNC generic_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr) - : m_dst(dst), m_src(src), m_functor(func), m_dstExpr(dstExpr) - { - #ifdef EIGEN_DEBUG_ASSIGN - AssignmentTraits::debug(); - #endif - } - - EIGEN_DEVICE_FUNC Index size() const { return m_dstExpr.size(); } - EIGEN_DEVICE_FUNC Index innerSize() const { return m_dstExpr.innerSize(); } - EIGEN_DEVICE_FUNC Index outerSize() const { return m_dstExpr.outerSize(); } - EIGEN_DEVICE_FUNC Index rows() const { return m_dstExpr.rows(); } - EIGEN_DEVICE_FUNC Index cols() const { return m_dstExpr.cols(); } - EIGEN_DEVICE_FUNC Index outerStride() const { return m_dstExpr.outerStride(); } - - EIGEN_DEVICE_FUNC DstEvaluatorType& dstEvaluator() { return m_dst; } - EIGEN_DEVICE_FUNC const SrcEvaluatorType& srcEvaluator() const { return m_src; } - - /// Assign src(row,col) to dst(row,col) through the assignment functor. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index row, Index col) - { - m_functor.assignCoeff(m_dst.coeffRef(row,col), m_src.coeff(row,col)); - } - - /// \sa assignCoeff(Index,Index) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index index) - { - m_functor.assignCoeff(m_dst.coeffRef(index), m_src.coeff(index)); - } - - /// \sa assignCoeff(Index,Index) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeffByOuterInner(Index outer, Index inner) - { - Index row = rowIndexByOuterInner(outer, inner); - Index col = colIndexByOuterInner(outer, inner); - assignCoeff(row, col); - } - - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index row, Index col) - { - m_functor.template assignPacket(&m_dst.coeffRef(row,col), m_src.template packet(row,col)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index index) - { - m_functor.template assignPacket(&m_dst.coeffRef(index), m_src.template packet(index)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner) - { - Index row = rowIndexByOuterInner(outer, inner); - Index col = colIndexByOuterInner(outer, inner); - assignPacket(row, col); - } - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) - { - typedef typename DstEvaluatorType::ExpressionTraits Traits; - return int(Traits::RowsAtCompileTime) == 1 ? 0 - : int(Traits::ColsAtCompileTime) == 1 ? inner - : int(DstEvaluatorType::Flags)&RowMajorBit ? outer - : inner; - } - - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) - { - typedef typename DstEvaluatorType::ExpressionTraits Traits; - return int(Traits::ColsAtCompileTime) == 1 ? 0 - : int(Traits::RowsAtCompileTime) == 1 ? inner - : int(DstEvaluatorType::Flags)&RowMajorBit ? inner - : outer; - } - - EIGEN_DEVICE_FUNC const Scalar* dstDataPtr() const - { - return m_dstExpr.data(); - } - -protected: - DstEvaluatorType& m_dst; - const SrcEvaluatorType& m_src; - const Functor &m_functor; - // TODO find a way to avoid the needs of the original expression - DstXprType& m_dstExpr; -}; - -/*************************************************************************** -* Part 5 : Entry point for dense rectangular assignment -***************************************************************************/ - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const Functor &/*func*/) -{ - EIGEN_ONLY_USED_FOR_DEBUG(dst); - EIGEN_ONLY_USED_FOR_DEBUG(src); - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const internal::assign_op &/*func*/) -{ - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if(((dst.rows()!=dstRows) || (dst.cols()!=dstCols))) - dst.resize(dstRows, dstCols); - eigen_assert(dst.rows() == dstRows && dst.cols() == dstCols); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src, const Functor &func) -{ - typedef evaluator DstEvaluatorType; - typedef evaluator SrcEvaluatorType; - - SrcEvaluatorType srcEvaluator(src); - - // NOTE To properly handle A = (A*A.transpose())/s with A rectangular, - // we need to resize the destination after the source evaluator has been created. - resize_if_allowed(dst, src, func); - - DstEvaluatorType dstEvaluator(dst); - - typedef generic_dense_assignment_kernel Kernel; - Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived()); - - dense_assignment_loop::run(kernel); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src) -{ - call_dense_assignment_loop(dst, src, internal::assign_op()); -} - -/*************************************************************************** -* Part 6 : Generic assignment -***************************************************************************/ - -// Based on the respective shapes of the destination and source, -// the class AssignmentKind determine the kind of assignment mechanism. -// AssignmentKind must define a Kind typedef. -template struct AssignmentKind; - -// Assignement kind defined in this file: -struct Dense2Dense {}; -struct EigenBase2EigenBase {}; - -template struct AssignmentKind { typedef EigenBase2EigenBase Kind; }; -template<> struct AssignmentKind { typedef Dense2Dense Kind; }; - -// This is the main assignment class -template< typename DstXprType, typename SrcXprType, typename Functor, - typename Kind = typename AssignmentKind< typename evaluator_traits::Shape , typename evaluator_traits::Shape >::Kind, - typename EnableIf = void> -struct Assignment; - - -// The only purpose of this call_assignment() function is to deal with noalias() / "assume-aliasing" and automatic transposition. -// Indeed, I (Gael) think that this concept of "assume-aliasing" was a mistake, and it makes thing quite complicated. -// So this intermediate function removes everything related to "assume-aliasing" such that Assignment -// does not has to bother about these annoying details. - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(Dst& dst, const Src& src) -{ - call_assignment(dst, src, internal::assign_op()); -} -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(const Dst& dst, const Src& src) -{ - call_assignment(dst, src, internal::assign_op()); -} - -// Deal with "assume-aliasing" -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(Dst& dst, const Src& src, const Func& func, typename enable_if< evaluator_assume_aliasing::value, void*>::type = 0) -{ - typename plain_matrix_type::type tmp(src); - call_assignment_no_alias(dst, tmp, func); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(Dst& dst, const Src& src, const Func& func, typename enable_if::value, void*>::type = 0) -{ - call_assignment_no_alias(dst, src, func); -} - -// by-pass "assume-aliasing" -// When there is no aliasing, we require that 'dst' has been properly resized -template class StorageBase, typename Src, typename Func> -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment(NoAlias& dst, const Src& src, const Func& func) -{ - call_assignment_no_alias(dst.expression(), src, func); -} - - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias(Dst& dst, const Src& src, const Func& func) -{ - enum { - NeedToTranspose = ( (int(Dst::RowsAtCompileTime) == 1 && int(Src::ColsAtCompileTime) == 1) - || (int(Dst::ColsAtCompileTime) == 1 && int(Src::RowsAtCompileTime) == 1) - ) && int(Dst::SizeAtCompileTime) != 1 - }; - - typedef typename internal::conditional, Dst>::type ActualDstTypeCleaned; - typedef typename internal::conditional, Dst&>::type ActualDstType; - ActualDstType actualDst(dst); - - // TODO check whether this is the right place to perform these checks: - EIGEN_STATIC_ASSERT_LVALUE(Dst) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src) - EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scalar); - - Assignment::run(actualDst, src, func); -} -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias(Dst& dst, const Src& src) -{ - call_assignment_no_alias(dst, src, internal::assign_op()); -} - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias_no_transpose(Dst& dst, const Src& src, const Func& func) -{ - // TODO check whether this is the right place to perform these checks: - EIGEN_STATIC_ASSERT_LVALUE(Dst) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst,Src) - EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename Dst::Scalar,typename Src::Scalar); - - Assignment::run(dst, src, func); -} -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -void call_assignment_no_alias_no_transpose(Dst& dst, const Src& src) -{ - call_assignment_no_alias_no_transpose(dst, src, internal::assign_op()); -} - -// forward declaration -template void check_for_aliasing(const Dst &dst, const Src &src); - -// Generic Dense to Dense assignment -// Note that the last template argument "Weak" is needed to make it possible to perform -// both partial specialization+SFINAE without ambiguous specialization -template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak> -struct Assignment -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const Functor &func) - { -#ifndef EIGEN_NO_DEBUG - internal::check_for_aliasing(dst, src); -#endif - - call_dense_assignment_loop(dst, src, func); - } -}; - -// Generic assignment through evalTo. -// TODO: not sure we have to keep that one, but it helps porting current code to new evaluator mechanism. -// Note that the last template argument "Weak" is needed to make it possible to perform -// both partial specialization+SFINAE without ambiguous specialization -template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak> -struct Assignment -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - src.evalTo(dst); - } - - // NOTE The following two functions are templated to avoid their instanciation if not needed - // This is needed because some expressions supports evalTo only and/or have 'void' as scalar type. - template - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - src.addTo(dst); - } - - template - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - src.subTo(dst); - } -}; - -} // namespace internal - -} // end namespace Eigen - -#endif // EIGEN_ASSIGN_EVALUATOR_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Assign_MKL.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Assign_MKL.h deleted file mode 100644 index 6c2ab926..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Assign_MKL.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - Copyright (c) 2011, Intel Corporation. All rights reserved. - Copyright (C) 2015 Gael Guennebaud - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Intel Corporation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ******************************************************************************** - * Content : Eigen bindings to Intel(R) MKL - * MKL VML support for coefficient-wise unary Eigen expressions like a=b.sin() - ******************************************************************************** -*/ - -#ifndef EIGEN_ASSIGN_VML_H -#define EIGEN_ASSIGN_VML_H - -namespace Eigen { - -namespace internal { - -template -class vml_assign_traits -{ - private: - enum { - DstHasDirectAccess = Dst::Flags & DirectAccessBit, - SrcHasDirectAccess = Src::Flags & DirectAccessBit, - StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)), - InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime) - : int(Dst::Flags)&RowMajorBit ? int(Dst::ColsAtCompileTime) - : int(Dst::RowsAtCompileTime), - InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime) - : int(Dst::Flags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime) - : int(Dst::MaxRowsAtCompileTime), - MaxSizeAtCompileTime = Dst::SizeAtCompileTime, - - MightEnableVml = StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess && Src::InnerStrideAtCompileTime==1 && Dst::InnerStrideAtCompileTime==1, - MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit), - VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize, - LargeEnough = VmlSize==Dynamic || VmlSize>=EIGEN_MKL_VML_THRESHOLD - }; - public: - enum { - EnableVml = MightEnableVml && LargeEnough, - Traversal = MightLinearize ? LinearTraversal : DefaultTraversal - }; -}; - -#define EIGEN_PP_EXPAND(ARG) ARG -#if !defined (EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1) -#define EIGEN_VMLMODE_EXPAND_LA , VML_HA -#else -#define EIGEN_VMLMODE_EXPAND_LA , VML_LA -#endif - -#define EIGEN_VMLMODE_EXPAND__ - -#define EIGEN_VMLMODE_PREFIX_LA vm -#define EIGEN_VMLMODE_PREFIX__ v -#define EIGEN_VMLMODE_PREFIX(VMLMODE) EIGEN_CAT(EIGEN_VMLMODE_PREFIX_,VMLMODE) - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE) \ - template< typename DstXprType, typename SrcXprNested> \ - struct Assignment, SrcXprNested>, assign_op, \ - Dense2Dense, typename enable_if::EnableVml>::type> { \ - typedef CwiseUnaryOp, SrcXprNested> SrcXprType; \ - static void run(DstXprType &dst, const SrcXprType &src, const assign_op &/*func*/) { \ - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \ - if(vml_assign_traits::Traversal==LinearTraversal) { \ - VMLOP(dst.size(), (const VMLTYPE*)src.nestedExpression().data(), \ - (VMLTYPE*)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE) ); \ - } else { \ - const Index outerSize = dst.outerSize(); \ - for(Index outer = 0; outer < outerSize; ++outer) { \ - const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.nestedExpression().coeffRef(outer,0)) : \ - &(src.nestedExpression().coeffRef(0, outer)); \ - EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer)); \ - VMLOP( dst.innerSize(), (const VMLTYPE*)src_ptr, \ - (VMLTYPE*)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE)); \ - } \ - } \ - } \ - }; \ - - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),s##VMLOP), float, float, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),d##VMLOP), double, double, VMLMODE) - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),c##VMLOP), scomplex, MKL_Complex8, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),z##VMLOP), dcomplex, MKL_Complex16, VMLMODE) - -#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE) \ - EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE) - - -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sin, Sin, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(asin, Asin, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sinh, Sinh, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cos, Cos, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(acos, Acos, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cosh, Cosh, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tan, Tan, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(atan, Atan, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tanh, Tanh, LA) -// EIGEN_MKL_VML_DECLARE_UNARY_CALLS(abs, Abs, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(exp, Exp, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log, Ln, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log10, Log10, LA) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sqrt, Sqrt, _) - -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(arg, Arg, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(round, Round, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(floor, Floor, _) -EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil, Ceil, _) - -#define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE) \ - template< typename DstXprType, typename SrcXprNested, typename Plain> \ - struct Assignment, SrcXprNested, \ - const CwiseNullaryOp,Plain> >, assign_op, \ - Dense2Dense, typename enable_if::EnableVml>::type> { \ - typedef CwiseBinaryOp, SrcXprNested, \ - const CwiseNullaryOp,Plain> > SrcXprType; \ - static void run(DstXprType &dst, const SrcXprType &src, const assign_op &/*func*/) { \ - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \ - VMLTYPE exponent = reinterpret_cast(src.rhs().functor().m_other); \ - if(vml_assign_traits::Traversal==LinearTraversal) \ - { \ - VMLOP( dst.size(), (const VMLTYPE*)src.lhs().data(), exponent, \ - (VMLTYPE*)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE) ); \ - } else { \ - const Index outerSize = dst.outerSize(); \ - for(Index outer = 0; outer < outerSize; ++outer) { \ - const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.lhs().coeffRef(outer,0)) : \ - &(src.lhs().coeffRef(0, outer)); \ - EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer)); \ - VMLOP( dst.innerSize(), (const VMLTYPE*)src_ptr, exponent, \ - (VMLTYPE*)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_##VMLMODE)); \ - } \ - } \ - } \ - }; - -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmsPowx, float, float, LA) -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdPowx, double, double, LA) -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcPowx, scomplex, MKL_Complex8, LA) -EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmzPowx, dcomplex, MKL_Complex16, LA) - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_ASSIGN_VML_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/BandMatrix.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/BandMatrix.h deleted file mode 100644 index 4978c914..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/BandMatrix.h +++ /dev/null @@ -1,353 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_BANDMATRIX_H -#define EIGEN_BANDMATRIX_H - -namespace Eigen { - -namespace internal { - -template -class BandMatrixBase : public EigenBase -{ - public: - - enum { - Flags = internal::traits::Flags, - CoeffReadCost = internal::traits::CoeffReadCost, - RowsAtCompileTime = internal::traits::RowsAtCompileTime, - ColsAtCompileTime = internal::traits::ColsAtCompileTime, - MaxRowsAtCompileTime = internal::traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = internal::traits::MaxColsAtCompileTime, - Supers = internal::traits::Supers, - Subs = internal::traits::Subs, - Options = internal::traits::Options - }; - typedef typename internal::traits::Scalar Scalar; - typedef Matrix DenseMatrixType; - typedef typename DenseMatrixType::StorageIndex StorageIndex; - typedef typename internal::traits::CoefficientsType CoefficientsType; - typedef EigenBase Base; - - protected: - enum { - DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) - ? 1 + Supers + Subs - : Dynamic, - SizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime) - }; - - public: - - using Base::derived; - using Base::rows; - using Base::cols; - - /** \returns the number of super diagonals */ - inline Index supers() const { return derived().supers(); } - - /** \returns the number of sub diagonals */ - inline Index subs() const { return derived().subs(); } - - /** \returns an expression of the underlying coefficient matrix */ - inline const CoefficientsType& coeffs() const { return derived().coeffs(); } - - /** \returns an expression of the underlying coefficient matrix */ - inline CoefficientsType& coeffs() { return derived().coeffs(); } - - /** \returns a vector expression of the \a i -th column, - * only the meaningful part is returned. - * \warning the internal storage must be column major. */ - inline Block col(Index i) - { - EIGEN_STATIC_ASSERT((Options&RowMajor)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); - Index start = 0; - Index len = coeffs().rows(); - if (i<=supers()) - { - start = supers()-i; - len = (std::min)(rows(),std::max(0,coeffs().rows() - (supers()-i))); - } - else if (i>=rows()-subs()) - len = std::max(0,coeffs().rows() - (i + 1 - rows() + subs())); - return Block(coeffs(), start, i, len, 1); - } - - /** \returns a vector expression of the main diagonal */ - inline Block diagonal() - { return Block(coeffs(),supers(),0,1,(std::min)(rows(),cols())); } - - /** \returns a vector expression of the main diagonal (const version) */ - inline const Block diagonal() const - { return Block(coeffs(),supers(),0,1,(std::min)(rows(),cols())); } - - template struct DiagonalIntReturnType { - enum { - ReturnOpposite = (Options&SelfAdjoint) && (((Index)>0 && Supers==0) || ((Index)<0 && Subs==0)), - Conjugate = ReturnOpposite && NumTraits::IsComplex, - ActualIndex = ReturnOpposite ? -Index : Index, - DiagonalSize = (RowsAtCompileTime==Dynamic || ColsAtCompileTime==Dynamic) - ? Dynamic - : (ActualIndex<0 - ? EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime, RowsAtCompileTime + ActualIndex) - : EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime, ColsAtCompileTime - ActualIndex)) - }; - typedef Block BuildType; - typedef typename internal::conditional,BuildType >, - BuildType>::type Type; - }; - - /** \returns a vector expression of the \a N -th sub or super diagonal */ - template inline typename DiagonalIntReturnType::Type diagonal() - { - return typename DiagonalIntReturnType::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N)); - } - - /** \returns a vector expression of the \a N -th sub or super diagonal */ - template inline const typename DiagonalIntReturnType::Type diagonal() const - { - return typename DiagonalIntReturnType::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N)); - } - - /** \returns a vector expression of the \a i -th sub or super diagonal */ - inline Block diagonal(Index i) - { - eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); - return Block(coeffs(), supers()-i, std::max(0,i), 1, diagonalLength(i)); - } - - /** \returns a vector expression of the \a i -th sub or super diagonal */ - inline const Block diagonal(Index i) const - { - eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); - return Block(coeffs(), supers()-i, std::max(0,i), 1, diagonalLength(i)); - } - - template inline void evalTo(Dest& dst) const - { - dst.resize(rows(),cols()); - dst.setZero(); - dst.diagonal() = diagonal(); - for (Index i=1; i<=supers();++i) - dst.diagonal(i) = diagonal(i); - for (Index i=1; i<=subs();++i) - dst.diagonal(-i) = diagonal(-i); - } - - DenseMatrixType toDenseMatrix() const - { - DenseMatrixType res(rows(),cols()); - evalTo(res); - return res; - } - - protected: - - inline Index diagonalLength(Index i) const - { return i<0 ? (std::min)(cols(),rows()+i) : (std::min)(rows(),cols()-i); } -}; - -/** - * \class BandMatrix - * \ingroup Core_Module - * - * \brief Represents a rectangular matrix with a banded storage - * - * \tparam _Scalar Numeric type, i.e. float, double, int - * \tparam _Rows Number of rows, or \b Dynamic - * \tparam _Cols Number of columns, or \b Dynamic - * \tparam _Supers Number of super diagonal - * \tparam _Subs Number of sub diagonal - * \tparam _Options A combination of either \b #RowMajor or \b #ColMajor, and of \b #SelfAdjoint - * The former controls \ref TopicStorageOrders "storage order", and defaults to - * column-major. The latter controls whether the matrix represents a selfadjoint - * matrix in which case either Supers of Subs have to be null. - * - * \sa class TridiagonalMatrix - */ - -template -struct traits > -{ - typedef _Scalar Scalar; - typedef Dense StorageKind; - typedef Eigen::Index StorageIndex; - enum { - CoeffReadCost = NumTraits::ReadCost, - RowsAtCompileTime = _Rows, - ColsAtCompileTime = _Cols, - MaxRowsAtCompileTime = _Rows, - MaxColsAtCompileTime = _Cols, - Flags = LvalueBit, - Supers = _Supers, - Subs = _Subs, - Options = _Options, - DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic - }; - typedef Matrix CoefficientsType; -}; - -template -class BandMatrix : public BandMatrixBase > -{ - public: - - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::traits::StorageIndex StorageIndex; - typedef typename internal::traits::CoefficientsType CoefficientsType; - - explicit inline BandMatrix(Index rows=Rows, Index cols=Cols, Index supers=Supers, Index subs=Subs) - : m_coeffs(1+supers+subs,cols), - m_rows(rows), m_supers(supers), m_subs(subs) - { - } - - /** \returns the number of columns */ - inline Index rows() const { return m_rows.value(); } - - /** \returns the number of rows */ - inline Index cols() const { return m_coeffs.cols(); } - - /** \returns the number of super diagonals */ - inline Index supers() const { return m_supers.value(); } - - /** \returns the number of sub diagonals */ - inline Index subs() const { return m_subs.value(); } - - inline const CoefficientsType& coeffs() const { return m_coeffs; } - inline CoefficientsType& coeffs() { return m_coeffs; } - - protected: - - CoefficientsType m_coeffs; - internal::variable_if_dynamic m_rows; - internal::variable_if_dynamic m_supers; - internal::variable_if_dynamic m_subs; -}; - -template -class BandMatrixWrapper; - -template -struct traits > -{ - typedef typename _CoefficientsType::Scalar Scalar; - typedef typename _CoefficientsType::StorageKind StorageKind; - typedef typename _CoefficientsType::StorageIndex StorageIndex; - enum { - CoeffReadCost = internal::traits<_CoefficientsType>::CoeffReadCost, - RowsAtCompileTime = _Rows, - ColsAtCompileTime = _Cols, - MaxRowsAtCompileTime = _Rows, - MaxColsAtCompileTime = _Cols, - Flags = LvalueBit, - Supers = _Supers, - Subs = _Subs, - Options = _Options, - DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic - }; - typedef _CoefficientsType CoefficientsType; -}; - -template -class BandMatrixWrapper : public BandMatrixBase > -{ - public: - - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::traits::CoefficientsType CoefficientsType; - typedef typename internal::traits::StorageIndex StorageIndex; - - explicit inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows=_Rows, Index cols=_Cols, Index supers=_Supers, Index subs=_Subs) - : m_coeffs(coeffs), - m_rows(rows), m_supers(supers), m_subs(subs) - { - EIGEN_UNUSED_VARIABLE(cols); - //internal::assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows()); - } - - /** \returns the number of columns */ - inline Index rows() const { return m_rows.value(); } - - /** \returns the number of rows */ - inline Index cols() const { return m_coeffs.cols(); } - - /** \returns the number of super diagonals */ - inline Index supers() const { return m_supers.value(); } - - /** \returns the number of sub diagonals */ - inline Index subs() const { return m_subs.value(); } - - inline const CoefficientsType& coeffs() const { return m_coeffs; } - - protected: - - const CoefficientsType& m_coeffs; - internal::variable_if_dynamic m_rows; - internal::variable_if_dynamic m_supers; - internal::variable_if_dynamic m_subs; -}; - -/** - * \class TridiagonalMatrix - * \ingroup Core_Module - * - * \brief Represents a tridiagonal matrix with a compact banded storage - * - * \tparam Scalar Numeric type, i.e. float, double, int - * \tparam Size Number of rows and cols, or \b Dynamic - * \tparam Options Can be 0 or \b SelfAdjoint - * - * \sa class BandMatrix - */ -template -class TridiagonalMatrix : public BandMatrix -{ - typedef BandMatrix Base; - typedef typename Base::StorageIndex StorageIndex; - public: - explicit TridiagonalMatrix(Index size = Size) : Base(size,size,Options&SelfAdjoint?0:1,1) {} - - inline typename Base::template DiagonalIntReturnType<1>::Type super() - { return Base::template diagonal<1>(); } - inline const typename Base::template DiagonalIntReturnType<1>::Type super() const - { return Base::template diagonal<1>(); } - inline typename Base::template DiagonalIntReturnType<-1>::Type sub() - { return Base::template diagonal<-1>(); } - inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const - { return Base::template diagonal<-1>(); } - protected: -}; - - -struct BandShape {}; - -template -struct evaluator_traits > - : public evaluator_traits_base > -{ - typedef BandShape Shape; -}; - -template -struct evaluator_traits > - : public evaluator_traits_base > -{ - typedef BandShape Shape; -}; - -template<> struct AssignmentKind { typedef EigenBase2EigenBase Kind; }; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_BANDMATRIX_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Block.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Block.h deleted file mode 100644 index 11de45c2..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Block.h +++ /dev/null @@ -1,452 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_BLOCK_H -#define EIGEN_BLOCK_H - -namespace Eigen { - -namespace internal { -template -struct traits > : traits -{ - typedef typename traits::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ref_selector::type XprTypeNested; - typedef typename remove_reference::type _XprTypeNested; - enum{ - MatrixRows = traits::RowsAtCompileTime, - MatrixCols = traits::ColsAtCompileTime, - RowsAtCompileTime = MatrixRows == 0 ? 0 : BlockRows, - ColsAtCompileTime = MatrixCols == 0 ? 0 : BlockCols, - MaxRowsAtCompileTime = BlockRows==0 ? 0 - : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime) - : int(traits::MaxRowsAtCompileTime), - MaxColsAtCompileTime = BlockCols==0 ? 0 - : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime) - : int(traits::MaxColsAtCompileTime), - - XprTypeIsRowMajor = (int(traits::Flags)&RowMajorBit) != 0, - IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0 - : XprTypeIsRowMajor, - HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor), - InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime), - InnerStrideAtCompileTime = HasSameStorageOrderAsXprType - ? int(inner_stride_at_compile_time::ret) - : int(outer_stride_at_compile_time::ret), - OuterStrideAtCompileTime = HasSameStorageOrderAsXprType - ? int(outer_stride_at_compile_time::ret) - : int(inner_stride_at_compile_time::ret), - - // FIXME, this traits is rather specialized for dense object and it needs to be cleaned further - FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0, - Flags = (traits::Flags & (DirectAccessBit | (InnerPanel?CompressedAccessBit:0))) | FlagsLvalueBit | FlagsRowMajorBit, - // FIXME DirectAccessBit should not be handled by expressions - // - // Alignment is needed by MapBase's assertions - // We can sefely set it to false here. Internal alignment errors will be detected by an eigen_internal_assert in the respective evaluator - Alignment = 0 - }; -}; - -template::ret> class BlockImpl_dense; - -} // end namespace internal - -template class BlockImpl; - -/** \class Block - * \ingroup Core_Module - * - * \brief Expression of a fixed-size or dynamic-size block - * - * \tparam XprType the type of the expression in which we are taking a block - * \tparam BlockRows the number of rows of the block we are taking at compile time (optional) - * \tparam BlockCols the number of columns of the block we are taking at compile time (optional) - * \tparam InnerPanel is true, if the block maps to a set of rows of a row major matrix or - * to set of columns of a column major matrix (optional). The parameter allows to determine - * at compile time whether aligned access is possible on the block expression. - * - * This class represents an expression of either a fixed-size or dynamic-size block. It is the return - * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block(Index,Index) and - * most of the time this is the only way it is used. - * - * However, if you want to directly maniputate block expressions, - * for instance if you want to write a function returning such an expression, you - * will need to use this class. - * - * Here is an example illustrating the dynamic case: - * \include class_Block.cpp - * Output: \verbinclude class_Block.out - * - * \note Even though this expression has dynamic size, in the case where \a XprType - * has fixed size, this expression inherits a fixed maximal size which means that evaluating - * it does not cause a dynamic memory allocation. - * - * Here is an example illustrating the fixed-size case: - * \include class_FixedBlock.cpp - * Output: \verbinclude class_FixedBlock.out - * - * \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock - */ -template class Block - : public BlockImpl::StorageKind> -{ - typedef BlockImpl::StorageKind> Impl; - public: - //typedef typename Impl::Base Base; - typedef Impl Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(Block) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block) - - typedef typename internal::remove_all::type NestedExpression; - - /** Column or Row constructor - */ - EIGEN_DEVICE_FUNC - inline Block(XprType& xpr, Index i) : Impl(xpr,i) - { - eigen_assert( (i>=0) && ( - ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i= 0 && BlockRows >= 0 && startRow + BlockRows <= xpr.rows() - && startCol >= 0 && BlockCols >= 0 && startCol + BlockCols <= xpr.cols()); - } - - /** Dynamic-size constructor - */ - EIGEN_DEVICE_FUNC - inline Block(XprType& xpr, - Index startRow, Index startCol, - Index blockRows, Index blockCols) - : Impl(xpr, startRow, startCol, blockRows, blockCols) - { - eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==blockRows) - && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols)); - eigen_assert(startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows - && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols); - } -}; - -// The generic default implementation for dense block simplu forward to the internal::BlockImpl_dense -// that must be specialized for direct and non-direct access... -template -class BlockImpl - : public internal::BlockImpl_dense -{ - typedef internal::BlockImpl_dense Impl; - typedef typename XprType::StorageIndex StorageIndex; - public: - typedef Impl Base; - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl) - EIGEN_DEVICE_FUNC inline BlockImpl(XprType& xpr, Index i) : Impl(xpr,i) {} - EIGEN_DEVICE_FUNC inline BlockImpl(XprType& xpr, Index startRow, Index startCol) : Impl(xpr, startRow, startCol) {} - EIGEN_DEVICE_FUNC - inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols) - : Impl(xpr, startRow, startCol, blockRows, blockCols) {} -}; - -namespace internal { - -/** \internal Internal implementation of dense Blocks in the general case. */ -template class BlockImpl_dense - : public internal::dense_xpr_base >::type -{ - typedef Block BlockType; - typedef typename internal::ref_selector::non_const_type XprTypeNested; - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(BlockType) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense) - - // class InnerIterator; // FIXME apparently never used - - /** Column or Row constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index i) - : m_xpr(xpr), - // It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime, - // and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1, - // all other cases are invalid. - // The case a 1x1 matrix seems ambiguous, but the result is the same anyway. - m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0), - m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0), - m_blockRows(BlockRows==1 ? 1 : xpr.rows()), - m_blockCols(BlockCols==1 ? 1 : xpr.cols()) - {} - - /** Fixed-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol) - : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol), - m_blockRows(BlockRows), m_blockCols(BlockCols) - {} - - /** Dynamic-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, - Index startRow, Index startCol, - Index blockRows, Index blockCols) - : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol), - m_blockRows(blockRows), m_blockCols(blockCols) - {} - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_blockRows.value(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_blockCols.value(); } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index rowId, Index colId) - { - EIGEN_STATIC_ASSERT_LVALUE(XprType) - return m_xpr.coeffRef(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return m_xpr.derived().coeffRef(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const - { - return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index index) - { - EIGEN_STATIC_ASSERT_LVALUE(XprType) - return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - EIGEN_DEVICE_FUNC - inline const CoeffReturnType coeff(Index index) const - { - return m_xpr.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - template - inline PacketScalar packet(Index rowId, Index colId) const - { - return m_xpr.template packet(rowId + m_startRow.value(), colId + m_startCol.value()); - } - - template - inline void writePacket(Index rowId, Index colId, const PacketScalar& val) - { - m_xpr.template writePacket(rowId + m_startRow.value(), colId + m_startCol.value(), val); - } - - template - inline PacketScalar packet(Index index) const - { - return m_xpr.template packet - (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0)); - } - - template - inline void writePacket(Index index, const PacketScalar& val) - { - m_xpr.template writePacket - (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index), - m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val); - } - - #ifdef EIGEN_PARSED_BY_DOXYGEN - /** \sa MapBase::data() */ - EIGEN_DEVICE_FUNC inline const Scalar* data() const; - EIGEN_DEVICE_FUNC inline Index innerStride() const; - EIGEN_DEVICE_FUNC inline Index outerStride() const; - #endif - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& nestedExpression() const - { - return m_xpr; - } - - EIGEN_DEVICE_FUNC - XprType& nestedExpression() { return m_xpr; } - - EIGEN_DEVICE_FUNC - StorageIndex startRow() const - { - return m_startRow.value(); - } - - EIGEN_DEVICE_FUNC - StorageIndex startCol() const - { - return m_startCol.value(); - } - - protected: - - XprTypeNested m_xpr; - const internal::variable_if_dynamic m_startRow; - const internal::variable_if_dynamic m_startCol; - const internal::variable_if_dynamic m_blockRows; - const internal::variable_if_dynamic m_blockCols; -}; - -/** \internal Internal implementation of dense Blocks in the direct access case.*/ -template -class BlockImpl_dense - : public MapBase > -{ - typedef Block BlockType; - typedef typename internal::ref_selector::non_const_type XprTypeNested; - enum { - XprTypeIsRowMajor = (int(traits::Flags)&RowMajorBit) != 0 - }; - public: - - typedef MapBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(BlockType) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense) - - /** Column or Row constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index i) - : Base(xpr.data() + i * ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && (!XprTypeIsRowMajor)) - || ((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && ( XprTypeIsRowMajor)) ? xpr.innerStride() : xpr.outerStride()), - BlockRows==1 ? 1 : xpr.rows(), - BlockCols==1 ? 1 : xpr.cols()), - m_xpr(xpr), - m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0), - m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0) - { - init(); - } - - /** Fixed-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol) - : Base(xpr.data()+xpr.innerStride()*(XprTypeIsRowMajor?startCol:startRow) + xpr.outerStride()*(XprTypeIsRowMajor?startRow:startCol)), - m_xpr(xpr), m_startRow(startRow), m_startCol(startCol) - { - init(); - } - - /** Dynamic-size constructor - */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, - Index startRow, Index startCol, - Index blockRows, Index blockCols) - : Base(xpr.data()+xpr.innerStride()*(XprTypeIsRowMajor?startCol:startRow) + xpr.outerStride()*(XprTypeIsRowMajor?startRow:startCol), blockRows, blockCols), - m_xpr(xpr), m_startRow(startRow), m_startCol(startCol) - { - init(); - } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& nestedExpression() const - { - return m_xpr; - } - - EIGEN_DEVICE_FUNC - XprType& nestedExpression() { return m_xpr; } - - /** \sa MapBase::innerStride() */ - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return internal::traits::HasSameStorageOrderAsXprType - ? m_xpr.innerStride() - : m_xpr.outerStride(); - } - - /** \sa MapBase::outerStride() */ - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return m_outerStride; - } - - EIGEN_DEVICE_FUNC - StorageIndex startRow() const - { - return m_startRow.value(); - } - - EIGEN_DEVICE_FUNC - StorageIndex startCol() const - { - return m_startCol.value(); - } - - #ifndef __SUNPRO_CC - // FIXME sunstudio is not friendly with the above friend... - // META-FIXME there is no 'friend' keyword around here. Is this obsolete? - protected: - #endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal used by allowAligned() */ - EIGEN_DEVICE_FUNC - inline BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows, Index blockCols) - : Base(data, blockRows, blockCols), m_xpr(xpr) - { - init(); - } - #endif - - protected: - EIGEN_DEVICE_FUNC - void init() - { - m_outerStride = internal::traits::HasSameStorageOrderAsXprType - ? m_xpr.outerStride() - : m_xpr.innerStride(); - } - - XprTypeNested m_xpr; - const internal::variable_if_dynamic m_startRow; - const internal::variable_if_dynamic m_startCol; - Index m_outerStride; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_BLOCK_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/BooleanRedux.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/BooleanRedux.h deleted file mode 100644 index ccf51906..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/BooleanRedux.h +++ /dev/null @@ -1,162 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ALLANDANY_H -#define EIGEN_ALLANDANY_H - -namespace Eigen { - -namespace internal { - -template -struct all_unroller -{ - enum { - col = (UnrollCount-1) / Rows, - row = (UnrollCount-1) % Rows - }; - - static inline bool run(const Derived &mat) - { - return all_unroller::run(mat) && mat.coeff(row, col); - } -}; - -template -struct all_unroller -{ - static inline bool run(const Derived &/*mat*/) { return true; } -}; - -template -struct all_unroller -{ - static inline bool run(const Derived &) { return false; } -}; - -template -struct any_unroller -{ - enum { - col = (UnrollCount-1) / Rows, - row = (UnrollCount-1) % Rows - }; - - static inline bool run(const Derived &mat) - { - return any_unroller::run(mat) || mat.coeff(row, col); - } -}; - -template -struct any_unroller -{ - static inline bool run(const Derived & /*mat*/) { return false; } -}; - -template -struct any_unroller -{ - static inline bool run(const Derived &) { return false; } -}; - -} // end namespace internal - -/** \returns true if all coefficients are true - * - * Example: \include MatrixBase_all.cpp - * Output: \verbinclude MatrixBase_all.out - * - * \sa any(), Cwise::operator<() - */ -template -EIGEN_DEVICE_FUNC inline bool DenseBase::all() const -{ - typedef internal::evaluator Evaluator; - enum { - unroll = SizeAtCompileTime != Dynamic - && SizeAtCompileTime * (Evaluator::CoeffReadCost + NumTraits::AddCost) <= EIGEN_UNROLLING_LIMIT - }; - Evaluator evaluator(derived()); - if(unroll) - return internal::all_unroller::RowsAtCompileTime>::run(evaluator); - else - { - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if (!evaluator.coeff(i, j)) return false; - return true; - } -} - -/** \returns true if at least one coefficient is true - * - * \sa all() - */ -template -EIGEN_DEVICE_FUNC inline bool DenseBase::any() const -{ - typedef internal::evaluator Evaluator; - enum { - unroll = SizeAtCompileTime != Dynamic - && SizeAtCompileTime * (Evaluator::CoeffReadCost + NumTraits::AddCost) <= EIGEN_UNROLLING_LIMIT - }; - Evaluator evaluator(derived()); - if(unroll) - return internal::any_unroller::RowsAtCompileTime>::run(evaluator); - else - { - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if (evaluator.coeff(i, j)) return true; - return false; - } -} - -/** \returns the number of coefficients which evaluate to true - * - * \sa all(), any() - */ -template -EIGEN_DEVICE_FUNC inline Eigen::Index DenseBase::count() const -{ - return derived().template cast().template cast().sum(); -} - -/** \returns true is \c *this contains at least one Not A Number (NaN). - * - * \sa allFinite() - */ -template -inline bool DenseBase::hasNaN() const -{ -#if EIGEN_COMP_MSVC || (defined __FAST_MATH__) - return derived().array().isNaN().any(); -#else - return !((derived().array()==derived().array()).all()); -#endif -} - -/** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values. - * - * \sa hasNaN() - */ -template -inline bool DenseBase::allFinite() const -{ -#if EIGEN_COMP_MSVC || (defined __FAST_MATH__) - return derived().array().isFinite().all(); -#else - return !((derived()-derived()).hasNaN()); -#endif -} - -} // end namespace Eigen - -#endif // EIGEN_ALLANDANY_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CommaInitializer.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CommaInitializer.h deleted file mode 100644 index 35fdbb81..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CommaInitializer.h +++ /dev/null @@ -1,160 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_COMMAINITIALIZER_H -#define EIGEN_COMMAINITIALIZER_H - -namespace Eigen { - -/** \class CommaInitializer - * \ingroup Core_Module - * - * \brief Helper class used by the comma initializer operator - * - * This class is internally used to implement the comma initializer feature. It is - * the return type of MatrixBase::operator<<, and most of the time this is the only - * way it is used. - * - * \sa \blank \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished() - */ -template -struct CommaInitializer -{ - typedef typename XprType::Scalar Scalar; - - EIGEN_DEVICE_FUNC - inline CommaInitializer(XprType& xpr, const Scalar& s) - : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1) - { - m_xpr.coeffRef(0,0) = s; - } - - template - EIGEN_DEVICE_FUNC - inline CommaInitializer(XprType& xpr, const DenseBase& other) - : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows()) - { - m_xpr.block(0, 0, other.rows(), other.cols()) = other; - } - - /* Copy/Move constructor which transfers ownership. This is crucial in - * absence of return value optimization to avoid assertions during destruction. */ - // FIXME in C++11 mode this could be replaced by a proper RValue constructor - EIGEN_DEVICE_FUNC - inline CommaInitializer(const CommaInitializer& o) - : m_xpr(o.m_xpr), m_row(o.m_row), m_col(o.m_col), m_currentBlockRows(o.m_currentBlockRows) { - // Mark original object as finished. In absence of R-value references we need to const_cast: - const_cast(o).m_row = m_xpr.rows(); - const_cast(o).m_col = m_xpr.cols(); - const_cast(o).m_currentBlockRows = 0; - } - - /* inserts a scalar value in the target matrix */ - EIGEN_DEVICE_FUNC - CommaInitializer& operator,(const Scalar& s) - { - if (m_col==m_xpr.cols()) - { - m_row+=m_currentBlockRows; - m_col = 0; - m_currentBlockRows = 1; - eigen_assert(m_row - EIGEN_DEVICE_FUNC - CommaInitializer& operator,(const DenseBase& other) - { - if (m_col==m_xpr.cols() && (other.cols()!=0 || other.rows()!=m_currentBlockRows)) - { - m_row+=m_currentBlockRows; - m_col = 0; - m_currentBlockRows = other.rows(); - eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows() - && "Too many rows passed to comma initializer (operator<<)"); - } - eigen_assert((m_col + other.cols() <= m_xpr.cols()) - && "Too many coefficients passed to comma initializer (operator<<)"); - eigen_assert(m_currentBlockRows==other.rows()); - m_xpr.template block - (m_row, m_col, other.rows(), other.cols()) = other; - m_col += other.cols(); - return *this; - } - - EIGEN_DEVICE_FUNC - inline ~CommaInitializer() -#if defined VERIFY_RAISES_ASSERT && (!defined EIGEN_NO_ASSERTION_CHECKING) && defined EIGEN_EXCEPTIONS - EIGEN_EXCEPTION_SPEC(Eigen::eigen_assert_exception) -#endif - { - finished(); - } - - /** \returns the built matrix once all its coefficients have been set. - * Calling finished is 100% optional. Its purpose is to write expressions - * like this: - * \code - * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished()); - * \endcode - */ - EIGEN_DEVICE_FUNC - inline XprType& finished() { - eigen_assert(((m_row+m_currentBlockRows) == m_xpr.rows() || m_xpr.cols() == 0) - && m_col == m_xpr.cols() - && "Too few coefficients passed to comma initializer (operator<<)"); - return m_xpr; - } - - XprType& m_xpr; // target expression - Index m_row; // current row id - Index m_col; // current col id - Index m_currentBlockRows; // current block height -}; - -/** \anchor MatrixBaseCommaInitRef - * Convenient operator to set the coefficients of a matrix. - * - * The coefficients must be provided in a row major order and exactly match - * the size of the matrix. Otherwise an assertion is raised. - * - * Example: \include MatrixBase_set.cpp - * Output: \verbinclude MatrixBase_set.out - * - * \note According the c++ standard, the argument expressions of this comma initializer are evaluated in arbitrary order. - * - * \sa CommaInitializer::finished(), class CommaInitializer - */ -template -EIGEN_DEVICE_FUNC inline CommaInitializer DenseBase::operator<< (const Scalar& s) -{ - return CommaInitializer(*static_cast(this), s); -} - -/** \sa operator<<(const Scalar&) */ -template -template -EIGEN_DEVICE_FUNC inline CommaInitializer -DenseBase::operator<<(const DenseBase& other) -{ - return CommaInitializer(*static_cast(this), other); -} - -} // end namespace Eigen - -#endif // EIGEN_COMMAINITIALIZER_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ConditionEstimator.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ConditionEstimator.h deleted file mode 100644 index aa7efdc7..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ConditionEstimator.h +++ /dev/null @@ -1,175 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Rasmus Munk Larsen (rmlarsen@google.com) -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CONDITIONESTIMATOR_H -#define EIGEN_CONDITIONESTIMATOR_H - -namespace Eigen { - -namespace internal { - -template -struct rcond_compute_sign { - static inline Vector run(const Vector& v) { - const RealVector v_abs = v.cwiseAbs(); - return (v_abs.array() == static_cast(0)) - .select(Vector::Ones(v.size()), v.cwiseQuotient(v_abs)); - } -}; - -// Partial specialization to avoid elementwise division for real vectors. -template -struct rcond_compute_sign { - static inline Vector run(const Vector& v) { - return (v.array() < static_cast(0)) - .select(-Vector::Ones(v.size()), Vector::Ones(v.size())); - } -}; - -/** - * \returns an estimate of ||inv(matrix)||_1 given a decomposition of - * \a matrix that implements .solve() and .adjoint().solve() methods. - * - * This function implements Algorithms 4.1 and 5.1 from - * http://www.maths.manchester.ac.uk/~higham/narep/narep135.pdf - * which also forms the basis for the condition number estimators in - * LAPACK. Since at most 10 calls to the solve method of dec are - * performed, the total cost is O(dims^2), as opposed to O(dims^3) - * needed to compute the inverse matrix explicitly. - * - * The most common usage is in estimating the condition number - * ||matrix||_1 * ||inv(matrix)||_1. The first term ||matrix||_1 can be - * computed directly in O(n^2) operations. - * - * Supports the following decompositions: FullPivLU, PartialPivLU, LDLT, and - * LLT. - * - * \sa FullPivLU, PartialPivLU, LDLT, LLT. - */ -template -typename Decomposition::RealScalar rcond_invmatrix_L1_norm_estimate(const Decomposition& dec) -{ - typedef typename Decomposition::MatrixType MatrixType; - typedef typename Decomposition::Scalar Scalar; - typedef typename Decomposition::RealScalar RealScalar; - typedef typename internal::plain_col_type::type Vector; - typedef typename internal::plain_col_type::type RealVector; - const bool is_complex = (NumTraits::IsComplex != 0); - - eigen_assert(dec.rows() == dec.cols()); - const Index n = dec.rows(); - if (n == 0) - return 0; - - // Disable Index to float conversion warning -#ifdef __INTEL_COMPILER - #pragma warning push - #pragma warning ( disable : 2259 ) -#endif - Vector v = dec.solve(Vector::Ones(n) / Scalar(n)); -#ifdef __INTEL_COMPILER - #pragma warning pop -#endif - - // lower_bound is a lower bound on - // ||inv(matrix)||_1 = sup_v ||inv(matrix) v||_1 / ||v||_1 - // and is the objective maximized by the ("super-") gradient ascent - // algorithm below. - RealScalar lower_bound = v.template lpNorm<1>(); - if (n == 1) - return lower_bound; - - // Gradient ascent algorithm follows: We know that the optimum is achieved at - // one of the simplices v = e_i, so in each iteration we follow a - // super-gradient to move towards the optimal one. - RealScalar old_lower_bound = lower_bound; - Vector sign_vector(n); - Vector old_sign_vector; - Index v_max_abs_index = -1; - Index old_v_max_abs_index = v_max_abs_index; - for (int k = 0; k < 4; ++k) - { - sign_vector = internal::rcond_compute_sign::run(v); - if (k > 0 && !is_complex && sign_vector == old_sign_vector) { - // Break if the solution stagnated. - break; - } - // v_max_abs_index = argmax |real( inv(matrix)^T * sign_vector )| - v = dec.adjoint().solve(sign_vector); - v.real().cwiseAbs().maxCoeff(&v_max_abs_index); - if (v_max_abs_index == old_v_max_abs_index) { - // Break if the solution stagnated. - break; - } - // Move to the new simplex e_j, where j = v_max_abs_index. - v = dec.solve(Vector::Unit(n, v_max_abs_index)); // v = inv(matrix) * e_j. - lower_bound = v.template lpNorm<1>(); - if (lower_bound <= old_lower_bound) { - // Break if the gradient step did not increase the lower_bound. - break; - } - if (!is_complex) { - old_sign_vector = sign_vector; - } - old_v_max_abs_index = v_max_abs_index; - old_lower_bound = lower_bound; - } - // The following calculates an independent estimate of ||matrix||_1 by - // multiplying matrix by a vector with entries of slowly increasing - // magnitude and alternating sign: - // v_i = (-1)^{i} (1 + (i / (dim-1))), i = 0,...,dim-1. - // This improvement to Hager's algorithm above is due to Higham. It was - // added to make the algorithm more robust in certain corner cases where - // large elements in the matrix might otherwise escape detection due to - // exact cancellation (especially when op and op_adjoint correspond to a - // sequence of backsubstitutions and permutations), which could cause - // Hager's algorithm to vastly underestimate ||matrix||_1. - Scalar alternating_sign(RealScalar(1)); - for (Index i = 0; i < n; ++i) { - // The static_cast is needed when Scalar is a complex and RealScalar implements expression templates - v[i] = alternating_sign * static_cast(RealScalar(1) + (RealScalar(i) / (RealScalar(n - 1)))); - alternating_sign = -alternating_sign; - } - v = dec.solve(v); - const RealScalar alternate_lower_bound = (2 * v.template lpNorm<1>()) / (3 * RealScalar(n)); - return numext::maxi(lower_bound, alternate_lower_bound); -} - -/** \brief Reciprocal condition number estimator. - * - * Computing a decomposition of a dense matrix takes O(n^3) operations, while - * this method estimates the condition number quickly and reliably in O(n^2) - * operations. - * - * \returns an estimate of the reciprocal condition number - * (1 / (||matrix||_1 * ||inv(matrix)||_1)) of matrix, given ||matrix||_1 and - * its decomposition. Supports the following decompositions: FullPivLU, - * PartialPivLU, LDLT, and LLT. - * - * \sa FullPivLU, PartialPivLU, LDLT, LLT. - */ -template -typename Decomposition::RealScalar -rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm, const Decomposition& dec) -{ - typedef typename Decomposition::RealScalar RealScalar; - eigen_assert(dec.rows() == dec.cols()); - if (dec.rows() == 0) return RealScalar(1); - if (matrix_norm == RealScalar(0)) return RealScalar(0); - if (dec.rows() == 1) return RealScalar(1); - const RealScalar inverse_matrix_norm = rcond_invmatrix_L1_norm_estimate(dec); - return (inverse_matrix_norm == RealScalar(0) ? RealScalar(0) - : (RealScalar(1) / inverse_matrix_norm) / matrix_norm); -} - -} // namespace internal - -} // namespace Eigen - -#endif diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CoreEvaluators.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CoreEvaluators.h deleted file mode 100644 index 15b361b3..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CoreEvaluators.h +++ /dev/null @@ -1,1728 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// Copyright (C) 2011-2014 Gael Guennebaud -// Copyright (C) 2011-2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -#ifndef EIGEN_COREEVALUATORS_H -#define EIGEN_COREEVALUATORS_H - -namespace Eigen { - -namespace internal { - -// This class returns the evaluator kind from the expression storage kind. -// Default assumes index based accessors -template -struct storage_kind_to_evaluator_kind { - typedef IndexBased Kind; -}; - -// This class returns the evaluator shape from the expression storage kind. -// It can be Dense, Sparse, Triangular, Diagonal, SelfAdjoint, Band, etc. -template struct storage_kind_to_shape; - -template<> struct storage_kind_to_shape { typedef DenseShape Shape; }; -template<> struct storage_kind_to_shape { typedef SolverShape Shape; }; -template<> struct storage_kind_to_shape { typedef PermutationShape Shape; }; -template<> struct storage_kind_to_shape { typedef TranspositionsShape Shape; }; - -// Evaluators have to be specialized with respect to various criteria such as: -// - storage/structure/shape -// - scalar type -// - etc. -// Therefore, we need specialization of evaluator providing additional template arguments for each kind of evaluators. -// We currently distinguish the following kind of evaluators: -// - unary_evaluator for expressions taking only one arguments (CwiseUnaryOp, CwiseUnaryView, Transpose, MatrixWrapper, ArrayWrapper, Reverse, Replicate) -// - binary_evaluator for expression taking two arguments (CwiseBinaryOp) -// - ternary_evaluator for expression taking three arguments (CwiseTernaryOp) -// - product_evaluator for linear algebra products (Product); special case of binary_evaluator because it requires additional tags for dispatching. -// - mapbase_evaluator for Map, Block, Ref -// - block_evaluator for Block (special dispatching to a mapbase_evaluator or unary_evaluator) - -template< typename T, - typename Arg1Kind = typename evaluator_traits::Kind, - typename Arg2Kind = typename evaluator_traits::Kind, - typename Arg3Kind = typename evaluator_traits::Kind, - typename Arg1Scalar = typename traits::Scalar, - typename Arg2Scalar = typename traits::Scalar, - typename Arg3Scalar = typename traits::Scalar> struct ternary_evaluator; - -template< typename T, - typename LhsKind = typename evaluator_traits::Kind, - typename RhsKind = typename evaluator_traits::Kind, - typename LhsScalar = typename traits::Scalar, - typename RhsScalar = typename traits::Scalar> struct binary_evaluator; - -template< typename T, - typename Kind = typename evaluator_traits::Kind, - typename Scalar = typename T::Scalar> struct unary_evaluator; - -// evaluator_traits contains traits for evaluator - -template -struct evaluator_traits_base -{ - // by default, get evaluator kind and shape from storage - typedef typename storage_kind_to_evaluator_kind::StorageKind>::Kind Kind; - typedef typename storage_kind_to_shape::StorageKind>::Shape Shape; -}; - -// Default evaluator traits -template -struct evaluator_traits : public evaluator_traits_base -{ -}; - -template::Shape > -struct evaluator_assume_aliasing { - static const bool value = false; -}; - -// By default, we assume a unary expression: -template -struct evaluator : public unary_evaluator -{ - typedef unary_evaluator Base; - EIGEN_DEVICE_FUNC explicit evaluator(const T& xpr) : Base(xpr) {} -}; - - -// TODO: Think about const-correctness -template -struct evaluator - : evaluator -{ - EIGEN_DEVICE_FUNC - explicit evaluator(const T& xpr) : evaluator(xpr) {} -}; - -// ---------- base class for all evaluators ---------- - -template -struct evaluator_base -{ - // TODO that's not very nice to have to propagate all these traits. They are currently only needed to handle outer,inner indices. - typedef traits ExpressionTraits; - - enum { - Alignment = 0 - }; - // noncopyable: - // Don't make this class inherit noncopyable as this kills EBO (Empty Base Optimization) - // and make complex evaluator much larger than then should do. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE evaluator_base() {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~evaluator_base() {} -private: - EIGEN_DEVICE_FUNC evaluator_base(const evaluator_base&); - EIGEN_DEVICE_FUNC const evaluator_base& operator=(const evaluator_base&); -}; - -// -------------------- Matrix and Array -------------------- -// -// evaluator is a common base class for the -// Matrix and Array evaluators. -// Here we directly specialize evaluator. This is not really a unary expression, and it is, by definition, dense, -// so no need for more sophisticated dispatching. - -// this helper permits to completely eliminate m_outerStride if it is known at compiletime. -template class plainobjectbase_evaluator_data { -public: - EIGEN_DEVICE_FUNC plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride) : data(ptr) - { - EIGEN_ONLY_USED_FOR_DEBUG(outerStride); - eigen_internal_assert(outerStride==OuterStride); - } - EIGEN_DEVICE_FUNC Index outerStride() const { return OuterStride; } - const Scalar *data; -}; - -template class plainobjectbase_evaluator_data { -public: - EIGEN_DEVICE_FUNC plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride) : data(ptr), m_outerStride(outerStride) {} - EIGEN_DEVICE_FUNC Index outerStride() const { return m_outerStride; } - const Scalar *data; -protected: - Index m_outerStride; -}; - -template -struct evaluator > - : evaluator_base -{ - typedef PlainObjectBase PlainObjectType; - typedef typename PlainObjectType::Scalar Scalar; - typedef typename PlainObjectType::CoeffReturnType CoeffReturnType; - - enum { - IsRowMajor = PlainObjectType::IsRowMajor, - IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime, - RowsAtCompileTime = PlainObjectType::RowsAtCompileTime, - ColsAtCompileTime = PlainObjectType::ColsAtCompileTime, - - CoeffReadCost = NumTraits::ReadCost, - Flags = traits::EvaluatorFlags, - Alignment = traits::Alignment - }; - enum { - // We do not need to know the outer stride for vectors - OuterStrideAtCompileTime = IsVectorAtCompileTime ? 0 - : int(IsRowMajor) ? ColsAtCompileTime - : RowsAtCompileTime - }; - - EIGEN_DEVICE_FUNC evaluator() - : m_d(0,OuterStrideAtCompileTime) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC explicit evaluator(const PlainObjectType& m) - : m_d(m.data(),IsVectorAtCompileTime ? 0 : m.outerStride()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - if (IsRowMajor) - return m_d.data[row * m_d.outerStride() + col]; - else - return m_d.data[row + col * m_d.outerStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.data[index]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - if (IsRowMajor) - return const_cast(m_d.data)[row * m_d.outerStride() + col]; - else - return const_cast(m_d.data)[row + col * m_d.outerStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return const_cast(m_d.data)[index]; - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - if (IsRowMajor) - return ploadt(m_d.data + row * m_d.outerStride() + col); - else - return ploadt(m_d.data + row + col * m_d.outerStride()); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return ploadt(m_d.data + index); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - if (IsRowMajor) - return pstoret - (const_cast(m_d.data) + row * m_d.outerStride() + col, x); - else - return pstoret - (const_cast(m_d.data) + row + col * m_d.outerStride(), x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - return pstoret(const_cast(m_d.data) + index, x); - } - -protected: - - plainobjectbase_evaluator_data m_d; -}; - -template -struct evaluator > - : evaluator > > -{ - typedef Matrix XprType; - - EIGEN_DEVICE_FUNC evaluator() {} - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& m) - : evaluator >(m) - { } -}; - -template -struct evaluator > - : evaluator > > -{ - typedef Array XprType; - - EIGEN_DEVICE_FUNC evaluator() {} - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& m) - : evaluator >(m) - { } -}; - -// -------------------- Transpose -------------------- - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef Transpose XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - Flags = evaluator::Flags ^ RowMajorBit, - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& t) : m_argImpl(t.nestedExpression()) {} - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(col, row); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(col, row); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename XprType::Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_argImpl.template packet(col, row); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_argImpl.template packet(index); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - m_argImpl.template writePacket(col, row, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - m_argImpl.template writePacket(index, x); - } - -protected: - evaluator m_argImpl; -}; - -// -------------------- CwiseNullaryOp -------------------- -// Like Matrix and Array, this is not really a unary expression, so we directly specialize evaluator. -// Likewise, there is not need to more sophisticated dispatching here. - -template::value, - bool has_unary = has_unary_operator::value, - bool has_binary = has_binary_operator::value> -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { return op(i,j); } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { return op.template packetOp(i,j); } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp(i); } -}; - -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType=0, IndexType=0) const { return op(); } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType=0, IndexType=0) const { return op.template packetOp(); } -}; - -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j=0) const { return op(i,j); } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j=0) const { return op.template packetOp(i,j); } -}; - -// We need the following specialization for vector-only functors assigned to a runtime vector, -// for instance, using linspace and assigning a RowVectorXd to a MatrixXd or even a row of a MatrixXd. -// In this case, i==0 and j is used for the actual iteration. -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { - eigen_assert(i==0 || j==0); - return op(i+j); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { - eigen_assert(i==0 || j==0); - return op.template packetOp(i+j); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp(i); } -}; - -template -struct nullary_wrapper {}; - -#if 0 && EIGEN_COMP_MSVC>0 -// Disable this ugly workaround. This is now handled in traits::match, -// but this piece of code might still become handly if some other weird compilation -// erros pop up again. - -// MSVC exhibits a weird compilation error when -// compiling: -// Eigen::MatrixXf A = MatrixXf::Random(3,3); -// Ref R = 2.f*A; -// and that has_*ary_operator> have not been instantiated yet. -// The "problem" is that evaluator<2.f*A> is instantiated by traits::match<2.f*A> -// and at that time has_*ary_operator returns true regardless of T. -// Then nullary_wrapper is badly instantiated as nullary_wrapper<.,.,true,true,true>. -// The trick is thus to defer the proper instantiation of nullary_wrapper when coeff(), -// and packet() are really instantiated as implemented below: - -// This is a simple wrapper around Index to enforce the re-instantiation of -// has_*ary_operator when needed. -template struct nullary_wrapper_workaround_msvc { - nullary_wrapper_workaround_msvc(const T&); - operator T()const; -}; - -template -struct nullary_wrapper -{ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().operator()(op,i,j); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().operator()(op,i); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().template packetOp(op,i,j); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { - return nullary_wrapper >::value, - has_unary_operator >::value, - has_binary_operator >::value>().template packetOp(op,i); - } -}; -#endif // MSVC workaround - -template -struct evaluator > - : evaluator_base > -{ - typedef CwiseNullaryOp XprType; - typedef typename internal::remove_all::type PlainObjectTypeCleaned; - - enum { - CoeffReadCost = internal::functor_traits::Cost, - - Flags = (evaluator::Flags - & ( HereditaryBits - | (functor_has_linear_access::ret ? LinearAccessBit : 0) - | (functor_traits::PacketAccess ? PacketAccessBit : 0))) - | (functor_traits::IsRepeatable ? 0 : EvalBeforeNestingBit), - Alignment = AlignedMax - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& n) - : m_functor(n.functor()), m_wrapper() - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(IndexType row, IndexType col) const - { - return m_wrapper(m_functor, row, col); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(IndexType index) const - { - return m_wrapper(m_functor,index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(IndexType row, IndexType col) const - { - return m_wrapper.template packetOp(m_functor, row, col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(IndexType index) const - { - return m_wrapper.template packetOp(m_functor, index); - } - -protected: - const NullaryOp m_functor; - const internal::nullary_wrapper m_wrapper; -}; - -// -------------------- CwiseUnaryOp -------------------- - -template -struct unary_evaluator, IndexBased > - : evaluator_base > -{ - typedef CwiseUnaryOp XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + functor_traits::Cost, - - Flags = evaluator::Flags - & (HereditaryBits | LinearAccessBit | (functor_traits::PacketAccess ? PacketAccessBit : 0)), - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit unary_evaluator(const XprType& op) : m_d(op) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.argImpl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.argImpl.coeff(index)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_d.func().packetOp(m_d.argImpl.template packet(row, col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_d.func().packetOp(m_d.argImpl.template packet(index)); - } - -protected: - - // this helper permits to completely eliminate the functor if it is empty - class Data : private UnaryOp - { - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : UnaryOp(xpr.functor()), argImpl(xpr.nestedExpression()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const UnaryOp& func() const { return static_cast(*this); } - evaluator argImpl; - }; - - Data m_d; -}; - -// -------------------- CwiseTernaryOp -------------------- - -// this is a ternary expression -template -struct evaluator > - : public ternary_evaluator > -{ - typedef CwiseTernaryOp XprType; - typedef ternary_evaluator > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {} -}; - -template -struct ternary_evaluator, IndexBased, IndexBased> - : evaluator_base > -{ - typedef CwiseTernaryOp XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + evaluator::CoeffReadCost + evaluator::CoeffReadCost + functor_traits::Cost, - - Arg1Flags = evaluator::Flags, - Arg2Flags = evaluator::Flags, - Arg3Flags = evaluator::Flags, - SameType = is_same::value && is_same::value, - StorageOrdersAgree = (int(Arg1Flags)&RowMajorBit)==(int(Arg2Flags)&RowMajorBit) && (int(Arg1Flags)&RowMajorBit)==(int(Arg3Flags)&RowMajorBit), - Flags0 = (int(Arg1Flags) | int(Arg2Flags) | int(Arg3Flags)) & ( - HereditaryBits - | (int(Arg1Flags) & int(Arg2Flags) & int(Arg3Flags) & - ( (StorageOrdersAgree ? LinearAccessBit : 0) - | (functor_traits::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0) - ) - ) - ), - Flags = (Flags0 & ~RowMajorBit) | (Arg1Flags & RowMajorBit), - Alignment = EIGEN_PLAIN_ENUM_MIN( - EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment, evaluator::Alignment), - evaluator::Alignment) - }; - - EIGEN_DEVICE_FUNC explicit ternary_evaluator(const XprType& xpr) : m_d(xpr) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.arg1Impl.coeff(row, col), m_d.arg2Impl.coeff(row, col), m_d.arg3Impl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.arg1Impl.coeff(index), m_d.arg2Impl.coeff(index), m_d.arg3Impl.coeff(index)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_d.func().packetOp(m_d.arg1Impl.template packet(row, col), - m_d.arg2Impl.template packet(row, col), - m_d.arg3Impl.template packet(row, col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_d.func().packetOp(m_d.arg1Impl.template packet(index), - m_d.arg2Impl.template packet(index), - m_d.arg3Impl.template packet(index)); - } - -protected: - // this helper permits to completely eliminate the functor if it is empty - struct Data : private TernaryOp - { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : TernaryOp(xpr.functor()), arg1Impl(xpr.arg1()), arg2Impl(xpr.arg2()), arg3Impl(xpr.arg3()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TernaryOp& func() const { return static_cast(*this); } - evaluator arg1Impl; - evaluator arg2Impl; - evaluator arg3Impl; - }; - - Data m_d; -}; - -// -------------------- CwiseBinaryOp -------------------- - -// this is a binary expression -template -struct evaluator > - : public binary_evaluator > -{ - typedef CwiseBinaryOp XprType; - typedef binary_evaluator > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {} -}; - -template -struct binary_evaluator, IndexBased, IndexBased> - : evaluator_base > -{ - typedef CwiseBinaryOp XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + evaluator::CoeffReadCost + functor_traits::Cost, - - LhsFlags = evaluator::Flags, - RhsFlags = evaluator::Flags, - SameType = is_same::value, - StorageOrdersAgree = (int(LhsFlags)&RowMajorBit)==(int(RhsFlags)&RowMajorBit), - Flags0 = (int(LhsFlags) | int(RhsFlags)) & ( - HereditaryBits - | (int(LhsFlags) & int(RhsFlags) & - ( (StorageOrdersAgree ? LinearAccessBit : 0) - | (functor_traits::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0) - ) - ) - ), - Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit), - Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment,evaluator::Alignment) - }; - - EIGEN_DEVICE_FUNC explicit binary_evaluator(const XprType& xpr) : m_d(xpr) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.lhsImpl.coeff(row, col), m_d.rhsImpl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.lhsImpl.coeff(index), m_d.rhsImpl.coeff(index)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_d.func().packetOp(m_d.lhsImpl.template packet(row, col), - m_d.rhsImpl.template packet(row, col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_d.func().packetOp(m_d.lhsImpl.template packet(index), - m_d.rhsImpl.template packet(index)); - } - -protected: - - // this helper permits to completely eliminate the functor if it is empty - struct Data : private BinaryOp - { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : BinaryOp(xpr.functor()), lhsImpl(xpr.lhs()), rhsImpl(xpr.rhs()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const BinaryOp& func() const { return static_cast(*this); } - evaluator lhsImpl; - evaluator rhsImpl; - }; - - Data m_d; -}; - -// -------------------- CwiseUnaryView -------------------- - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef CwiseUnaryView XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost + functor_traits::Cost, - - Flags = (evaluator::Flags & (HereditaryBits | LinearAccessBit | DirectAccessBit)), - - Alignment = 0 // FIXME it is not very clear why alignment is necessarily lost... - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op) : m_d(op) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits::Cost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_d.func()(m_d.argImpl.coeff(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_d.func()(m_d.argImpl.coeff(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_d.func()(m_d.argImpl.coeffRef(row, col)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_d.func()(m_d.argImpl.coeffRef(index)); - } - -protected: - - // this helper permits to completely eliminate the functor if it is empty - struct Data : private UnaryOp - { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Data(const XprType& xpr) : UnaryOp(xpr.functor()), argImpl(xpr.nestedExpression()) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const UnaryOp& func() const { return static_cast(*this); } - evaluator argImpl; - }; - - Data m_d; -}; - -// -------------------- Map -------------------- - -// FIXME perhaps the PlainObjectType could be provided by Derived::PlainObject ? -// but that might complicate template specialization -template -struct mapbase_evaluator; - -template -struct mapbase_evaluator : evaluator_base -{ - typedef Derived XprType; - typedef typename XprType::PointerType PointerType; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - IsRowMajor = XprType::RowsAtCompileTime, - ColsAtCompileTime = XprType::ColsAtCompileTime, - CoeffReadCost = NumTraits::ReadCost - }; - - EIGEN_DEVICE_FUNC explicit mapbase_evaluator(const XprType& map) - : m_data(const_cast(map.data())), - m_innerStride(map.innerStride()), - m_outerStride(map.outerStride()) - { - EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(evaluator::Flags&PacketAccessBit, internal::inner_stride_at_compile_time::ret==1), - PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_data[col * colStride() + row * rowStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_data[index * m_innerStride.value()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_data[col * colStride() + row * rowStride()]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_data[index * m_innerStride.value()]; - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - PointerType ptr = m_data + row * rowStride() + col * colStride(); - return internal::ploadt(ptr); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return internal::ploadt(m_data + index * m_innerStride.value()); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - PointerType ptr = m_data + row * rowStride() + col * colStride(); - return internal::pstoret(ptr, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - internal::pstoret(m_data + index * m_innerStride.value(), x); - } -protected: - EIGEN_DEVICE_FUNC - inline Index rowStride() const { return XprType::IsRowMajor ? m_outerStride.value() : m_innerStride.value(); } - EIGEN_DEVICE_FUNC - inline Index colStride() const { return XprType::IsRowMajor ? m_innerStride.value() : m_outerStride.value(); } - - PointerType m_data; - const internal::variable_if_dynamic m_innerStride; - const internal::variable_if_dynamic m_outerStride; -}; - -template -struct evaluator > - : public mapbase_evaluator, PlainObjectType> -{ - typedef Map XprType; - typedef typename XprType::Scalar Scalar; - // TODO: should check for smaller packet types once we can handle multi-sized packet types - typedef typename packet_traits::type PacketScalar; - - enum { - InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0 - ? int(PlainObjectType::InnerStrideAtCompileTime) - : int(StrideType::InnerStrideAtCompileTime), - OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0 - ? int(PlainObjectType::OuterStrideAtCompileTime) - : int(StrideType::OuterStrideAtCompileTime), - HasNoInnerStride = InnerStrideAtCompileTime == 1, - HasNoOuterStride = StrideType::OuterStrideAtCompileTime == 0, - HasNoStride = HasNoInnerStride && HasNoOuterStride, - IsDynamicSize = PlainObjectType::SizeAtCompileTime==Dynamic, - - PacketAccessMask = bool(HasNoInnerStride) ? ~int(0) : ~int(PacketAccessBit), - LinearAccessMask = bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime) ? ~int(0) : ~int(LinearAccessBit), - Flags = int( evaluator::Flags) & (LinearAccessMask&PacketAccessMask), - - Alignment = int(MapOptions)&int(AlignedMask) - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& map) - : mapbase_evaluator(map) - { } -}; - -// -------------------- Ref -------------------- - -template -struct evaluator > - : public mapbase_evaluator, PlainObjectType> -{ - typedef Ref XprType; - - enum { - Flags = evaluator >::Flags, - Alignment = evaluator >::Alignment - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& ref) - : mapbase_evaluator(ref) - { } -}; - -// -------------------- Block -------------------- - -template::ret> struct block_evaluator; - -template -struct evaluator > - : block_evaluator -{ - typedef Block XprType; - typedef typename XprType::Scalar Scalar; - // TODO: should check for smaller packet types once we can handle multi-sized packet types - typedef typename packet_traits::type PacketScalar; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - - RowsAtCompileTime = traits::RowsAtCompileTime, - ColsAtCompileTime = traits::ColsAtCompileTime, - MaxRowsAtCompileTime = traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = traits::MaxColsAtCompileTime, - - ArgTypeIsRowMajor = (int(evaluator::Flags)&RowMajorBit) != 0, - IsRowMajor = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0 - : ArgTypeIsRowMajor, - HasSameStorageOrderAsArgType = (IsRowMajor == ArgTypeIsRowMajor), - InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime), - InnerStrideAtCompileTime = HasSameStorageOrderAsArgType - ? int(inner_stride_at_compile_time::ret) - : int(outer_stride_at_compile_time::ret), - OuterStrideAtCompileTime = HasSameStorageOrderAsArgType - ? int(outer_stride_at_compile_time::ret) - : int(inner_stride_at_compile_time::ret), - MaskPacketAccessBit = (InnerStrideAtCompileTime == 1) ? PacketAccessBit : 0, - - FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (evaluator::Flags&LinearAccessBit))) ? LinearAccessBit : 0, - FlagsRowMajorBit = XprType::Flags&RowMajorBit, - Flags0 = evaluator::Flags & ( (HereditaryBits & ~RowMajorBit) | - DirectAccessBit | - MaskPacketAccessBit), - Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit, - - PacketAlignment = unpacket_traits::alignment, - Alignment0 = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0)) ? int(PacketAlignment) : 0, - Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment, Alignment0) - }; - typedef block_evaluator block_evaluator_type; - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& block) : block_evaluator_type(block) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } -}; - -// no direct-access => dispatch to a unary evaluator -template -struct block_evaluator - : unary_evaluator > -{ - typedef Block XprType; - - EIGEN_DEVICE_FUNC explicit block_evaluator(const XprType& block) - : unary_evaluator(block) - {} -}; - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef Block XprType; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& block) - : m_argImpl(block.nestedExpression()), - m_startRow(block.startRow()), - m_startCol(block.startCol()) - { } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - RowsAtCompileTime = XprType::RowsAtCompileTime - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(m_startRow.value() + row, m_startCol.value() + col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return coeff(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(m_startRow.value() + row, m_startCol.value() + col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return coeffRef(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_argImpl.template packet(m_startRow.value() + row, m_startCol.value() + col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return packet(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - return m_argImpl.template writePacket(m_startRow.value() + row, m_startCol.value() + col, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - return writePacket(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0, - x); - } - -protected: - evaluator m_argImpl; - const variable_if_dynamic m_startRow; - const variable_if_dynamic m_startCol; -}; - -// TODO: This evaluator does not actually use the child evaluator; -// all action is via the data() as returned by the Block expression. - -template -struct block_evaluator - : mapbase_evaluator, - typename Block::PlainObject> -{ - typedef Block XprType; - typedef typename XprType::Scalar Scalar; - - EIGEN_DEVICE_FUNC explicit block_evaluator(const XprType& block) - : mapbase_evaluator(block) - { - // TODO: for the 3.3 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime - eigen_assert(((internal::UIntPtr(block.data()) % EIGEN_PLAIN_ENUM_MAX(1,evaluator::Alignment)) == 0) && "data is not aligned"); - } -}; - - -// -------------------- Select -------------------- -// NOTE shall we introduce a ternary_evaluator? - -// TODO enable vectorization for Select -template -struct evaluator > - : evaluator_base > -{ - typedef Select XprType; - enum { - CoeffReadCost = evaluator::CoeffReadCost - + EIGEN_PLAIN_ENUM_MAX(evaluator::CoeffReadCost, - evaluator::CoeffReadCost), - - Flags = (unsigned int)evaluator::Flags & evaluator::Flags & HereditaryBits, - - Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator::Alignment, evaluator::Alignment) - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& select) - : m_conditionImpl(select.conditionMatrix()), - m_thenImpl(select.thenMatrix()), - m_elseImpl(select.elseMatrix()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - if (m_conditionImpl.coeff(row, col)) - return m_thenImpl.coeff(row, col); - else - return m_elseImpl.coeff(row, col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - if (m_conditionImpl.coeff(index)) - return m_thenImpl.coeff(index); - else - return m_elseImpl.coeff(index); - } - -protected: - evaluator m_conditionImpl; - evaluator m_thenImpl; - evaluator m_elseImpl; -}; - - -// -------------------- Replicate -------------------- - -template -struct unary_evaluator > - : evaluator_base > -{ - typedef Replicate XprType; - typedef typename XprType::CoeffReturnType CoeffReturnType; - enum { - Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor - }; - typedef typename internal::nested_eval::type ArgTypeNested; - typedef typename internal::remove_all::type ArgTypeNestedCleaned; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - LinearAccessMask = XprType::IsVectorAtCompileTime ? LinearAccessBit : 0, - Flags = (evaluator::Flags & (HereditaryBits|LinearAccessMask) & ~RowMajorBit) | (traits::Flags & RowMajorBit), - - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& replicate) - : m_arg(replicate.nestedExpression()), - m_argImpl(m_arg), - m_rows(replicate.nestedExpression().rows()), - m_cols(replicate.nestedExpression().cols()) - {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - // try to avoid using modulo; this is a pure optimization strategy - const Index actual_row = internal::traits::RowsAtCompileTime==1 ? 0 - : RowFactor==1 ? row - : row % m_rows.value(); - const Index actual_col = internal::traits::ColsAtCompileTime==1 ? 0 - : ColFactor==1 ? col - : col % m_cols.value(); - - return m_argImpl.coeff(actual_row, actual_col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - // try to avoid using modulo; this is a pure optimization strategy - const Index actual_index = internal::traits::RowsAtCompileTime==1 - ? (ColFactor==1 ? index : index%m_cols.value()) - : (RowFactor==1 ? index : index%m_rows.value()); - - return m_argImpl.coeff(actual_index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - const Index actual_row = internal::traits::RowsAtCompileTime==1 ? 0 - : RowFactor==1 ? row - : row % m_rows.value(); - const Index actual_col = internal::traits::ColsAtCompileTime==1 ? 0 - : ColFactor==1 ? col - : col % m_cols.value(); - - return m_argImpl.template packet(actual_row, actual_col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - const Index actual_index = internal::traits::RowsAtCompileTime==1 - ? (ColFactor==1 ? index : index%m_cols.value()) - : (RowFactor==1 ? index : index%m_rows.value()); - - return m_argImpl.template packet(actual_index); - } - -protected: - const ArgTypeNested m_arg; - evaluator m_argImpl; - const variable_if_dynamic m_rows; - const variable_if_dynamic m_cols; -}; - - -// -------------------- PartialReduxExpr -------------------- - -template< typename ArgType, typename MemberOp, int Direction> -struct evaluator > - : evaluator_base > -{ - typedef PartialReduxExpr XprType; - typedef typename internal::nested_eval::type ArgTypeNested; - typedef typename internal::remove_all::type ArgTypeNestedCleaned; - typedef typename ArgType::Scalar InputScalar; - typedef typename XprType::Scalar Scalar; - enum { - TraversalSize = Direction==int(Vertical) ? int(ArgType::RowsAtCompileTime) : int(ArgType::ColsAtCompileTime) - }; - typedef typename MemberOp::template Cost CostOpType; - enum { - CoeffReadCost = TraversalSize==Dynamic ? HugeCost - : TraversalSize * evaluator::CoeffReadCost + int(CostOpType::value), - - Flags = (traits::Flags&RowMajorBit) | (evaluator::Flags&(HereditaryBits&(~RowMajorBit))) | LinearAccessBit, - - Alignment = 0 // FIXME this will need to be improved once PartialReduxExpr is vectorized - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType xpr) - : m_arg(xpr.nestedExpression()), m_functor(xpr.functor()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(TraversalSize==Dynamic ? HugeCost : int(CostOpType::value)); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Scalar coeff(Index i, Index j) const - { - if (Direction==Vertical) - return m_functor(m_arg.col(j)); - else - return m_functor(m_arg.row(i)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Scalar coeff(Index index) const - { - if (Direction==Vertical) - return m_functor(m_arg.col(index)); - else - return m_functor(m_arg.row(index)); - } - -protected: - typename internal::add_const_on_value_type::type m_arg; - const MemberOp m_functor; -}; - - -// -------------------- MatrixWrapper and ArrayWrapper -------------------- -// -// evaluator_wrapper_base is a common base class for the -// MatrixWrapper and ArrayWrapper evaluators. - -template -struct evaluator_wrapper_base - : evaluator_base -{ - typedef typename remove_all::type ArgType; - enum { - CoeffReadCost = evaluator::CoeffReadCost, - Flags = evaluator::Flags, - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC explicit evaluator_wrapper_base(const ArgType& arg) : m_argImpl(arg) {} - - typedef typename ArgType::Scalar Scalar; - typedef typename ArgType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(row, col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(row, col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(index); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - return m_argImpl.template packet(row, col); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - return m_argImpl.template packet(index); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - m_argImpl.template writePacket(row, col, x); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - m_argImpl.template writePacket(index, x); - } - -protected: - evaluator m_argImpl; -}; - -template -struct unary_evaluator > - : evaluator_wrapper_base > -{ - typedef MatrixWrapper XprType; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& wrapper) - : evaluator_wrapper_base >(wrapper.nestedExpression()) - { } -}; - -template -struct unary_evaluator > - : evaluator_wrapper_base > -{ - typedef ArrayWrapper XprType; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& wrapper) - : evaluator_wrapper_base >(wrapper.nestedExpression()) - { } -}; - - -// -------------------- Reverse -------------------- - -// defined in Reverse.h: -template struct reverse_packet_cond; - -template -struct unary_evaluator > - : evaluator_base > -{ - typedef Reverse XprType; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - IsRowMajor = XprType::IsRowMajor, - IsColMajor = !IsRowMajor, - ReverseRow = (Direction == Vertical) || (Direction == BothDirections), - ReverseCol = (Direction == Horizontal) || (Direction == BothDirections), - ReversePacket = (Direction == BothDirections) - || ((Direction == Vertical) && IsColMajor) - || ((Direction == Horizontal) && IsRowMajor), - - CoeffReadCost = evaluator::CoeffReadCost, - - // let's enable LinearAccess only with vectorization because of the product overhead - // FIXME enable DirectAccess with negative strides? - Flags0 = evaluator::Flags, - LinearAccess = ( (Direction==BothDirections) && (int(Flags0)&PacketAccessBit) ) - || ((ReverseRow && XprType::ColsAtCompileTime==1) || (ReverseCol && XprType::RowsAtCompileTime==1)) - ? LinearAccessBit : 0, - - Flags = int(Flags0) & (HereditaryBits | PacketAccessBit | LinearAccess), - - Alignment = 0 // FIXME in some rare cases, Alignment could be preserved, like a Vector4f. - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& reverse) - : m_argImpl(reverse.nestedExpression()), - m_rows(ReverseRow ? reverse.nestedExpression().rows() : 1), - m_cols(ReverseCol ? reverse.nestedExpression().cols() : 1) - { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(ReverseRow ? m_rows.value() - row - 1 : row, - ReverseCol ? m_cols.value() - col - 1 : col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(m_rows.value() * m_cols.value() - index - 1); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(ReverseRow ? m_rows.value() - row - 1 : row, - ReverseCol ? m_cols.value() - col - 1 : col); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(m_rows.value() * m_cols.value() - index - 1); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index row, Index col) const - { - enum { - PacketSize = unpacket_traits::size, - OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1, - OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1 - }; - typedef internal::reverse_packet_cond reverse_packet; - return reverse_packet::run(m_argImpl.template packet( - ReverseRow ? m_rows.value() - row - OffsetRow : row, - ReverseCol ? m_cols.value() - col - OffsetCol : col)); - } - - template - EIGEN_STRONG_INLINE - PacketType packet(Index index) const - { - enum { PacketSize = unpacket_traits::size }; - return preverse(m_argImpl.template packet(m_rows.value() * m_cols.value() - index - PacketSize)); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index row, Index col, const PacketType& x) - { - // FIXME we could factorize some code with packet(i,j) - enum { - PacketSize = unpacket_traits::size, - OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1, - OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1 - }; - typedef internal::reverse_packet_cond reverse_packet; - m_argImpl.template writePacket( - ReverseRow ? m_rows.value() - row - OffsetRow : row, - ReverseCol ? m_cols.value() - col - OffsetCol : col, - reverse_packet::run(x)); - } - - template - EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketType& x) - { - enum { PacketSize = unpacket_traits::size }; - m_argImpl.template writePacket - (m_rows.value() * m_cols.value() - index - PacketSize, preverse(x)); - } - -protected: - evaluator m_argImpl; - - // If we do not reverse rows, then we do not need to know the number of rows; same for columns - // Nonetheless, in this case it is important to set to 1 such that the coeff(index) method works fine for vectors. - const variable_if_dynamic m_rows; - const variable_if_dynamic m_cols; -}; - - -// -------------------- Diagonal -------------------- - -template -struct evaluator > - : evaluator_base > -{ - typedef Diagonal XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - - Flags = (unsigned int)(evaluator::Flags & (HereditaryBits | DirectAccessBit) & ~RowMajorBit) | LinearAccessBit, - - Alignment = 0 - }; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& diagonal) - : m_argImpl(diagonal.nestedExpression()), - m_index(diagonal.index()) - { } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index) const - { - return m_argImpl.coeff(row + rowOffset(), row + colOffset()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index index) const - { - return m_argImpl.coeff(index + rowOffset(), index + colOffset()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index) - { - return m_argImpl.coeffRef(row + rowOffset(), row + colOffset()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index index) - { - return m_argImpl.coeffRef(index + rowOffset(), index + colOffset()); - } - -protected: - evaluator m_argImpl; - const internal::variable_if_dynamicindex m_index; - -private: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value() > 0 ? 0 : -m_index.value(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value() > 0 ? m_index.value() : 0; } -}; - - -//---------------------------------------------------------------------- -// deprecated code -//---------------------------------------------------------------------- - -// -------------------- EvalToTemp -------------------- - -// expression class for evaluating nested expression to a temporary - -template class EvalToTemp; - -template -struct traits > - : public traits -{ }; - -template -class EvalToTemp - : public dense_xpr_base >::type -{ - public: - - typedef typename dense_xpr_base::type Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(EvalToTemp) - - explicit EvalToTemp(const ArgType& arg) - : m_arg(arg) - { } - - const ArgType& arg() const - { - return m_arg; - } - - Index rows() const - { - return m_arg.rows(); - } - - Index cols() const - { - return m_arg.cols(); - } - - private: - const ArgType& m_arg; -}; - -template -struct evaluator > - : public evaluator -{ - typedef EvalToTemp XprType; - typedef typename ArgType::PlainObject PlainObject; - typedef evaluator Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : m_result(xpr.arg()) - { - ::new (static_cast(this)) Base(m_result); - } - - // This constructor is used when nesting an EvalTo evaluator in another evaluator - EIGEN_DEVICE_FUNC evaluator(const ArgType& arg) - : m_result(arg) - { - ::new (static_cast(this)) Base(m_result); - } - -protected: - PlainObject m_result; -}; - -} // namespace internal - -} // end namespace Eigen - -#endif // EIGEN_COREEVALUATORS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CoreIterators.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CoreIterators.h deleted file mode 100644 index b9671968..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CoreIterators.h +++ /dev/null @@ -1,132 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_COREITERATORS_H -#define EIGEN_COREITERATORS_H - -namespace Eigen { - -/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core - */ - -namespace internal { - -template -class inner_iterator_selector; - -} - -/** \class InnerIterator - * \brief An InnerIterator allows to loop over the element of any matrix expression. - * - * \warning To be used with care because an evaluator is constructed every time an InnerIterator iterator is constructed. - * - * TODO: add a usage example - */ -template -class InnerIterator -{ -protected: - typedef internal::inner_iterator_selector::Kind> IteratorType; - typedef internal::evaluator EvaluatorType; - typedef typename internal::traits::Scalar Scalar; -public: - /** Construct an iterator over the \a outerId -th row or column of \a xpr */ - InnerIterator(const XprType &xpr, const Index &outerId) - : m_eval(xpr), m_iter(m_eval, outerId, xpr.innerSize()) - {} - - /// \returns the value of the current coefficient. - EIGEN_STRONG_INLINE Scalar value() const { return m_iter.value(); } - /** Increment the iterator \c *this to the next non-zero coefficient. - * Explicit zeros are not skipped over. To skip explicit zeros, see class SparseView - */ - EIGEN_STRONG_INLINE InnerIterator& operator++() { m_iter.operator++(); return *this; } - EIGEN_STRONG_INLINE InnerIterator& operator+=(Index i) { m_iter.operator+=(i); return *this; } - EIGEN_STRONG_INLINE InnerIterator operator+(Index i) - { InnerIterator result(*this); result+=i; return result; } - - - /// \returns the column or row index of the current coefficient. - EIGEN_STRONG_INLINE Index index() const { return m_iter.index(); } - /// \returns the row index of the current coefficient. - EIGEN_STRONG_INLINE Index row() const { return m_iter.row(); } - /// \returns the column index of the current coefficient. - EIGEN_STRONG_INLINE Index col() const { return m_iter.col(); } - /// \returns \c true if the iterator \c *this still references a valid coefficient. - EIGEN_STRONG_INLINE operator bool() const { return m_iter; } - -protected: - EvaluatorType m_eval; - IteratorType m_iter; -private: - // If you get here, then you're not using the right InnerIterator type, e.g.: - // SparseMatrix A; - // SparseMatrix::InnerIterator it(A,0); - template InnerIterator(const EigenBase&,Index outer); -}; - -namespace internal { - -// Generic inner iterator implementation for dense objects -template -class inner_iterator_selector -{ -protected: - typedef evaluator EvaluatorType; - typedef typename traits::Scalar Scalar; - enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit }; - -public: - EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &innerSize) - : m_eval(eval), m_inner(0), m_outer(outerId), m_end(innerSize) - {} - - EIGEN_STRONG_INLINE Scalar value() const - { - return (IsRowMajor) ? m_eval.coeff(m_outer, m_inner) - : m_eval.coeff(m_inner, m_outer); - } - - EIGEN_STRONG_INLINE inner_iterator_selector& operator++() { m_inner++; return *this; } - - EIGEN_STRONG_INLINE Index index() const { return m_inner; } - inline Index row() const { return IsRowMajor ? m_outer : index(); } - inline Index col() const { return IsRowMajor ? index() : m_outer; } - - EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; } - -protected: - const EvaluatorType& m_eval; - Index m_inner; - const Index m_outer; - const Index m_end; -}; - -// For iterator-based evaluator, inner-iterator is already implemented as -// evaluator<>::InnerIterator -template -class inner_iterator_selector - : public evaluator::InnerIterator -{ -protected: - typedef typename evaluator::InnerIterator Base; - typedef evaluator EvaluatorType; - -public: - EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &/*innerSize*/) - : Base(eval, outerId) - {} -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_COREITERATORS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseBinaryOp.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseBinaryOp.h deleted file mode 100644 index bf2632d9..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseBinaryOp.h +++ /dev/null @@ -1,183 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_BINARY_OP_H -#define EIGEN_CWISE_BINARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > -{ - // we must not inherit from traits since it has - // the potential to cause problems with MSVC - typedef typename remove_all::type Ancestor; - typedef typename traits::XprKind XprKind; - enum { - RowsAtCompileTime = traits::RowsAtCompileTime, - ColsAtCompileTime = traits::ColsAtCompileTime, - MaxRowsAtCompileTime = traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = traits::MaxColsAtCompileTime - }; - - // even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor), - // we still want to handle the case when the result type is different. - typedef typename result_of< - BinaryOp( - const typename Lhs::Scalar&, - const typename Rhs::Scalar& - ) - >::type Scalar; - typedef typename cwise_promote_storage_type::StorageKind, - typename traits::StorageKind, - BinaryOp>::ret StorageKind; - typedef typename promote_index_type::StorageIndex, - typename traits::StorageIndex>::type StorageIndex; - typedef typename Lhs::Nested LhsNested; - typedef typename Rhs::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - enum { - Flags = cwise_promote_storage_order::StorageKind,typename traits::StorageKind,_LhsNested::Flags & RowMajorBit,_RhsNested::Flags & RowMajorBit>::value - }; -}; -} // end namespace internal - -template -class CwiseBinaryOpImpl; - -/** \class CwiseBinaryOp - * \ingroup Core_Module - * - * \brief Generic expression where a coefficient-wise binary operator is applied to two expressions - * - * \tparam BinaryOp template functor implementing the operator - * \tparam LhsType the type of the left-hand side - * \tparam RhsType the type of the right-hand side - * - * This class represents an expression where a coefficient-wise binary operator is applied to two expressions. - * It is the return type of binary operators, by which we mean only those binary operators where - * both the left-hand side and the right-hand side are Eigen expressions. - * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp. - * - * Most of the time, this is the only way that it is used, so you typically don't have to name - * CwiseBinaryOp types explicitly. - * - * \sa MatrixBase::binaryExpr(const MatrixBase &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp - */ -template -class CwiseBinaryOp : - public CwiseBinaryOpImpl< - BinaryOp, LhsType, RhsType, - typename internal::cwise_promote_storage_type::StorageKind, - typename internal::traits::StorageKind, - BinaryOp>::ret>, - internal::no_assignment_operator -{ - public: - - typedef typename internal::remove_all::type Functor; - typedef typename internal::remove_all::type Lhs; - typedef typename internal::remove_all::type Rhs; - - typedef typename CwiseBinaryOpImpl< - BinaryOp, LhsType, RhsType, - typename internal::cwise_promote_storage_type::StorageKind, - typename internal::traits::StorageKind, - BinaryOp>::ret>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp) - - typedef typename internal::ref_selector::type LhsNested; - typedef typename internal::ref_selector::type RhsNested; - typedef typename internal::remove_reference::type _LhsNested; - typedef typename internal::remove_reference::type _RhsNested; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs, const BinaryOp& func = BinaryOp()) - : m_lhs(aLhs), m_rhs(aRhs), m_functor(func) - { - EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar); - // require the sizes to match - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs) - eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { - // return the fixed size type if available to enable compile time optimizations - if (internal::traits::type>::RowsAtCompileTime==Dynamic) - return m_rhs.rows(); - else - return m_lhs.rows(); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { - // return the fixed size type if available to enable compile time optimizations - if (internal::traits::type>::ColsAtCompileTime==Dynamic) - return m_rhs.cols(); - else - return m_lhs.cols(); - } - - /** \returns the left hand side nested expression */ - EIGEN_DEVICE_FUNC - const _LhsNested& lhs() const { return m_lhs; } - /** \returns the right hand side nested expression */ - EIGEN_DEVICE_FUNC - const _RhsNested& rhs() const { return m_rhs; } - /** \returns the functor representing the binary operation */ - EIGEN_DEVICE_FUNC - const BinaryOp& functor() const { return m_functor; } - - protected: - LhsNested m_lhs; - RhsNested m_rhs; - const BinaryOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseBinaryOpImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -/** replaces \c *this by \c *this - \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -MatrixBase::operator-=(const MatrixBase &other) -{ - call_assignment(derived(), other.derived(), internal::sub_assign_op()); - return derived(); -} - -/** replaces \c *this by \c *this + \a other. - * - * \returns a reference to \c *this - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & -MatrixBase::operator+=(const MatrixBase& other) -{ - call_assignment(derived(), other.derived(), internal::add_assign_op()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_CWISE_BINARY_OP_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseNullaryOp.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseNullaryOp.h deleted file mode 100644 index 144608ec..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseNullaryOp.h +++ /dev/null @@ -1,866 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_NULLARY_OP_H -#define EIGEN_CWISE_NULLARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > : traits -{ - enum { - Flags = traits::Flags & RowMajorBit - }; -}; - -} // namespace internal - -/** \class CwiseNullaryOp - * \ingroup Core_Module - * - * \brief Generic expression of a matrix where all coefficients are defined by a functor - * - * \tparam NullaryOp template functor implementing the operator - * \tparam PlainObjectType the underlying plain matrix/array type - * - * This class represents an expression of a generic nullary operator. - * It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods, - * and most of the time this is the only way it is used. - * - * However, if you want to write a function returning such an expression, you - * will need to use this class. - * - * The functor NullaryOp must expose one of the following method: - - - - -
\c operator()() if the procedural generation does not depend on the coefficient entries (e.g., random numbers)
\c operator()(Index i)if the procedural generation makes sense for vectors only and that it depends on the coefficient index \c i (e.g., linspace)
\c operator()(Index i,Index j)if the procedural generation depends on the matrix coordinates \c i, \c j (e.g., to generate a checkerboard with 0 and 1)
- * It is also possible to expose the last two operators if the generation makes sense for matrices but can be optimized for vectors. - * - * See DenseBase::NullaryExpr(Index,const CustomNullaryOp&) for an example binding - * C++11 random number generators. - * - * A nullary expression can also be used to implement custom sophisticated matrix manipulations - * that cannot be covered by the existing set of natively supported matrix manipulations. - * See this \ref TopicCustomizing_NullaryExpr "page" for some examples and additional explanations - * on the behavior of CwiseNullaryOp. - * - * \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr - */ -template -class CwiseNullaryOp : public internal::dense_xpr_base< CwiseNullaryOp >::type, internal::no_assignment_operator -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp) - - EIGEN_DEVICE_FUNC - CwiseNullaryOp(Index rows, Index cols, const NullaryOp& func = NullaryOp()) - : m_rows(rows), m_cols(cols), m_functor(func) - { - eigen_assert(rows >= 0 - && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) - && cols >= 0 - && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { return m_rows.value(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { return m_cols.value(); } - - /** \returns the functor representing the nullary operation */ - EIGEN_DEVICE_FUNC - const NullaryOp& functor() const { return m_functor; } - - protected: - const internal::variable_if_dynamic m_rows; - const internal::variable_if_dynamic m_cols; - const NullaryOp m_functor; -}; - - -/** \returns an expression of a matrix defined by a custom functor \a func - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp::PlainObject> -DenseBase::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func) -{ - return CwiseNullaryOp(rows, cols, func); -} - -/** \returns an expression of a matrix defined by a custom functor \a func - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * Here is an example with C++11 random generators: \include random_cpp11.cpp - * Output: \verbinclude random_cpp11.out - * - * \sa class CwiseNullaryOp - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp::PlainObject> -DenseBase::NullaryExpr(Index size, const CustomNullaryOp& func) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - if(RowsAtCompileTime == 1) return CwiseNullaryOp(1, size, func); - else return CwiseNullaryOp(size, 1, func); -} - -/** \returns an expression of a matrix defined by a custom functor \a func - * - * This variant is only for fixed-size DenseBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp::PlainObject> -DenseBase::NullaryExpr(const CustomNullaryOp& func) -{ - return CwiseNullaryOp(RowsAtCompileTime, ColsAtCompileTime, func); -} - -/** \returns an expression of a constant matrix of value \a value - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this DenseBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Constant(Index rows, Index cols, const Scalar& value) -{ - return DenseBase::NullaryExpr(rows, cols, internal::scalar_constant_op(value)); -} - -/** \returns an expression of a constant matrix of value \a value - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this DenseBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Zero() should be used - * instead. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Constant(Index size, const Scalar& value) -{ - return DenseBase::NullaryExpr(size, internal::scalar_constant_op(value)); -} - -/** \returns an expression of a constant matrix of value \a value - * - * This variant is only for fixed-size DenseBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * The template parameter \a CustomNullaryOp is the type of the functor. - * - * \sa class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Constant(const Scalar& value) -{ - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return DenseBase::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op(value)); -} - -/** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(Index,const Scalar&,const Scalar&) - * - * \sa LinSpaced(Index,Scalar,Scalar), setLinSpaced(Index,const Scalar&,const Scalar&) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return DenseBase::NullaryExpr(size, internal::linspaced_op(low,high,size)); -} - -/** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(const Scalar&,const Scalar&) - * - * \sa LinSpaced(Scalar,Scalar) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return DenseBase::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op(low,high,Derived::SizeAtCompileTime)); -} - -/** - * \brief Sets a linearly spaced vector. - * - * The function generates 'size' equally spaced values in the closed interval [low,high]. - * When size is set to 1, a vector of length 1 containing 'high' is returned. - * - * \only_for_vectors - * - * Example: \include DenseBase_LinSpaced.cpp - * Output: \verbinclude DenseBase_LinSpaced.out - * - * For integer scalar types, an even spacing is possible if and only if the length of the range, - * i.e., \c high-low is a scalar multiple of \c size-1, or if \c size is a scalar multiple of the - * number of values \c high-low+1 (meaning each value can be repeated the same number of time). - * If one of these two considions is not satisfied, then \c high is lowered to the largest value - * satisfying one of this constraint. - * Here are some examples: - * - * Example: \include DenseBase_LinSpacedInt.cpp - * Output: \verbinclude DenseBase_LinSpacedInt.out - * - * \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(Index size, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return DenseBase::NullaryExpr(size, internal::linspaced_op(low,high,size)); -} - -/** - * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&) - * Special version for fixed size types which does not require the size parameter. - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::RandomAccessLinSpacedReturnType -DenseBase::LinSpaced(const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return DenseBase::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op(low,high,Derived::SizeAtCompileTime)); -} - -/** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isApproxToConstant -(const Scalar& val, const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if(!internal::isApprox(self.coeff(i, j), val, prec)) - return false; - return true; -} - -/** This is just an alias for isApproxToConstant(). - * - * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isConstant -(const Scalar& val, const RealScalar& prec) const -{ - return isApproxToConstant(val, prec); -} - -/** Alias for setConstant(): sets all coefficients in this expression to \a val. - * - * \sa setConstant(), Constant(), class CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase::fill(const Scalar& val) -{ - setConstant(val); -} - -/** Sets all coefficients in this expression to value \a val. - * - * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setConstant(const Scalar& val) -{ - return derived() = Constant(rows(), cols(), val); -} - -/** Resizes to the given \a size, and sets all coefficients in this expression to the given value \a val. - * - * \only_for_vectors - * - * Example: \include Matrix_setConstant_int.cpp - * Output: \verbinclude Matrix_setConstant_int.out - * - * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setConstant(Index size, const Scalar& val) -{ - resize(size); - return setConstant(val); -} - -/** Resizes to the given size, and sets all coefficients in this expression to the given value \a val. - * - * \param rows the new number of rows - * \param cols the new number of columns - * \param val the value to which all coefficients are set - * - * Example: \include Matrix_setConstant_int_int.cpp - * Output: \verbinclude Matrix_setConstant_int_int.out - * - * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setConstant(Index rows, Index cols, const Scalar& val) -{ - resize(rows, cols); - return setConstant(val); -} - -/** - * \brief Sets a linearly spaced vector. - * - * The function generates 'size' equally spaced values in the closed interval [low,high]. - * When size is set to 1, a vector of length 1 containing 'high' is returned. - * - * \only_for_vectors - * - * Example: \include DenseBase_setLinSpaced.cpp - * Output: \verbinclude DenseBase_setLinSpaced.out - * - * For integer scalar types, do not miss the explanations on the definition - * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink. - * - * \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op(low,high,newSize)); -} - -/** - * \brief Sets a linearly spaced vector. - * - * The function fills \c *this with equally spaced values in the closed interval [low,high]. - * When size is set to 1, a vector of length 1 containing 'high' is returned. - * - * \only_for_vectors - * - * For integer scalar types, do not miss the explanations on the definition - * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink. - * - * \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setLinSpaced(const Scalar& low, const Scalar& high) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return setLinSpaced(size(), low, high); -} - -// zero: - -/** \returns an expression of a zero matrix. - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used - * instead. - * - * Example: \include MatrixBase_zero_int_int.cpp - * Output: \verbinclude MatrixBase_zero_int_int.out - * - * \sa Zero(), Zero(Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Zero(Index rows, Index cols) -{ - return Constant(rows, cols, Scalar(0)); -} - -/** \returns an expression of a zero vector. - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Zero() should be used - * instead. - * - * Example: \include MatrixBase_zero_int.cpp - * Output: \verbinclude MatrixBase_zero_int.out - * - * \sa Zero(), Zero(Index,Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Zero(Index size) -{ - return Constant(size, Scalar(0)); -} - -/** \returns an expression of a fixed-size zero matrix or vector. - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * Example: \include MatrixBase_zero.cpp - * Output: \verbinclude MatrixBase_zero.out - * - * \sa Zero(Index), Zero(Index,Index) - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Zero() -{ - return Constant(Scalar(0)); -} - -/** \returns true if *this is approximately equal to the zero matrix, - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isZero.cpp - * Output: \verbinclude MatrixBase_isZero.out - * - * \sa class CwiseNullaryOp, Zero() - */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isZero(const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < rows(); ++i) - if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast(1), prec)) - return false; - return true; -} - -/** Sets all coefficients in this expression to zero. - * - * Example: \include MatrixBase_setZero.cpp - * Output: \verbinclude MatrixBase_setZero.out - * - * \sa class CwiseNullaryOp, Zero() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setZero() -{ - return setConstant(Scalar(0)); -} - -/** Resizes to the given \a size, and sets all coefficients in this expression to zero. - * - * \only_for_vectors - * - * Example: \include Matrix_setZero_int.cpp - * Output: \verbinclude Matrix_setZero_int.out - * - * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setZero(Index newSize) -{ - resize(newSize); - return setConstant(Scalar(0)); -} - -/** Resizes to the given size, and sets all coefficients in this expression to zero. - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setZero_int_int.cpp - * Output: \verbinclude Matrix_setZero_int_int.out - * - * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setZero(Index rows, Index cols) -{ - resize(rows, cols); - return setConstant(Scalar(0)); -} - -// ones: - -/** \returns an expression of a matrix where all coefficients equal one. - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used - * instead. - * - * Example: \include MatrixBase_ones_int_int.cpp - * Output: \verbinclude MatrixBase_ones_int_int.out - * - * \sa Ones(), Ones(Index), isOnes(), class Ones - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Ones(Index rows, Index cols) -{ - return Constant(rows, cols, Scalar(1)); -} - -/** \returns an expression of a vector where all coefficients equal one. - * - * The parameter \a newSize is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Ones() should be used - * instead. - * - * Example: \include MatrixBase_ones_int.cpp - * Output: \verbinclude MatrixBase_ones_int.out - * - * \sa Ones(), Ones(Index,Index), isOnes(), class Ones - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Ones(Index newSize) -{ - return Constant(newSize, Scalar(1)); -} - -/** \returns an expression of a fixed-size matrix or vector where all coefficients equal one. - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * Example: \include MatrixBase_ones.cpp - * Output: \verbinclude MatrixBase_ones.out - * - * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase::ConstantReturnType -DenseBase::Ones() -{ - return Constant(Scalar(1)); -} - -/** \returns true if *this is approximately equal to the matrix where all coefficients - * are equal to 1, within the precision given by \a prec. - * - * Example: \include MatrixBase_isOnes.cpp - * Output: \verbinclude MatrixBase_isOnes.out - * - * \sa class CwiseNullaryOp, Ones() - */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isOnes -(const RealScalar& prec) const -{ - return isApproxToConstant(Scalar(1), prec); -} - -/** Sets all coefficients in this expression to one. - * - * Example: \include MatrixBase_setOnes.cpp - * Output: \verbinclude MatrixBase_setOnes.out - * - * \sa class CwiseNullaryOp, Ones() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase::setOnes() -{ - return setConstant(Scalar(1)); -} - -/** Resizes to the given \a newSize, and sets all coefficients in this expression to one. - * - * \only_for_vectors - * - * Example: \include Matrix_setOnes_int.cpp - * Output: \verbinclude Matrix_setOnes_int.out - * - * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setOnes(Index newSize) -{ - resize(newSize); - return setConstant(Scalar(1)); -} - -/** Resizes to the given size, and sets all coefficients in this expression to one. - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setOnes_int_int.cpp - * Output: \verbinclude Matrix_setOnes_int_int.out - * - * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setOnes(Index rows, Index cols) -{ - resize(rows, cols); - return setConstant(Scalar(1)); -} - -// Identity: - -/** \returns an expression of the identity matrix (not necessarily square). - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used - * instead. - * - * Example: \include MatrixBase_identity_int_int.cpp - * Output: \verbinclude MatrixBase_identity_int_int.out - * - * \sa Identity(), setIdentity(), isIdentity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::IdentityReturnType -MatrixBase::Identity(Index rows, Index cols) -{ - return DenseBase::NullaryExpr(rows, cols, internal::scalar_identity_op()); -} - -/** \returns an expression of the identity matrix (not necessarily square). - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variant taking size arguments. - * - * Example: \include MatrixBase_identity.cpp - * Output: \verbinclude MatrixBase_identity.out - * - * \sa Identity(Index,Index), setIdentity(), isIdentity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::IdentityReturnType -MatrixBase::Identity() -{ - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - return MatrixBase::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op()); -} - -/** \returns true if *this is approximately equal to the identity matrix - * (not necessarily square), - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isIdentity.cpp - * Output: \verbinclude MatrixBase_isIdentity.out - * - * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity() - */ -template -bool MatrixBase::isIdentity -(const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index j = 0; j < cols(); ++j) - { - for(Index i = 0; i < rows(); ++i) - { - if(i == j) - { - if(!internal::isApprox(self.coeff(i, j), static_cast(1), prec)) - return false; - } - else - { - if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast(1), prec)) - return false; - } - } - } - return true; -} - -namespace internal { - -template=16)> -struct setIdentity_impl -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Derived& run(Derived& m) - { - return m = Derived::Identity(m.rows(), m.cols()); - } -}; - -template -struct setIdentity_impl -{ - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Derived& run(Derived& m) - { - m.setZero(); - const Index size = numext::mini(m.rows(), m.cols()); - for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1); - return m; - } -}; - -} // end namespace internal - -/** Writes the identity expression (not necessarily square) into *this. - * - * Example: \include MatrixBase_setIdentity.cpp - * Output: \verbinclude MatrixBase_setIdentity.out - * - * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase::setIdentity() -{ - return internal::setIdentity_impl::run(derived()); -} - -/** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this. - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setIdentity_int_int.cpp - * Output: \verbinclude Matrix_setIdentity_int_int.out - * - * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase::setIdentity(Index rows, Index cols) -{ - derived().resize(rows, cols); - return setIdentity(); -} - -/** \returns an expression of the i-th unit (basis) vector. - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::Unit(Index newSize, Index i) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i); -} - -/** \returns an expression of the i-th unit (basis) vector. - * - * \only_for_vectors - * - * This variant is for fixed-size vector only. - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::Unit(Index i) -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - return BasisReturnType(SquareMatrixType::Identity(),i); -} - -/** \returns an expression of the X axis unit vector (1{,0}^*) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitX() -{ return Derived::Unit(0); } - -/** \returns an expression of the Y axis unit vector (0,1{,0}^*) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitY() -{ return Derived::Unit(1); } - -/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitZ() -{ return Derived::Unit(2); } - -/** \returns an expression of the W axis unit vector (0,0,0,1) - * - * \only_for_vectors - * - * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase::BasisReturnType MatrixBase::UnitW() -{ return Derived::Unit(3); } - -} // end namespace Eigen - -#endif // EIGEN_CWISE_NULLARY_OP_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseTernaryOp.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseTernaryOp.h deleted file mode 100644 index 9f3576fe..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseTernaryOp.h +++ /dev/null @@ -1,197 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2016 Eugene Brevdo -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_TERNARY_OP_H -#define EIGEN_CWISE_TERNARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > { - // we must not inherit from traits since it has - // the potential to cause problems with MSVC - typedef typename remove_all::type Ancestor; - typedef typename traits::XprKind XprKind; - enum { - RowsAtCompileTime = traits::RowsAtCompileTime, - ColsAtCompileTime = traits::ColsAtCompileTime, - MaxRowsAtCompileTime = traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = traits::MaxColsAtCompileTime - }; - - // even though we require Arg1, Arg2, and Arg3 to have the same scalar type - // (see CwiseTernaryOp constructor), - // we still want to handle the case when the result type is different. - typedef typename result_of::type Scalar; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - - typedef typename Arg1::Nested Arg1Nested; - typedef typename Arg2::Nested Arg2Nested; - typedef typename Arg3::Nested Arg3Nested; - typedef typename remove_reference::type _Arg1Nested; - typedef typename remove_reference::type _Arg2Nested; - typedef typename remove_reference::type _Arg3Nested; - enum { Flags = _Arg1Nested::Flags & RowMajorBit }; -}; -} // end namespace internal - -template -class CwiseTernaryOpImpl; - -/** \class CwiseTernaryOp - * \ingroup Core_Module - * - * \brief Generic expression where a coefficient-wise ternary operator is - * applied to two expressions - * - * \tparam TernaryOp template functor implementing the operator - * \tparam Arg1Type the type of the first argument - * \tparam Arg2Type the type of the second argument - * \tparam Arg3Type the type of the third argument - * - * This class represents an expression where a coefficient-wise ternary - * operator is applied to three expressions. - * It is the return type of ternary operators, by which we mean only those - * ternary operators where - * all three arguments are Eigen expressions. - * For example, the return type of betainc(matrix1, matrix2, matrix3) is a - * CwiseTernaryOp. - * - * Most of the time, this is the only way that it is used, so you typically - * don't have to name - * CwiseTernaryOp types explicitly. - * - * \sa MatrixBase::ternaryExpr(const MatrixBase &, const - * MatrixBase &, const CustomTernaryOp &) const, class CwiseBinaryOp, - * class CwiseUnaryOp, class CwiseNullaryOp - */ -template -class CwiseTernaryOp : public CwiseTernaryOpImpl< - TernaryOp, Arg1Type, Arg2Type, Arg3Type, - typename internal::traits::StorageKind>, - internal::no_assignment_operator -{ - public: - typedef typename internal::remove_all::type Arg1; - typedef typename internal::remove_all::type Arg2; - typedef typename internal::remove_all::type Arg3; - - typedef typename CwiseTernaryOpImpl< - TernaryOp, Arg1Type, Arg2Type, Arg3Type, - typename internal::traits::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseTernaryOp) - - typedef typename internal::ref_selector::type Arg1Nested; - typedef typename internal::ref_selector::type Arg2Nested; - typedef typename internal::ref_selector::type Arg3Nested; - typedef typename internal::remove_reference::type _Arg1Nested; - typedef typename internal::remove_reference::type _Arg2Nested; - typedef typename internal::remove_reference::type _Arg3Nested; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CwiseTernaryOp(const Arg1& a1, const Arg2& a2, - const Arg3& a3, - const TernaryOp& func = TernaryOp()) - : m_arg1(a1), m_arg2(a2), m_arg3(a3), m_functor(func) { - // require the sizes to match - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg2) - EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg3) - - // The index types should match - EIGEN_STATIC_ASSERT((internal::is_same< - typename internal::traits::StorageKind, - typename internal::traits::StorageKind>::value), - STORAGE_KIND_MUST_MATCH) - EIGEN_STATIC_ASSERT((internal::is_same< - typename internal::traits::StorageKind, - typename internal::traits::StorageKind>::value), - STORAGE_KIND_MUST_MATCH) - - eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() && - a1.rows() == a3.rows() && a1.cols() == a3.cols()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { - // return the fixed size type if available to enable compile time - // optimizations - if (internal::traits::type>:: - RowsAtCompileTime == Dynamic && - internal::traits::type>:: - RowsAtCompileTime == Dynamic) - return m_arg3.rows(); - else if (internal::traits::type>:: - RowsAtCompileTime == Dynamic && - internal::traits::type>:: - RowsAtCompileTime == Dynamic) - return m_arg2.rows(); - else - return m_arg1.rows(); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { - // return the fixed size type if available to enable compile time - // optimizations - if (internal::traits::type>:: - ColsAtCompileTime == Dynamic && - internal::traits::type>:: - ColsAtCompileTime == Dynamic) - return m_arg3.cols(); - else if (internal::traits::type>:: - ColsAtCompileTime == Dynamic && - internal::traits::type>:: - ColsAtCompileTime == Dynamic) - return m_arg2.cols(); - else - return m_arg1.cols(); - } - - /** \returns the first argument nested expression */ - EIGEN_DEVICE_FUNC - const _Arg1Nested& arg1() const { return m_arg1; } - /** \returns the first argument nested expression */ - EIGEN_DEVICE_FUNC - const _Arg2Nested& arg2() const { return m_arg2; } - /** \returns the third argument nested expression */ - EIGEN_DEVICE_FUNC - const _Arg3Nested& arg3() const { return m_arg3; } - /** \returns the functor representing the ternary operation */ - EIGEN_DEVICE_FUNC - const TernaryOp& functor() const { return m_functor; } - - protected: - Arg1Nested m_arg1; - Arg2Nested m_arg2; - Arg3Nested m_arg3; - const TernaryOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseTernaryOpImpl - : public internal::generic_xpr_base< - CwiseTernaryOp >::type { - public: - typedef typename internal::generic_xpr_base< - CwiseTernaryOp >::type Base; -}; - -} // end namespace Eigen - -#endif // EIGEN_CWISE_TERNARY_OP_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseUnaryOp.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseUnaryOp.h deleted file mode 100644 index 1d2dd19f..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseUnaryOp.h +++ /dev/null @@ -1,103 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_UNARY_OP_H -#define EIGEN_CWISE_UNARY_OP_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : traits -{ - typedef typename result_of< - UnaryOp(const typename XprType::Scalar&) - >::type Scalar; - typedef typename XprType::Nested XprTypeNested; - typedef typename remove_reference::type _XprTypeNested; - enum { - Flags = _XprTypeNested::Flags & RowMajorBit - }; -}; -} - -template -class CwiseUnaryOpImpl; - -/** \class CwiseUnaryOp - * \ingroup Core_Module - * - * \brief Generic expression where a coefficient-wise unary operator is applied to an expression - * - * \tparam UnaryOp template functor implementing the operator - * \tparam XprType the type of the expression to which we are applying the unary operator - * - * This class represents an expression where a unary operator is applied to an expression. - * It is the return type of all operations taking exactly 1 input expression, regardless of the - * presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix - * is considered unary, because only the right-hand side is an expression, and its - * return type is a specialization of CwiseUnaryOp. - * - * Most of the time, this is the only way that it is used, so you typically don't have to name - * CwiseUnaryOp types explicitly. - * - * \sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp - */ -template -class CwiseUnaryOp : public CwiseUnaryOpImpl::StorageKind>, internal::no_assignment_operator -{ - public: - - typedef typename CwiseUnaryOpImpl::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp) - typedef typename internal::ref_selector::type XprTypeNested; - typedef typename internal::remove_all::type NestedExpression; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit CwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp()) - : m_xpr(xpr), m_functor(func) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index rows() const { return m_xpr.rows(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index cols() const { return m_xpr.cols(); } - - /** \returns the functor representing the unary operation */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const UnaryOp& functor() const { return m_functor; } - - /** \returns the nested expression */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const typename internal::remove_all::type& - nestedExpression() const { return m_xpr; } - - /** \returns the nested expression */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename internal::remove_all::type& - nestedExpression() { return m_xpr; } - - protected: - XprTypeNested m_xpr; - const UnaryOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseUnaryOpImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -} // end namespace Eigen - -#endif // EIGEN_CWISE_UNARY_OP_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseUnaryView.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseUnaryView.h deleted file mode 100644 index 27103305..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/CwiseUnaryView.h +++ /dev/null @@ -1,128 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CWISE_UNARY_VIEW_H -#define EIGEN_CWISE_UNARY_VIEW_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : traits -{ - typedef typename result_of< - ViewOp(const typename traits::Scalar&) - >::type Scalar; - typedef typename MatrixType::Nested MatrixTypeNested; - typedef typename remove_all::type _MatrixTypeNested; - enum { - FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = traits<_MatrixTypeNested>::Flags & (RowMajorBit | FlagsLvalueBit | DirectAccessBit), // FIXME DirectAccessBit should not be handled by expressions - MatrixTypeInnerStride = inner_stride_at_compile_time::ret, - // need to cast the sizeof's from size_t to int explicitly, otherwise: - // "error: no integral type can represent all of the enumerator values - InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic - ? int(Dynamic) - : int(MatrixTypeInnerStride) * int(sizeof(typename traits::Scalar) / sizeof(Scalar)), - OuterStrideAtCompileTime = outer_stride_at_compile_time::ret == Dynamic - ? int(Dynamic) - : outer_stride_at_compile_time::ret * int(sizeof(typename traits::Scalar) / sizeof(Scalar)) - }; -}; -} - -template -class CwiseUnaryViewImpl; - -/** \class CwiseUnaryView - * \ingroup Core_Module - * - * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector - * - * \tparam ViewOp template functor implementing the view - * \tparam MatrixType the type of the matrix we are applying the unary operator - * - * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector. - * It is the return type of real() and imag(), and most of the time this is the only way it is used. - * - * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp - */ -template -class CwiseUnaryView : public CwiseUnaryViewImpl::StorageKind> -{ - public: - - typedef typename CwiseUnaryViewImpl::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView) - typedef typename internal::ref_selector::non_const_type MatrixTypeNested; - typedef typename internal::remove_all::type NestedExpression; - - explicit inline CwiseUnaryView(MatrixType& mat, const ViewOp& func = ViewOp()) - : m_matrix(mat), m_functor(func) {} - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView) - - EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); } - EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); } - - /** \returns the functor representing unary operation */ - const ViewOp& functor() const { return m_functor; } - - /** \returns the nested expression */ - const typename internal::remove_all::type& - nestedExpression() const { return m_matrix; } - - /** \returns the nested expression */ - typename internal::remove_reference::type& - nestedExpression() { return m_matrix.const_cast_derived(); } - - protected: - MatrixTypeNested m_matrix; - ViewOp m_functor; -}; - -// Generic API dispatcher -template -class CwiseUnaryViewImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -template -class CwiseUnaryViewImpl - : public internal::dense_xpr_base< CwiseUnaryView >::type -{ - public: - - typedef CwiseUnaryView Derived; - typedef typename internal::dense_xpr_base< CwiseUnaryView >::type Base; - - EIGEN_DENSE_PUBLIC_INTERFACE(Derived) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl) - - EIGEN_DEVICE_FUNC inline Scalar* data() { return &(this->coeffRef(0)); } - EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(this->coeff(0)); } - - EIGEN_DEVICE_FUNC inline Index innerStride() const - { - return derived().nestedExpression().innerStride() * sizeof(typename internal::traits::Scalar) / sizeof(Scalar); - } - - EIGEN_DEVICE_FUNC inline Index outerStride() const - { - return derived().nestedExpression().outerStride() * sizeof(typename internal::traits::Scalar) / sizeof(Scalar); - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CWISE_UNARY_VIEW_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseBase.h deleted file mode 100644 index fd933eed..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseBase.h +++ /dev/null @@ -1,615 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2010 Benoit Jacob -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DENSEBASE_H -#define EIGEN_DENSEBASE_H - -namespace Eigen { - -namespace internal { - -// The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type. -// This dummy function simply aims at checking that at compile time. -static inline void check_DenseIndex_is_signed() { - EIGEN_STATIC_ASSERT(NumTraits::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE); -} - -} // end namespace internal - -/** \class DenseBase - * \ingroup Core_Module - * - * \brief Base class for all dense matrices, vectors, and arrays - * - * This class is the base that is inherited by all dense objects (matrix, vector, arrays, - * and related expression types). The common Eigen API for dense objects is contained in this class. - * - * \tparam Derived is the derived type, e.g., a matrix type or an expression. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN. - * - * \sa \blank \ref TopicClassHierarchy - */ -template class DenseBase -#ifndef EIGEN_PARSED_BY_DOXYGEN - : public DenseCoeffsBase -#else - : public DenseCoeffsBase -#endif // not EIGEN_PARSED_BY_DOXYGEN -{ - public: - - /** Inner iterator type to iterate over the coefficients of a row or column. - * \sa class InnerIterator - */ - typedef Eigen::InnerIterator InnerIterator; - - typedef typename internal::traits::StorageKind StorageKind; - - /** - * \brief The type used to store indices - * \details This typedef is relevant for types that store multiple indices such as - * PermutationMatrix or Transpositions, otherwise it defaults to Eigen::Index - * \sa \blank \ref TopicPreprocessorDirectives, Eigen::Index, SparseMatrixBase. - */ - typedef typename internal::traits::StorageIndex StorageIndex; - - /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex, etc. */ - typedef typename internal::traits::Scalar Scalar; - - /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex, etc. - * - * It is an alias for the Scalar type */ - typedef Scalar value_type; - - typedef typename NumTraits::Real RealScalar; - typedef DenseCoeffsBase Base; - - using Base::derived; - using Base::const_cast_derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::rowIndexByOuterInner; - using Base::colIndexByOuterInner; - using Base::coeff; - using Base::coeffByOuterInner; - using Base::operator(); - using Base::operator[]; - using Base::x; - using Base::y; - using Base::z; - using Base::w; - using Base::stride; - using Base::innerStride; - using Base::outerStride; - using Base::rowStride; - using Base::colStride; - typedef typename Base::CoeffReturnType CoeffReturnType; - - enum { - - RowsAtCompileTime = internal::traits::RowsAtCompileTime, - /**< The number of rows at compile-time. This is just a copy of the value provided - * by the \a Derived type. If a value is not known at compile-time, - * it is set to the \a Dynamic constant. - * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */ - - ColsAtCompileTime = internal::traits::ColsAtCompileTime, - /**< The number of columns at compile-time. This is just a copy of the value provided - * by the \a Derived type. If a value is not known at compile-time, - * it is set to the \a Dynamic constant. - * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */ - - - SizeAtCompileTime = (internal::size_at_compile_time::RowsAtCompileTime, - internal::traits::ColsAtCompileTime>::ret), - /**< This is equal to the number of coefficients, i.e. the number of - * rows times the number of columns, or to \a Dynamic if this is not - * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */ - - MaxRowsAtCompileTime = internal::traits::MaxRowsAtCompileTime, - /**< This value is equal to the maximum possible number of rows that this expression - * might have. If this expression might have an arbitrarily high number of rows, - * this value is set to \a Dynamic. - * - * This value is useful to know when evaluating an expression, in order to determine - * whether it is possible to avoid doing a dynamic memory allocation. - * - * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime - */ - - MaxColsAtCompileTime = internal::traits::MaxColsAtCompileTime, - /**< This value is equal to the maximum possible number of columns that this expression - * might have. If this expression might have an arbitrarily high number of columns, - * this value is set to \a Dynamic. - * - * This value is useful to know when evaluating an expression, in order to determine - * whether it is possible to avoid doing a dynamic memory allocation. - * - * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime - */ - - MaxSizeAtCompileTime = (internal::size_at_compile_time::MaxRowsAtCompileTime, - internal::traits::MaxColsAtCompileTime>::ret), - /**< This value is equal to the maximum possible number of coefficients that this expression - * might have. If this expression might have an arbitrarily high number of coefficients, - * this value is set to \a Dynamic. - * - * This value is useful to know when evaluating an expression, in order to determine - * whether it is possible to avoid doing a dynamic memory allocation. - * - * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime - */ - - IsVectorAtCompileTime = internal::traits::MaxRowsAtCompileTime == 1 - || internal::traits::MaxColsAtCompileTime == 1, - /**< This is set to true if either the number of rows or the number of - * columns is known at compile-time to be equal to 1. Indeed, in that case, - * we are dealing with a column-vector (if there is only one column) or with - * a row-vector (if there is only one row). */ - - Flags = internal::traits::Flags, - /**< This stores expression \ref flags flags which may or may not be inherited by new expressions - * constructed from this one. See the \ref flags "list of flags". - */ - - IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */ - - InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime) - : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime), - - InnerStrideAtCompileTime = internal::inner_stride_at_compile_time::ret, - OuterStrideAtCompileTime = internal::outer_stride_at_compile_time::ret - }; - - typedef typename internal::find_best_packet::type PacketScalar; - - enum { IsPlainObjectBase = 0 }; - - /** The plain matrix type corresponding to this expression. - * \sa PlainObject */ - typedef Matrix::Scalar, - internal::traits::RowsAtCompileTime, - internal::traits::ColsAtCompileTime, - AutoAlign | (internal::traits::Flags&RowMajorBit ? RowMajor : ColMajor), - internal::traits::MaxRowsAtCompileTime, - internal::traits::MaxColsAtCompileTime - > PlainMatrix; - - /** The plain array type corresponding to this expression. - * \sa PlainObject */ - typedef Array::Scalar, - internal::traits::RowsAtCompileTime, - internal::traits::ColsAtCompileTime, - AutoAlign | (internal::traits::Flags&RowMajorBit ? RowMajor : ColMajor), - internal::traits::MaxRowsAtCompileTime, - internal::traits::MaxColsAtCompileTime - > PlainArray; - - /** \brief The plain matrix or array type corresponding to this expression. - * - * This is not necessarily exactly the return type of eval(). In the case of plain matrices, - * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed - * that the return type of eval() is either PlainObject or const PlainObject&. - */ - typedef typename internal::conditional::XprKind,MatrixXpr >::value, - PlainMatrix, PlainArray>::type PlainObject; - - /** \returns the number of nonzero coefficients which is in practice the number - * of stored coefficients. */ - EIGEN_DEVICE_FUNC - inline Index nonZeros() const { return size(); } - - /** \returns the outer size. - * - * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension - * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a - * column-major matrix, and the number of rows for a row-major matrix. */ - EIGEN_DEVICE_FUNC - Index outerSize() const - { - return IsVectorAtCompileTime ? 1 - : int(IsRowMajor) ? this->rows() : this->cols(); - } - - /** \returns the inner size. - * - * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension - * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a - * column-major matrix, and the number of columns for a row-major matrix. */ - EIGEN_DEVICE_FUNC - Index innerSize() const - { - return IsVectorAtCompileTime ? this->size() - : int(IsRowMajor) ? this->cols() : this->rows(); - } - - /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are - * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does - * nothing else. - */ - EIGEN_DEVICE_FUNC - void resize(Index newSize) - { - EIGEN_ONLY_USED_FOR_DEBUG(newSize); - eigen_assert(newSize == this->size() - && "DenseBase::resize() does not actually allow to resize."); - } - /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are - * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does - * nothing else. - */ - EIGEN_DEVICE_FUNC - void resize(Index rows, Index cols) - { - EIGEN_ONLY_USED_FOR_DEBUG(rows); - EIGEN_ONLY_USED_FOR_DEBUG(cols); - eigen_assert(rows == this->rows() && cols == this->cols() - && "DenseBase::resize() does not actually allow to resize."); - } - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal Represents a matrix with all coefficients equal to one another*/ - typedef CwiseNullaryOp,PlainObject> ConstantReturnType; - /** \internal \deprecated Represents a vector with linearly spaced coefficients that allows sequential access only. */ - typedef CwiseNullaryOp,PlainObject> SequentialLinSpacedReturnType; - /** \internal Represents a vector with linearly spaced coefficients that allows random access. */ - typedef CwiseNullaryOp,PlainObject> RandomAccessLinSpacedReturnType; - /** \internal the return type of MatrixBase::eigenvalues() */ - typedef Matrix::Scalar>::Real, internal::traits::ColsAtCompileTime, 1> EigenvaluesReturnType; - -#endif // not EIGEN_PARSED_BY_DOXYGEN - - /** Copies \a other into *this. \returns a reference to *this. */ - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const DenseBase& other); - - /** Special case of the template operator=, in order to prevent the compiler - * from generating a default operator= (issue hit with g++ 4.1) - */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const DenseBase& other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const EigenBase &other); - - template - EIGEN_DEVICE_FUNC - Derived& operator+=(const EigenBase &other); - - template - EIGEN_DEVICE_FUNC - Derived& operator-=(const EigenBase &other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const ReturnByValue& func); - - /** \internal - * Copies \a other into *this without evaluating other. \returns a reference to *this. - * \deprecated */ - template - EIGEN_DEVICE_FUNC - Derived& lazyAssign(const DenseBase& other); - - EIGEN_DEVICE_FUNC - CommaInitializer operator<< (const Scalar& s); - - /** \deprecated it now returns \c *this */ - template - EIGEN_DEPRECATED - const Derived& flagged() const - { return derived(); } - - template - EIGEN_DEVICE_FUNC - CommaInitializer operator<< (const DenseBase& other); - - typedef Transpose TransposeReturnType; - EIGEN_DEVICE_FUNC - TransposeReturnType transpose(); - typedef typename internal::add_const >::type ConstTransposeReturnType; - EIGEN_DEVICE_FUNC - ConstTransposeReturnType transpose() const; - EIGEN_DEVICE_FUNC - void transposeInPlace(); - - EIGEN_DEVICE_FUNC static const ConstantReturnType - Constant(Index rows, Index cols, const Scalar& value); - EIGEN_DEVICE_FUNC static const ConstantReturnType - Constant(Index size, const Scalar& value); - EIGEN_DEVICE_FUNC static const ConstantReturnType - Constant(const Scalar& value); - - EIGEN_DEVICE_FUNC static const SequentialLinSpacedReturnType - LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType - LinSpaced(Index size, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC static const SequentialLinSpacedReturnType - LinSpaced(Sequential_t, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType - LinSpaced(const Scalar& low, const Scalar& high); - - template EIGEN_DEVICE_FUNC - static const CwiseNullaryOp - NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func); - template EIGEN_DEVICE_FUNC - static const CwiseNullaryOp - NullaryExpr(Index size, const CustomNullaryOp& func); - template EIGEN_DEVICE_FUNC - static const CwiseNullaryOp - NullaryExpr(const CustomNullaryOp& func); - - EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index rows, Index cols); - EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index size); - EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(); - EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols); - EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size); - EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(); - - EIGEN_DEVICE_FUNC void fill(const Scalar& value); - EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value); - EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high); - EIGEN_DEVICE_FUNC Derived& setZero(); - EIGEN_DEVICE_FUNC Derived& setOnes(); - EIGEN_DEVICE_FUNC Derived& setRandom(); - - template EIGEN_DEVICE_FUNC - bool isApprox(const DenseBase& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC - bool isMuchSmallerThan(const RealScalar& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - template EIGEN_DEVICE_FUNC - bool isMuchSmallerThan(const DenseBase& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - - EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits::dummy_precision()) const; - - inline bool hasNaN() const; - inline bool allFinite() const; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator*=(const Scalar& other); - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator/=(const Scalar& other); - - typedef typename internal::add_const_on_value_type::type>::type EvalReturnType; - /** \returns the matrix or vector obtained by evaluating this expression. - * - * Notice that in the case of a plain matrix or vector (not an expression) this function just returns - * a const reference, in order to avoid a useless copy. - * - * \warning Be carefull with eval() and the auto C++ keyword, as detailed in this \link TopicPitfalls_auto_keyword page \endlink. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE EvalReturnType eval() const - { - // Even though MSVC does not honor strong inlining when the return type - // is a dynamic matrix, we desperately need strong inlining for fixed - // size types on MSVC. - return typename internal::eval::type(derived()); - } - - /** swaps *this with the expression \a other. - * - */ - template - EIGEN_DEVICE_FUNC - void swap(const DenseBase& other) - { - EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY); - eigen_assert(rows()==other.rows() && cols()==other.cols()); - call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op()); - } - - /** swaps *this with the matrix or array \a other. - * - */ - template - EIGEN_DEVICE_FUNC - void swap(PlainObjectBase& other) - { - eigen_assert(rows()==other.rows() && cols()==other.cols()); - call_assignment(derived(), other.derived(), internal::swap_assign_op()); - } - - EIGEN_DEVICE_FUNC inline const NestByValue nestByValue() const; - EIGEN_DEVICE_FUNC inline const ForceAlignedAccess forceAlignedAccess() const; - EIGEN_DEVICE_FUNC inline ForceAlignedAccess forceAlignedAccess(); - template EIGEN_DEVICE_FUNC - inline const typename internal::conditional,Derived&>::type forceAlignedAccessIf() const; - template EIGEN_DEVICE_FUNC - inline typename internal::conditional,Derived&>::type forceAlignedAccessIf(); - - EIGEN_DEVICE_FUNC Scalar sum() const; - EIGEN_DEVICE_FUNC Scalar mean() const; - EIGEN_DEVICE_FUNC Scalar trace() const; - - EIGEN_DEVICE_FUNC Scalar prod() const; - - EIGEN_DEVICE_FUNC typename internal::traits::Scalar minCoeff() const; - EIGEN_DEVICE_FUNC typename internal::traits::Scalar maxCoeff() const; - - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar minCoeff(IndexType* row, IndexType* col) const; - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar maxCoeff(IndexType* row, IndexType* col) const; - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar minCoeff(IndexType* index) const; - template EIGEN_DEVICE_FUNC - typename internal::traits::Scalar maxCoeff(IndexType* index) const; - - template - EIGEN_DEVICE_FUNC - Scalar redux(const BinaryOp& func) const; - - template - EIGEN_DEVICE_FUNC - void visit(Visitor& func) const; - - /** \returns a WithFormat proxy object allowing to print a matrix the with given - * format \a fmt. - * - * See class IOFormat for some examples. - * - * \sa class IOFormat, class WithFormat - */ - inline const WithFormat format(const IOFormat& fmt) const - { - return WithFormat(derived(), fmt); - } - - /** \returns the unique coefficient of a 1x1 expression */ - EIGEN_DEVICE_FUNC - CoeffReturnType value() const - { - EIGEN_STATIC_ASSERT_SIZE_1x1(Derived) - eigen_assert(this->rows() == 1 && this->cols() == 1); - return derived().coeff(0,0); - } - - EIGEN_DEVICE_FUNC bool all() const; - EIGEN_DEVICE_FUNC bool any() const; - EIGEN_DEVICE_FUNC Index count() const; - - typedef VectorwiseOp RowwiseReturnType; - typedef const VectorwiseOp ConstRowwiseReturnType; - typedef VectorwiseOp ColwiseReturnType; - typedef const VectorwiseOp ConstColwiseReturnType; - - /** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations - * - * Example: \include MatrixBase_rowwise.cpp - * Output: \verbinclude MatrixBase_rowwise.out - * - * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting - */ - //Code moved here due to a CUDA compiler bug - EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const { - return ConstRowwiseReturnType(derived()); - } - EIGEN_DEVICE_FUNC RowwiseReturnType rowwise(); - - /** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations - * - * Example: \include MatrixBase_colwise.cpp - * Output: \verbinclude MatrixBase_colwise.out - * - * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting - */ - EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const { - return ConstColwiseReturnType(derived()); - } - EIGEN_DEVICE_FUNC ColwiseReturnType colwise(); - - typedef CwiseNullaryOp,PlainObject> RandomReturnType; - static const RandomReturnType Random(Index rows, Index cols); - static const RandomReturnType Random(Index size); - static const RandomReturnType Random(); - - template - const Select - select(const DenseBase& thenMatrix, - const DenseBase& elseMatrix) const; - - template - inline const Select - select(const DenseBase& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const; - - template - inline const Select - select(const typename ElseDerived::Scalar& thenScalar, const DenseBase& elseMatrix) const; - - template RealScalar lpNorm() const; - - template - EIGEN_DEVICE_FUNC - const Replicate replicate() const; - /** - * \return an expression of the replication of \c *this - * - * Example: \include MatrixBase_replicate_int_int.cpp - * Output: \verbinclude MatrixBase_replicate_int_int.out - * - * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate - */ - //Code moved here due to a CUDA compiler bug - EIGEN_DEVICE_FUNC - const Replicate replicate(Index rowFactor, Index colFactor) const - { - return Replicate(derived(), rowFactor, colFactor); - } - - typedef Reverse ReverseReturnType; - typedef const Reverse ConstReverseReturnType; - EIGEN_DEVICE_FUNC ReverseReturnType reverse(); - /** This is the const version of reverse(). */ - //Code moved here due to a CUDA compiler bug - EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const - { - return ConstReverseReturnType(derived()); - } - EIGEN_DEVICE_FUNC void reverseInPlace(); - -#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase -#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL -#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND) -#define EIGEN_DOC_UNARY_ADDONS(X,Y) -# include "../plugins/CommonCwiseUnaryOps.h" -# include "../plugins/BlockMethods.h" -# include "../plugins/IndexedViewMethods.h" -# ifdef EIGEN_DENSEBASE_PLUGIN -# include EIGEN_DENSEBASE_PLUGIN -# endif -#undef EIGEN_CURRENT_STORAGE_BASE_CLASS -#undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL -#undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF -#undef EIGEN_DOC_UNARY_ADDONS - - // disable the use of evalTo for dense objects with a nice compilation error - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& ) const - { - EIGEN_STATIC_ASSERT((internal::is_same::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS); - } - - protected: - /** Default constructor. Do nothing. */ - EIGEN_DEVICE_FUNC DenseBase() - { - /* Just checks for self-consistency of the flags. - * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down - */ -#ifdef EIGEN_INTERNAL_DEBUGGING - EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor)) - && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))), - INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION) -#endif - } - - private: - EIGEN_DEVICE_FUNC explicit DenseBase(int); - EIGEN_DEVICE_FUNC DenseBase(int,int); - template EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase&); -}; - -} // end namespace Eigen - -#endif // EIGEN_DENSEBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseCoeffsBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseCoeffsBase.h deleted file mode 100644 index c4af48ab..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseCoeffsBase.h +++ /dev/null @@ -1,681 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DENSECOEFFSBASE_H -#define EIGEN_DENSECOEFFSBASE_H - -namespace Eigen { - -namespace internal { -template struct add_const_on_value_type_if_arithmetic -{ - typedef typename conditional::value, T, typename add_const_on_value_type::type>::type type; -}; -} - -/** \brief Base class providing read-only coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #ReadOnlyAccessors Constant indicating read-only access - * - * This class defines the \c operator() \c const function and friends, which can be used to read specific - * entries of a matrix or array. - * - * \sa DenseCoeffsBase, DenseCoeffsBase, - * \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase : public EigenBase -{ - public: - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - - // Explanation for this CoeffReturnType typedef. - // - This is the return type of the coeff() method. - // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references - // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value). - // - The is_artihmetic check is required since "const int", "const double", etc. will cause warnings on some systems - // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is - // not possible, since the underlying expressions might not offer a valid address the reference could be referring to. - typedef typename internal::conditional::Flags&LvalueBit), - const Scalar&, - typename internal::conditional::value, Scalar, const Scalar>::type - >::type CoeffReturnType; - - typedef typename internal::add_const_on_value_type_if_arithmetic< - typename internal::packet_traits::type - >::type PacketReturnType; - - typedef EigenBase Base; - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const - { - return int(Derived::RowsAtCompileTime) == 1 ? 0 - : int(Derived::ColsAtCompileTime) == 1 ? inner - : int(Derived::Flags)&RowMajorBit ? outer - : inner; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const - { - return int(Derived::ColsAtCompileTime) == 1 ? 0 - : int(Derived::RowsAtCompileTime) == 1 ? inner - : int(Derived::Flags)&RowMajorBit ? inner - : outer; - } - - /** Short version: don't use this function, use - * \link operator()(Index,Index) const \endlink instead. - * - * Long version: this function is similar to - * \link operator()(Index,Index) const \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameters \a row and \a col are in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator()(Index,Index) const \endlink. - * - * \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const - { - eigen_internal_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return internal::evaluator(derived()).coeff(row,col); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const - { - return coeff(rowIndexByOuterInner(outer, inner), - colIndexByOuterInner(outer, inner)); - } - - /** \returns the coefficient at given the given row and column. - * - * \sa operator()(Index,Index), operator[](Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const - { - eigen_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return coeff(row, col); - } - - /** Short version: don't use this function, use - * \link operator[](Index) const \endlink instead. - * - * Long version: this function is similar to - * \link operator[](Index) const \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameter \a index is in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator[](Index) const \endlink. - * - * \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - coeff(Index index) const - { - EIGEN_STATIC_ASSERT(internal::evaluator::Flags & LinearAccessBit, - THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS) - eigen_internal_assert(index >= 0 && index < size()); - return internal::evaluator(derived()).coeff(index); - } - - - /** \returns the coefficient at given index. - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const, - * z() const, w() const - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - operator[](Index index) const - { - EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime, - THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD) - eigen_assert(index >= 0 && index < size()); - return coeff(index); - } - - /** \returns the coefficient at given index. - * - * This is synonymous to operator[](Index) const. - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const, - * z() const, w() const - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - operator()(Index index) const - { - eigen_assert(index >= 0 && index < size()); - return coeff(index); - } - - /** equivalent to operator[](0). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - x() const { return (*this)[0]; } - - /** equivalent to operator[](1). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - y() const - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS); - return (*this)[1]; - } - - /** equivalent to operator[](2). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - z() const - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS); - return (*this)[2]; - } - - /** equivalent to operator[](3). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE CoeffReturnType - w() const - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS); - return (*this)[3]; - } - - /** \internal - * \returns the packet of coefficients starting at the given row and column. It is your responsibility - * to ensure that a packet really starts there. This method is only available on expressions having the - * PacketAccessBit. - * - * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select - * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets - * starting at an address which is a multiple of the packet size. - */ - - template - EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const - { - typedef typename internal::packet_traits::type DefaultPacketType; - eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols()); - return internal::evaluator(derived()).template packet(row,col); - } - - - /** \internal */ - template - EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const - { - return packet(rowIndexByOuterInner(outer, inner), - colIndexByOuterInner(outer, inner)); - } - - /** \internal - * \returns the packet of coefficients starting at the given index. It is your responsibility - * to ensure that a packet really starts there. This method is only available on expressions having the - * PacketAccessBit and the LinearAccessBit. - * - * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select - * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets - * starting at an address which is a multiple of the packet size. - */ - - template - EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT(internal::evaluator::Flags & LinearAccessBit, - THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS) - typedef typename internal::packet_traits::type DefaultPacketType; - eigen_internal_assert(index >= 0 && index < size()); - return internal::evaluator(derived()).template packet(index); - } - - protected: - // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase. - // But some methods are only available in the DirectAccess case. - // So we add dummy methods here with these names, so that "using... " doesn't fail. - // It's not private so that the child class DenseBase can access them, and it's not public - // either since it's an implementation detail, so has to be protected. - void coeffRef(); - void coeffRefByOuterInner(); - void writePacket(); - void writePacketByOuterInner(); - void copyCoeff(); - void copyCoeffByOuterInner(); - void copyPacket(); - void copyPacketByOuterInner(); - void stride(); - void innerStride(); - void outerStride(); - void rowStride(); - void colStride(); -}; - -/** \brief Base class providing read/write coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #WriteAccessors Constant indicating read/write access - * - * This class defines the non-const \c operator() function and friends, which can be used to write specific - * entries of a matrix or array. This class inherits DenseCoeffsBase which - * defines the const variant for reading specific entries. - * - * \sa DenseCoeffsBase, \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase : public DenseCoeffsBase -{ - public: - - typedef DenseCoeffsBase Base; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - - using Base::coeff; - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - using Base::rowIndexByOuterInner; - using Base::colIndexByOuterInner; - using Base::operator[]; - using Base::operator(); - using Base::x; - using Base::y; - using Base::z; - using Base::w; - - /** Short version: don't use this function, use - * \link operator()(Index,Index) \endlink instead. - * - * Long version: this function is similar to - * \link operator()(Index,Index) \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameters \a row and \a col are in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator()(Index,Index) \endlink. - * - * \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) - { - eigen_internal_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return internal::evaluator(derived()).coeffRef(row,col); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - coeffRefByOuterInner(Index outer, Index inner) - { - return coeffRef(rowIndexByOuterInner(outer, inner), - colIndexByOuterInner(outer, inner)); - } - - /** \returns a reference to the coefficient at given the given row and column. - * - * \sa operator[](Index) - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - operator()(Index row, Index col) - { - eigen_assert(row >= 0 && row < rows() - && col >= 0 && col < cols()); - return coeffRef(row, col); - } - - - /** Short version: don't use this function, use - * \link operator[](Index) \endlink instead. - * - * Long version: this function is similar to - * \link operator[](Index) \endlink, but without the assertion. - * Use this for limiting the performance cost of debugging code when doing - * repeated coefficient access. Only use this when it is guaranteed that the - * parameters \a row and \a col are in range. - * - * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this - * function equivalent to \link operator[](Index) \endlink. - * - * \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index) - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - coeffRef(Index index) - { - EIGEN_STATIC_ASSERT(internal::evaluator::Flags & LinearAccessBit, - THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS) - eigen_internal_assert(index >= 0 && index < size()); - return internal::evaluator(derived()).coeffRef(index); - } - - /** \returns a reference to the coefficient at given index. - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w() - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - operator[](Index index) - { - EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime, - THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD) - eigen_assert(index >= 0 && index < size()); - return coeffRef(index); - } - - /** \returns a reference to the coefficient at given index. - * - * This is synonymous to operator[](Index). - * - * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. - * - * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w() - */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - operator()(Index index) - { - eigen_assert(index >= 0 && index < size()); - return coeffRef(index); - } - - /** equivalent to operator[](0). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - x() { return (*this)[0]; } - - /** equivalent to operator[](1). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - y() - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS); - return (*this)[1]; - } - - /** equivalent to operator[](2). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - z() - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS); - return (*this)[2]; - } - - /** equivalent to operator[](3). */ - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& - w() - { - EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS); - return (*this)[3]; - } -}; - -/** \brief Base class providing direct read-only coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #DirectAccessors Constant indicating direct access - * - * This class defines functions to work with strides which can be used to access entries directly. This class - * inherits DenseCoeffsBase which defines functions to access entries read-only using - * \c operator() . - * - * \sa \blank \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase : public DenseCoeffsBase -{ - public: - - typedef DenseCoeffsBase Base; - typedef typename internal::traits::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - - /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. - * - * \sa outerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return derived().innerStride(); - } - - /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns - * in a column-major matrix). - * - * \sa innerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return derived().outerStride(); - } - - // FIXME shall we remove it ? - inline Index stride() const - { - return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); - } - - /** \returns the pointer increment between two consecutive rows. - * - * \sa innerStride(), outerStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index rowStride() const - { - return Derived::IsRowMajor ? outerStride() : innerStride(); - } - - /** \returns the pointer increment between two consecutive columns. - * - * \sa innerStride(), outerStride(), rowStride() - */ - EIGEN_DEVICE_FUNC - inline Index colStride() const - { - return Derived::IsRowMajor ? innerStride() : outerStride(); - } -}; - -/** \brief Base class providing direct read/write coefficient access to matrices and arrays. - * \ingroup Core_Module - * \tparam Derived Type of the derived class - * \tparam #DirectWriteAccessors Constant indicating direct access - * - * This class defines functions to work with strides which can be used to access entries directly. This class - * inherits DenseCoeffsBase which defines functions to access entries read/write using - * \c operator(). - * - * \sa \blank \ref TopicClassHierarchy - */ -template -class DenseCoeffsBase - : public DenseCoeffsBase -{ - public: - - typedef DenseCoeffsBase Base; - typedef typename internal::traits::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - using Base::rows; - using Base::cols; - using Base::size; - using Base::derived; - - /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. - * - * \sa outerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return derived().innerStride(); - } - - /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns - * in a column-major matrix). - * - * \sa innerStride(), rowStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return derived().outerStride(); - } - - // FIXME shall we remove it ? - inline Index stride() const - { - return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); - } - - /** \returns the pointer increment between two consecutive rows. - * - * \sa innerStride(), outerStride(), colStride() - */ - EIGEN_DEVICE_FUNC - inline Index rowStride() const - { - return Derived::IsRowMajor ? outerStride() : innerStride(); - } - - /** \returns the pointer increment between two consecutive columns. - * - * \sa innerStride(), outerStride(), rowStride() - */ - EIGEN_DEVICE_FUNC - inline Index colStride() const - { - return Derived::IsRowMajor ? innerStride() : outerStride(); - } -}; - -namespace internal { - -template -struct first_aligned_impl -{ - static inline Index run(const Derived&) - { return 0; } -}; - -template -struct first_aligned_impl -{ - static inline Index run(const Derived& m) - { - return internal::first_aligned(m.data(), m.size()); - } -}; - -/** \internal \returns the index of the first element of the array stored by \a m that is properly aligned with respect to \a Alignment for vectorization. - * - * \tparam Alignment requested alignment in Bytes. - * - * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more - * documentation. - */ -template -static inline Index first_aligned(const DenseBase& m) -{ - enum { ReturnZero = (int(evaluator::Alignment) >= Alignment) || !(Derived::Flags & DirectAccessBit) }; - return first_aligned_impl::run(m.derived()); -} - -template -static inline Index first_default_aligned(const DenseBase& m) -{ - typedef typename Derived::Scalar Scalar; - typedef typename packet_traits::type DefaultPacketType; - return internal::first_aligned::alignment),Derived>(m); -} - -template::ret> -struct inner_stride_at_compile_time -{ - enum { ret = traits::InnerStrideAtCompileTime }; -}; - -template -struct inner_stride_at_compile_time -{ - enum { ret = 0 }; -}; - -template::ret> -struct outer_stride_at_compile_time -{ - enum { ret = traits::OuterStrideAtCompileTime }; -}; - -template -struct outer_stride_at_compile_time -{ - enum { ret = 0 }; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_DENSECOEFFSBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseStorage.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseStorage.h deleted file mode 100644 index 7958feeb..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/DenseStorage.h +++ /dev/null @@ -1,570 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2009 Benoit Jacob -// Copyright (C) 2010-2013 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATRIXSTORAGE_H -#define EIGEN_MATRIXSTORAGE_H - -#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN - #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) X; EIGEN_DENSE_STORAGE_CTOR_PLUGIN; -#else - #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) -#endif - -namespace Eigen { - -namespace internal { - -struct constructor_without_unaligned_array_assert {}; - -template -EIGEN_DEVICE_FUNC -void check_static_allocation_size() -{ - // if EIGEN_STACK_ALLOCATION_LIMIT is defined to 0, then no limit - #if EIGEN_STACK_ALLOCATION_LIMIT - EIGEN_STATIC_ASSERT(Size * sizeof(T) <= EIGEN_STACK_ALLOCATION_LIMIT, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG); - #endif -} - -/** \internal - * Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned: - * to 16 bytes boundary if the total size is a multiple of 16 bytes. - */ -template ::value > -struct plain_array -{ - T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -#if defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT) - #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) -#elif EIGEN_GNUC_AT_LEAST(4,7) - // GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned. - // See this bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900 - // Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined: - template - EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; } - #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ - eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \ - && "this assertion is explained here: " \ - "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \ - " **** READ THIS WEB PAGE !!! ****"); -#else - #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ - eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \ - && "this assertion is explained here: " \ - "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \ - " **** READ THIS WEB PAGE !!! ****"); -#endif - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(8) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(7); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(16) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(15); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(32) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(31); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - EIGEN_ALIGN_TO_BOUNDARY(64) T array[Size]; - - EIGEN_DEVICE_FUNC - plain_array() - { - EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(63); - check_static_allocation_size(); - } - - EIGEN_DEVICE_FUNC - plain_array(constructor_without_unaligned_array_assert) - { - check_static_allocation_size(); - } -}; - -template -struct plain_array -{ - T array[1]; - EIGEN_DEVICE_FUNC plain_array() {} - EIGEN_DEVICE_FUNC plain_array(constructor_without_unaligned_array_assert) {} -}; - -} // end namespace internal - -/** \internal - * - * \class DenseStorage - * \ingroup Core_Module - * - * \brief Stores the data of a matrix - * - * This class stores the data of fixed-size, dynamic-size or mixed matrices - * in a way as compact as possible. - * - * \sa Matrix - */ -template class DenseStorage; - -// purely fixed-size matrix -template class DenseStorage -{ - internal::plain_array m_data; - public: - EIGEN_DEVICE_FUNC DenseStorage() { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size) - } - EIGEN_DEVICE_FUNC - explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()) {} - EIGEN_DEVICE_FUNC - DenseStorage(const DenseStorage& other) : m_data(other.m_data) { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size) - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) m_data = other.m_data; - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows==_Rows && cols==_Cols); - EIGEN_UNUSED_VARIABLE(size); - EIGEN_UNUSED_VARIABLE(rows); - EIGEN_UNUSED_VARIABLE(cols); - } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); } - EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} - EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC void resize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// null matrix -template class DenseStorage -{ - public: - EIGEN_DEVICE_FUNC DenseStorage() {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage&) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage&) { return *this; } - EIGEN_DEVICE_FUNC DenseStorage(Index,Index,Index) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& ) {} - EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} - EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC void resize(Index,Index,Index) {} - EIGEN_DEVICE_FUNC const T *data() const { return 0; } - EIGEN_DEVICE_FUNC T *data() { return 0; } -}; - -// more specializations for null matrices; these are necessary to resolve ambiguities -template class DenseStorage -: public DenseStorage { }; - -template class DenseStorage -: public DenseStorage { }; - -template class DenseStorage -: public DenseStorage { }; - -// dynamic-size matrix with fixed-size storage -template class DenseStorage -{ - internal::plain_array m_data; - Index m_rows; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_rows(other.m_rows), m_cols(other.m_cols) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - m_data = other.m_data; - m_rows = other.m_rows; - m_cols = other.m_cols; - } - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) - { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC Index rows() const {return m_rows;} - EIGEN_DEVICE_FUNC Index cols() const {return m_cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index cols) { m_rows = rows; m_cols = cols; } - EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index cols) { m_rows = rows; m_cols = cols; } - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// dynamic-size matrix with fixed-size storage and fixed width -template class DenseStorage -{ - internal::plain_array m_data; - Index m_rows; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_rows(other.m_rows) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - m_data = other.m_data; - m_rows = other.m_rows; - } - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index) : m_rows(rows) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); } - EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return _Cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index) { m_rows = rows; } - EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index) { m_rows = rows; } - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// dynamic-size matrix with fixed-size storage and fixed height -template class DenseStorage -{ - internal::plain_array m_data; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_cols(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_data(other.m_data), m_cols(other.m_cols) {} - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - m_data = other.m_data; - m_cols = other.m_cols; - } - return *this; - } - EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {} - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC Index rows(void) const {return _Rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} - void conservativeResize(Index, Index, Index cols) { m_cols = cols; } - void resize(Index, Index, Index cols) { m_cols = cols; } - EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } - EIGEN_DEVICE_FUNC T *data() { return m_data.array; } -}; - -// purely dynamic matrix. -template class DenseStorage -{ - T *m_data; - Index m_rows; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_data(0), m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) - : m_data(0), m_rows(0), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) - : m_data(internal::conditional_aligned_new_auto(size)), m_rows(rows), m_cols(cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows>=0 && cols >=0); - } - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) - : m_data(internal::conditional_aligned_new_auto(other.m_rows*other.m_cols)) - , m_rows(other.m_rows) - , m_cols(other.m_cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*m_cols) - internal::smart_copy(other.m_data, other.m_data+other.m_rows*other.m_cols, m_data); - } - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - DenseStorage tmp(other); - this->swap(tmp); - } - return *this; - } -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT - : m_data(std::move(other.m_data)) - , m_rows(std::move(other.m_rows)) - , m_cols(std::move(other.m_cols)) - { - other.m_data = nullptr; - other.m_rows = 0; - other.m_cols = 0; - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_data, other.m_data); - swap(m_rows, other.m_rows); - swap(m_cols, other.m_cols); - return *this; - } -#endif - EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols); } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) - { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} - void conservativeResize(Index size, Index rows, Index cols) - { - m_data = internal::conditional_aligned_realloc_new_auto(m_data, size, m_rows*m_cols); - m_rows = rows; - m_cols = cols; - } - EIGEN_DEVICE_FUNC void resize(Index size, Index rows, Index cols) - { - if(size != m_rows*m_cols) - { - internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols); - if (size) - m_data = internal::conditional_aligned_new_auto(size); - else - m_data = 0; - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - } - m_rows = rows; - m_cols = cols; - } - EIGEN_DEVICE_FUNC const T *data() const { return m_data; } - EIGEN_DEVICE_FUNC T *data() { return m_data; } -}; - -// matrix with dynamic width and fixed height (so that matrix has dynamic size). -template class DenseStorage -{ - T *m_data; - Index m_cols; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_data(0), m_cols(0) {} - explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {} - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto(size)), m_cols(cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows==_Rows && cols >=0); - EIGEN_UNUSED_VARIABLE(rows); - } - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) - : m_data(internal::conditional_aligned_new_auto(_Rows*other.m_cols)) - , m_cols(other.m_cols) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_cols*_Rows) - internal::smart_copy(other.m_data, other.m_data+_Rows*m_cols, m_data); - } - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - DenseStorage tmp(other); - this->swap(tmp); - } - return *this; - } -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT - : m_data(std::move(other.m_data)) - , m_cols(std::move(other.m_cols)) - { - other.m_data = nullptr; - other.m_cols = 0; - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_data, other.m_data); - swap(m_cols, other.m_cols); - return *this; - } -#endif - EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto(m_data, _Rows*m_cols); } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); } - EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} - EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} - EIGEN_DEVICE_FUNC void conservativeResize(Index size, Index, Index cols) - { - m_data = internal::conditional_aligned_realloc_new_auto(m_data, size, _Rows*m_cols); - m_cols = cols; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index, Index cols) - { - if(size != _Rows*m_cols) - { - internal::conditional_aligned_delete_auto(m_data, _Rows*m_cols); - if (size) - m_data = internal::conditional_aligned_new_auto(size); - else - m_data = 0; - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - } - m_cols = cols; - } - EIGEN_DEVICE_FUNC const T *data() const { return m_data; } - EIGEN_DEVICE_FUNC T *data() { return m_data; } -}; - -// matrix with dynamic height and fixed width (so that matrix has dynamic size). -template class DenseStorage -{ - T *m_data; - Index m_rows; - public: - EIGEN_DEVICE_FUNC DenseStorage() : m_data(0), m_rows(0) {} - explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {} - EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto(size)), m_rows(rows) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - eigen_internal_assert(size==rows*cols && rows>=0 && cols == _Cols); - EIGEN_UNUSED_VARIABLE(cols); - } - EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) - : m_data(internal::conditional_aligned_new_auto(other.m_rows*_Cols)) - , m_rows(other.m_rows) - { - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*_Cols) - internal::smart_copy(other.m_data, other.m_data+other.m_rows*_Cols, m_data); - } - EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) - { - if (this != &other) - { - DenseStorage tmp(other); - this->swap(tmp); - } - return *this; - } -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT - : m_data(std::move(other.m_data)) - , m_rows(std::move(other.m_rows)) - { - other.m_data = nullptr; - other.m_rows = 0; - } - EIGEN_DEVICE_FUNC - DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_data, other.m_data); - swap(m_rows, other.m_rows); - return *this; - } -#endif - EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto(m_data, _Cols*m_rows); } - EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); } - EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} - EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} - void conservativeResize(Index size, Index rows, Index) - { - m_data = internal::conditional_aligned_realloc_new_auto(m_data, size, m_rows*_Cols); - m_rows = rows; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index rows, Index) - { - if(size != m_rows*_Cols) - { - internal::conditional_aligned_delete_auto(m_data, _Cols*m_rows); - if (size) - m_data = internal::conditional_aligned_new_auto(size); - else - m_data = 0; - EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({}) - } - m_rows = rows; - } - EIGEN_DEVICE_FUNC const T *data() const { return m_data; } - EIGEN_DEVICE_FUNC T *data() { return m_data; } -}; - -} // end namespace Eigen - -#endif // EIGEN_MATRIX_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Diagonal.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Diagonal.h deleted file mode 100644 index c62f5ff2..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Diagonal.h +++ /dev/null @@ -1,259 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2009 Benoit Jacob -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DIAGONAL_H -#define EIGEN_DIAGONAL_H - -namespace Eigen { - -/** \class Diagonal - * \ingroup Core_Module - * - * \brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix - * - * \param MatrixType the type of the object in which we are taking a sub/main/super diagonal - * \param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal. - * A positive value means a superdiagonal, a negative value means a subdiagonal. - * You can also use DynamicIndex so the index can be set at runtime. - * - * The matrix is not required to be square. - * - * This class represents an expression of the main diagonal, or any sub/super diagonal - * of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the - * time this is the only way it is used. - * - * \sa MatrixBase::diagonal(), MatrixBase::diagonal(Index) - */ - -namespace internal { -template -struct traits > - : traits -{ - typedef typename ref_selector::type MatrixTypeNested; - typedef typename remove_reference::type _MatrixTypeNested; - typedef typename MatrixType::StorageKind StorageKind; - enum { - RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic - : (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), - MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), - ColsAtCompileTime = 1, - MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic - : DiagIndex == DynamicIndex ? EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime, - MatrixType::MaxColsAtCompileTime) - : (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), - MatrixType::MaxColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), - MaxColsAtCompileTime = 1, - MaskLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = (unsigned int)_MatrixTypeNested::Flags & (RowMajorBit | MaskLvalueBit | DirectAccessBit) & ~RowMajorBit, // FIXME DirectAccessBit should not be handled by expressions - MatrixTypeOuterStride = outer_stride_at_compile_time::ret, - InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride+1, - OuterStrideAtCompileTime = 0 - }; -}; -} - -template class Diagonal - : public internal::dense_xpr_base< Diagonal >::type -{ - public: - - enum { DiagIndex = _DiagIndex }; - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal) - - EIGEN_DEVICE_FUNC - explicit inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index) {} - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal) - - EIGEN_DEVICE_FUNC - inline Index rows() const - { - return m_index.value()<0 ? numext::mini(m_matrix.cols(),m_matrix.rows()+m_index.value()) - : numext::mini(m_matrix.rows(),m_matrix.cols()-m_index.value()); - } - - EIGEN_DEVICE_FUNC - inline Index cols() const { return 1; } - - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return m_matrix.outerStride() + 1; - } - - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return 0; - } - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return &(m_matrix.coeffRef(rowOffset(), colOffset())); } - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return &(m_matrix.coeffRef(rowOffset(), colOffset())); } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index row, Index) - { - EIGEN_STATIC_ASSERT_LVALUE(MatrixType) - return m_matrix.coeffRef(row+rowOffset(), row+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index row, Index) const - { - return m_matrix.coeffRef(row+rowOffset(), row+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline CoeffReturnType coeff(Index row, Index) const - { - return m_matrix.coeff(row+rowOffset(), row+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline Scalar& coeffRef(Index idx) - { - EIGEN_STATIC_ASSERT_LVALUE(MatrixType) - return m_matrix.coeffRef(idx+rowOffset(), idx+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index idx) const - { - return m_matrix.coeffRef(idx+rowOffset(), idx+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline CoeffReturnType coeff(Index idx) const - { - return m_matrix.coeff(idx+rowOffset(), idx+colOffset()); - } - - EIGEN_DEVICE_FUNC - inline const typename internal::remove_all::type& - nestedExpression() const - { - return m_matrix; - } - - EIGEN_DEVICE_FUNC - inline Index index() const - { - return m_index.value(); - } - - protected: - typename internal::ref_selector::non_const_type m_matrix; - const internal::variable_if_dynamicindex m_index; - - private: - // some compilers may fail to optimize std::max etc in case of compile-time constants... - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index absDiagIndex() const { return m_index.value()>0 ? m_index.value() : -m_index.value(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value()>0 ? 0 : -m_index.value(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value()>0 ? m_index.value() : 0; } - // trigger a compile-time error if someone try to call packet - template typename MatrixType::PacketReturnType packet(Index) const; - template typename MatrixType::PacketReturnType packet(Index,Index) const; -}; - -/** \returns an expression of the main diagonal of the matrix \c *this - * - * \c *this is not required to be square. - * - * Example: \include MatrixBase_diagonal.cpp - * Output: \verbinclude MatrixBase_diagonal.out - * - * \sa class Diagonal */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::DiagonalReturnType -MatrixBase::diagonal() -{ - return DiagonalReturnType(derived()); -} - -/** This is the const version of diagonal(). */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::ConstDiagonalReturnType -MatrixBase::diagonal() const -{ - return ConstDiagonalReturnType(derived()); -} - -/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this - * - * \c *this is not required to be square. - * - * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0 - * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal. - * - * Example: \include MatrixBase_diagonal_int.cpp - * Output: \verbinclude MatrixBase_diagonal_int.out - * - * \sa MatrixBase::diagonal(), class Diagonal */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::DiagonalDynamicIndexReturnType -MatrixBase::diagonal(Index index) -{ - return DiagonalDynamicIndexReturnType(derived(), index); -} - -/** This is the const version of diagonal(Index). */ -template -EIGEN_DEVICE_FUNC inline typename MatrixBase::ConstDiagonalDynamicIndexReturnType -MatrixBase::diagonal(Index index) const -{ - return ConstDiagonalDynamicIndexReturnType(derived(), index); -} - -/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this - * - * \c *this is not required to be square. - * - * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0 - * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal. - * - * Example: \include MatrixBase_diagonal_template_int.cpp - * Output: \verbinclude MatrixBase_diagonal_template_int.out - * - * \sa MatrixBase::diagonal(), class Diagonal */ -template -template -EIGEN_DEVICE_FUNC -inline typename MatrixBase::template DiagonalIndexReturnType::Type -MatrixBase::diagonal() -{ - return typename DiagonalIndexReturnType::Type(derived()); -} - -/** This is the const version of diagonal(). */ -template -template -EIGEN_DEVICE_FUNC -inline typename MatrixBase::template ConstDiagonalIndexReturnType::Type -MatrixBase::diagonal() const -{ - return typename ConstDiagonalIndexReturnType::Type(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_DIAGONAL_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/DiagonalMatrix.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/DiagonalMatrix.h deleted file mode 100644 index 4e8297ee..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/DiagonalMatrix.h +++ /dev/null @@ -1,343 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// Copyright (C) 2007-2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DIAGONALMATRIX_H -#define EIGEN_DIAGONALMATRIX_H - -namespace Eigen { - -#ifndef EIGEN_PARSED_BY_DOXYGEN -template -class DiagonalBase : public EigenBase -{ - public: - typedef typename internal::traits::DiagonalVectorType DiagonalVectorType; - typedef typename DiagonalVectorType::Scalar Scalar; - typedef typename DiagonalVectorType::RealScalar RealScalar; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - - enum { - RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - IsVectorAtCompileTime = 0, - Flags = NoPreferredStorageOrderBit - }; - - typedef Matrix DenseMatrixType; - typedef DenseMatrixType DenseType; - typedef DiagonalMatrix PlainObject; - - EIGEN_DEVICE_FUNC - inline const Derived& derived() const { return *static_cast(this); } - EIGEN_DEVICE_FUNC - inline Derived& derived() { return *static_cast(this); } - - EIGEN_DEVICE_FUNC - DenseMatrixType toDenseMatrix() const { return derived(); } - - EIGEN_DEVICE_FUNC - inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); } - EIGEN_DEVICE_FUNC - inline DiagonalVectorType& diagonal() { return derived().diagonal(); } - - EIGEN_DEVICE_FUNC - inline Index rows() const { return diagonal().size(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return diagonal().size(); } - - template - EIGEN_DEVICE_FUNC - const Product - operator*(const MatrixBase &matrix) const - { - return Product(derived(),matrix.derived()); - } - - typedef DiagonalWrapper, const DiagonalVectorType> > InverseReturnType; - EIGEN_DEVICE_FUNC - inline const InverseReturnType - inverse() const - { - return InverseReturnType(diagonal().cwiseInverse()); - } - - EIGEN_DEVICE_FUNC - inline const DiagonalWrapper - operator*(const Scalar& scalar) const - { - return DiagonalWrapper(diagonal() * scalar); - } - EIGEN_DEVICE_FUNC - friend inline const DiagonalWrapper - operator*(const Scalar& scalar, const DiagonalBase& other) - { - return DiagonalWrapper(scalar * other.diagonal()); - } -}; - -#endif - -/** \class DiagonalMatrix - * \ingroup Core_Module - * - * \brief Represents a diagonal matrix with its storage - * - * \param _Scalar the type of coefficients - * \param SizeAtCompileTime the dimension of the matrix, or Dynamic - * \param MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults - * to SizeAtCompileTime. Most of the time, you do not need to specify it. - * - * \sa class DiagonalWrapper - */ - -namespace internal { -template -struct traits > - : traits > -{ - typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType; - typedef DiagonalShape StorageKind; - enum { - Flags = LvalueBit | NoPreferredStorageOrderBit - }; -}; -} -template -class DiagonalMatrix - : public DiagonalBase > -{ - public: - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename internal::traits::DiagonalVectorType DiagonalVectorType; - typedef const DiagonalMatrix& Nested; - typedef _Scalar Scalar; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - #endif - - protected: - - DiagonalVectorType m_diagonal; - - public: - - /** const version of diagonal(). */ - EIGEN_DEVICE_FUNC - inline const DiagonalVectorType& diagonal() const { return m_diagonal; } - /** \returns a reference to the stored vector of diagonal coefficients. */ - EIGEN_DEVICE_FUNC - inline DiagonalVectorType& diagonal() { return m_diagonal; } - - /** Default constructor without initialization */ - EIGEN_DEVICE_FUNC - inline DiagonalMatrix() {} - - /** Constructs a diagonal matrix with given dimension */ - EIGEN_DEVICE_FUNC - explicit inline DiagonalMatrix(Index dim) : m_diagonal(dim) {} - - /** 2D constructor. */ - EIGEN_DEVICE_FUNC - inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x,y) {} - - /** 3D constructor. */ - EIGEN_DEVICE_FUNC - inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x,y,z) {} - - /** Copy constructor. */ - template - EIGEN_DEVICE_FUNC - inline DiagonalMatrix(const DiagonalBase& other) : m_diagonal(other.diagonal()) {} - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */ - inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {} - #endif - - /** generic constructor from expression of the diagonal coefficients */ - template - EIGEN_DEVICE_FUNC - explicit inline DiagonalMatrix(const MatrixBase& other) : m_diagonal(other) - {} - - /** Copy operator. */ - template - EIGEN_DEVICE_FUNC - DiagonalMatrix& operator=(const DiagonalBase& other) - { - m_diagonal = other.diagonal(); - return *this; - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - EIGEN_DEVICE_FUNC - DiagonalMatrix& operator=(const DiagonalMatrix& other) - { - m_diagonal = other.diagonal(); - return *this; - } - #endif - - /** Resizes to given size. */ - EIGEN_DEVICE_FUNC - inline void resize(Index size) { m_diagonal.resize(size); } - /** Sets all coefficients to zero. */ - EIGEN_DEVICE_FUNC - inline void setZero() { m_diagonal.setZero(); } - /** Resizes and sets all coefficients to zero. */ - EIGEN_DEVICE_FUNC - inline void setZero(Index size) { m_diagonal.setZero(size); } - /** Sets this matrix to be the identity matrix of the current size. */ - EIGEN_DEVICE_FUNC - inline void setIdentity() { m_diagonal.setOnes(); } - /** Sets this matrix to be the identity matrix of the given size. */ - EIGEN_DEVICE_FUNC - inline void setIdentity(Index size) { m_diagonal.setOnes(size); } -}; - -/** \class DiagonalWrapper - * \ingroup Core_Module - * - * \brief Expression of a diagonal matrix - * - * \param _DiagonalVectorType the type of the vector of diagonal coefficients - * - * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients, - * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal() - * and most of the time this is the only way that it is used. - * - * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal() - */ - -namespace internal { -template -struct traits > -{ - typedef _DiagonalVectorType DiagonalVectorType; - typedef typename DiagonalVectorType::Scalar Scalar; - typedef typename DiagonalVectorType::StorageIndex StorageIndex; - typedef DiagonalShape StorageKind; - typedef typename traits::XprKind XprKind; - enum { - RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, - MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, - Flags = (traits::Flags & LvalueBit) | NoPreferredStorageOrderBit - }; -}; -} - -template -class DiagonalWrapper - : public DiagonalBase >, internal::no_assignment_operator -{ - public: - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef _DiagonalVectorType DiagonalVectorType; - typedef DiagonalWrapper Nested; - #endif - - /** Constructor from expression of diagonal coefficients to wrap. */ - EIGEN_DEVICE_FUNC - explicit inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {} - - /** \returns a const reference to the wrapped expression of diagonal coefficients. */ - EIGEN_DEVICE_FUNC - const DiagonalVectorType& diagonal() const { return m_diagonal; } - - protected: - typename DiagonalVectorType::Nested m_diagonal; -}; - -/** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients - * - * \only_for_vectors - * - * Example: \include MatrixBase_asDiagonal.cpp - * Output: \verbinclude MatrixBase_asDiagonal.out - * - * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal() - **/ -template -EIGEN_DEVICE_FUNC inline const DiagonalWrapper -MatrixBase::asDiagonal() const -{ - return DiagonalWrapper(derived()); -} - -/** \returns true if *this is approximately equal to a diagonal matrix, - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isDiagonal.cpp - * Output: \verbinclude MatrixBase_isDiagonal.out - * - * \sa asDiagonal() - */ -template -bool MatrixBase::isDiagonal(const RealScalar& prec) const -{ - if(cols() != rows()) return false; - RealScalar maxAbsOnDiagonal = static_cast(-1); - for(Index j = 0; j < cols(); ++j) - { - RealScalar absOnDiagonal = numext::abs(coeff(j,j)); - if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal; - } - for(Index j = 0; j < cols(); ++j) - for(Index i = 0; i < j; ++i) - { - if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false; - if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false; - } - return true; -} - -namespace internal { - -template<> struct storage_kind_to_shape { typedef DiagonalShape Shape; }; - -struct Diagonal2Dense {}; - -template<> struct AssignmentKind { typedef Diagonal2Dense Kind; }; - -// Diagonal matrix to Dense assignment -template< typename DstXprType, typename SrcXprType, typename Functor> -struct Assignment -{ - static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op &/*func*/) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - - dst.setZero(); - dst.diagonal() = src.diagonal(); - } - - static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op &/*func*/) - { dst.diagonal() += src.diagonal(); } - - static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op &/*func*/) - { dst.diagonal() -= src.diagonal(); } -}; - -} // namespace internal - -} // end namespace Eigen - -#endif // EIGEN_DIAGONALMATRIX_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/DiagonalProduct.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/DiagonalProduct.h deleted file mode 100644 index 7911d1cd..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/DiagonalProduct.h +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2007-2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DIAGONALPRODUCT_H -#define EIGEN_DIAGONALPRODUCT_H - -namespace Eigen { - -/** \returns the diagonal matrix product of \c *this by the diagonal matrix \a diagonal. - */ -template -template -EIGEN_DEVICE_FUNC inline const Product -MatrixBase::operator*(const DiagonalBase &a_diagonal) const -{ - return Product(derived(),a_diagonal.derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_DIAGONALPRODUCT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Dot.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Dot.h deleted file mode 100644 index bb8e3fec..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Dot.h +++ /dev/null @@ -1,315 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008, 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DOT_H -#define EIGEN_DOT_H - -namespace Eigen { - -namespace internal { - -// helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot -// with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE -// looking at the static assertions. Thus this is a trick to get better compile errors. -template -struct dot_nocheck -{ - typedef scalar_conj_product_op::Scalar,typename traits::Scalar> conj_prod; - typedef typename conj_prod::result_type ResScalar; - EIGEN_DEVICE_FUNC - static inline ResScalar run(const MatrixBase& a, const MatrixBase& b) - { - return a.template binaryExpr(b).sum(); - } -}; - -template -struct dot_nocheck -{ - typedef scalar_conj_product_op::Scalar,typename traits::Scalar> conj_prod; - typedef typename conj_prod::result_type ResScalar; - EIGEN_DEVICE_FUNC - static inline ResScalar run(const MatrixBase& a, const MatrixBase& b) - { - return a.transpose().template binaryExpr(b).sum(); - } -}; - -} // end namespace internal - -/** \fn MatrixBase::dot - * \returns the dot product of *this with other. - * - * \only_for_vectors - * - * \note If the scalar type is complex numbers, then this function returns the hermitian - * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the - * second variable. - * - * \sa squaredNorm(), norm() - */ -template -template -EIGEN_DEVICE_FUNC -typename ScalarBinaryOpTraits::Scalar,typename internal::traits::Scalar>::ReturnType -MatrixBase::dot(const MatrixBase& other) const -{ - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived) - EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived) -#if !(defined(EIGEN_NO_STATIC_ASSERT) && defined(EIGEN_NO_DEBUG)) - typedef internal::scalar_conj_product_op func; - EIGEN_CHECK_BINARY_COMPATIBILIY(func,Scalar,typename OtherDerived::Scalar); -#endif - - eigen_assert(size() == other.size()); - - return internal::dot_nocheck::run(*this, other); -} - -//---------- implementation of L2 norm and related functions ---------- - -/** \returns, for vectors, the squared \em l2 norm of \c *this, and for matrices the Frobenius norm. - * In both cases, it consists in the sum of the square of all the matrix entries. - * For vectors, this is also equals to the dot product of \c *this with itself. - * - * \sa dot(), norm(), lpNorm() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NumTraits::Scalar>::Real MatrixBase::squaredNorm() const -{ - return numext::real((*this).cwiseAbs2().sum()); -} - -/** \returns, for vectors, the \em l2 norm of \c *this, and for matrices the Frobenius norm. - * In both cases, it consists in the square root of the sum of the square of all the matrix entries. - * For vectors, this is also equals to the square root of the dot product of \c *this with itself. - * - * \sa lpNorm(), dot(), squaredNorm() - */ -template -EIGEN_DEVICE_FUNC inline typename NumTraits::Scalar>::Real MatrixBase::norm() const -{ - return numext::sqrt(squaredNorm()); -} - -/** \returns an expression of the quotient of \c *this by its own norm. - * - * \warning If the input vector is too small (i.e., this->norm()==0), - * then this function returns a copy of the input. - * - * \only_for_vectors - * - * \sa norm(), normalize() - */ -template -EIGEN_DEVICE_FUNC inline const typename MatrixBase::PlainObject -MatrixBase::normalized() const -{ - typedef typename internal::nested_eval::type _Nested; - _Nested n(derived()); - RealScalar z = n.squaredNorm(); - // NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU - if(z>RealScalar(0)) - return n / numext::sqrt(z); - else - return n; -} - -/** Normalizes the vector, i.e. divides it by its own norm. - * - * \only_for_vectors - * - * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged. - * - * \sa norm(), normalized() - */ -template -EIGEN_DEVICE_FUNC inline void MatrixBase::normalize() -{ - RealScalar z = squaredNorm(); - // NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU - if(z>RealScalar(0)) - derived() /= numext::sqrt(z); -} - -/** \returns an expression of the quotient of \c *this by its own norm while avoiding underflow and overflow. - * - * \only_for_vectors - * - * This method is analogue to the normalized() method, but it reduces the risk of - * underflow and overflow when computing the norm. - * - * \warning If the input vector is too small (i.e., this->norm()==0), - * then this function returns a copy of the input. - * - * \sa stableNorm(), stableNormalize(), normalized() - */ -template -EIGEN_DEVICE_FUNC inline const typename MatrixBase::PlainObject -MatrixBase::stableNormalized() const -{ - typedef typename internal::nested_eval::type _Nested; - _Nested n(derived()); - RealScalar w = n.cwiseAbs().maxCoeff(); - RealScalar z = (n/w).squaredNorm(); - if(z>RealScalar(0)) - return n / (numext::sqrt(z)*w); - else - return n; -} - -/** Normalizes the vector while avoid underflow and overflow - * - * \only_for_vectors - * - * This method is analogue to the normalize() method, but it reduces the risk of - * underflow and overflow when computing the norm. - * - * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged. - * - * \sa stableNorm(), stableNormalized(), normalize() - */ -template -EIGEN_DEVICE_FUNC inline void MatrixBase::stableNormalize() -{ - RealScalar w = cwiseAbs().maxCoeff(); - RealScalar z = (derived()/w).squaredNorm(); - if(z>RealScalar(0)) - derived() /= numext::sqrt(z)*w; -} - -//---------- implementation of other norms ---------- - -namespace internal { - -template -struct lpNorm_selector -{ - typedef typename NumTraits::Scalar>::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const MatrixBase& m) - { - EIGEN_USING_STD_MATH(pow) - return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p); - } -}; - -template -struct lpNorm_selector -{ - EIGEN_DEVICE_FUNC - static inline typename NumTraits::Scalar>::Real run(const MatrixBase& m) - { - return m.cwiseAbs().sum(); - } -}; - -template -struct lpNorm_selector -{ - EIGEN_DEVICE_FUNC - static inline typename NumTraits::Scalar>::Real run(const MatrixBase& m) - { - return m.norm(); - } -}; - -template -struct lpNorm_selector -{ - typedef typename NumTraits::Scalar>::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const MatrixBase& m) - { - if(Derived::SizeAtCompileTime==0 || (Derived::SizeAtCompileTime==Dynamic && m.size()==0)) - return RealScalar(0); - return m.cwiseAbs().maxCoeff(); - } -}; - -} // end namespace internal - -/** \returns the \b coefficient-wise \f$ \ell^p \f$ norm of \c *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values - * of the coefficients of \c *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$ - * norm, that is the maximum of the absolute values of the coefficients of \c *this. - * - * In all cases, if \c *this is empty, then the value 0 is returned. - * - * \note For matrices, this function does not compute the operator-norm. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink. - * - * \sa norm() - */ -template -template -#ifndef EIGEN_PARSED_BY_DOXYGEN -EIGEN_DEVICE_FUNC inline typename NumTraits::Scalar>::Real -#else -EIGEN_DEVICE_FUNC MatrixBase::RealScalar -#endif -MatrixBase::lpNorm() const -{ - return internal::lpNorm_selector::run(*this); -} - -//---------- implementation of isOrthogonal / isUnitary ---------- - -/** \returns true if *this is approximately orthogonal to \a other, - * within the precision given by \a prec. - * - * Example: \include MatrixBase_isOrthogonal.cpp - * Output: \verbinclude MatrixBase_isOrthogonal.out - */ -template -template -bool MatrixBase::isOrthogonal -(const MatrixBase& other, const RealScalar& prec) const -{ - typename internal::nested_eval::type nested(derived()); - typename internal::nested_eval::type otherNested(other.derived()); - return numext::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm(); -} - -/** \returns true if *this is approximately an unitary matrix, - * within the precision given by \a prec. In the case where the \a Scalar - * type is real numbers, a unitary matrix is an orthogonal matrix, whence the name. - * - * \note This can be used to check whether a family of vectors forms an orthonormal basis. - * Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an - * orthonormal basis. - * - * Example: \include MatrixBase_isUnitary.cpp - * Output: \verbinclude MatrixBase_isUnitary.out - */ -template -bool MatrixBase::isUnitary(const RealScalar& prec) const -{ - typename internal::nested_eval::type self(derived()); - for(Index i = 0; i < cols(); ++i) - { - if(!internal::isApprox(self.col(i).squaredNorm(), static_cast(1), prec)) - return false; - for(Index j = 0; j < i; ++j) - if(!internal::isMuchSmallerThan(self.col(i).dot(self.col(j)), static_cast(1), prec)) - return false; - } - return true; -} - -} // end namespace Eigen - -#endif // EIGEN_DOT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/EigenBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/EigenBase.h deleted file mode 100644 index ccc122cf..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/EigenBase.h +++ /dev/null @@ -1,158 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_EIGENBASE_H -#define EIGEN_EIGENBASE_H - -namespace Eigen { - -/** \class EigenBase - * - * Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T). - * - * In other words, an EigenBase object is an object that can be copied into a MatrixBase. - * - * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc. - * - * Notice that this class is trivial, it is only used to disambiguate overloaded functions. - * - * \sa \blank \ref TopicClassHierarchy - */ -template struct EigenBase -{ -// typedef typename internal::plain_matrix_type::type PlainObject; - - /** \brief The interface type of indices - * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE. - * \deprecated Since Eigen 3.3, its usage is deprecated. Use Eigen::Index instead. - * \sa StorageIndex, \ref TopicPreprocessorDirectives. - */ - typedef Eigen::Index Index; - - // FIXME is it needed? - typedef typename internal::traits::StorageKind StorageKind; - - /** \returns a reference to the derived object */ - EIGEN_DEVICE_FUNC - Derived& derived() { return *static_cast(this); } - /** \returns a const reference to the derived object */ - EIGEN_DEVICE_FUNC - const Derived& derived() const { return *static_cast(this); } - - EIGEN_DEVICE_FUNC - inline Derived& const_cast_derived() const - { return *static_cast(const_cast(this)); } - EIGEN_DEVICE_FUNC - inline const Derived& const_derived() const - { return *static_cast(this); } - - /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ - EIGEN_DEVICE_FUNC - inline Index rows() const { return derived().rows(); } - /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/ - EIGEN_DEVICE_FUNC - inline Index cols() const { return derived().cols(); } - /** \returns the number of coefficients, which is rows()*cols(). - * \sa rows(), cols(), SizeAtCompileTime. */ - EIGEN_DEVICE_FUNC - inline Index size() const { return rows() * cols(); } - - /** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */ - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& dst) const - { derived().evalTo(dst); } - - /** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */ - template - EIGEN_DEVICE_FUNC - inline void addTo(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - typename Dest::PlainObject res(rows(),cols()); - evalTo(res); - dst += res; - } - - /** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */ - template - EIGEN_DEVICE_FUNC - inline void subTo(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - typename Dest::PlainObject res(rows(),cols()); - evalTo(res); - dst -= res; - } - - /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */ - template - EIGEN_DEVICE_FUNC inline void applyThisOnTheRight(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - dst = dst * this->derived(); - } - - /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */ - template - EIGEN_DEVICE_FUNC inline void applyThisOnTheLeft(Dest& dst) const - { - // This is the default implementation, - // derived class can reimplement it in a more optimized way. - dst = this->derived() * dst; - } - -}; - -/*************************************************************************** -* Implementation of matrix base methods -***************************************************************************/ - -/** \brief Copies the generic expression \a other into *this. - * - * \details The expression must provide a (templated) evalTo(Derived& dst) const - * function which does the actual job. In practice, this allows any user to write - * its own special matrix without having to modify MatrixBase - * - * \returns a reference to *this. - */ -template -template -EIGEN_DEVICE_FUNC -Derived& DenseBase::operator=(const EigenBase &other) -{ - call_assignment(derived(), other.derived()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -Derived& DenseBase::operator+=(const EigenBase &other) -{ - call_assignment(derived(), other.derived(), internal::add_assign_op()); - return derived(); -} - -template -template -EIGEN_DEVICE_FUNC -Derived& DenseBase::operator-=(const EigenBase &other) -{ - call_assignment(derived(), other.derived(), internal::sub_assign_op()); - return derived(); -} - -} // end namespace Eigen - -#endif // EIGEN_EIGENBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ForceAlignedAccess.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ForceAlignedAccess.h deleted file mode 100644 index 7b08b45e..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ForceAlignedAccess.h +++ /dev/null @@ -1,146 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_FORCEALIGNEDACCESS_H -#define EIGEN_FORCEALIGNEDACCESS_H - -namespace Eigen { - -/** \class ForceAlignedAccess - * \ingroup Core_Module - * - * \brief Enforce aligned packet loads and stores regardless of what is requested - * - * \param ExpressionType the type of the object of which we are forcing aligned packet access - * - * This class is the return type of MatrixBase::forceAlignedAccess() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::forceAlignedAccess() - */ - -namespace internal { -template -struct traits > : public traits -{}; -} - -template class ForceAlignedAccess - : public internal::dense_xpr_base< ForceAlignedAccess >::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess) - - EIGEN_DEVICE_FUNC explicit inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const - { - return m_expression.coeff(row, col); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) - { - return m_expression.const_cast_derived().coeffRef(row, col); - } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const - { - return m_expression.coeff(index); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) - { - return m_expression.const_cast_derived().coeffRef(index); - } - - template - inline const PacketScalar packet(Index row, Index col) const - { - return m_expression.template packet(row, col); - } - - template - inline void writePacket(Index row, Index col, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(row, col, x); - } - - template - inline const PacketScalar packet(Index index) const - { - return m_expression.template packet(index); - } - - template - inline void writePacket(Index index, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(index, x); - } - - EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; } - - protected: - const ExpressionType& m_expression; - - private: - ForceAlignedAccess& operator=(const ForceAlignedAccess&); -}; - -/** \returns an expression of *this with forced aligned access - * \sa forceAlignedAccessIf(),class ForceAlignedAccess - */ -template -inline const ForceAlignedAccess -MatrixBase::forceAlignedAccess() const -{ - return ForceAlignedAccess(derived()); -} - -/** \returns an expression of *this with forced aligned access - * \sa forceAlignedAccessIf(), class ForceAlignedAccess - */ -template -inline ForceAlignedAccess -MatrixBase::forceAlignedAccess() -{ - return ForceAlignedAccess(derived()); -} - -/** \returns an expression of *this with forced aligned access if \a Enable is true. - * \sa forceAlignedAccess(), class ForceAlignedAccess - */ -template -template -inline typename internal::add_const_on_value_type,Derived&>::type>::type -MatrixBase::forceAlignedAccessIf() const -{ - return derived(); // FIXME This should not work but apparently is never used -} - -/** \returns an expression of *this with forced aligned access if \a Enable is true. - * \sa forceAlignedAccess(), class ForceAlignedAccess - */ -template -template -inline typename internal::conditional,Derived&>::type -MatrixBase::forceAlignedAccessIf() -{ - return derived(); // FIXME This should not work but apparently is never used -} - -} // end namespace Eigen - -#endif // EIGEN_FORCEALIGNEDACCESS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Fuzzy.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Fuzzy.h deleted file mode 100644 index 43aa49b2..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Fuzzy.h +++ /dev/null @@ -1,155 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_FUZZY_H -#define EIGEN_FUZZY_H - -namespace Eigen { - -namespace internal -{ - -template::IsInteger> -struct isApprox_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec) - { - typename internal::nested_eval::type nested(x); - typename internal::nested_eval::type otherNested(y); - return (nested - otherNested).cwiseAbs2().sum() <= prec * prec * numext::mini(nested.cwiseAbs2().sum(), otherNested.cwiseAbs2().sum()); - } -}; - -template -struct isApprox_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar&) - { - return x.matrix() == y.matrix(); - } -}; - -template::IsInteger> -struct isMuchSmallerThan_object_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec) - { - return x.cwiseAbs2().sum() <= numext::abs2(prec) * y.cwiseAbs2().sum(); - } -}; - -template -struct isMuchSmallerThan_object_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const OtherDerived&, const typename Derived::RealScalar&) - { - return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix(); - } -}; - -template::IsInteger> -struct isMuchSmallerThan_scalar_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const typename Derived::RealScalar& y, const typename Derived::RealScalar& prec) - { - return x.cwiseAbs2().sum() <= numext::abs2(prec * y); - } -}; - -template -struct isMuchSmallerThan_scalar_selector -{ - EIGEN_DEVICE_FUNC - static bool run(const Derived& x, const typename Derived::RealScalar&, const typename Derived::RealScalar&) - { - return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix(); - } -}; - -} // end namespace internal - - -/** \returns \c true if \c *this is approximately equal to \a other, within the precision - * determined by \a prec. - * - * \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$ - * are considered to be approximately equal within precision \f$ p \f$ if - * \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f] - * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm - * L2 norm). - * - * \note Because of the multiplicativeness of this comparison, one can't use this function - * to check whether \c *this is approximately equal to the zero matrix or vector. - * Indeed, \c isApprox(zero) returns false unless \c *this itself is exactly the zero matrix - * or vector. If you want to test whether \c *this is zero, use internal::isMuchSmallerThan(const - * RealScalar&, RealScalar) instead. - * - * \sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const - */ -template -template -EIGEN_DEVICE_FUNC bool DenseBase::isApprox( - const DenseBase& other, - const RealScalar& prec -) const -{ - return internal::isApprox_selector::run(derived(), other.derived(), prec); -} - -/** \returns \c true if the norm of \c *this is much smaller than \a other, - * within the precision determined by \a prec. - * - * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is - * considered to be much smaller than \f$ x \f$ within precision \f$ p \f$ if - * \f[ \Vert v \Vert \leqslant p\,\vert x\vert. \f] - * - * For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason, - * the value of the reference scalar \a other should come from the Hilbert-Schmidt norm - * of a reference matrix of same dimensions. - * - * \sa isApprox(), isMuchSmallerThan(const DenseBase&, RealScalar) const - */ -template -EIGEN_DEVICE_FUNC bool DenseBase::isMuchSmallerThan( - const typename NumTraits::Real& other, - const RealScalar& prec -) const -{ - return internal::isMuchSmallerThan_scalar_selector::run(derived(), other, prec); -} - -/** \returns \c true if the norm of \c *this is much smaller than the norm of \a other, - * within the precision determined by \a prec. - * - * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is - * considered to be much smaller than a vector \f$ w \f$ within precision \f$ p \f$ if - * \f[ \Vert v \Vert \leqslant p\,\Vert w\Vert. \f] - * For matrices, the comparison is done using the Hilbert-Schmidt norm. - * - * \sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const - */ -template -template -EIGEN_DEVICE_FUNC bool DenseBase::isMuchSmallerThan( - const DenseBase& other, - const RealScalar& prec -) const -{ - return internal::isMuchSmallerThan_object_selector::run(derived(), other.derived(), prec); -} - -} // end namespace Eigen - -#endif // EIGEN_FUZZY_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/GeneralProduct.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/GeneralProduct.h deleted file mode 100644 index b206b0a7..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/GeneralProduct.h +++ /dev/null @@ -1,454 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GENERAL_PRODUCT_H -#define EIGEN_GENERAL_PRODUCT_H - -namespace Eigen { - -enum { - Large = 2, - Small = 3 -}; - -namespace internal { - -template struct product_type_selector; - -template struct product_size_category -{ - enum { is_large = MaxSize == Dynamic || - Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD || - (Size==Dynamic && MaxSize>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD), - value = is_large ? Large - : Size == 1 ? 1 - : Small - }; -}; - -template struct product_type -{ - typedef typename remove_all::type _Lhs; - typedef typename remove_all::type _Rhs; - enum { - MaxRows = traits<_Lhs>::MaxRowsAtCompileTime, - Rows = traits<_Lhs>::RowsAtCompileTime, - MaxCols = traits<_Rhs>::MaxColsAtCompileTime, - Cols = traits<_Rhs>::ColsAtCompileTime, - MaxDepth = EIGEN_SIZE_MIN_PREFER_FIXED(traits<_Lhs>::MaxColsAtCompileTime, - traits<_Rhs>::MaxRowsAtCompileTime), - Depth = EIGEN_SIZE_MIN_PREFER_FIXED(traits<_Lhs>::ColsAtCompileTime, - traits<_Rhs>::RowsAtCompileTime) - }; - - // the splitting into different lines of code here, introducing the _select enums and the typedef below, - // is to work around an internal compiler error with gcc 4.1 and 4.2. -private: - enum { - rows_select = product_size_category::value, - cols_select = product_size_category::value, - depth_select = product_size_category::value - }; - typedef product_type_selector selector; - -public: - enum { - value = selector::ret, - ret = selector::ret - }; -#ifdef EIGEN_DEBUG_PRODUCT - static void debug() - { - EIGEN_DEBUG_VAR(Rows); - EIGEN_DEBUG_VAR(Cols); - EIGEN_DEBUG_VAR(Depth); - EIGEN_DEBUG_VAR(rows_select); - EIGEN_DEBUG_VAR(cols_select); - EIGEN_DEBUG_VAR(depth_select); - EIGEN_DEBUG_VAR(value); - } -#endif -}; - -/* The following allows to select the kind of product at compile time - * based on the three dimensions of the product. - * This is a compile time mapping from {1,Small,Large}^3 -> {product types} */ -// FIXME I'm not sure the current mapping is the ideal one. -template struct product_type_selector { enum { ret = OuterProduct }; }; -template struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template struct product_type_selector<1, N, 1> { enum { ret = LazyCoeffBasedProductMode }; }; -template struct product_type_selector<1, 1, Depth> { enum { ret = InnerProduct }; }; -template<> struct product_type_selector<1, 1, 1> { enum { ret = InnerProduct }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector<1, Small,Small> { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = LazyCoeffBasedProductMode }; }; -template<> struct product_type_selector<1, Large,Small> { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector<1, Large,Large> { enum { ret = GemvProduct }; }; -template<> struct product_type_selector<1, Small,Large> { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = GemvProduct }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = CoeffBasedProductMode }; }; -template<> struct product_type_selector { enum { ret = GemmProduct }; }; - -} // end namespace internal - -/*********************************************************************** -* Implementation of Inner Vector Vector Product -***********************************************************************/ - -// FIXME : maybe the "inner product" could return a Scalar -// instead of a 1x1 matrix ?? -// Pro: more natural for the user -// Cons: this could be a problem if in a meta unrolled algorithm a matrix-matrix -// product ends up to a row-vector times col-vector product... To tackle this use -// case, we could have a specialization for Block with: operator=(Scalar x); - -/*********************************************************************** -* Implementation of Outer Vector Vector Product -***********************************************************************/ - -/*********************************************************************** -* Implementation of General Matrix Vector Product -***********************************************************************/ - -/* According to the shape/flags of the matrix we have to distinghish 3 different cases: - * 1 - the matrix is col-major, BLAS compatible and M is large => call fast BLAS-like colmajor routine - * 2 - the matrix is row-major, BLAS compatible and N is large => call fast BLAS-like rowmajor routine - * 3 - all other cases are handled using a simple loop along the outer-storage direction. - * Therefore we need a lower level meta selector. - * Furthermore, if the matrix is the rhs, then the product has to be transposed. - */ -namespace internal { - -template -struct gemv_dense_selector; - -} // end namespace internal - -namespace internal { - -template struct gemv_static_vector_if; - -template -struct gemv_static_vector_if -{ - EIGEN_STRONG_INLINE Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; } -}; - -template -struct gemv_static_vector_if -{ - EIGEN_STRONG_INLINE Scalar* data() { return 0; } -}; - -template -struct gemv_static_vector_if -{ - enum { - ForceAlignment = internal::packet_traits::Vectorizable, - PacketSize = internal::packet_traits::size - }; - #if EIGEN_MAX_STATIC_ALIGN_BYTES!=0 - internal::plain_array m_data; - EIGEN_STRONG_INLINE Scalar* data() { return m_data.array; } - #else - // Some architectures cannot align on the stack, - // => let's manually enforce alignment by allocating more data and return the address of the first aligned element. - internal::plain_array m_data; - EIGEN_STRONG_INLINE Scalar* data() { - return ForceAlignment - ? reinterpret_cast((internal::UIntPtr(m_data.array) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES-1))) + EIGEN_MAX_ALIGN_BYTES) - : m_data.array; - } - #endif -}; - -// The vector is on the left => transposition -template -struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - Transpose destT(dest); - enum { OtherStorageOrder = StorageOrder == RowMajor ? ColMajor : RowMajor }; - gemv_dense_selector - ::run(rhs.transpose(), lhs.transpose(), destT, alpha); - } -}; - -template<> struct gemv_dense_selector -{ - template - static inline void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - typedef typename Lhs::Scalar LhsScalar; - typedef typename Rhs::Scalar RhsScalar; - typedef typename Dest::Scalar ResScalar; - typedef typename Dest::RealScalar RealScalar; - - typedef internal::blas_traits LhsBlasTraits; - typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType; - typedef internal::blas_traits RhsBlasTraits; - typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType; - - typedef Map, EIGEN_PLAIN_ENUM_MIN(AlignedMax,internal::packet_traits::size)> MappedDest; - - ActualLhsType actualLhs = LhsBlasTraits::extract(lhs); - ActualRhsType actualRhs = RhsBlasTraits::extract(rhs); - - ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs) - * RhsBlasTraits::extractScalarFactor(rhs); - - // make sure Dest is a compile-time vector type (bug 1166) - typedef typename conditional::type ActualDest; - - enum { - // FIXME find a way to allow an inner stride on the result if packet_traits::size==1 - // on, the other hand it is good for the cache to pack the vector anyways... - EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime==1), - ComplexByReal = (NumTraits::IsComplex) && (!NumTraits::IsComplex), - MightCannotUseDest = (!EvalToDestAtCompileTime) || ComplexByReal - }; - - typedef const_blas_data_mapper LhsMapper; - typedef const_blas_data_mapper RhsMapper; - RhsScalar compatibleAlpha = get_factor::run(actualAlpha); - - if(!MightCannotUseDest) - { - // shortcut if we are sure to be able to use dest directly, - // this ease the compiler to generate cleaner and more optimzized code for most common cases - general_matrix_vector_product - ::run( - actualLhs.rows(), actualLhs.cols(), - LhsMapper(actualLhs.data(), actualLhs.outerStride()), - RhsMapper(actualRhs.data(), actualRhs.innerStride()), - dest.data(), 1, - compatibleAlpha); - } - else - { - gemv_static_vector_if static_dest; - - const bool alphaIsCompatible = (!ComplexByReal) || (numext::imag(actualAlpha)==RealScalar(0)); - const bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible; - - ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(), - evalToDest ? dest.data() : static_dest.data()); - - if(!evalToDest) - { - #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN - Index size = dest.size(); - EIGEN_DENSE_STORAGE_CTOR_PLUGIN - #endif - if(!alphaIsCompatible) - { - MappedDest(actualDestPtr, dest.size()).setZero(); - compatibleAlpha = RhsScalar(1); - } - else - MappedDest(actualDestPtr, dest.size()) = dest; - } - - general_matrix_vector_product - ::run( - actualLhs.rows(), actualLhs.cols(), - LhsMapper(actualLhs.data(), actualLhs.outerStride()), - RhsMapper(actualRhs.data(), actualRhs.innerStride()), - actualDestPtr, 1, - compatibleAlpha); - - if (!evalToDest) - { - if(!alphaIsCompatible) - dest.matrix() += actualAlpha * MappedDest(actualDestPtr, dest.size()); - else - dest = MappedDest(actualDestPtr, dest.size()); - } - } - } -}; - -template<> struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - typedef typename Lhs::Scalar LhsScalar; - typedef typename Rhs::Scalar RhsScalar; - typedef typename Dest::Scalar ResScalar; - - typedef internal::blas_traits LhsBlasTraits; - typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType; - typedef internal::blas_traits RhsBlasTraits; - typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType; - typedef typename internal::remove_all::type ActualRhsTypeCleaned; - - typename add_const::type actualLhs = LhsBlasTraits::extract(lhs); - typename add_const::type actualRhs = RhsBlasTraits::extract(rhs); - - ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs) - * RhsBlasTraits::extractScalarFactor(rhs); - - enum { - // FIXME find a way to allow an inner stride on the result if packet_traits::size==1 - // on, the other hand it is good for the cache to pack the vector anyways... - DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1 - }; - - gemv_static_vector_if static_rhs; - - ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(), - DirectlyUseRhs ? const_cast(actualRhs.data()) : static_rhs.data()); - - if(!DirectlyUseRhs) - { - #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN - Index size = actualRhs.size(); - EIGEN_DENSE_STORAGE_CTOR_PLUGIN - #endif - Map(actualRhsPtr, actualRhs.size()) = actualRhs; - } - - typedef const_blas_data_mapper LhsMapper; - typedef const_blas_data_mapper RhsMapper; - general_matrix_vector_product - ::run( - actualLhs.rows(), actualLhs.cols(), - LhsMapper(actualLhs.data(), actualLhs.outerStride()), - RhsMapper(actualRhsPtr, 1), - dest.data(), dest.col(0).innerStride(), //NOTE if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166) - actualAlpha); - } -}; - -template<> struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - EIGEN_STATIC_ASSERT((!nested_eval::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE); - // TODO if rhs is large enough it might be beneficial to make sure that dest is sequentially stored in memory, otherwise use a temp - typename nested_eval::type actual_rhs(rhs); - const Index size = rhs.rows(); - for(Index k=0; k struct gemv_dense_selector -{ - template - static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha) - { - EIGEN_STATIC_ASSERT((!nested_eval::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE); - typename nested_eval::type actual_rhs(rhs); - const Index rows = dest.rows(); - for(Index i=0; i -template -inline const Product -MatrixBase::operator*(const MatrixBase &other) const -{ - // A note regarding the function declaration: In MSVC, this function will sometimes - // not be inlined since DenseStorage is an unwindable object for dynamic - // matrices and product types are holding a member to store the result. - // Thus it does not help tagging this function with EIGEN_STRONG_INLINE. - enum { - ProductIsValid = Derived::ColsAtCompileTime==Dynamic - || OtherDerived::RowsAtCompileTime==Dynamic - || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime), - AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime, - SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived) - }; - // note to the lost user: - // * for a dot product use: v1.dot(v2) - // * for a coeff-wise product use: v1.cwiseProduct(v2) - EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes), - INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS) - EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors), - INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION) - EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT) -#ifdef EIGEN_DEBUG_PRODUCT - internal::product_type::debug(); -#endif - - return Product(derived(), other.derived()); -} - -#endif // __CUDACC__ - -/** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation. - * - * The returned product will behave like any other expressions: the coefficients of the product will be - * computed once at a time as requested. This might be useful in some extremely rare cases when only - * a small and no coherent fraction of the result's coefficients have to be computed. - * - * \warning This version of the matrix product can be much much slower. So use it only if you know - * what you are doing and that you measured a true speed improvement. - * - * \sa operator*(const MatrixBase&) - */ -template -template -const Product -EIGEN_DEVICE_FUNC MatrixBase::lazyProduct(const MatrixBase &other) const -{ - enum { - ProductIsValid = Derived::ColsAtCompileTime==Dynamic - || OtherDerived::RowsAtCompileTime==Dynamic - || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime), - AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime, - SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived) - }; - // note to the lost user: - // * for a dot product use: v1.dot(v2) - // * for a coeff-wise product use: v1.cwiseProduct(v2) - EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes), - INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS) - EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors), - INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION) - EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT) - - return Product(derived(), other.derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_PRODUCT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/GenericPacketMath.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/GenericPacketMath.h deleted file mode 100644 index d19d5bbd..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/GenericPacketMath.h +++ /dev/null @@ -1,598 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GENERIC_PACKET_MATH_H -#define EIGEN_GENERIC_PACKET_MATH_H - -namespace Eigen { - -namespace internal { - -/** \internal - * \file GenericPacketMath.h - * - * Default implementation for types not supported by the vectorization. - * In practice these functions are provided to make easier the writing - * of generic vectorized code. - */ - -#ifndef EIGEN_DEBUG_ALIGNED_LOAD -#define EIGEN_DEBUG_ALIGNED_LOAD -#endif - -#ifndef EIGEN_DEBUG_UNALIGNED_LOAD -#define EIGEN_DEBUG_UNALIGNED_LOAD -#endif - -#ifndef EIGEN_DEBUG_ALIGNED_STORE -#define EIGEN_DEBUG_ALIGNED_STORE -#endif - -#ifndef EIGEN_DEBUG_UNALIGNED_STORE -#define EIGEN_DEBUG_UNALIGNED_STORE -#endif - -struct default_packet_traits -{ - enum { - HasHalfPacket = 0, - - HasAdd = 1, - HasSub = 1, - HasMul = 1, - HasNegate = 1, - HasAbs = 1, - HasArg = 0, - HasAbs2 = 1, - HasMin = 1, - HasMax = 1, - HasConj = 1, - HasSetLinear = 1, - HasBlend = 0, - - HasDiv = 0, - HasSqrt = 0, - HasRsqrt = 0, - HasExp = 0, - HasExpm1 = 0, - HasLog = 0, - HasLog1p = 0, - HasLog10 = 0, - HasPow = 0, - - HasSin = 0, - HasCos = 0, - HasTan = 0, - HasASin = 0, - HasACos = 0, - HasATan = 0, - HasSinh = 0, - HasCosh = 0, - HasTanh = 0, - HasLGamma = 0, - HasDiGamma = 0, - HasZeta = 0, - HasPolygamma = 0, - HasErf = 0, - HasErfc = 0, - HasIGamma = 0, - HasIGammac = 0, - HasBetaInc = 0, - - HasRound = 0, - HasFloor = 0, - HasCeil = 0, - - HasSign = 0 - }; -}; - -template struct packet_traits : default_packet_traits -{ - typedef T type; - typedef T half; - enum { - Vectorizable = 0, - size = 1, - AlignedOnScalar = 0, - HasHalfPacket = 0 - }; - enum { - HasAdd = 0, - HasSub = 0, - HasMul = 0, - HasNegate = 0, - HasAbs = 0, - HasAbs2 = 0, - HasMin = 0, - HasMax = 0, - HasConj = 0, - HasSetLinear = 0 - }; -}; - -template struct packet_traits : packet_traits { }; - -template struct type_casting_traits { - enum { - VectorizedCast = 0, - SrcCoeffRatio = 1, - TgtCoeffRatio = 1 - }; -}; - - -/** \internal \returns static_cast(a) (coeff-wise) */ -template -EIGEN_DEVICE_FUNC inline TgtPacket -pcast(const SrcPacket& a) { - return static_cast(a); -} -template -EIGEN_DEVICE_FUNC inline TgtPacket -pcast(const SrcPacket& a, const SrcPacket& /*b*/) { - return static_cast(a); -} - -template -EIGEN_DEVICE_FUNC inline TgtPacket -pcast(const SrcPacket& a, const SrcPacket& /*b*/, const SrcPacket& /*c*/, const SrcPacket& /*d*/) { - return static_cast(a); -} - -/** \internal \returns a + b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -padd(const Packet& a, - const Packet& b) { return a+b; } - -/** \internal \returns a - b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -psub(const Packet& a, - const Packet& b) { return a-b; } - -/** \internal \returns -a (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pnegate(const Packet& a) { return -a; } - -/** \internal \returns conj(a) (coeff-wise) */ - -template EIGEN_DEVICE_FUNC inline Packet -pconj(const Packet& a) { return numext::conj(a); } - -/** \internal \returns a * b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmul(const Packet& a, - const Packet& b) { return a*b; } - -/** \internal \returns a / b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pdiv(const Packet& a, - const Packet& b) { return a/b; } - -/** \internal \returns the min of \a a and \a b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmin(const Packet& a, - const Packet& b) { return numext::mini(a, b); } - -/** \internal \returns the max of \a a and \a b (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmax(const Packet& a, - const Packet& b) { return numext::maxi(a, b); } - -/** \internal \returns the absolute value of \a a */ -template EIGEN_DEVICE_FUNC inline Packet -pabs(const Packet& a) { using std::abs; return abs(a); } - -/** \internal \returns the phase angle of \a a */ -template EIGEN_DEVICE_FUNC inline Packet -parg(const Packet& a) { using numext::arg; return arg(a); } - -/** \internal \returns the bitwise and of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -pand(const Packet& a, const Packet& b) { return a & b; } - -/** \internal \returns the bitwise or of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -por(const Packet& a, const Packet& b) { return a | b; } - -/** \internal \returns the bitwise xor of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -pxor(const Packet& a, const Packet& b) { return a ^ b; } - -/** \internal \returns the bitwise andnot of \a a and \a b */ -template EIGEN_DEVICE_FUNC inline Packet -pandnot(const Packet& a, const Packet& b) { return a & (!b); } - -/** \internal \returns a packet version of \a *from, from must be 16 bytes aligned */ -template EIGEN_DEVICE_FUNC inline Packet -pload(const typename unpacket_traits::type* from) { return *from; } - -/** \internal \returns a packet version of \a *from, (un-aligned load) */ -template EIGEN_DEVICE_FUNC inline Packet -ploadu(const typename unpacket_traits::type* from) { return *from; } - -/** \internal \returns a packet with constant coefficients \a a, e.g.: (a,a,a,a) */ -template EIGEN_DEVICE_FUNC inline Packet -pset1(const typename unpacket_traits::type& a) { return a; } - -/** \internal \returns a packet with constant coefficients \a a[0], e.g.: (a[0],a[0],a[0],a[0]) */ -template EIGEN_DEVICE_FUNC inline Packet -pload1(const typename unpacket_traits::type *a) { return pset1(*a); } - -/** \internal \returns a packet with elements of \a *from duplicated. - * For instance, for a packet of 8 elements, 4 scalars will be read from \a *from and - * duplicated to form: {from[0],from[0],from[1],from[1],from[2],from[2],from[3],from[3]} - * Currently, this function is only used for scalar * complex products. - */ -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet -ploaddup(const typename unpacket_traits::type* from) { return *from; } - -/** \internal \returns a packet with elements of \a *from quadrupled. - * For instance, for a packet of 8 elements, 2 scalars will be read from \a *from and - * replicated to form: {from[0],from[0],from[0],from[0],from[1],from[1],from[1],from[1]} - * Currently, this function is only used in matrix products. - * For packet-size smaller or equal to 4, this function is equivalent to pload1 - */ -template EIGEN_DEVICE_FUNC inline Packet -ploadquad(const typename unpacket_traits::type* from) -{ return pload1(from); } - -/** \internal equivalent to - * \code - * a0 = pload1(a+0); - * a1 = pload1(a+1); - * a2 = pload1(a+2); - * a3 = pload1(a+3); - * \endcode - * \sa pset1, pload1, ploaddup, pbroadcast2 - */ -template EIGEN_DEVICE_FUNC -inline void pbroadcast4(const typename unpacket_traits::type *a, - Packet& a0, Packet& a1, Packet& a2, Packet& a3) -{ - a0 = pload1(a+0); - a1 = pload1(a+1); - a2 = pload1(a+2); - a3 = pload1(a+3); -} - -/** \internal equivalent to - * \code - * a0 = pload1(a+0); - * a1 = pload1(a+1); - * \endcode - * \sa pset1, pload1, ploaddup, pbroadcast4 - */ -template EIGEN_DEVICE_FUNC -inline void pbroadcast2(const typename unpacket_traits::type *a, - Packet& a0, Packet& a1) -{ - a0 = pload1(a+0); - a1 = pload1(a+1); -} - -/** \internal \brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */ -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet -plset(const typename unpacket_traits::type& a) { return a; } - -/** \internal copy the packet \a from to \a *to, \a to must be 16 bytes aligned */ -template EIGEN_DEVICE_FUNC inline void pstore(Scalar* to, const Packet& from) -{ (*to) = from; } - -/** \internal copy the packet \a from to \a *to, (un-aligned store) */ -template EIGEN_DEVICE_FUNC inline void pstoreu(Scalar* to, const Packet& from) -{ (*to) = from; } - - template EIGEN_DEVICE_FUNC inline Packet pgather(const Scalar* from, Index /*stride*/) - { return ploadu(from); } - - template EIGEN_DEVICE_FUNC inline void pscatter(Scalar* to, const Packet& from, Index /*stride*/) - { pstore(to, from); } - -/** \internal tries to do cache prefetching of \a addr */ -template EIGEN_DEVICE_FUNC inline void prefetch(const Scalar* addr) -{ -#ifdef __CUDA_ARCH__ -#if defined(__LP64__) - // 64-bit pointer operand constraint for inlined asm - asm(" prefetch.L1 [ %1 ];" : "=l"(addr) : "l"(addr)); -#else - // 32-bit pointer operand constraint for inlined asm - asm(" prefetch.L1 [ %1 ];" : "=r"(addr) : "r"(addr)); -#endif -#elif (!EIGEN_COMP_MSVC) && (EIGEN_COMP_GNUC || EIGEN_COMP_CLANG || EIGEN_COMP_ICC) - __builtin_prefetch(addr); -#endif -} - -/** \internal \returns the first element of a packet */ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type pfirst(const Packet& a) -{ return a; } - -/** \internal \returns a packet where the element i contains the sum of the packet of \a vec[i] */ -template EIGEN_DEVICE_FUNC inline Packet -preduxp(const Packet* vecs) { return vecs[0]; } - -/** \internal \returns the sum of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux(const Packet& a) -{ return a; } - -/** \internal \returns the sum of the elements of \a a by block of 4 elements. - * For a packet {a0, a1, a2, a3, a4, a5, a6, a7}, it returns a half packet {a0+a4, a1+a5, a2+a6, a3+a7} - * For packet-size smaller or equal to 4, this boils down to a noop. - */ -template EIGEN_DEVICE_FUNC inline -typename conditional<(unpacket_traits::size%8)==0,typename unpacket_traits::half,Packet>::type -predux_downto4(const Packet& a) -{ return a; } - -/** \internal \returns the product of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux_mul(const Packet& a) -{ return a; } - -/** \internal \returns the min of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux_min(const Packet& a) -{ return a; } - -/** \internal \returns the max of the elements of \a a*/ -template EIGEN_DEVICE_FUNC inline typename unpacket_traits::type predux_max(const Packet& a) -{ return a; } - -/** \internal \returns the reversed elements of \a a*/ -template EIGEN_DEVICE_FUNC inline Packet preverse(const Packet& a) -{ return a; } - -/** \internal \returns \a a with real and imaginary part flipped (for complex type only) */ -template EIGEN_DEVICE_FUNC inline Packet pcplxflip(const Packet& a) -{ - // FIXME: uncomment the following in case we drop the internal imag and real functions. -// using std::imag; -// using std::real; - return Packet(imag(a),real(a)); -} - -/************************** -* Special math functions -***************************/ - -/** \internal \returns the sine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet psin(const Packet& a) { using std::sin; return sin(a); } - -/** \internal \returns the cosine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pcos(const Packet& a) { using std::cos; return cos(a); } - -/** \internal \returns the tan of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet ptan(const Packet& a) { using std::tan; return tan(a); } - -/** \internal \returns the arc sine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pasin(const Packet& a) { using std::asin; return asin(a); } - -/** \internal \returns the arc cosine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pacos(const Packet& a) { using std::acos; return acos(a); } - -/** \internal \returns the arc tangent of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet patan(const Packet& a) { using std::atan; return atan(a); } - -/** \internal \returns the hyperbolic sine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet psinh(const Packet& a) { using std::sinh; return sinh(a); } - -/** \internal \returns the hyperbolic cosine of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pcosh(const Packet& a) { using std::cosh; return cosh(a); } - -/** \internal \returns the hyperbolic tan of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet ptanh(const Packet& a) { using std::tanh; return tanh(a); } - -/** \internal \returns the exp of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pexp(const Packet& a) { using std::exp; return exp(a); } - -/** \internal \returns the expm1 of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pexpm1(const Packet& a) { return numext::expm1(a); } - -/** \internal \returns the log of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet plog(const Packet& a) { using std::log; return log(a); } - -/** \internal \returns the log1p of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet plog1p(const Packet& a) { return numext::log1p(a); } - -/** \internal \returns the log10 of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet plog10(const Packet& a) { using std::log10; return log10(a); } - -/** \internal \returns the square-root of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet psqrt(const Packet& a) { using std::sqrt; return sqrt(a); } - -/** \internal \returns the reciprocal square-root of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet prsqrt(const Packet& a) { - return pdiv(pset1(1), psqrt(a)); -} - -/** \internal \returns the rounded value of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pround(const Packet& a) { using numext::round; return round(a); } - -/** \internal \returns the floor of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pfloor(const Packet& a) { using numext::floor; return floor(a); } - -/** \internal \returns the ceil of \a a (coeff-wise) */ -template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pceil(const Packet& a) { using numext::ceil; return ceil(a); } - -/*************************************************************************** -* The following functions might not have to be overwritten for vectorized types -***************************************************************************/ - -/** \internal copy a packet with constant coeficient \a a (e.g., [a,a,a,a]) to \a *to. \a to must be 16 bytes aligned */ -// NOTE: this function must really be templated on the packet type (think about different packet types for the same scalar type) -template -inline void pstore1(typename unpacket_traits::type* to, const typename unpacket_traits::type& a) -{ - pstore(to, pset1(a)); -} - -/** \internal \returns a * b + c (coeff-wise) */ -template EIGEN_DEVICE_FUNC inline Packet -pmadd(const Packet& a, - const Packet& b, - const Packet& c) -{ return padd(pmul(a, b),c); } - -/** \internal \returns a packet version of \a *from. - * The pointer \a from must be aligned on a \a Alignment bytes boundary. */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(const typename unpacket_traits::type* from) -{ - if(Alignment >= unpacket_traits::alignment) - return pload(from); - else - return ploadu(from); -} - -/** \internal copy the packet \a from to \a *to. - * The pointer \a from must be aligned on a \a Alignment bytes boundary. */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret(Scalar* to, const Packet& from) -{ - if(Alignment >= unpacket_traits::alignment) - pstore(to, from); - else - pstoreu(to, from); -} - -/** \internal \returns a packet version of \a *from. - * Unlike ploadt, ploadt_ro takes advantage of the read-only memory path on the - * hardware if available to speedup the loading of data that won't be modified - * by the current computation. - */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(const typename unpacket_traits::type* from) -{ - return ploadt(from); -} - -/** \internal default implementation of palign() allowing partial specialization */ -template -struct palign_impl -{ - // by default data are aligned, so there is nothing to be done :) - static inline void run(PacketType&, const PacketType&) {} -}; - -/** \internal update \a first using the concatenation of the packet_size minus \a Offset last elements - * of \a first and \a Offset first elements of \a second. - * - * This function is currently only used to optimize matrix-vector products on unligned matrices. - * It takes 2 packets that represent a contiguous memory array, and returns a packet starting - * at the position \a Offset. For instance, for packets of 4 elements, we have: - * Input: - * - first = {f0,f1,f2,f3} - * - second = {s0,s1,s2,s3} - * Output: - * - if Offset==0 then {f0,f1,f2,f3} - * - if Offset==1 then {f1,f2,f3,s0} - * - if Offset==2 then {f2,f3,s0,s1} - * - if Offset==3 then {f3,s0,s1,s3} - */ -template -inline void palign(PacketType& first, const PacketType& second) -{ - palign_impl::run(first,second); -} - -/*************************************************************************** -* Fast complex products (GCC generates a function call which is very slow) -***************************************************************************/ - -// Eigen+CUDA does not support complexes. -#ifndef __CUDACC__ - -template<> inline std::complex pmul(const std::complex& a, const std::complex& b) -{ return std::complex(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); } - -template<> inline std::complex pmul(const std::complex& a, const std::complex& b) -{ return std::complex(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); } - -#endif - - -/*************************************************************************** - * PacketBlock, that is a collection of N packets where the number of words - * in the packet is a multiple of N. -***************************************************************************/ -template ::size> struct PacketBlock { - Packet packet[N]; -}; - -template EIGEN_DEVICE_FUNC inline void -ptranspose(PacketBlock& /*kernel*/) { - // Nothing to do in the scalar case, i.e. a 1x1 matrix. -} - -/*************************************************************************** - * Selector, i.e. vector of N boolean values used to select (i.e. blend) - * words from 2 packets. -***************************************************************************/ -template struct Selector { - bool select[N]; -}; - -template EIGEN_DEVICE_FUNC inline Packet -pblend(const Selector::size>& ifPacket, const Packet& thenPacket, const Packet& elsePacket) { - return ifPacket.select[0] ? thenPacket : elsePacket; -} - -/** \internal \returns \a a with the first coefficient replaced by the scalar b */ -template EIGEN_DEVICE_FUNC inline Packet -pinsertfirst(const Packet& a, typename unpacket_traits::type b) -{ - // Default implementation based on pblend. - // It must be specialized for higher performance. - Selector::size> mask; - mask.select[0] = true; - // This for loop should be optimized away by the compiler. - for(Index i=1; i::size; ++i) - mask.select[i] = false; - return pblend(mask, pset1(b), a); -} - -/** \internal \returns \a a with the last coefficient replaced by the scalar b */ -template EIGEN_DEVICE_FUNC inline Packet -pinsertlast(const Packet& a, typename unpacket_traits::type b) -{ - // Default implementation based on pblend. - // It must be specialized for higher performance. - Selector::size> mask; - // This for loop should be optimized away by the compiler. - for(Index i=0; i::size-1; ++i) - mask.select[i] = false; - mask.select[unpacket_traits::size-1] = true; - return pblend(mask, pset1(b), a); -} - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_GENERIC_PACKET_MATH_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/GlobalFunctions.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/GlobalFunctions.h deleted file mode 100644 index 12828a7c..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/GlobalFunctions.h +++ /dev/null @@ -1,188 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2016 Gael Guennebaud -// Copyright (C) 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_GLOBAL_FUNCTIONS_H -#define EIGEN_GLOBAL_FUNCTIONS_H - -#ifdef EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR,DOC_OP,DOC_DETAILS) \ - /** \returns an expression of the coefficient-wise DOC_OP of \a x - - DOC_DETAILS - - \sa Math functions, class CwiseUnaryOp - */ \ - template \ - inline const Eigen::CwiseUnaryOp, const Derived> \ - NAME(const Eigen::ArrayBase& x); - -#else - -#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR,DOC_OP,DOC_DETAILS) \ - template \ - inline const Eigen::CwiseUnaryOp, const Derived> \ - (NAME)(const Eigen::ArrayBase& x) { \ - return Eigen::CwiseUnaryOp, const Derived>(x.derived()); \ - } - -#endif // EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME,FUNCTOR) \ - \ - template \ - struct NAME##_retval > \ - { \ - typedef const Eigen::CwiseUnaryOp, const Derived> type; \ - }; \ - template \ - struct NAME##_impl > \ - { \ - static inline typename NAME##_retval >::type run(const Eigen::ArrayBase& x) \ - { \ - return typename NAME##_retval >::type(x.derived()); \ - } \ - }; - -namespace Eigen -{ - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real,scalar_real_op,real part,\sa ArrayBase::real) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag,scalar_imag_op,imaginary part,\sa ArrayBase::imag) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(conj,scalar_conjugate_op,complex conjugate,\sa ArrayBase::conjugate) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(inverse,scalar_inverse_op,inverse,\sa ArrayBase::inverse) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin,scalar_sin_op,sine,\sa ArrayBase::sin) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos,scalar_cos_op,cosine,\sa ArrayBase::cos) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan,scalar_tan_op,tangent,\sa ArrayBase::tan) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(atan,scalar_atan_op,arc-tangent,\sa ArrayBase::atan) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin,scalar_asin_op,arc-sine,\sa ArrayBase::asin) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos,scalar_acos_op,arc-consine,\sa ArrayBase::acos) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sinh,scalar_sinh_op,hyperbolic sine,\sa ArrayBase::sinh) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cosh,scalar_cosh_op,hyperbolic cosine,\sa ArrayBase::cosh) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tanh,scalar_tanh_op,hyperbolic tangent,\sa ArrayBase::tanh) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(lgamma,scalar_lgamma_op,natural logarithm of the gamma function,\sa ArrayBase::lgamma) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(digamma,scalar_digamma_op,derivative of lgamma,\sa ArrayBase::digamma) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erf,scalar_erf_op,error function,\sa ArrayBase::erf) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erfc,scalar_erfc_op,complement error function,\sa ArrayBase::erfc) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op,exponential,\sa ArrayBase::exp) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(expm1,scalar_expm1_op,exponential of a value minus 1,\sa ArrayBase::expm1) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op,natural logarithm,\sa Eigen::log10 DOXCOMMA ArrayBase::log) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log1p,scalar_log1p_op,natural logarithm of 1 plus the value,\sa ArrayBase::log1p) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log10,scalar_log10_op,base 10 logarithm,\sa Eigen::log DOXCOMMA ArrayBase::log) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op,absolute value,\sa ArrayBase::abs DOXCOMMA MatrixBase::cwiseAbs) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs2,scalar_abs2_op,squared absolute value,\sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(arg,scalar_arg_op,complex argument,\sa ArrayBase::arg) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op,square root,\sa ArrayBase::sqrt DOXCOMMA MatrixBase::cwiseSqrt) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rsqrt,scalar_rsqrt_op,reciprocal square root,\sa ArrayBase::rsqrt) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(square,scalar_square_op,square (power 2),\sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cube,scalar_cube_op,cube (power 3),\sa Eigen::pow DOXCOMMA ArrayBase::cube) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(round,scalar_round_op,nearest integer,\sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(floor,scalar_floor_op,nearest integer not greater than the giben value,\sa Eigen::ceil DOXCOMMA ArrayBase::floor) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ceil,scalar_ceil_op,nearest integer not less than the giben value,\sa Eigen::floor DOXCOMMA ArrayBase::ceil) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isnan,scalar_isnan_op,not-a-number test,\sa Eigen::isinf DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isnan) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isinf,scalar_isinf_op,infinite value test,\sa Eigen::isnan DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isinf) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isfinite,scalar_isfinite_op,finite value test,\sa Eigen::isinf DOXCOMMA Eigen::isnan DOXCOMMA ArrayBase::isfinite) - EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sign,scalar_sign_op,sign (or 0),\sa ArrayBase::sign) - - /** \returns an expression of the coefficient-wise power of \a x to the given constant \a exponent. - * - * \tparam ScalarExponent is the scalar type of \a exponent. It must be compatible with the scalar type of the given expression (\c Derived::Scalar). - * - * \sa ArrayBase::pow() - * - * \relates ArrayBase - */ -#ifdef EIGEN_PARSED_BY_DOXYGEN - template - inline const CwiseBinaryOp,Derived,Constant > - pow(const Eigen::ArrayBase& x, const ScalarExponent& exponent); -#else - template - inline typename internal::enable_if< !(internal::is_same::value) && EIGEN_SCALAR_BINARY_SUPPORTED(pow,typename Derived::Scalar,ScalarExponent), - const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,ScalarExponent,pow) >::type - pow(const Eigen::ArrayBase& x, const ScalarExponent& exponent) { - return x.derived().pow(exponent); - } - - template - inline const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,typename Derived::Scalar,pow) - pow(const Eigen::ArrayBase& x, const typename Derived::Scalar& exponent) { - return x.derived().pow(exponent); - } -#endif - - /** \returns an expression of the coefficient-wise power of \a x to the given array of \a exponents. - * - * This function computes the coefficient-wise power. - * - * Example: \include Cwise_array_power_array.cpp - * Output: \verbinclude Cwise_array_power_array.out - * - * \sa ArrayBase::pow() - * - * \relates ArrayBase - */ - template - inline const Eigen::CwiseBinaryOp, const Derived, const ExponentDerived> - pow(const Eigen::ArrayBase& x, const Eigen::ArrayBase& exponents) - { - return Eigen::CwiseBinaryOp, const Derived, const ExponentDerived>( - x.derived(), - exponents.derived() - ); - } - - /** \returns an expression of the coefficient-wise power of the scalar \a x to the given array of \a exponents. - * - * This function computes the coefficient-wise power between a scalar and an array of exponents. - * - * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression (\c Derived::Scalar). - * - * Example: \include Cwise_scalar_power_array.cpp - * Output: \verbinclude Cwise_scalar_power_array.out - * - * \sa ArrayBase::pow() - * - * \relates ArrayBase - */ -#ifdef EIGEN_PARSED_BY_DOXYGEN - template - inline const CwiseBinaryOp,Constant,Derived> - pow(const Scalar& x,const Eigen::ArrayBase& x); -#else - template - inline typename internal::enable_if< !(internal::is_same::value) && EIGEN_SCALAR_BINARY_SUPPORTED(pow,Scalar,typename Derived::Scalar), - const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar,Derived,pow) >::type - pow(const Scalar& x, const Eigen::ArrayBase& exponents) - { - return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar,Derived,pow)( - typename internal::plain_constant_type::type(exponents.rows(), exponents.cols(), x), exponents.derived() ); - } - - template - inline const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(typename Derived::Scalar,Derived,pow) - pow(const typename Derived::Scalar& x, const Eigen::ArrayBase& exponents) - { - return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(typename Derived::Scalar,Derived,pow)( - typename internal::plain_constant_type::type(exponents.rows(), exponents.cols(), x), exponents.derived() ); - } -#endif - - - namespace internal - { - EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real,scalar_real_op) - EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op) - EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2,scalar_abs2_op) - } -} - -// TODO: cleanly disable those functions that are not supported on Array (numext::real_ref, internal::random, internal::isApprox...) - -#endif // EIGEN_GLOBAL_FUNCTIONS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/IO.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/IO.h deleted file mode 100644 index da7fd6cc..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/IO.h +++ /dev/null @@ -1,225 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_IO_H -#define EIGEN_IO_H - -namespace Eigen { - -enum { DontAlignCols = 1 }; -enum { StreamPrecision = -1, - FullPrecision = -2 }; - -namespace internal { -template -std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt); -} - -/** \class IOFormat - * \ingroup Core_Module - * - * \brief Stores a set of parameters controlling the way matrices are printed - * - * List of available parameters: - * - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c FullPrecision. - * The default is the special value \c StreamPrecision which means to use the - * stream's own precision setting, as set for instance using \c cout.precision(3). The other special value - * \c FullPrecision means that the number of digits will be computed to match the full precision of each floating-point - * type. - * - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c DontAlignCols which - * allows to disable the alignment of columns, resulting in faster code. - * - \b coeffSeparator string printed between two coefficients of the same row - * - \b rowSeparator string printed between two rows - * - \b rowPrefix string printed at the beginning of each row - * - \b rowSuffix string printed at the end of each row - * - \b matPrefix string printed at the beginning of the matrix - * - \b matSuffix string printed at the end of the matrix - * - * Example: \include IOFormat.cpp - * Output: \verbinclude IOFormat.out - * - * \sa DenseBase::format(), class WithFormat - */ -struct IOFormat -{ - /** Default constructor, see class IOFormat for the meaning of the parameters */ - IOFormat(int _precision = StreamPrecision, int _flags = 0, - const std::string& _coeffSeparator = " ", - const std::string& _rowSeparator = "\n", const std::string& _rowPrefix="", const std::string& _rowSuffix="", - const std::string& _matPrefix="", const std::string& _matSuffix="") - : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator), - rowSpacer(""), coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags) - { - // TODO check if rowPrefix, rowSuffix or rowSeparator contains a newline - // don't add rowSpacer if columns are not to be aligned - if((flags & DontAlignCols)) - return; - int i = int(matSuffix.length())-1; - while (i>=0 && matSuffix[i]!='\n') - { - rowSpacer += ' '; - i--; - } - } - std::string matPrefix, matSuffix; - std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer; - std::string coeffSeparator; - int precision; - int flags; -}; - -/** \class WithFormat - * \ingroup Core_Module - * - * \brief Pseudo expression providing matrix output with given format - * - * \tparam ExpressionType the type of the object on which IO stream operations are performed - * - * This class represents an expression with stream operators controlled by a given IOFormat. - * It is the return type of DenseBase::format() - * and most of the time this is the only way it is used. - * - * See class IOFormat for some examples. - * - * \sa DenseBase::format(), class IOFormat - */ -template -class WithFormat -{ - public: - - WithFormat(const ExpressionType& matrix, const IOFormat& format) - : m_matrix(matrix), m_format(format) - {} - - friend std::ostream & operator << (std::ostream & s, const WithFormat& wf) - { - return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format); - } - - protected: - typename ExpressionType::Nested m_matrix; - IOFormat m_format; -}; - -namespace internal { - -// NOTE: This helper is kept for backward compatibility with previous code specializing -// this internal::significant_decimals_impl structure. In the future we should directly -// call digits10() which has been introduced in July 2016 in 3.3. -template -struct significant_decimals_impl -{ - static inline int run() - { - return NumTraits::digits10(); - } -}; - -/** \internal - * print the matrix \a _m to the output stream \a s using the output format \a fmt */ -template -std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt) -{ - if(_m.size() == 0) - { - s << fmt.matPrefix << fmt.matSuffix; - return s; - } - - typename Derived::Nested m = _m; - typedef typename Derived::Scalar Scalar; - - Index width = 0; - - std::streamsize explicit_precision; - if(fmt.precision == StreamPrecision) - { - explicit_precision = 0; - } - else if(fmt.precision == FullPrecision) - { - if (NumTraits::IsInteger) - { - explicit_precision = 0; - } - else - { - explicit_precision = significant_decimals_impl::run(); - } - } - else - { - explicit_precision = fmt.precision; - } - - std::streamsize old_precision = 0; - if(explicit_precision) old_precision = s.precision(explicit_precision); - - bool align_cols = !(fmt.flags & DontAlignCols); - if(align_cols) - { - // compute the largest width - for(Index j = 0; j < m.cols(); ++j) - for(Index i = 0; i < m.rows(); ++i) - { - std::stringstream sstr; - sstr.copyfmt(s); - sstr << m.coeff(i,j); - width = std::max(width, Index(sstr.str().length())); - } - } - s << fmt.matPrefix; - for(Index i = 0; i < m.rows(); ++i) - { - if (i) - s << fmt.rowSpacer; - s << fmt.rowPrefix; - if(width) s.width(width); - s << m.coeff(i, 0); - for(Index j = 1; j < m.cols(); ++j) - { - s << fmt.coeffSeparator; - if (width) s.width(width); - s << m.coeff(i, j); - } - s << fmt.rowSuffix; - if( i < m.rows() - 1) - s << fmt.rowSeparator; - } - s << fmt.matSuffix; - if(explicit_precision) s.precision(old_precision); - return s; -} - -} // end namespace internal - -/** \relates DenseBase - * - * Outputs the matrix, to the given stream. - * - * If you wish to print the matrix with a format different than the default, use DenseBase::format(). - * - * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers. - * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters. - * - * \sa DenseBase::format() - */ -template -std::ostream & operator << -(std::ostream & s, - const DenseBase & m) -{ - return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT); -} - -} // end namespace Eigen - -#endif // EIGEN_IO_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/IndexedView.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/IndexedView.h deleted file mode 100644 index 8c57a277..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/IndexedView.h +++ /dev/null @@ -1,207 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_INDEXED_VIEW_H -#define EIGEN_INDEXED_VIEW_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : traits -{ - enum { - RowsAtCompileTime = int(array_size::value), - ColsAtCompileTime = int(array_size::value), - MaxRowsAtCompileTime = RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime) : int(traits::MaxRowsAtCompileTime), - MaxColsAtCompileTime = ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime) : int(traits::MaxColsAtCompileTime), - - XprTypeIsRowMajor = (int(traits::Flags)&RowMajorBit) != 0, - IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0 - : XprTypeIsRowMajor, - - RowIncr = int(get_compile_time_incr::value), - ColIncr = int(get_compile_time_incr::value), - InnerIncr = IsRowMajor ? ColIncr : RowIncr, - OuterIncr = IsRowMajor ? RowIncr : ColIncr, - - HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor), - XprInnerStride = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time::ret) : int(outer_stride_at_compile_time::ret), - XprOuterstride = HasSameStorageOrderAsXprType ? int(outer_stride_at_compile_time::ret) : int(inner_stride_at_compile_time::ret), - - InnerSize = XprTypeIsRowMajor ? ColsAtCompileTime : RowsAtCompileTime, - IsBlockAlike = InnerIncr==1 && OuterIncr==1, - IsInnerPannel = HasSameStorageOrderAsXprType && is_same,typename conditional::type>::value, - - InnerStrideAtCompileTime = InnerIncr<0 || InnerIncr==DynamicIndex || XprInnerStride==Dynamic ? Dynamic : XprInnerStride * InnerIncr, - OuterStrideAtCompileTime = OuterIncr<0 || OuterIncr==DynamicIndex || XprOuterstride==Dynamic ? Dynamic : XprOuterstride * OuterIncr, - - ReturnAsScalar = is_same::value && is_same::value, - ReturnAsBlock = (!ReturnAsScalar) && IsBlockAlike, - ReturnAsIndexedView = (!ReturnAsScalar) && (!ReturnAsBlock), - - // FIXME we deal with compile-time strides if and only if we have DirectAccessBit flag, - // but this is too strict regarding negative strides... - DirectAccessMask = (int(InnerIncr)!=UndefinedIncr && int(OuterIncr)!=UndefinedIncr && InnerIncr>=0 && OuterIncr>=0) ? DirectAccessBit : 0, - FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0, - FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = (traits::Flags & (HereditaryBits | DirectAccessMask)) | FlagsLvalueBit | FlagsRowMajorBit - }; - - typedef Block BlockType; -}; - -} - -template -class IndexedViewImpl; - - -/** \class IndexedView - * \ingroup Core_Module - * - * \brief Expression of a non-sequential sub-matrix defined by arbitrary sequences of row and column indices - * - * \tparam XprType the type of the expression in which we are taking the intersections of sub-rows and sub-columns - * \tparam RowIndices the type of the object defining the sequence of row indices - * \tparam ColIndices the type of the object defining the sequence of column indices - * - * This class represents an expression of a sub-matrix (or sub-vector) defined as the intersection - * of sub-sets of rows and columns, that are themself defined by generic sequences of row indices \f$ \{r_0,r_1,..r_{m-1}\} \f$ - * and column indices \f$ \{c_0,c_1,..c_{n-1} \}\f$. Let \f$ A \f$ be the nested matrix, then the resulting matrix \f$ B \f$ has \c m - * rows and \c n columns, and its entries are given by: \f$ B(i,j) = A(r_i,c_j) \f$. - * - * The \c RowIndices and \c ColIndices types must be compatible with the following API: - * \code - * operator[](Index) const; - * Index size() const; - * \endcode - * - * Typical supported types thus include: - * - std::vector - * - std::valarray - * - std::array - * - Plain C arrays: int[N] - * - Eigen::ArrayXi - * - decltype(ArrayXi::LinSpaced(...)) - * - Any view/expressions of the previous types - * - Eigen::ArithmeticSequence - * - Eigen::internal::AllRange (helper for Eigen::all) - * - Eigen::internal::SingleRange (helper for single index) - * - etc. - * - * In typical usages of %Eigen, this class should never be used directly. It is the return type of - * DenseBase::operator()(const RowIndices&, const ColIndices&). - * - * \sa class Block - */ -template -class IndexedView : public IndexedViewImpl::StorageKind> -{ -public: - typedef typename IndexedViewImpl::StorageKind>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(IndexedView) - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(IndexedView) - - typedef typename internal::ref_selector::non_const_type MatrixTypeNested; - typedef typename internal::remove_all::type NestedExpression; - - template - IndexedView(XprType& xpr, const T0& rowIndices, const T1& colIndices) - : m_xpr(xpr), m_rowIndices(rowIndices), m_colIndices(colIndices) - {} - - /** \returns number of rows */ - Index rows() const { return internal::size(m_rowIndices); } - - /** \returns number of columns */ - Index cols() const { return internal::size(m_colIndices); } - - /** \returns the nested expression */ - const typename internal::remove_all::type& - nestedExpression() const { return m_xpr; } - - /** \returns the nested expression */ - typename internal::remove_reference::type& - nestedExpression() { return m_xpr.const_cast_derived(); } - - /** \returns a const reference to the object storing/generating the row indices */ - const RowIndices& rowIndices() const { return m_rowIndices; } - - /** \returns a const reference to the object storing/generating the column indices */ - const ColIndices& colIndices() const { return m_colIndices; } - -protected: - MatrixTypeNested m_xpr; - RowIndices m_rowIndices; - ColIndices m_colIndices; -}; - - -// Generic API dispatcher -template -class IndexedViewImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; -}; - -namespace internal { - - -template -struct unary_evaluator, IndexBased> - : evaluator_base > -{ - typedef IndexedView XprType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost /* TODO + cost of row/col index */, - - Flags = (evaluator::Flags & (HereditaryBits /*| LinearAccessBit | DirectAccessBit*/)), - - Alignment = 0 - }; - - EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - CoeffReturnType coeff(Index row, Index col) const - { - return m_argImpl.coeff(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Scalar& coeffRef(Index row, Index col) - { - return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); - } - -protected: - - evaluator m_argImpl; - const XprType& m_xpr; - -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_INDEXED_VIEW_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Inverse.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Inverse.h deleted file mode 100644 index b76f0439..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Inverse.h +++ /dev/null @@ -1,118 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_INVERSE_H -#define EIGEN_INVERSE_H - -namespace Eigen { - -template class InverseImpl; - -namespace internal { - -template -struct traits > - : traits -{ - typedef typename XprType::PlainObject PlainObject; - typedef traits BaseTraits; - enum { - Flags = BaseTraits::Flags & RowMajorBit - }; -}; - -} // end namespace internal - -/** \class Inverse - * - * \brief Expression of the inverse of another expression - * - * \tparam XprType the type of the expression we are taking the inverse - * - * This class represents an abstract expression of A.inverse() - * and most of the time this is the only way it is used. - * - */ -template -class Inverse : public InverseImpl::StorageKind> -{ -public: - typedef typename XprType::StorageIndex StorageIndex; - typedef typename XprType::PlainObject PlainObject; - typedef typename XprType::Scalar Scalar; - typedef typename internal::ref_selector::type XprTypeNested; - typedef typename internal::remove_all::type XprTypeNestedCleaned; - typedef typename internal::ref_selector::type Nested; - typedef typename internal::remove_all::type NestedExpression; - - explicit EIGEN_DEVICE_FUNC Inverse(const XprType &xpr) - : m_xpr(xpr) - {} - - EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); } - EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); } - - EIGEN_DEVICE_FUNC const XprTypeNestedCleaned& nestedExpression() const { return m_xpr; } - -protected: - XprTypeNested m_xpr; -}; - -// Generic API dispatcher -template -class InverseImpl - : public internal::generic_xpr_base >::type -{ -public: - typedef typename internal::generic_xpr_base >::type Base; - typedef typename XprType::Scalar Scalar; -private: - - Scalar coeff(Index row, Index col) const; - Scalar coeff(Index i) const; -}; - -namespace internal { - -/** \internal - * \brief Default evaluator for Inverse expression. - * - * This default evaluator for Inverse expression simply evaluate the inverse into a temporary - * by a call to internal::call_assignment_no_alias. - * Therefore, inverse implementers only have to specialize Assignment, ...> for - * there own nested expression. - * - * \sa class Inverse - */ -template -struct unary_evaluator > - : public evaluator::PlainObject> -{ - typedef Inverse InverseType; - typedef typename InverseType::PlainObject PlainObject; - typedef evaluator Base; - - enum { Flags = Base::Flags | EvalBeforeNestingBit }; - - unary_evaluator(const InverseType& inv_xpr) - : m_result(inv_xpr.rows(), inv_xpr.cols()) - { - ::new (static_cast(this)) Base(m_result); - internal::call_assignment_no_alias(m_result, inv_xpr); - } - -protected: - PlainObject m_result; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_INVERSE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Map.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Map.h deleted file mode 100644 index 06d19670..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Map.h +++ /dev/null @@ -1,164 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2010 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MAP_H -#define EIGEN_MAP_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : public traits -{ - typedef traits TraitsBase; - enum { - InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0 - ? int(PlainObjectType::InnerStrideAtCompileTime) - : int(StrideType::InnerStrideAtCompileTime), - OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0 - ? int(PlainObjectType::OuterStrideAtCompileTime) - : int(StrideType::OuterStrideAtCompileTime), - Alignment = int(MapOptions)&int(AlignedMask), - Flags0 = TraitsBase::Flags & (~NestByRefBit), - Flags = is_lvalue::value ? int(Flags0) : (int(Flags0) & ~LvalueBit) - }; -private: - enum { Options }; // Expressions don't have Options -}; -} - -/** \class Map - * \ingroup Core_Module - * - * \brief A matrix or vector expression mapping an existing array of data. - * - * \tparam PlainObjectType the equivalent matrix type of the mapped data - * \tparam MapOptions specifies the pointer alignment in bytes. It can be: \c #Aligned128, , \c #Aligned64, \c #Aligned32, \c #Aligned16, \c #Aligned8 or \c #Unaligned. - * The default is \c #Unaligned. - * \tparam StrideType optionally specifies strides. By default, Map assumes the memory layout - * of an ordinary, contiguous array. This can be overridden by specifying strides. - * The type passed here must be a specialization of the Stride template, see examples below. - * - * This class represents a matrix or vector expression mapping an existing array of data. - * It can be used to let Eigen interface without any overhead with non-Eigen data structures, - * such as plain C arrays or structures from other libraries. By default, it assumes that the - * data is laid out contiguously in memory. You can however override this by explicitly specifying - * inner and outer strides. - * - * Here's an example of simply mapping a contiguous array as a \ref TopicStorageOrders "column-major" matrix: - * \include Map_simple.cpp - * Output: \verbinclude Map_simple.out - * - * If you need to map non-contiguous arrays, you can do so by specifying strides: - * - * Here's an example of mapping an array as a vector, specifying an inner stride, that is, the pointer - * increment between two consecutive coefficients. Here, we're specifying the inner stride as a compile-time - * fixed value. - * \include Map_inner_stride.cpp - * Output: \verbinclude Map_inner_stride.out - * - * Here's an example of mapping an array while specifying an outer stride. Here, since we're mapping - * as a column-major matrix, 'outer stride' means the pointer increment between two consecutive columns. - * Here, we're specifying the outer stride as a runtime parameter. Note that here \c OuterStride<> is - * a short version of \c OuterStride because the default template parameter of OuterStride - * is \c Dynamic - * \include Map_outer_stride.cpp - * Output: \verbinclude Map_outer_stride.out - * - * For more details and for an example of specifying both an inner and an outer stride, see class Stride. - * - * \b Tip: to change the array of data mapped by a Map object, you can use the C++ - * placement new syntax: - * - * Example: \include Map_placement_new.cpp - * Output: \verbinclude Map_placement_new.out - * - * This class is the return type of PlainObjectBase::Map() but can also be used directly. - * - * \sa PlainObjectBase::Map(), \ref TopicStorageOrders - */ -template class Map - : public MapBase > -{ - public: - - typedef MapBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Map) - - typedef typename Base::PointerType PointerType; - typedef PointerType PointerArgType; - EIGEN_DEVICE_FUNC - inline PointerType cast_to_pointer_type(PointerArgType ptr) { return ptr; } - - EIGEN_DEVICE_FUNC - inline Index innerStride() const - { - return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1; - } - - EIGEN_DEVICE_FUNC - inline Index outerStride() const - { - return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer() - : IsVectorAtCompileTime ? this->size() - : int(Flags)&RowMajorBit ? this->cols() - : this->rows(); - } - - /** Constructor in the fixed-size case. - * - * \param dataPtr pointer to the array to map - * \param stride optional Stride object, passing the strides. - */ - EIGEN_DEVICE_FUNC - explicit inline Map(PointerArgType dataPtr, const StrideType& stride = StrideType()) - : Base(cast_to_pointer_type(dataPtr)), m_stride(stride) - { - PlainObjectType::Base::_check_template_params(); - } - - /** Constructor in the dynamic-size vector case. - * - * \param dataPtr pointer to the array to map - * \param size the size of the vector expression - * \param stride optional Stride object, passing the strides. - */ - EIGEN_DEVICE_FUNC - inline Map(PointerArgType dataPtr, Index size, const StrideType& stride = StrideType()) - : Base(cast_to_pointer_type(dataPtr), size), m_stride(stride) - { - PlainObjectType::Base::_check_template_params(); - } - - /** Constructor in the dynamic-size matrix case. - * - * \param dataPtr pointer to the array to map - * \param rows the number of rows of the matrix expression - * \param cols the number of columns of the matrix expression - * \param stride optional Stride object, passing the strides. - */ - EIGEN_DEVICE_FUNC - inline Map(PointerArgType dataPtr, Index rows, Index cols, const StrideType& stride = StrideType()) - : Base(cast_to_pointer_type(dataPtr), rows, cols), m_stride(stride) - { - PlainObjectType::Base::_check_template_params(); - } - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map) - - protected: - StrideType m_stride; -}; - - -} // end namespace Eigen - -#endif // EIGEN_MAP_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/MapBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/MapBase.h deleted file mode 100644 index 020f939a..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/MapBase.h +++ /dev/null @@ -1,299 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2007-2010 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MAPBASE_H -#define EIGEN_MAPBASE_H - -#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \ - EIGEN_STATIC_ASSERT((int(internal::evaluator::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \ - YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT) - -namespace Eigen { - -/** \ingroup Core_Module - * - * \brief Base class for dense Map and Block expression with direct access - * - * This base class provides the const low-level accessors (e.g. coeff, coeffRef) of dense - * Map and Block objects with direct access. - * Typical users do not have to directly deal with this class. - * - * This class can be extended by through the macro plugin \c EIGEN_MAPBASE_PLUGIN. - * See \link TopicCustomizing_Plugins customizing Eigen \endlink for details. - * - * The \c Derived class has to provide the following two methods describing the memory layout: - * \code Index innerStride() const; \endcode - * \code Index outerStride() const; \endcode - * - * \sa class Map, class Block - */ -template class MapBase - : public internal::dense_xpr_base::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - enum { - RowsAtCompileTime = internal::traits::RowsAtCompileTime, - ColsAtCompileTime = internal::traits::ColsAtCompileTime, - SizeAtCompileTime = Base::SizeAtCompileTime - }; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - typedef typename internal::conditional< - bool(internal::is_lvalue::value), - Scalar *, - const Scalar *>::type - PointerType; - - using Base::derived; -// using Base::RowsAtCompileTime; -// using Base::ColsAtCompileTime; -// using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - using Base::IsRowMajor; - - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - using Base::lazyAssign; - using Base::eval; - - using Base::innerStride; - using Base::outerStride; - using Base::rowStride; - using Base::colStride; - - // bug 217 - compile error on ICC 11.1 - using Base::operator=; - - typedef typename Base::CoeffReturnType CoeffReturnType; - - /** \copydoc DenseBase::rows() */ - EIGEN_DEVICE_FUNC inline Index rows() const { return m_rows.value(); } - /** \copydoc DenseBase::cols() */ - EIGEN_DEVICE_FUNC inline Index cols() const { return m_cols.value(); } - - /** Returns a pointer to the first coefficient of the matrix or vector. - * - * \note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride(). - * - * \sa innerStride(), outerStride() - */ - EIGEN_DEVICE_FUNC inline const Scalar* data() const { return m_data; } - - /** \copydoc PlainObjectBase::coeff(Index,Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeff(Index rowId, Index colId) const - { - return m_data[colId * colStride() + rowId * rowStride()]; - } - - /** \copydoc PlainObjectBase::coeff(Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeff(Index index) const - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return m_data[index * innerStride()]; - } - - /** \copydoc PlainObjectBase::coeffRef(Index,Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index rowId, Index colId) const - { - return this->m_data[colId * colStride() + rowId * rowStride()]; - } - - /** \copydoc PlainObjectBase::coeffRef(Index) const */ - EIGEN_DEVICE_FUNC - inline const Scalar& coeffRef(Index index) const - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return this->m_data[index * innerStride()]; - } - - /** \internal */ - template - inline PacketScalar packet(Index rowId, Index colId) const - { - return internal::ploadt - (m_data + (colId * colStride() + rowId * rowStride())); - } - - /** \internal */ - template - inline PacketScalar packet(Index index) const - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return internal::ploadt(m_data + index * innerStride()); - } - - /** \internal Constructor for fixed size matrices or vectors */ - EIGEN_DEVICE_FUNC - explicit inline MapBase(PointerType dataPtr) : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime) - { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) - checkSanity(); - } - - /** \internal Constructor for dynamically sized vectors */ - EIGEN_DEVICE_FUNC - inline MapBase(PointerType dataPtr, Index vecSize) - : m_data(dataPtr), - m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)), - m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime)) - { - EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) - eigen_assert(vecSize >= 0); - eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize); - checkSanity(); - } - - /** \internal Constructor for dynamically sized matrices */ - EIGEN_DEVICE_FUNC - inline MapBase(PointerType dataPtr, Index rows, Index cols) - : m_data(dataPtr), m_rows(rows), m_cols(cols) - { - eigen_assert( (dataPtr == 0) - || ( rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) - && cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols))); - checkSanity(); - } - - #ifdef EIGEN_MAPBASE_PLUGIN - #include EIGEN_MAPBASE_PLUGIN - #endif - - protected: - - template - EIGEN_DEVICE_FUNC - void checkSanity(typename internal::enable_if<(internal::traits::Alignment>0),void*>::type = 0) const - { -#if EIGEN_MAX_ALIGN_BYTES>0 - eigen_assert(( ((internal::UIntPtr(m_data) % internal::traits::Alignment) == 0) - || (cols() * rows() * innerStride() * sizeof(Scalar)) < internal::traits::Alignment ) && "data is not aligned"); -#endif - } - - template - EIGEN_DEVICE_FUNC - void checkSanity(typename internal::enable_if::Alignment==0,void*>::type = 0) const - {} - - PointerType m_data; - const internal::variable_if_dynamic m_rows; - const internal::variable_if_dynamic m_cols; -}; - -/** \ingroup Core_Module - * - * \brief Base class for non-const dense Map and Block expression with direct access - * - * This base class provides the non-const low-level accessors (e.g. coeff and coeffRef) of - * dense Map and Block objects with direct access. - * It inherits MapBase which defines the const variant for reading specific entries. - * - * \sa class Map, class Block - */ -template class MapBase - : public MapBase -{ - typedef MapBase ReadOnlyMapBase; - public: - - typedef MapBase Base; - - typedef typename Base::Scalar Scalar; - typedef typename Base::PacketScalar PacketScalar; - typedef typename Base::StorageIndex StorageIndex; - typedef typename Base::PointerType PointerType; - - using Base::derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - - using Base::innerStride; - using Base::outerStride; - using Base::rowStride; - using Base::colStride; - - typedef typename internal::conditional< - internal::is_lvalue::value, - Scalar, - const Scalar - >::type ScalarWithConstIfNotLvalue; - - EIGEN_DEVICE_FUNC - inline const Scalar* data() const { return this->m_data; } - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue* data() { return this->m_data; } // no const-cast here so non-const-correct code will give a compile error - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col) - { - return this->m_data[col * colStride() + row * rowStride()]; - } - - EIGEN_DEVICE_FUNC - inline ScalarWithConstIfNotLvalue& coeffRef(Index index) - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - return this->m_data[index * innerStride()]; - } - - template - inline void writePacket(Index row, Index col, const PacketScalar& val) - { - internal::pstoret - (this->m_data + (col * colStride() + row * rowStride()), val); - } - - template - inline void writePacket(Index index, const PacketScalar& val) - { - EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) - internal::pstoret - (this->m_data + index * innerStride(), val); - } - - EIGEN_DEVICE_FUNC explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {} - EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {} - EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index rows, Index cols) : Base(dataPtr, rows, cols) {} - - EIGEN_DEVICE_FUNC - Derived& operator=(const MapBase& other) - { - ReadOnlyMapBase::Base::operator=(other); - return derived(); - } - - // In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base, - // see bugs 821 and 920. - using ReadOnlyMapBase::Base::operator=; -}; - -#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS - -} // end namespace Eigen - -#endif // EIGEN_MAPBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/MathFunctions.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/MathFunctions.h deleted file mode 100644 index 5ec6c395..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/MathFunctions.h +++ /dev/null @@ -1,1667 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATHFUNCTIONS_H -#define EIGEN_MATHFUNCTIONS_H - -// source: http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html -// TODO this should better be moved to NumTraits -#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L - -namespace Eigen { - -// On WINCE, std::abs is defined for int only, so let's defined our own overloads: -// This issue has been confirmed with MSVC 2008 only, but the issue might exist for more recent versions too. -#if EIGEN_OS_WINCE && EIGEN_COMP_MSVC && EIGEN_COMP_MSVC<=1500 -long abs(long x) { return (labs(x)); } -double abs(double x) { return (fabs(x)); } -float abs(float x) { return (fabsf(x)); } -long double abs(long double x) { return (fabsl(x)); } -#endif - -namespace internal { - -/** \internal \class global_math_functions_filtering_base - * - * What it does: - * Defines a typedef 'type' as follows: - * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then - * global_math_functions_filtering_base::type is a typedef for it. - * - otherwise, global_math_functions_filtering_base::type is a typedef for T. - * - * How it's used: - * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions. - * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know - * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase. - * So we must make sure to use sin_impl > and not sin_impl, otherwise our partial specialization - * won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells it. - * - * How it's implemented: - * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you replace - * the typename dummy by an integer template parameter, it doesn't work anymore! - */ - -template -struct global_math_functions_filtering_base -{ - typedef T type; -}; - -template struct always_void { typedef void type; }; - -template -struct global_math_functions_filtering_base - ::type - > -{ - typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type; -}; - -#define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl::type> -#define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval::type>::type - -/**************************************************************************** -* Implementation of real * -****************************************************************************/ - -template::IsComplex> -struct real_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return x; - } -}; - -template -struct real_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - using std::real; - return real(x); - } -}; - -template struct real_impl : real_default_impl {}; - -#ifdef __CUDA_ARCH__ -template -struct real_impl > -{ - typedef T RealScalar; - EIGEN_DEVICE_FUNC - static inline T run(const std::complex& x) - { - return x.real(); - } -}; -#endif - -template -struct real_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of imag * -****************************************************************************/ - -template::IsComplex> -struct imag_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar&) - { - return RealScalar(0); - } -}; - -template -struct imag_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - using std::imag; - return imag(x); - } -}; - -template struct imag_impl : imag_default_impl {}; - -#ifdef __CUDA_ARCH__ -template -struct imag_impl > -{ - typedef T RealScalar; - EIGEN_DEVICE_FUNC - static inline T run(const std::complex& x) - { - return x.imag(); - } -}; -#endif - -template -struct imag_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of real_ref * -****************************************************************************/ - -template -struct real_ref_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar& run(Scalar& x) - { - return reinterpret_cast(&x)[0]; - } - EIGEN_DEVICE_FUNC - static inline const RealScalar& run(const Scalar& x) - { - return reinterpret_cast(&x)[0]; - } -}; - -template -struct real_ref_retval -{ - typedef typename NumTraits::Real & type; -}; - -/**************************************************************************** -* Implementation of imag_ref * -****************************************************************************/ - -template -struct imag_ref_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar& run(Scalar& x) - { - return reinterpret_cast(&x)[1]; - } - EIGEN_DEVICE_FUNC - static inline const RealScalar& run(const Scalar& x) - { - return reinterpret_cast(&x)[1]; - } -}; - -template -struct imag_ref_default_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(Scalar&) - { - return Scalar(0); - } - EIGEN_DEVICE_FUNC - static inline const Scalar run(const Scalar&) - { - return Scalar(0); - } -}; - -template -struct imag_ref_impl : imag_ref_default_impl::IsComplex> {}; - -template -struct imag_ref_retval -{ - typedef typename NumTraits::Real & type; -}; - -/**************************************************************************** -* Implementation of conj * -****************************************************************************/ - -template::IsComplex> -struct conj_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(const Scalar& x) - { - return x; - } -}; - -template -struct conj_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(const Scalar& x) - { - using std::conj; - return conj(x); - } -}; - -template -struct conj_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of abs2 * -****************************************************************************/ - -template -struct abs2_impl_default -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return x*x; - } -}; - -template -struct abs2_impl_default // IsComplex -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return real(x)*real(x) + imag(x)*imag(x); - } -}; - -template -struct abs2_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return abs2_impl_default::IsComplex>::run(x); - } -}; - -template -struct abs2_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of norm1 * -****************************************************************************/ - -template -struct norm1_default_impl -{ - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(abs); - return abs(real(x)) + abs(imag(x)); - } -}; - -template -struct norm1_default_impl -{ - EIGEN_DEVICE_FUNC - static inline Scalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(abs); - return abs(x); - } -}; - -template -struct norm1_impl : norm1_default_impl::IsComplex> {}; - -template -struct norm1_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of hypot * -****************************************************************************/ - -template -struct hypot_impl -{ - typedef typename NumTraits::Real RealScalar; - static inline RealScalar run(const Scalar& x, const Scalar& y) - { - EIGEN_USING_STD_MATH(abs); - EIGEN_USING_STD_MATH(sqrt); - RealScalar _x = abs(x); - RealScalar _y = abs(y); - Scalar p, qp; - if(_x>_y) - { - p = _x; - qp = _y / p; - } - else - { - p = _y; - qp = _x / p; - } - if(p==RealScalar(0)) return RealScalar(0); - return p * sqrt(RealScalar(1) + qp*qp); - } -}; - -template -struct hypot_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of cast * -****************************************************************************/ - -template -struct cast_impl -{ - EIGEN_DEVICE_FUNC - static inline NewType run(const OldType& x) - { - return static_cast(x); - } -}; - -// here, for once, we're plainly returning NewType: we don't want cast to do weird things. - -template -EIGEN_DEVICE_FUNC -inline NewType cast(const OldType& x) -{ - return cast_impl::run(x); -} - -/**************************************************************************** -* Implementation of round * -****************************************************************************/ - -#if EIGEN_HAS_CXX11_MATH - template - struct round_impl { - static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT((!NumTraits::IsComplex), NUMERIC_TYPE_MUST_BE_REAL) - EIGEN_USING_STD_MATH(round); - return round(x); - } - }; -#else - template - struct round_impl - { - static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT((!NumTraits::IsComplex), NUMERIC_TYPE_MUST_BE_REAL) - EIGEN_USING_STD_MATH(floor); - EIGEN_USING_STD_MATH(ceil); - return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5)); - } - }; -#endif - -template -struct round_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of arg * -****************************************************************************/ - -#if EIGEN_HAS_CXX11_MATH - template - struct arg_impl { - static inline Scalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(arg); - return arg(x); - } - }; -#else - template::IsComplex> - struct arg_default_impl - { - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); } - }; - - template - struct arg_default_impl - { - typedef typename NumTraits::Real RealScalar; - EIGEN_DEVICE_FUNC - static inline RealScalar run(const Scalar& x) - { - EIGEN_USING_STD_MATH(arg); - return arg(x); - } - }; - - template struct arg_impl : arg_default_impl {}; -#endif - -template -struct arg_retval -{ - typedef typename NumTraits::Real type; -}; - -/**************************************************************************** -* Implementation of expm1 * -****************************************************************************/ - -// This implementation is based on GSL Math's expm1. -namespace std_fallback { - // fallback expm1 implementation in case there is no expm1(Scalar) function in namespace of Scalar, - // or that there is no suitable std::expm1 function available. Implementation - // attributed to Kahan. See: http://www.plunk.org/~hatch/rightway.php. - template - EIGEN_DEVICE_FUNC inline Scalar expm1(const Scalar& x) { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - typedef typename NumTraits::Real RealScalar; - - EIGEN_USING_STD_MATH(exp); - Scalar u = exp(x); - if (u == Scalar(1)) { - return x; - } - Scalar um1 = u - RealScalar(1); - if (um1 == Scalar(-1)) { - return RealScalar(-1); - } - - EIGEN_USING_STD_MATH(log); - return (u - RealScalar(1)) * x / log(u); - } -} - -template -struct expm1_impl { - EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - #if EIGEN_HAS_CXX11_MATH - using std::expm1; - #endif - using std_fallback::expm1; - return expm1(x); - } -}; - - -template -struct expm1_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of log1p * -****************************************************************************/ - -namespace std_fallback { - // fallback log1p implementation in case there is no log1p(Scalar) function in namespace of Scalar, - // or that there is no suitable std::log1p function available - template - EIGEN_DEVICE_FUNC inline Scalar log1p(const Scalar& x) { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - typedef typename NumTraits::Real RealScalar; - EIGEN_USING_STD_MATH(log); - Scalar x1p = RealScalar(1) + x; - return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) ); - } -} - -template -struct log1p_impl { - EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) - { - EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) - #if EIGEN_HAS_CXX11_MATH - using std::log1p; - #endif - using std_fallback::log1p; - return log1p(x); - } -}; - - -template -struct log1p_retval -{ - typedef Scalar type; -}; - -/**************************************************************************** -* Implementation of pow * -****************************************************************************/ - -template::IsInteger&&NumTraits::IsInteger> -struct pow_impl -{ - //typedef Scalar retval; - typedef typename ScalarBinaryOpTraits >::ReturnType result_type; - static EIGEN_DEVICE_FUNC inline result_type run(const ScalarX& x, const ScalarY& y) - { - EIGEN_USING_STD_MATH(pow); - return pow(x, y); - } -}; - -template -struct pow_impl -{ - typedef ScalarX result_type; - static EIGEN_DEVICE_FUNC inline ScalarX run(ScalarX x, ScalarY y) - { - ScalarX res(1); - eigen_assert(!NumTraits::IsSigned || y >= 0); - if(y & 1) res *= x; - y >>= 1; - while(y) - { - x *= x; - if(y&1) res *= x; - y >>= 1; - } - return res; - } -}; - -/**************************************************************************** -* Implementation of random * -****************************************************************************/ - -template -struct random_default_impl {}; - -template -struct random_impl : random_default_impl::IsComplex, NumTraits::IsInteger> {}; - -template -struct random_retval -{ - typedef Scalar type; -}; - -template inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y); -template inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(); - -template -struct random_default_impl -{ - static inline Scalar run(const Scalar& x, const Scalar& y) - { - return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX); - } - static inline Scalar run() - { - return run(Scalar(NumTraits::IsSigned ? -1 : 0), Scalar(1)); - } -}; - -enum { - meta_floor_log2_terminate, - meta_floor_log2_move_up, - meta_floor_log2_move_down, - meta_floor_log2_bogus -}; - -template struct meta_floor_log2_selector -{ - enum { middle = (lower + upper) / 2, - value = (upper <= lower + 1) ? int(meta_floor_log2_terminate) - : (n < (1 << middle)) ? int(meta_floor_log2_move_down) - : (n==0) ? int(meta_floor_log2_bogus) - : int(meta_floor_log2_move_up) - }; -}; - -template::value> -struct meta_floor_log2 {}; - -template -struct meta_floor_log2 -{ - enum { value = meta_floor_log2::middle>::value }; -}; - -template -struct meta_floor_log2 -{ - enum { value = meta_floor_log2::middle, upper>::value }; -}; - -template -struct meta_floor_log2 -{ - enum { value = (n >= ((unsigned int)(1) << (lower+1))) ? lower+1 : lower }; -}; - -template -struct meta_floor_log2 -{ - // no value, error at compile time -}; - -template -struct random_default_impl -{ - static inline Scalar run(const Scalar& x, const Scalar& y) - { - typedef typename conditional::IsSigned,std::ptrdiff_t,std::size_t>::type ScalarX; - if(y=x the result converted to an unsigned long is still correct. - std::size_t range = ScalarX(y)-ScalarX(x); - std::size_t offset = 0; - // rejection sampling - std::size_t divisor = 1; - std::size_t multiplier = 1; - if(range range); - return Scalar(ScalarX(x) + offset); - } - - static inline Scalar run() - { -#ifdef EIGEN_MAKING_DOCS - return run(Scalar(NumTraits::IsSigned ? -10 : 0), Scalar(10)); -#else - enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value, - scalar_bits = sizeof(Scalar) * CHAR_BIT, - shift = EIGEN_PLAIN_ENUM_MAX(0, int(rand_bits) - int(scalar_bits)), - offset = NumTraits::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0 - }; - return Scalar((std::rand() >> shift) - offset); -#endif - } -}; - -template -struct random_default_impl -{ - static inline Scalar run(const Scalar& x, const Scalar& y) - { - return Scalar(random(real(x), real(y)), - random(imag(x), imag(y))); - } - static inline Scalar run() - { - typedef typename NumTraits::Real RealScalar; - return Scalar(random(), random()); - } -}; - -template -inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y) -{ - return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y); -} - -template -inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random() -{ - return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(); -} - -// Implementatin of is* functions - -// std::is* do not work with fast-math and gcc, std::is* are available on MSVC 2013 and newer, as well as in clang. -#if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG) -#define EIGEN_USE_STD_FPCLASSIFY 1 -#else -#define EIGEN_USE_STD_FPCLASSIFY 0 -#endif - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if::value,bool>::type -isnan_impl(const T&) { return false; } - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if::value,bool>::type -isinf_impl(const T&) { return false; } - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if::value,bool>::type -isfinite_impl(const T&) { return true; } - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if<(!internal::is_integral::value)&&(!NumTraits::IsComplex),bool>::type -isfinite_impl(const T& x) -{ - #ifdef __CUDA_ARCH__ - return (::isfinite)(x); - #elif EIGEN_USE_STD_FPCLASSIFY - using std::isfinite; - return isfinite EIGEN_NOT_A_MACRO (x); - #else - return x<=NumTraits::highest() && x>=NumTraits::lowest(); - #endif -} - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if<(!internal::is_integral::value)&&(!NumTraits::IsComplex),bool>::type -isinf_impl(const T& x) -{ - #ifdef __CUDA_ARCH__ - return (::isinf)(x); - #elif EIGEN_USE_STD_FPCLASSIFY - using std::isinf; - return isinf EIGEN_NOT_A_MACRO (x); - #else - return x>NumTraits::highest() || x::lowest(); - #endif -} - -template -EIGEN_DEVICE_FUNC -typename internal::enable_if<(!internal::is_integral::value)&&(!NumTraits::IsComplex),bool>::type -isnan_impl(const T& x) -{ - #ifdef __CUDA_ARCH__ - return (::isnan)(x); - #elif EIGEN_USE_STD_FPCLASSIFY - using std::isnan; - return isnan EIGEN_NOT_A_MACRO (x); - #else - return x != x; - #endif -} - -#if (!EIGEN_USE_STD_FPCLASSIFY) - -#if EIGEN_COMP_MSVC - -template EIGEN_DEVICE_FUNC bool isinf_msvc_helper(T x) -{ - return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF; -} - -//MSVC defines a _isnan builtin function, but for double only -EIGEN_DEVICE_FUNC inline bool isnan_impl(const long double& x) { return _isnan(x)!=0; } -EIGEN_DEVICE_FUNC inline bool isnan_impl(const double& x) { return _isnan(x)!=0; } -EIGEN_DEVICE_FUNC inline bool isnan_impl(const float& x) { return _isnan(x)!=0; } - -EIGEN_DEVICE_FUNC inline bool isinf_impl(const long double& x) { return isinf_msvc_helper(x); } -EIGEN_DEVICE_FUNC inline bool isinf_impl(const double& x) { return isinf_msvc_helper(x); } -EIGEN_DEVICE_FUNC inline bool isinf_impl(const float& x) { return isinf_msvc_helper(x); } - -#elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC) - -#if EIGEN_GNUC_AT_LEAST(5,0) - #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only"))) -#else - // NOTE the inline qualifier and noinline attribute are both needed: the former is to avoid linking issue (duplicate symbol), - // while the second prevent too aggressive optimizations in fast-math mode: - #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only"))) -#endif - -template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const long double& x) { return __builtin_isnan(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const double& x) { return __builtin_isnan(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const float& x) { return __builtin_isnan(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const double& x) { return __builtin_isinf(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const float& x) { return __builtin_isinf(x); } -template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const long double& x) { return __builtin_isinf(x); } - -#undef EIGEN_TMP_NOOPT_ATTRIB - -#endif - -#endif - -// The following overload are defined at the end of this file -template EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex& x); -template EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex& x); -template EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex& x); - -template T generic_fast_tanh_float(const T& a_x); - -} // end namespace internal - -/**************************************************************************** -* Generic math functions * -****************************************************************************/ - -namespace numext { - -#if !defined(__CUDA_ARCH__) && !defined(__SYCL_DEVICE_ONLY__) -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) -{ - EIGEN_USING_STD_MATH(min); - return min EIGEN_NOT_A_MACRO (x,y); -} - -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) -{ - EIGEN_USING_STD_MATH(max); - return max EIGEN_NOT_A_MACRO (x,y); -} - - -#elif defined(__SYCL_DEVICE_ONLY__) -template -EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) -{ - - return y < x ? y : x; -} - -template -EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) -{ - - return x < y ? y : x; -} - -EIGEN_ALWAYS_INLINE int mini(const int& x, const int& y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE int maxi(const int& x, const int& y) -{ - return cl::sycl::max(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned int mini(const unsigned int& x, const unsigned int& y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned int maxi(const unsigned int& x, const unsigned int& y) -{ - return cl::sycl::max(x,y); -} - -EIGEN_ALWAYS_INLINE long mini(const long & x, const long & y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE long maxi(const long & x, const long & y) -{ - return cl::sycl::max(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned long mini(const unsigned long& x, const unsigned long& y) -{ - return cl::sycl::min(x,y); -} - -EIGEN_ALWAYS_INLINE unsigned long maxi(const unsigned long& x, const unsigned long& y) -{ - return cl::sycl::max(x,y); -} - - -EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) -{ - return cl::sycl::fmin(x,y); -} - -EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y) -{ - return cl::sycl::fmax(x,y); -} - -EIGEN_ALWAYS_INLINE double mini(const double& x, const double& y) -{ - return cl::sycl::fmin(x,y); -} - -EIGEN_ALWAYS_INLINE double maxi(const double& x, const double& y) -{ - return cl::sycl::fmax(x,y); -} - -#else -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) -{ - return y < x ? y : x; -} -template<> -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) -{ - return fminf(x, y); -} -template -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) -{ - return x < y ? y : x; -} -template<> -EIGEN_DEVICE_FUNC -EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y) -{ - return fmaxf(x, y); -} -#endif - - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(const Scalar& x) -{ - return internal::real_ref_impl::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(const Scalar& x) -{ - return internal::imag_ref_impl::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y) -{ - return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y); -} - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float log1p(float x) { return cl::sycl::log1p(x); } -EIGEN_ALWAYS_INLINE double log1p(double x) { return cl::sycl::log1p(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float log1p(const float &x) { return ::log1pf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double log1p(const double &x) { return ::log1p(x); } -#endif - -template -EIGEN_DEVICE_FUNC -inline typename internal::pow_impl::result_type pow(const ScalarX& x, const ScalarY& y) -{ - return internal::pow_impl::run(x, y); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float pow(float x, float y) { return cl::sycl::pow(x, y); } -EIGEN_ALWAYS_INLINE double pow(double x, double y) { return cl::sycl::pow(x, y); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template EIGEN_DEVICE_FUNC bool (isnan) (const T &x) { return internal::isnan_impl(x); } -template EIGEN_DEVICE_FUNC bool (isinf) (const T &x) { return internal::isinf_impl(x); } -template EIGEN_DEVICE_FUNC bool (isfinite)(const T &x) { return internal::isfinite_impl(x); } - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float isnan(float x) { return cl::sycl::isnan(x); } -EIGEN_ALWAYS_INLINE double isnan(double x) { return cl::sycl::isnan(x); } -EIGEN_ALWAYS_INLINE float isinf(float x) { return cl::sycl::isinf(x); } -EIGEN_ALWAYS_INLINE double isinf(double x) { return cl::sycl::isinf(x); } -EIGEN_ALWAYS_INLINE float isfinite(float x) { return cl::sycl::isfinite(x); } -EIGEN_ALWAYS_INLINE double isfinite(double x) { return cl::sycl::isfinite(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(round, Scalar) round(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float round(float x) { return cl::sycl::round(x); } -EIGEN_ALWAYS_INLINE double round(double x) { return cl::sycl::round(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template -EIGEN_DEVICE_FUNC -T (floor)(const T& x) -{ - EIGEN_USING_STD_MATH(floor); - return floor(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float floor(float x) { return cl::sycl::floor(x); } -EIGEN_ALWAYS_INLINE double floor(double x) { return cl::sycl::floor(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float floor(const float &x) { return ::floorf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double floor(const double &x) { return ::floor(x); } -#endif - -template -EIGEN_DEVICE_FUNC -T (ceil)(const T& x) -{ - EIGEN_USING_STD_MATH(ceil); - return ceil(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float ceil(float x) { return cl::sycl::ceil(x); } -EIGEN_ALWAYS_INLINE double ceil(double x) { return cl::sycl::ceil(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float ceil(const float &x) { return ::ceilf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double ceil(const double &x) { return ::ceil(x); } -#endif - - -/** Log base 2 for 32 bits positive integers. - * Conveniently returns 0 for x==0. */ -inline int log2(int x) -{ - eigen_assert(x>=0); - unsigned int v(x); - static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return table[(v * 0x07C4ACDDU) >> 27]; -} - -/** \returns the square root of \a x. - * - * It is essentially equivalent to \code using std::sqrt; return sqrt(x); \endcode, - * but slightly faster for float/double and some compilers (e.g., gcc), thanks to - * specializations when SSE is enabled. - * - * It's usage is justified in performance critical functions, like norm/normalize. - */ -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T sqrt(const T &x) -{ - EIGEN_USING_STD_MATH(sqrt); - return sqrt(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float sqrt(float x) { return cl::sycl::sqrt(x); } -EIGEN_ALWAYS_INLINE double sqrt(double x) { return cl::sycl::sqrt(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T log(const T &x) { - EIGEN_USING_STD_MATH(log); - return log(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float log(float x) { return cl::sycl::log(x); } -EIGEN_ALWAYS_INLINE double log(double x) { return cl::sycl::log(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float log(const float &x) { return ::logf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double log(const double &x) { return ::log(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -typename NumTraits::Real abs(const T &x) { - EIGEN_USING_STD_MATH(abs); - return abs(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float abs(float x) { return cl::sycl::fabs(x); } -EIGEN_ALWAYS_INLINE double abs(double x) { return cl::sycl::fabs(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float abs(const float &x) { return ::fabsf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double abs(const double &x) { return ::fabs(x); } - -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float abs(const std::complex& x) { - return ::hypotf(x.real(), x.imag()); -} - -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double abs(const std::complex& x) { - return ::hypot(x.real(), x.imag()); -} -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T exp(const T &x) { - EIGEN_USING_STD_MATH(exp); - return exp(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float exp(float x) { return cl::sycl::exp(x); } -EIGEN_ALWAYS_INLINE double exp(double x) { return cl::sycl::exp(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float exp(const float &x) { return ::expf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double exp(const double &x) { return ::exp(x); } -#endif - -template -EIGEN_DEVICE_FUNC -inline EIGEN_MATHFUNC_RETVAL(expm1, Scalar) expm1(const Scalar& x) -{ - return EIGEN_MATHFUNC_IMPL(expm1, Scalar)::run(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float expm1(float x) { return cl::sycl::expm1(x); } -EIGEN_ALWAYS_INLINE double expm1(double x) { return cl::sycl::expm1(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float expm1(const float &x) { return ::expm1f(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double expm1(const double &x) { return ::expm1(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T cos(const T &x) { - EIGEN_USING_STD_MATH(cos); - return cos(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float cos(float x) { return cl::sycl::cos(x); } -EIGEN_ALWAYS_INLINE double cos(double x) { return cl::sycl::cos(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float cos(const float &x) { return ::cosf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double cos(const double &x) { return ::cos(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T sin(const T &x) { - EIGEN_USING_STD_MATH(sin); - return sin(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float sin(float x) { return cl::sycl::sin(x); } -EIGEN_ALWAYS_INLINE double sin(double x) { return cl::sycl::sin(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float sin(const float &x) { return ::sinf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double sin(const double &x) { return ::sin(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T tan(const T &x) { - EIGEN_USING_STD_MATH(tan); - return tan(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float tan(float x) { return cl::sycl::tan(x); } -EIGEN_ALWAYS_INLINE double tan(double x) { return cl::sycl::tan(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float tan(const float &x) { return ::tanf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double tan(const double &x) { return ::tan(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T acos(const T &x) { - EIGEN_USING_STD_MATH(acos); - return acos(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float acos(float x) { return cl::sycl::acos(x); } -EIGEN_ALWAYS_INLINE double acos(double x) { return cl::sycl::acos(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float acos(const float &x) { return ::acosf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double acos(const double &x) { return ::acos(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T asin(const T &x) { - EIGEN_USING_STD_MATH(asin); - return asin(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float asin(float x) { return cl::sycl::asin(x); } -EIGEN_ALWAYS_INLINE double asin(double x) { return cl::sycl::asin(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float asin(const float &x) { return ::asinf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double asin(const double &x) { return ::asin(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T atan(const T &x) { - EIGEN_USING_STD_MATH(atan); - return atan(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float atan(float x) { return cl::sycl::atan(x); } -EIGEN_ALWAYS_INLINE double atan(double x) { return cl::sycl::atan(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float atan(const float &x) { return ::atanf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double atan(const double &x) { return ::atan(x); } -#endif - - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T cosh(const T &x) { - EIGEN_USING_STD_MATH(cosh); - return cosh(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float cosh(float x) { return cl::sycl::cosh(x); } -EIGEN_ALWAYS_INLINE double cosh(double x) { return cl::sycl::cosh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float cosh(const float &x) { return ::coshf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double cosh(const double &x) { return ::cosh(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T sinh(const T &x) { - EIGEN_USING_STD_MATH(sinh); - return sinh(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float sinh(float x) { return cl::sycl::sinh(x); } -EIGEN_ALWAYS_INLINE double sinh(double x) { return cl::sycl::sinh(x); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float sinh(const float &x) { return ::sinhf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double sinh(const double &x) { return ::sinh(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T tanh(const T &x) { - EIGEN_USING_STD_MATH(tanh); - return tanh(x); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float tanh(float x) { return cl::sycl::tanh(x); } -EIGEN_ALWAYS_INLINE double tanh(double x) { return cl::sycl::tanh(x); } -#elif (!defined(__CUDACC__)) && EIGEN_FAST_MATH -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float tanh(float x) { return internal::generic_fast_tanh_float(x); } -#endif - -#ifdef __CUDACC__ -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float tanh(const float &x) { return ::tanhf(x); } - -template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double tanh(const double &x) { return ::tanh(x); } -#endif - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T fmod(const T& a, const T& b) { - EIGEN_USING_STD_MATH(fmod); - return fmod(a, b); -} - -#if defined(__SYCL_DEVICE_ONLY__) -EIGEN_ALWAYS_INLINE float fmod(float x, float y) { return cl::sycl::fmod(x, y); } -EIGEN_ALWAYS_INLINE double fmod(double x, double y) { return cl::sycl::fmod(x, y); } -#endif // defined(__SYCL_DEVICE_ONLY__) - -#ifdef __CUDACC__ -template <> -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float fmod(const float& a, const float& b) { - return ::fmodf(a, b); -} - -template <> -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double fmod(const double& a, const double& b) { - return ::fmod(a, b); -} -#endif - -} // end namespace numext - -namespace internal { - -template -EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex& x) -{ - return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x)); -} - -template -EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex& x) -{ - return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x)); -} - -template -EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex& x) -{ - return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x)); -} - -/**************************************************************************** -* Implementation of fuzzy comparisons * -****************************************************************************/ - -template -struct scalar_fuzzy_default_impl {}; - -template -struct scalar_fuzzy_default_impl -{ - typedef typename NumTraits::Real RealScalar; - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec) - { - return numext::abs(x) <= numext::abs(y) * prec; - } - EIGEN_DEVICE_FUNC - static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec) - { - return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec; - } - EIGEN_DEVICE_FUNC - static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec) - { - return x <= y || isApprox(x, y, prec); - } -}; - -template -struct scalar_fuzzy_default_impl -{ - typedef typename NumTraits::Real RealScalar; - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&) - { - return x == Scalar(0); - } - EIGEN_DEVICE_FUNC - static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&) - { - return x == y; - } - EIGEN_DEVICE_FUNC - static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&) - { - return x <= y; - } -}; - -template -struct scalar_fuzzy_default_impl -{ - typedef typename NumTraits::Real RealScalar; - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec) - { - return numext::abs2(x) <= numext::abs2(y) * prec * prec; - } - EIGEN_DEVICE_FUNC - static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec) - { - return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec; - } -}; - -template -struct scalar_fuzzy_impl : scalar_fuzzy_default_impl::IsComplex, NumTraits::IsInteger> {}; - -template EIGEN_DEVICE_FUNC -inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, - const typename NumTraits::Real &precision = NumTraits::dummy_precision()) -{ - return scalar_fuzzy_impl::template isMuchSmallerThan(x, y, precision); -} - -template EIGEN_DEVICE_FUNC -inline bool isApprox(const Scalar& x, const Scalar& y, - const typename NumTraits::Real &precision = NumTraits::dummy_precision()) -{ - return scalar_fuzzy_impl::isApprox(x, y, precision); -} - -template EIGEN_DEVICE_FUNC -inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, - const typename NumTraits::Real &precision = NumTraits::dummy_precision()) -{ - return scalar_fuzzy_impl::isApproxOrLessThan(x, y, precision); -} - -/****************************************** -*** The special case of the bool type *** -******************************************/ - -template<> struct random_impl -{ - static inline bool run() - { - return random(0,1)==0 ? false : true; - } -}; - -template<> struct scalar_fuzzy_impl -{ - typedef bool RealScalar; - - template EIGEN_DEVICE_FUNC - static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&) - { - return !x; - } - - EIGEN_DEVICE_FUNC - static inline bool isApprox(bool x, bool y, bool) - { - return x == y; - } - - EIGEN_DEVICE_FUNC - static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&) - { - return (!x) || y; - } - -}; - - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_MATHFUNCTIONS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/MathFunctionsImpl.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/MathFunctionsImpl.h deleted file mode 100644 index ae1386b4..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/MathFunctionsImpl.h +++ /dev/null @@ -1,73 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Pedro Gonnet (pedro.gonnet@gmail.com) -// Copyright (C) 2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATHFUNCTIONSIMPL_H -#define EIGEN_MATHFUNCTIONSIMPL_H - -namespace Eigen { - -namespace internal { - -/** \internal \returns the hyperbolic tan of \a a (coeff-wise) - Doesn't do anything fancy, just a 13/6-degree rational interpolant which - is accurate up to a couple of ulp in the range [-9, 9], outside of which - the tanh(x) = +/-1. - - This implementation works on both scalars and packets. -*/ -template -T generic_fast_tanh_float(const T& a_x) -{ - // Clamp the inputs to the range [-9, 9] since anything outside - // this range is +/-1.0f in single-precision. - const T plus_9 = pset1(9.f); - const T minus_9 = pset1(-9.f); - const T x = pmax(pmin(a_x, plus_9), minus_9); - // The monomial coefficients of the numerator polynomial (odd). - const T alpha_1 = pset1(4.89352455891786e-03f); - const T alpha_3 = pset1(6.37261928875436e-04f); - const T alpha_5 = pset1(1.48572235717979e-05f); - const T alpha_7 = pset1(5.12229709037114e-08f); - const T alpha_9 = pset1(-8.60467152213735e-11f); - const T alpha_11 = pset1(2.00018790482477e-13f); - const T alpha_13 = pset1(-2.76076847742355e-16f); - - // The monomial coefficients of the denominator polynomial (even). - const T beta_0 = pset1(4.89352518554385e-03f); - const T beta_2 = pset1(2.26843463243900e-03f); - const T beta_4 = pset1(1.18534705686654e-04f); - const T beta_6 = pset1(1.19825839466702e-06f); - - // Since the polynomials are odd/even, we need x^2. - const T x2 = pmul(x, x); - - // Evaluate the numerator polynomial p. - T p = pmadd(x2, alpha_13, alpha_11); - p = pmadd(x2, p, alpha_9); - p = pmadd(x2, p, alpha_7); - p = pmadd(x2, p, alpha_5); - p = pmadd(x2, p, alpha_3); - p = pmadd(x2, p, alpha_1); - p = pmul(x, p); - - // Evaluate the denominator polynomial p. - T q = pmadd(x2, beta_6, beta_4); - q = pmadd(x2, q, beta_2); - q = pmadd(x2, q, beta_0); - - // Divide the numerator by the denominator. - return pdiv(p, q); -} - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_MATHFUNCTIONSIMPL_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Matrix.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Matrix.h deleted file mode 100644 index 90c336d8..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Matrix.h +++ /dev/null @@ -1,461 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATRIX_H -#define EIGEN_MATRIX_H - -namespace Eigen { - -namespace internal { -template -struct traits > -{ -private: - enum { size = internal::size_at_compile_time<_Rows,_Cols>::ret }; - typedef typename find_best_packet<_Scalar,size>::type PacketScalar; - enum { - row_major_bit = _Options&RowMajor ? RowMajorBit : 0, - is_dynamic_size_storage = _MaxRows==Dynamic || _MaxCols==Dynamic, - max_size = is_dynamic_size_storage ? Dynamic : _MaxRows*_MaxCols, - default_alignment = compute_default_alignment<_Scalar,max_size>::value, - actual_alignment = ((_Options&DontAlign)==0) ? default_alignment : 0, - required_alignment = unpacket_traits::alignment, - packet_access_bit = (packet_traits<_Scalar>::Vectorizable && (EIGEN_UNALIGNED_VECTORIZE || (actual_alignment>=required_alignment))) ? PacketAccessBit : 0 - }; - -public: - typedef _Scalar Scalar; - typedef Dense StorageKind; - typedef Eigen::Index StorageIndex; - typedef MatrixXpr XprKind; - enum { - RowsAtCompileTime = _Rows, - ColsAtCompileTime = _Cols, - MaxRowsAtCompileTime = _MaxRows, - MaxColsAtCompileTime = _MaxCols, - Flags = compute_matrix_flags<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::ret, - Options = _Options, - InnerStrideAtCompileTime = 1, - OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime, - - // FIXME, the following flag in only used to define NeedsToAlign in PlainObjectBase - EvaluatorFlags = LinearAccessBit | DirectAccessBit | packet_access_bit | row_major_bit, - Alignment = actual_alignment - }; -}; -} - -/** \class Matrix - * \ingroup Core_Module - * - * \brief The matrix class, also used for vectors and row-vectors - * - * The %Matrix class is the work-horse for all \em dense (\ref dense "note") matrices and vectors within Eigen. - * Vectors are matrices with one column, and row-vectors are matrices with one row. - * - * The %Matrix class encompasses \em both fixed-size and dynamic-size objects (\ref fixedsize "note"). - * - * The first three template parameters are required: - * \tparam _Scalar Numeric type, e.g. float, double, int or std::complex. - * User defined scalar types are supported as well (see \ref user_defined_scalars "here"). - * \tparam _Rows Number of rows, or \b Dynamic - * \tparam _Cols Number of columns, or \b Dynamic - * - * The remaining template parameters are optional -- in most cases you don't have to worry about them. - * \tparam _Options A combination of either \b #RowMajor or \b #ColMajor, and of either - * \b #AutoAlign or \b #DontAlign. - * The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required - * for vectorization. It defaults to aligning matrices except for fixed sizes that aren't a multiple of the packet size. - * \tparam _MaxRows Maximum number of rows. Defaults to \a _Rows (\ref maxrows "note"). - * \tparam _MaxCols Maximum number of columns. Defaults to \a _Cols (\ref maxrows "note"). - * - * Eigen provides a number of typedefs covering the usual cases. Here are some examples: - * - * \li \c Matrix2d is a 2x2 square matrix of doubles (\c Matrix) - * \li \c Vector4f is a vector of 4 floats (\c Matrix) - * \li \c RowVector3i is a row-vector of 3 ints (\c Matrix) - * - * \li \c MatrixXf is a dynamic-size matrix of floats (\c Matrix) - * \li \c VectorXf is a dynamic-size vector of floats (\c Matrix) - * - * \li \c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\c Matrix) - * \li \c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\c Matrix) - * - * See \link matrixtypedefs this page \endlink for a complete list of predefined \em %Matrix and \em Vector typedefs. - * - * You can access elements of vectors and matrices using normal subscripting: - * - * \code - * Eigen::VectorXd v(10); - * v[0] = 0.1; - * v[1] = 0.2; - * v(0) = 0.3; - * v(1) = 0.4; - * - * Eigen::MatrixXi m(10, 10); - * m(0, 1) = 1; - * m(0, 2) = 2; - * m(0, 3) = 3; - * \endcode - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIX_PLUGIN. - * - * Some notes: - * - *
- *
\anchor dense Dense versus sparse:
- *
This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the Sparse module. - * - * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary contiguous array. - * This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero coefficients.
- * - *
\anchor fixedsize Fixed-size versus dynamic-size:
- *
Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array - * of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices, typically up to 4x4, sometimes up - * to 16x16. Larger matrices should be declared as dynamic-size even if one happens to know their size at compile-time. - * - * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime - * variables, and the array of coefficients is allocated dynamically on the heap. - * - * Note that \em dense matrices, be they Fixed-size or Dynamic-size, do not expand dynamically in the sense of a std::map. - * If you want this behavior, see the Sparse module.
- * - *
\anchor maxrows _MaxRows and _MaxCols:
- *
In most cases, one just leaves these parameters to the default values. - * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases - * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they cannot - * exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case _MaxRows and _MaxCols - * are the dimensions of the original matrix, while _Rows and _Cols are Dynamic.
- *
- * - * ABI and storage layout - * - * The table below summarizes the ABI of some possible Matrix instances which is fixed thorough the lifetime of Eigen 3. - * - * - * - * - * - * - *
Matrix typeEquivalent C structure
\code Matrix \endcode\code - * struct { - * T *data; // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0 - * Eigen::Index rows, cols; - * }; - * \endcode
\code - * Matrix - * Matrix \endcode\code - * struct { - * T *data; // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0 - * Eigen::Index size; - * }; - * \endcode
\code Matrix \endcode\code - * struct { - * T data[Rows*Cols]; // with (size_t(data)%A(Rows*Cols*sizeof(T)))==0 - * }; - * \endcode
\code Matrix \endcode\code - * struct { - * T data[MaxRows*MaxCols]; // with (size_t(data)%A(MaxRows*MaxCols*sizeof(T)))==0 - * Eigen::Index rows, cols; - * }; - * \endcode
- * Note that in this table Rows, Cols, MaxRows and MaxCols are all positive integers. A(S) is defined to the largest possible power-of-two - * smaller to EIGEN_MAX_STATIC_ALIGN_BYTES. - * - * \see MatrixBase for the majority of the API methods for matrices, \ref TopicClassHierarchy, - * \ref TopicStorageOrders - */ - -template -class Matrix - : public PlainObjectBase > -{ - public: - - /** \brief Base class typedef. - * \sa PlainObjectBase - */ - typedef PlainObjectBase Base; - - enum { Options = _Options }; - - EIGEN_DENSE_PUBLIC_INTERFACE(Matrix) - - typedef typename Base::PlainObject PlainObject; - - using Base::base; - using Base::coeffRef; - - /** - * \brief Assigns matrices to each other. - * - * \note This is a special case of the templated operator=. Its purpose is - * to prevent a default operator= from hiding the templated operator=. - * - * \callgraph - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other) - { - return Base::_set(other); - } - - /** \internal - * \brief Copies the value of the expression \a other into \c *this with automatic resizing. - * - * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), - * it will be initialized. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const DenseBase& other) - { - return Base::_set(other); - } - - /* Here, doxygen failed to copy the brief information when using \copydoc */ - - /** - * \brief Copies the generic expression \a other into *this. - * \copydetails DenseBase::operator=(const EigenBase &other) - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase &other) - { - return Base::operator=(other); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue& func) - { - return Base::operator=(func); - } - - /** \brief Default constructor. - * - * For fixed-size matrices, does nothing. - * - * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix - * is called a null matrix. This constructor is the unique way to create null matrices: resizing - * a matrix to 0 is not supported. - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix() : Base() - { - Base::_check_template_params(); - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - - // FIXME is it still needed - EIGEN_DEVICE_FUNC - explicit Matrix(internal::constructor_without_unaligned_array_assert) - : Base(internal::constructor_without_unaligned_array_assert()) - { Base::_check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED } - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - Matrix(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible::value) - : Base(std::move(other)) - { - Base::_check_template_params(); - if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic) - Base::_set_noalias(other); - } - EIGEN_DEVICE_FUNC - Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable::value) - { - other.swap(*this); - return *this; - } -#endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - - // This constructor is for both 1x1 matrices and dynamic vectors - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit Matrix(const T& x) - { - Base::_check_template_params(); - Base::template _init1(x); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y) - { - Base::_check_template_params(); - Base::template _init2(x, y); - } - #else - /** \brief Constructs a fixed-sized matrix initialized with coefficients starting at \a data */ - EIGEN_DEVICE_FUNC - explicit Matrix(const Scalar *data); - - /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors - * - * This is useful for dynamic-size vectors. For fixed-size vectors, - * it is redundant to pass these parameters, so one should use the default constructor - * Matrix() instead. - * - * \warning This constructor is disabled for fixed-size \c 1x1 matrices. For instance, - * calling Matrix(1) will call the initialization constructor: Matrix(const Scalar&). - * For fixed-size \c 1x1 matrices it is therefore recommended to use the default - * constructor Matrix() instead, especially when using one of the non standard - * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives). - */ - EIGEN_STRONG_INLINE explicit Matrix(Index dim); - /** \brief Constructs an initialized 1x1 matrix with the given coefficient */ - Matrix(const Scalar& x); - /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns. - * - * This is useful for dynamic-size matrices. For fixed-size matrices, - * it is redundant to pass these parameters, so one should use the default constructor - * Matrix() instead. - * - * \warning This constructor is disabled for fixed-size \c 1x2 and \c 2x1 vectors. For instance, - * calling Matrix2f(2,1) will call the initialization constructor: Matrix(const Scalar& x, const Scalar& y). - * For fixed-size \c 1x2 or \c 2x1 vectors it is therefore recommended to use the default - * constructor Matrix() instead, especially when using one of the non standard - * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives). - */ - EIGEN_DEVICE_FUNC - Matrix(Index rows, Index cols); - - /** \brief Constructs an initialized 2D vector with given coefficients */ - Matrix(const Scalar& x, const Scalar& y); - #endif - - /** \brief Constructs an initialized 3D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3) - m_storage.data()[0] = x; - m_storage.data()[1] = y; - m_storage.data()[2] = z; - } - /** \brief Constructs an initialized 4D vector with given coefficients */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w) - { - Base::_check_template_params(); - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4) - m_storage.data()[0] = x; - m_storage.data()[1] = y; - m_storage.data()[2] = z; - m_storage.data()[3] = w; - } - - - /** \brief Copy constructor */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const Matrix& other) : Base(other) - { } - - /** \brief Copy constructor for generic expressions. - * \sa MatrixBase::operator=(const EigenBase&) - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Matrix(const EigenBase &other) - : Base(other.derived()) - { } - - EIGEN_DEVICE_FUNC inline Index innerStride() const { return 1; } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return this->innerSize(); } - - /////////// Geometry module /////////// - - template - EIGEN_DEVICE_FUNC - explicit Matrix(const RotationBase& r); - template - EIGEN_DEVICE_FUNC - Matrix& operator=(const RotationBase& r); - - // allow to extend Matrix outside Eigen - #ifdef EIGEN_MATRIX_PLUGIN - #include EIGEN_MATRIX_PLUGIN - #endif - - protected: - template - friend struct internal::conservative_resize_like_impl; - - using Base::m_storage; -}; - -/** \defgroup matrixtypedefs Global matrix typedefs - * - * \ingroup Core_Module - * - * Eigen defines several typedef shortcuts for most common matrix and vector types. - * - * The general patterns are the following: - * - * \c MatrixSizeType where \c Size can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size, - * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd - * for complex double. - * - * For example, \c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \c MatrixXf is a dynamic-size matrix of floats. - * - * There are also \c VectorSizeType and \c RowVectorSizeType which are self-explanatory. For example, \c Vector4cf is - * a fixed-size vector of 4 complex floats. - * - * \sa class Matrix - */ - -#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Matrix##SizeSuffix##TypeSuffix; \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Vector##SizeSuffix##TypeSuffix; \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix RowVector##SizeSuffix##TypeSuffix; - -#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Matrix##Size##X##TypeSuffix; \ -/** \ingroup matrixtypedefs */ \ -typedef Matrix Matrix##X##Size##TypeSuffix; - -#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \ -EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ -EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ -EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ -EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4) - -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float, f) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double, d) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex, cf) -EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex, cd) - -#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES -#undef EIGEN_MAKE_TYPEDEFS -#undef EIGEN_MAKE_FIXED_TYPEDEFS - -} // end namespace Eigen - -#endif // EIGEN_MATRIX_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/MatrixBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/MatrixBase.h deleted file mode 100644 index 200e5774..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/MatrixBase.h +++ /dev/null @@ -1,530 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2009 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_MATRIXBASE_H -#define EIGEN_MATRIXBASE_H - -namespace Eigen { - -/** \class MatrixBase - * \ingroup Core_Module - * - * \brief Base class for all dense matrices, vectors, and expressions - * - * This class is the base that is inherited by all matrix, vector, and related expression - * types. Most of the Eigen API is contained in this class, and its base classes. Other important - * classes for the Eigen API are Matrix, and VectorwiseOp. - * - * Note that some methods are defined in other modules such as the \ref LU_Module LU module - * for all functions related to matrix inversions. - * - * \tparam Derived is the derived type, e.g. a matrix type, or an expression, etc. - * - * When writing a function taking Eigen objects as argument, if you want your function - * to take as argument any matrix, vector, or expression, just let it take a - * MatrixBase argument. As an example, here is a function printFirstRow which, given - * a matrix, vector, or expression \a x, prints the first row of \a x. - * - * \code - template - void printFirstRow(const Eigen::MatrixBase& x) - { - cout << x.row(0) << endl; - } - * \endcode - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIXBASE_PLUGIN. - * - * \sa \blank \ref TopicClassHierarchy - */ -template class MatrixBase - : public DenseBase -{ - public: -#ifndef EIGEN_PARSED_BY_DOXYGEN - typedef MatrixBase StorageBaseType; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::StorageIndex StorageIndex; - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - - typedef DenseBase Base; - using Base::RowsAtCompileTime; - using Base::ColsAtCompileTime; - using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - - using Base::derived; - using Base::const_cast_derived; - using Base::rows; - using Base::cols; - using Base::size; - using Base::coeff; - using Base::coeffRef; - using Base::lazyAssign; - using Base::eval; - using Base::operator-; - using Base::operator+=; - using Base::operator-=; - using Base::operator*=; - using Base::operator/=; - - typedef typename Base::CoeffReturnType CoeffReturnType; - typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType; - typedef typename Base::RowXpr RowXpr; - typedef typename Base::ColXpr ColXpr; -#endif // not EIGEN_PARSED_BY_DOXYGEN - - - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** type of the equivalent square matrix */ - typedef Matrix SquareMatrixType; -#endif // not EIGEN_PARSED_BY_DOXYGEN - - /** \returns the size of the main diagonal, which is min(rows(),cols()). - * \sa rows(), cols(), SizeAtCompileTime. */ - EIGEN_DEVICE_FUNC - inline Index diagonalSize() const { return (numext::mini)(rows(),cols()); } - - typedef typename Base::PlainObject PlainObject; - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal Represents a matrix with all coefficients equal to one another*/ - typedef CwiseNullaryOp,PlainObject> ConstantReturnType; - /** \internal the return type of MatrixBase::adjoint() */ - typedef typename internal::conditional::IsComplex, - CwiseUnaryOp, ConstTransposeReturnType>, - ConstTransposeReturnType - >::type AdjointReturnType; - /** \internal Return type of eigenvalues() */ - typedef Matrix, internal::traits::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType; - /** \internal the return type of identity */ - typedef CwiseNullaryOp,PlainObject> IdentityReturnType; - /** \internal the return type of unit vectors */ - typedef Block, SquareMatrixType>, - internal::traits::RowsAtCompileTime, - internal::traits::ColsAtCompileTime> BasisReturnType; -#endif // not EIGEN_PARSED_BY_DOXYGEN - -#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase -#define EIGEN_DOC_UNARY_ADDONS(X,Y) -# include "../plugins/CommonCwiseBinaryOps.h" -# include "../plugins/MatrixCwiseUnaryOps.h" -# include "../plugins/MatrixCwiseBinaryOps.h" -# ifdef EIGEN_MATRIXBASE_PLUGIN -# include EIGEN_MATRIXBASE_PLUGIN -# endif -#undef EIGEN_CURRENT_STORAGE_BASE_CLASS -#undef EIGEN_DOC_UNARY_ADDONS - - /** Special case of the template operator=, in order to prevent the compiler - * from generating a default operator= (issue hit with g++ 4.1) - */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const MatrixBase& other); - - // We cannot inherit here via Base::operator= since it is causing - // trouble with MSVC. - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator=(const DenseBase& other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const EigenBase& other); - - template - EIGEN_DEVICE_FUNC - Derived& operator=(const ReturnByValue& other); - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const MatrixBase& other); - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const MatrixBase& other); - -#ifdef __CUDACC__ - template - EIGEN_DEVICE_FUNC - const Product - operator*(const MatrixBase &other) const - { return this->lazyProduct(other); } -#else - - template - const Product - operator*(const MatrixBase &other) const; - -#endif - - template - EIGEN_DEVICE_FUNC - const Product - lazyProduct(const MatrixBase &other) const; - - template - Derived& operator*=(const EigenBase& other); - - template - void applyOnTheLeft(const EigenBase& other); - - template - void applyOnTheRight(const EigenBase& other); - - template - EIGEN_DEVICE_FUNC - const Product - operator*(const DiagonalBase &diagonal) const; - - template - EIGEN_DEVICE_FUNC - typename ScalarBinaryOpTraits::Scalar,typename internal::traits::Scalar>::ReturnType - dot(const MatrixBase& other) const; - - EIGEN_DEVICE_FUNC RealScalar squaredNorm() const; - EIGEN_DEVICE_FUNC RealScalar norm() const; - RealScalar stableNorm() const; - RealScalar blueNorm() const; - RealScalar hypotNorm() const; - EIGEN_DEVICE_FUNC const PlainObject normalized() const; - EIGEN_DEVICE_FUNC const PlainObject stableNormalized() const; - EIGEN_DEVICE_FUNC void normalize(); - EIGEN_DEVICE_FUNC void stableNormalize(); - - EIGEN_DEVICE_FUNC const AdjointReturnType adjoint() const; - EIGEN_DEVICE_FUNC void adjointInPlace(); - - typedef Diagonal DiagonalReturnType; - EIGEN_DEVICE_FUNC - DiagonalReturnType diagonal(); - - typedef typename internal::add_const >::type ConstDiagonalReturnType; - EIGEN_DEVICE_FUNC - ConstDiagonalReturnType diagonal() const; - - template struct DiagonalIndexReturnType { typedef Diagonal Type; }; - template struct ConstDiagonalIndexReturnType { typedef const Diagonal Type; }; - - template - EIGEN_DEVICE_FUNC - typename DiagonalIndexReturnType::Type diagonal(); - - template - EIGEN_DEVICE_FUNC - typename ConstDiagonalIndexReturnType::Type diagonal() const; - - typedef Diagonal DiagonalDynamicIndexReturnType; - typedef typename internal::add_const >::type ConstDiagonalDynamicIndexReturnType; - - EIGEN_DEVICE_FUNC - DiagonalDynamicIndexReturnType diagonal(Index index); - EIGEN_DEVICE_FUNC - ConstDiagonalDynamicIndexReturnType diagonal(Index index) const; - - template struct TriangularViewReturnType { typedef TriangularView Type; }; - template struct ConstTriangularViewReturnType { typedef const TriangularView Type; }; - - template - EIGEN_DEVICE_FUNC - typename TriangularViewReturnType::Type triangularView(); - template - EIGEN_DEVICE_FUNC - typename ConstTriangularViewReturnType::Type triangularView() const; - - template struct SelfAdjointViewReturnType { typedef SelfAdjointView Type; }; - template struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView Type; }; - - template - EIGEN_DEVICE_FUNC - typename SelfAdjointViewReturnType::Type selfadjointView(); - template - EIGEN_DEVICE_FUNC - typename ConstSelfAdjointViewReturnType::Type selfadjointView() const; - - const SparseView sparseView(const Scalar& m_reference = Scalar(0), - const typename NumTraits::Real& m_epsilon = NumTraits::dummy_precision()) const; - EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(); - EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(Index rows, Index cols); - EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index size, Index i); - EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index i); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitX(); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitY(); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitZ(); - EIGEN_DEVICE_FUNC static const BasisReturnType UnitW(); - - EIGEN_DEVICE_FUNC - const DiagonalWrapper asDiagonal() const; - const PermutationWrapper asPermutation() const; - - EIGEN_DEVICE_FUNC - Derived& setIdentity(); - EIGEN_DEVICE_FUNC - Derived& setIdentity(Index rows, Index cols); - - bool isIdentity(const RealScalar& prec = NumTraits::dummy_precision()) const; - bool isDiagonal(const RealScalar& prec = NumTraits::dummy_precision()) const; - - bool isUpperTriangular(const RealScalar& prec = NumTraits::dummy_precision()) const; - bool isLowerTriangular(const RealScalar& prec = NumTraits::dummy_precision()) const; - - template - bool isOrthogonal(const MatrixBase& other, - const RealScalar& prec = NumTraits::dummy_precision()) const; - bool isUnitary(const RealScalar& prec = NumTraits::dummy_precision()) const; - - /** \returns true if each coefficients of \c *this and \a other are all exactly equal. - * \warning When using floating point scalar values you probably should rather use a - * fuzzy comparison such as isApprox() - * \sa isApprox(), operator!= */ - template - EIGEN_DEVICE_FUNC inline bool operator==(const MatrixBase& other) const - { return cwiseEqual(other).all(); } - - /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other. - * \warning When using floating point scalar values you probably should rather use a - * fuzzy comparison such as isApprox() - * \sa isApprox(), operator== */ - template - EIGEN_DEVICE_FUNC inline bool operator!=(const MatrixBase& other) const - { return cwiseNotEqual(other).any(); } - - NoAlias noalias(); - - // TODO forceAlignedAccess is temporarily disabled - // Need to find a nicer workaround. - inline const Derived& forceAlignedAccess() const { return derived(); } - inline Derived& forceAlignedAccess() { return derived(); } - template inline const Derived& forceAlignedAccessIf() const { return derived(); } - template inline Derived& forceAlignedAccessIf() { return derived(); } - - EIGEN_DEVICE_FUNC Scalar trace() const; - - template EIGEN_DEVICE_FUNC RealScalar lpNorm() const; - - EIGEN_DEVICE_FUNC MatrixBase& matrix() { return *this; } - EIGEN_DEVICE_FUNC const MatrixBase& matrix() const { return *this; } - - /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix - * \sa ArrayBase::matrix() */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ArrayWrapper array() { return ArrayWrapper(derived()); } - /** \returns a const \link Eigen::ArrayBase Array \endlink expression of this matrix - * \sa ArrayBase::matrix() */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArrayWrapper array() const { return ArrayWrapper(derived()); } - -/////////// LU module /////////// - - inline const FullPivLU fullPivLu() const; - inline const PartialPivLU partialPivLu() const; - - inline const PartialPivLU lu() const; - - inline const Inverse inverse() const; - - template - inline void computeInverseAndDetWithCheck( - ResultType& inverse, - typename ResultType::Scalar& determinant, - bool& invertible, - const RealScalar& absDeterminantThreshold = NumTraits::dummy_precision() - ) const; - template - inline void computeInverseWithCheck( - ResultType& inverse, - bool& invertible, - const RealScalar& absDeterminantThreshold = NumTraits::dummy_precision() - ) const; - Scalar determinant() const; - -/////////// Cholesky module /////////// - - inline const LLT llt() const; - inline const LDLT ldlt() const; - -/////////// QR module /////////// - - inline const HouseholderQR householderQr() const; - inline const ColPivHouseholderQR colPivHouseholderQr() const; - inline const FullPivHouseholderQR fullPivHouseholderQr() const; - inline const CompleteOrthogonalDecomposition completeOrthogonalDecomposition() const; - -/////////// Eigenvalues module /////////// - - inline EigenvaluesReturnType eigenvalues() const; - inline RealScalar operatorNorm() const; - -/////////// SVD module /////////// - - inline JacobiSVD jacobiSvd(unsigned int computationOptions = 0) const; - inline BDCSVD bdcSvd(unsigned int computationOptions = 0) const; - -/////////// Geometry module /////////// - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /// \internal helper struct to form the return type of the cross product - template struct cross_product_return_type { - typedef typename ScalarBinaryOpTraits::Scalar,typename internal::traits::Scalar>::ReturnType Scalar; - typedef Matrix type; - }; - #endif // EIGEN_PARSED_BY_DOXYGEN - template - EIGEN_DEVICE_FUNC -#ifndef EIGEN_PARSED_BY_DOXYGEN - inline typename cross_product_return_type::type -#else - inline PlainObject -#endif - cross(const MatrixBase& other) const; - - template - EIGEN_DEVICE_FUNC - inline PlainObject cross3(const MatrixBase& other) const; - - EIGEN_DEVICE_FUNC - inline PlainObject unitOrthogonal(void) const; - - EIGEN_DEVICE_FUNC - inline Matrix eulerAngles(Index a0, Index a1, Index a2) const; - - // put this as separate enum value to work around possible GCC 4.3 bug (?) - enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1&&RowsAtCompileTime==1 ? ((internal::traits::Flags&RowMajorBit)==RowMajorBit ? Horizontal : Vertical) - : ColsAtCompileTime==1 ? Vertical : Horizontal }; - typedef Homogeneous HomogeneousReturnType; - EIGEN_DEVICE_FUNC - inline HomogeneousReturnType homogeneous() const; - - enum { - SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1 - }; - typedef Block::ColsAtCompileTime==1 ? SizeMinusOne : 1, - internal::traits::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne; - typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(ConstStartMinusOne,Scalar,quotient) HNormalizedReturnType; - EIGEN_DEVICE_FUNC - inline const HNormalizedReturnType hnormalized() const; - -////////// Householder module /////////// - - void makeHouseholderInPlace(Scalar& tau, RealScalar& beta); - template - void makeHouseholder(EssentialPart& essential, - Scalar& tau, RealScalar& beta) const; - template - void applyHouseholderOnTheLeft(const EssentialPart& essential, - const Scalar& tau, - Scalar* workspace); - template - void applyHouseholderOnTheRight(const EssentialPart& essential, - const Scalar& tau, - Scalar* workspace); - -///////// Jacobi module ///////// - - template - void applyOnTheLeft(Index p, Index q, const JacobiRotation& j); - template - void applyOnTheRight(Index p, Index q, const JacobiRotation& j); - -///////// SparseCore module ///////// - - template - EIGEN_STRONG_INLINE const typename SparseMatrixBase::template CwiseProductDenseReturnType::Type - cwiseProduct(const SparseMatrixBase &other) const - { - return other.cwiseProduct(derived()); - } - -///////// MatrixFunctions module ///////// - - typedef typename internal::stem_function::type StemFunction; - const MatrixExponentialReturnValue exp() const; - const MatrixFunctionReturnValue matrixFunction(StemFunction f) const; - const MatrixFunctionReturnValue cosh() const; - const MatrixFunctionReturnValue sinh() const; - const MatrixFunctionReturnValue cos() const; - const MatrixFunctionReturnValue sin() const; - const MatrixSquareRootReturnValue sqrt() const; - const MatrixLogarithmReturnValue log() const; - const MatrixPowerReturnValue pow(const RealScalar& p) const; - const MatrixComplexPowerReturnValue pow(const std::complex& p) const; - - protected: - EIGEN_DEVICE_FUNC MatrixBase() : Base() {} - - private: - EIGEN_DEVICE_FUNC explicit MatrixBase(int); - EIGEN_DEVICE_FUNC MatrixBase(int,int); - template EIGEN_DEVICE_FUNC explicit MatrixBase(const MatrixBase&); - protected: - // mixing arrays and matrices is not legal - template Derived& operator+=(const ArrayBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} - // mixing arrays and matrices is not legal - template Derived& operator-=(const ArrayBase& ) - {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;} -}; - - -/*************************************************************************** -* Implementation of matrix base methods -***************************************************************************/ - -/** replaces \c *this by \c *this * \a other. - * - * \returns a reference to \c *this - * - * Example: \include MatrixBase_applyOnTheRight.cpp - * Output: \verbinclude MatrixBase_applyOnTheRight.out - */ -template -template -inline Derived& -MatrixBase::operator*=(const EigenBase &other) -{ - other.derived().applyThisOnTheRight(derived()); - return derived(); -} - -/** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=(). - * - * Example: \include MatrixBase_applyOnTheRight.cpp - * Output: \verbinclude MatrixBase_applyOnTheRight.out - */ -template -template -inline void MatrixBase::applyOnTheRight(const EigenBase &other) -{ - other.derived().applyThisOnTheRight(derived()); -} - -/** replaces \c *this by \a other * \c *this. - * - * Example: \include MatrixBase_applyOnTheLeft.cpp - * Output: \verbinclude MatrixBase_applyOnTheLeft.out - */ -template -template -inline void MatrixBase::applyOnTheLeft(const EigenBase &other) -{ - other.derived().applyThisOnTheLeft(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_MATRIXBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/NestByValue.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/NestByValue.h deleted file mode 100644 index 01cf192e..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/NestByValue.h +++ /dev/null @@ -1,110 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NESTBYVALUE_H -#define EIGEN_NESTBYVALUE_H - -namespace Eigen { - -namespace internal { -template -struct traits > : public traits -{}; -} - -/** \class NestByValue - * \ingroup Core_Module - * - * \brief Expression which must be nested by value - * - * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value - * - * This class is the return type of MatrixBase::nestByValue() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::nestByValue() - */ -template class NestByValue - : public internal::dense_xpr_base< NestByValue >::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue) - - EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {} - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); } - EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); } - EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const - { - return m_expression.coeff(row, col); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) - { - return m_expression.const_cast_derived().coeffRef(row, col); - } - - EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const - { - return m_expression.coeff(index); - } - - EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) - { - return m_expression.const_cast_derived().coeffRef(index); - } - - template - EIGEN_DEVICE_FUNC inline const PacketScalar packet(Index row, Index col) const - { - return m_expression.template packet(row, col); - } - - template - EIGEN_DEVICE_FUNC inline void writePacket(Index row, Index col, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(row, col, x); - } - - template - EIGEN_DEVICE_FUNC inline const PacketScalar packet(Index index) const - { - return m_expression.template packet(index); - } - - template - EIGEN_DEVICE_FUNC inline void writePacket(Index index, const PacketScalar& x) - { - m_expression.const_cast_derived().template writePacket(index, x); - } - - EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; } - - protected: - const ExpressionType m_expression; -}; - -/** \returns an expression of the temporary version of *this. - */ -template -EIGEN_DEVICE_FUNC inline const NestByValue -DenseBase::nestByValue() const -{ - return NestByValue(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_NESTBYVALUE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/NoAlias.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/NoAlias.h deleted file mode 100644 index 33908010..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/NoAlias.h +++ /dev/null @@ -1,108 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NOALIAS_H -#define EIGEN_NOALIAS_H - -namespace Eigen { - -/** \class NoAlias - * \ingroup Core_Module - * - * \brief Pseudo expression providing an operator = assuming no aliasing - * - * \tparam ExpressionType the type of the object on which to do the lazy assignment - * - * This class represents an expression with special assignment operators - * assuming no aliasing between the target expression and the source expression. - * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression. - * It is the return type of MatrixBase::noalias() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::noalias() - */ -template class StorageBase> -class NoAlias -{ - public: - typedef typename ExpressionType::Scalar Scalar; - - explicit NoAlias(ExpressionType& expression) : m_expression(expression) {} - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase& other) - { - call_assignment_no_alias(m_expression, other.derived(), internal::assign_op()); - return m_expression; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase& other) - { - call_assignment_no_alias(m_expression, other.derived(), internal::add_assign_op()); - return m_expression; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase& other) - { - call_assignment_no_alias(m_expression, other.derived(), internal::sub_assign_op()); - return m_expression; - } - - EIGEN_DEVICE_FUNC - ExpressionType& expression() const - { - return m_expression; - } - - protected: - ExpressionType& m_expression; -}; - -/** \returns a pseudo expression of \c *this with an operator= assuming - * no aliasing between \c *this and the source expression. - * - * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag. - * Currently, even though several expressions may alias, only product - * expressions have this flag. Therefore, noalias() is only usefull when - * the source expression contains a matrix product. - * - * Here are some examples where noalias is usefull: - * \code - * D.noalias() = A * B; - * D.noalias() += A.transpose() * B; - * D.noalias() -= 2 * A * B.adjoint(); - * \endcode - * - * On the other hand the following example will lead to a \b wrong result: - * \code - * A.noalias() = A * B; - * \endcode - * because the result matrix A is also an operand of the matrix product. Therefore, - * there is no alternative than evaluating A * B in a temporary, that is the default - * behavior when you write: - * \code - * A = A * B; - * \endcode - * - * \sa class NoAlias - */ -template -NoAlias MatrixBase::noalias() -{ - return NoAlias(derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_NOALIAS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/NumTraits.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/NumTraits.h deleted file mode 100644 index aebc0c25..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/NumTraits.h +++ /dev/null @@ -1,246 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NUMTRAITS_H -#define EIGEN_NUMTRAITS_H - -namespace Eigen { - -namespace internal { - -// default implementation of digits10(), based on numeric_limits if specialized, -// 0 for integer types, and log10(epsilon()) otherwise. -template< typename T, - bool use_numeric_limits = std::numeric_limits::is_specialized, - bool is_integer = NumTraits::IsInteger> -struct default_digits10_impl -{ - static int run() { return std::numeric_limits::digits10; } -}; - -template -struct default_digits10_impl // Floating point -{ - static int run() { - using std::log10; - using std::ceil; - typedef typename NumTraits::Real Real; - return int(ceil(-log10(NumTraits::epsilon()))); - } -}; - -template -struct default_digits10_impl // Integer -{ - static int run() { return 0; } -}; - -} // end namespace internal - -/** \class NumTraits - * \ingroup Core_Module - * - * \brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen. - * - * \tparam T the numeric type at hand - * - * This class stores enums, typedefs and static methods giving information about a numeric type. - * - * The provided data consists of: - * \li A typedef \c Real, giving the "real part" type of \a T. If \a T is already real, - * then \c Real is just a typedef to \a T. If \a T is \c std::complex then \c Real - * is a typedef to \a U. - * \li A typedef \c NonInteger, giving the type that should be used for operations producing non-integral values, - * such as quotients, square roots, etc. If \a T is a floating-point type, then this typedef just gives - * \a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to - * take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is - * only intended as a helper for code that needs to explicitly promote types. - * \li A typedef \c Literal giving the type to use for numeric literals such as "2" or "0.5". For instance, for \c std::complex, Literal is defined as \c U. - * Of course, this type must be fully compatible with \a T. In doubt, just use \a T here. - * \li A typedef \a Nested giving the type to use to nest a value inside of the expression tree. If you don't know what - * this means, just use \a T here. - * \li An enum value \a IsComplex. It is equal to 1 if \a T is a \c std::complex - * type, and to 0 otherwise. - * \li An enum value \a IsInteger. It is equal to \c 1 if \a T is an integer type such as \c int, - * and to \c 0 otherwise. - * \li Enum values ReadCost, AddCost and MulCost representing a rough estimate of the number of CPU cycles needed - * to by move / add / mul instructions respectively, assuming the data is already stored in CPU registers. - * Stay vague here. No need to do architecture-specific stuff. If you don't know what this means, just use \c Eigen::HugeCost. - * \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned. - * \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must - * be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise. - * \li An epsilon() function which, unlike std::numeric_limits::epsilon(), - * it returns a \a Real instead of a \a T. - * \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default - * value by the fuzzy comparison operators. - * \li highest() and lowest() functions returning the highest and lowest possible values respectively. - * \li digits10() function returning the number of decimal digits that can be represented without change. This is - * the analogue of std::numeric_limits::digits10 - * which is used as the default implementation if specialized. - */ - -template struct GenericNumTraits -{ - enum { - IsInteger = std::numeric_limits::is_integer, - IsSigned = std::numeric_limits::is_signed, - IsComplex = 0, - RequireInitialization = internal::is_arithmetic::value ? 0 : 1, - ReadCost = 1, - AddCost = 1, - MulCost = 1 - }; - - typedef T Real; - typedef typename internal::conditional< - IsInteger, - typename internal::conditional::type, - T - >::type NonInteger; - typedef T Nested; - typedef T Literal; - - EIGEN_DEVICE_FUNC - static inline Real epsilon() - { - return numext::numeric_limits::epsilon(); - } - - EIGEN_DEVICE_FUNC - static inline int digits10() - { - return internal::default_digits10_impl::run(); - } - - EIGEN_DEVICE_FUNC - static inline Real dummy_precision() - { - // make sure to override this for floating-point types - return Real(0); - } - - - EIGEN_DEVICE_FUNC - static inline T highest() { - return (numext::numeric_limits::max)(); - } - - EIGEN_DEVICE_FUNC - static inline T lowest() { - return IsInteger ? (numext::numeric_limits::min)() : (-(numext::numeric_limits::max)()); - } - - EIGEN_DEVICE_FUNC - static inline T infinity() { - return numext::numeric_limits::infinity(); - } - - EIGEN_DEVICE_FUNC - static inline T quiet_NaN() { - return numext::numeric_limits::quiet_NaN(); - } -}; - -template struct NumTraits : GenericNumTraits -{}; - -template<> struct NumTraits - : GenericNumTraits -{ - EIGEN_DEVICE_FUNC - static inline float dummy_precision() { return 1e-5f; } -}; - -template<> struct NumTraits : GenericNumTraits -{ - EIGEN_DEVICE_FUNC - static inline double dummy_precision() { return 1e-12; } -}; - -template<> struct NumTraits - : GenericNumTraits -{ - static inline long double dummy_precision() { return 1e-15l; } -}; - -template struct NumTraits > - : GenericNumTraits > -{ - typedef _Real Real; - typedef typename NumTraits<_Real>::Literal Literal; - enum { - IsComplex = 1, - RequireInitialization = NumTraits<_Real>::RequireInitialization, - ReadCost = 2 * NumTraits<_Real>::ReadCost, - AddCost = 2 * NumTraits::AddCost, - MulCost = 4 * NumTraits::MulCost + 2 * NumTraits::AddCost - }; - - EIGEN_DEVICE_FUNC - static inline Real epsilon() { return NumTraits::epsilon(); } - EIGEN_DEVICE_FUNC - static inline Real dummy_precision() { return NumTraits::dummy_precision(); } - EIGEN_DEVICE_FUNC - static inline int digits10() { return NumTraits::digits10(); } -}; - -template -struct NumTraits > -{ - typedef Array ArrayType; - typedef typename NumTraits::Real RealScalar; - typedef Array Real; - typedef typename NumTraits::NonInteger NonIntegerScalar; - typedef Array NonInteger; - typedef ArrayType & Nested; - typedef typename NumTraits::Literal Literal; - - enum { - IsComplex = NumTraits::IsComplex, - IsInteger = NumTraits::IsInteger, - IsSigned = NumTraits::IsSigned, - RequireInitialization = 1, - ReadCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * NumTraits::ReadCost, - AddCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * NumTraits::AddCost, - MulCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * NumTraits::MulCost - }; - - EIGEN_DEVICE_FUNC - static inline RealScalar epsilon() { return NumTraits::epsilon(); } - EIGEN_DEVICE_FUNC - static inline RealScalar dummy_precision() { return NumTraits::dummy_precision(); } -}; - -template<> struct NumTraits - : GenericNumTraits -{ - enum { - RequireInitialization = 1, - ReadCost = HugeCost, - AddCost = HugeCost, - MulCost = HugeCost - }; - - static inline int digits10() { return 0; } - -private: - static inline std::string epsilon(); - static inline std::string dummy_precision(); - static inline std::string lowest(); - static inline std::string highest(); - static inline std::string infinity(); - static inline std::string quiet_NaN(); -}; - -// Empty specialization for void to allow template specialization based on NumTraits::Real with T==void and SFINAE. -template<> struct NumTraits {}; - -} // end namespace Eigen - -#endif // EIGEN_NUMTRAITS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/PermutationMatrix.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/PermutationMatrix.h deleted file mode 100644 index b1fb455b..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/PermutationMatrix.h +++ /dev/null @@ -1,633 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// Copyright (C) 2009-2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_PERMUTATIONMATRIX_H -#define EIGEN_PERMUTATIONMATRIX_H - -namespace Eigen { - -namespace internal { - -enum PermPermProduct_t {PermPermProduct}; - -} // end namespace internal - -/** \class PermutationBase - * \ingroup Core_Module - * - * \brief Base class for permutations - * - * \tparam Derived the derived class - * - * This class is the base class for all expressions representing a permutation matrix, - * internally stored as a vector of integers. - * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix - * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have: - * \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f] - * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have: - * \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f] - * - * Permutation matrices are square and invertible. - * - * Notice that in addition to the member functions and operators listed here, there also are non-member - * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase) - * on either side. - * - * \sa class PermutationMatrix, class PermutationWrapper - */ -template -class PermutationBase : public EigenBase -{ - typedef internal::traits Traits; - typedef EigenBase Base; - public: - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - enum { - Flags = Traits::Flags, - RowsAtCompileTime = Traits::RowsAtCompileTime, - ColsAtCompileTime = Traits::ColsAtCompileTime, - MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = Traits::MaxColsAtCompileTime - }; - typedef typename Traits::StorageIndex StorageIndex; - typedef Matrix - DenseMatrixType; - typedef PermutationMatrix - PlainPermutationType; - typedef PlainPermutationType PlainObject; - using Base::derived; - typedef Inverse InverseReturnType; - typedef void Scalar; - #endif - - /** Copies the other permutation into *this */ - template - Derived& operator=(const PermutationBase& other) - { - indices() = other.indices(); - return derived(); - } - - /** Assignment from the Transpositions \a tr */ - template - Derived& operator=(const TranspositionsBase& tr) - { - setIdentity(tr.size()); - for(Index k=size()-1; k>=0; --k) - applyTranspositionOnTheRight(k,tr.coeff(k)); - return derived(); - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - Derived& operator=(const PermutationBase& other) - { - indices() = other.indices(); - return derived(); - } - #endif - - /** \returns the number of rows */ - inline Index rows() const { return Index(indices().size()); } - - /** \returns the number of columns */ - inline Index cols() const { return Index(indices().size()); } - - /** \returns the size of a side of the respective square matrix, i.e., the number of indices */ - inline Index size() const { return Index(indices().size()); } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void evalTo(MatrixBase& other) const - { - other.setZero(); - for (Index i=0; i=0 && j>=0 && i=0 && j>=0 && i - void assignTranspose(const PermutationBase& other) - { - for (Index i=0; i - void assignProduct(const Lhs& lhs, const Rhs& rhs) - { - eigen_assert(lhs.cols() == rhs.rows()); - for (Index i=0; i - inline PlainPermutationType operator*(const PermutationBase& other) const - { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); } - - /** \returns the product of a permutation with another inverse permutation. - * - * \note \blank \note_try_to_help_rvo - */ - template - inline PlainPermutationType operator*(const InverseImpl& other) const - { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); } - - /** \returns the product of an inverse permutation with another permutation. - * - * \note \blank \note_try_to_help_rvo - */ - template friend - inline PlainPermutationType operator*(const InverseImpl& other, const PermutationBase& perm) - { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); } - - /** \returns the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the permutation. - * - * This function is O(\c n) procedure allocating a buffer of \c n booleans. - */ - Index determinant() const - { - Index res = 1; - Index n = size(); - Matrix mask(n); - mask.fill(false); - Index r = 0; - while(r < n) - { - // search for the next seed - while(r=n) - break; - // we got one, let's follow it until we are back to the seed - Index k0 = r++; - mask.coeffRef(k0) = true; - for(Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k)) - { - mask.coeffRef(k) = true; - res = -res; - } - } - return res; - } - - protected: - -}; - -namespace internal { -template -struct traits > - : traits > -{ - typedef PermutationStorage StorageKind; - typedef Matrix<_StorageIndex, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType; - typedef _StorageIndex StorageIndex; - typedef void Scalar; -}; -} - -/** \class PermutationMatrix - * \ingroup Core_Module - * - * \brief Permutation matrix - * - * \tparam SizeAtCompileTime the number of rows/cols, or Dynamic - * \tparam MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it. - * \tparam _StorageIndex the integer type of the indices - * - * This class represents a permutation matrix, internally stored as a vector of integers. - * - * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix - */ -template -class PermutationMatrix : public PermutationBase > -{ - typedef PermutationBase Base; - typedef internal::traits Traits; - public: - - typedef const PermutationMatrix& Nested; - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - typedef typename Traits::StorageIndex StorageIndex; - #endif - - inline PermutationMatrix() - {} - - /** Constructs an uninitialized permutation matrix of given size. - */ - explicit inline PermutationMatrix(Index size) : m_indices(size) - { - eigen_internal_assert(size <= NumTraits::highest()); - } - - /** Copy constructor. */ - template - inline PermutationMatrix(const PermutationBase& other) - : m_indices(other.indices()) {} - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** Standard copy constructor. Defined only to prevent a default copy constructor - * from hiding the other templated constructor */ - inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {} - #endif - - /** Generic constructor from expression of the indices. The indices - * array has the meaning that the permutations sends each integer i to indices[i]. - * - * \warning It is your responsibility to check that the indices array that you passes actually - * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the - * array's size. - */ - template - explicit inline PermutationMatrix(const MatrixBase& indices) : m_indices(indices) - {} - - /** Convert the Transpositions \a tr to a permutation matrix */ - template - explicit PermutationMatrix(const TranspositionsBase& tr) - : m_indices(tr.size()) - { - *this = tr; - } - - /** Copies the other permutation into *this */ - template - PermutationMatrix& operator=(const PermutationBase& other) - { - m_indices = other.indices(); - return *this; - } - - /** Assignment from the Transpositions \a tr */ - template - PermutationMatrix& operator=(const TranspositionsBase& tr) - { - return Base::operator=(tr.derived()); - } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - PermutationMatrix& operator=(const PermutationMatrix& other) - { - m_indices = other.m_indices; - return *this; - } - #endif - - /** const version of indices(). */ - const IndicesType& indices() const { return m_indices; } - /** \returns a reference to the stored array representing the permutation. */ - IndicesType& indices() { return m_indices; } - - - /**** multiplication helpers to hopefully get RVO ****/ - -#ifndef EIGEN_PARSED_BY_DOXYGEN - template - PermutationMatrix(const InverseImpl& other) - : m_indices(other.derived().nestedExpression().size()) - { - eigen_internal_assert(m_indices.size() <= NumTraits::highest()); - StorageIndex end = StorageIndex(m_indices.size()); - for (StorageIndex i=0; i - PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs) - : m_indices(lhs.indices().size()) - { - Base::assignProduct(lhs,rhs); - } -#endif - - protected: - - IndicesType m_indices; -}; - - -namespace internal { -template -struct traits,_PacketAccess> > - : traits > -{ - typedef PermutationStorage StorageKind; - typedef Map, _PacketAccess> IndicesType; - typedef _StorageIndex StorageIndex; - typedef void Scalar; -}; -} - -template -class Map,_PacketAccess> - : public PermutationBase,_PacketAccess> > -{ - typedef PermutationBase Base; - typedef internal::traits Traits; - public: - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - typedef typename IndicesType::Scalar StorageIndex; - #endif - - inline Map(const StorageIndex* indicesPtr) - : m_indices(indicesPtr) - {} - - inline Map(const StorageIndex* indicesPtr, Index size) - : m_indices(indicesPtr,size) - {} - - /** Copies the other permutation into *this */ - template - Map& operator=(const PermutationBase& other) - { return Base::operator=(other.derived()); } - - /** Assignment from the Transpositions \a tr */ - template - Map& operator=(const TranspositionsBase& tr) - { return Base::operator=(tr.derived()); } - - #ifndef EIGEN_PARSED_BY_DOXYGEN - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - Map& operator=(const Map& other) - { - m_indices = other.m_indices; - return *this; - } - #endif - - /** const version of indices(). */ - const IndicesType& indices() const { return m_indices; } - /** \returns a reference to the stored array representing the permutation. */ - IndicesType& indices() { return m_indices; } - - protected: - - IndicesType m_indices; -}; - -template class TranspositionsWrapper; -namespace internal { -template -struct traits > -{ - typedef PermutationStorage StorageKind; - typedef void Scalar; - typedef typename _IndicesType::Scalar StorageIndex; - typedef _IndicesType IndicesType; - enum { - RowsAtCompileTime = _IndicesType::SizeAtCompileTime, - ColsAtCompileTime = _IndicesType::SizeAtCompileTime, - MaxRowsAtCompileTime = IndicesType::MaxSizeAtCompileTime, - MaxColsAtCompileTime = IndicesType::MaxSizeAtCompileTime, - Flags = 0 - }; -}; -} - -/** \class PermutationWrapper - * \ingroup Core_Module - * - * \brief Class to view a vector of integers as a permutation matrix - * - * \tparam _IndicesType the type of the vector of integer (can be any compatible expression) - * - * This class allows to view any vector expression of integers as a permutation matrix. - * - * \sa class PermutationBase, class PermutationMatrix - */ -template -class PermutationWrapper : public PermutationBase > -{ - typedef PermutationBase Base; - typedef internal::traits Traits; - public: - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename Traits::IndicesType IndicesType; - #endif - - inline PermutationWrapper(const IndicesType& indices) - : m_indices(indices) - {} - - /** const version of indices(). */ - const typename internal::remove_all::type& - indices() const { return m_indices; } - - protected: - - typename IndicesType::Nested m_indices; -}; - - -/** \returns the matrix with the permutation applied to the columns. - */ -template -EIGEN_DEVICE_FUNC -const Product -operator*(const MatrixBase &matrix, - const PermutationBase& permutation) -{ - return Product - (matrix.derived(), permutation.derived()); -} - -/** \returns the matrix with the permutation applied to the rows. - */ -template -EIGEN_DEVICE_FUNC -const Product -operator*(const PermutationBase &permutation, - const MatrixBase& matrix) -{ - return Product - (permutation.derived(), matrix.derived()); -} - - -template -class InverseImpl - : public EigenBase > -{ - typedef typename PermutationType::PlainPermutationType PlainPermutationType; - typedef internal::traits PermTraits; - protected: - InverseImpl() {} - public: - typedef Inverse InverseType; - using EigenBase >::derived; - - #ifndef EIGEN_PARSED_BY_DOXYGEN - typedef typename PermutationType::DenseMatrixType DenseMatrixType; - enum { - RowsAtCompileTime = PermTraits::RowsAtCompileTime, - ColsAtCompileTime = PermTraits::ColsAtCompileTime, - MaxRowsAtCompileTime = PermTraits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = PermTraits::MaxColsAtCompileTime - }; - #endif - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - void evalTo(MatrixBase& other) const - { - other.setZero(); - for (Index i=0; i friend - const Product - operator*(const MatrixBase& matrix, const InverseType& trPerm) - { - return Product(matrix.derived(), trPerm.derived()); - } - - /** \returns the matrix with the inverse permutation applied to the rows. - */ - template - const Product - operator*(const MatrixBase& matrix) const - { - return Product(derived(), matrix.derived()); - } -}; - -template -const PermutationWrapper MatrixBase::asPermutation() const -{ - return derived(); -} - -namespace internal { - -template<> struct AssignmentKind { typedef EigenBase2EigenBase Kind; }; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_PERMUTATIONMATRIX_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/PlainObjectBase.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/PlainObjectBase.h deleted file mode 100644 index 77f4f606..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/PlainObjectBase.h +++ /dev/null @@ -1,1031 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_DENSESTORAGEBASE_H -#define EIGEN_DENSESTORAGEBASE_H - -#if defined(EIGEN_INITIALIZE_MATRICES_BY_ZERO) -# define EIGEN_INITIALIZE_COEFFS -# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i::quiet_NaN(); -#else -# undef EIGEN_INITIALIZE_COEFFS -# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED -#endif - -namespace Eigen { - -namespace internal { - -template struct check_rows_cols_for_overflow { - template - EIGEN_DEVICE_FUNC - static EIGEN_ALWAYS_INLINE void run(Index, Index) - { - } -}; - -template<> struct check_rows_cols_for_overflow { - template - EIGEN_DEVICE_FUNC - static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols) - { - // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242 - // we assume Index is signed - Index max_index = (std::size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed - bool error = (rows == 0 || cols == 0) ? false - : (rows > max_index / cols); - if (error) - throw_std_bad_alloc(); - } -}; - -template -struct conservative_resize_like_impl; - -template struct matrix_swap_impl; - -} // end namespace internal - -#ifdef EIGEN_PARSED_BY_DOXYGEN -namespace doxygen { - -// This is a workaround to doxygen not being able to understand the inheritance logic -// when it is hidden by the dense_xpr_base helper struct. -// Moreover, doxygen fails to include members that are not documented in the declaration body of -// MatrixBase if we inherits MatrixBase >, -// this is why we simply inherits MatrixBase, though this does not make sense. - -/** This class is just a workaround for Doxygen and it does not not actually exist. */ -template struct dense_xpr_base_dispatcher; -/** This class is just a workaround for Doxygen and it does not not actually exist. */ -template -struct dense_xpr_base_dispatcher > - : public MatrixBase {}; -/** This class is just a workaround for Doxygen and it does not not actually exist. */ -template -struct dense_xpr_base_dispatcher > - : public ArrayBase {}; - -} // namespace doxygen - -/** \class PlainObjectBase - * \ingroup Core_Module - * \brief %Dense storage base class for matrices and arrays. - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_PLAINOBJECTBASE_PLUGIN. - * - * \tparam Derived is the derived type, e.g., a Matrix or Array - * - * \sa \ref TopicClassHierarchy - */ -template -class PlainObjectBase : public doxygen::dense_xpr_base_dispatcher -#else -template -class PlainObjectBase : public internal::dense_xpr_base::type -#endif -{ - public: - enum { Options = internal::traits::Options }; - typedef typename internal::dense_xpr_base::type Base; - - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Scalar Scalar; - - typedef typename internal::packet_traits::type PacketScalar; - typedef typename NumTraits::Real RealScalar; - typedef Derived DenseType; - - using Base::RowsAtCompileTime; - using Base::ColsAtCompileTime; - using Base::SizeAtCompileTime; - using Base::MaxRowsAtCompileTime; - using Base::MaxColsAtCompileTime; - using Base::MaxSizeAtCompileTime; - using Base::IsVectorAtCompileTime; - using Base::Flags; - - template friend class Eigen::Map; - friend class Eigen::Map; - typedef Eigen::Map MapType; - friend class Eigen::Map; - typedef const Eigen::Map ConstMapType; -#if EIGEN_MAX_ALIGN_BYTES>0 - // for EIGEN_MAX_ALIGN_BYTES==0, AlignedMax==Unaligned, and many compilers generate warnings for friend-ing a class twice. - friend class Eigen::Map; - friend class Eigen::Map; -#endif - typedef Eigen::Map AlignedMapType; - typedef const Eigen::Map ConstAlignedMapType; - template struct StridedMapType { typedef Eigen::Map type; }; - template struct StridedConstMapType { typedef Eigen::Map type; }; - template struct StridedAlignedMapType { typedef Eigen::Map type; }; - template struct StridedConstAlignedMapType { typedef Eigen::Map type; }; - - protected: - DenseStorage m_storage; - - public: - enum { NeedsToAlign = (SizeAtCompileTime != Dynamic) && (internal::traits::Alignment>0) }; - EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign) - - EIGEN_DEVICE_FUNC - Base& base() { return *static_cast(this); } - EIGEN_DEVICE_FUNC - const Base& base() const { return *static_cast(this); } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rows() const { return m_storage.rows(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index cols() const { return m_storage.cols(); } - - /** This is an overloaded version of DenseCoeffsBase::coeff(Index,Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeff(Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff(Index rowId, Index colId) const - { - if(Flags & RowMajorBit) - return m_storage.data()[colId + rowId * m_storage.cols()]; - else // column-major - return m_storage.data()[rowId + colId * m_storage.rows()]; - } - - /** This is an overloaded version of DenseCoeffsBase::coeff(Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeff(Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const - { - return m_storage.data()[index]; - } - - /** This is an overloaded version of DenseCoeffsBase::coeffRef(Index,Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeffRef(Index,Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId) - { - if(Flags & RowMajorBit) - return m_storage.data()[colId + rowId * m_storage.cols()]; - else // column-major - return m_storage.data()[rowId + colId * m_storage.rows()]; - } - - /** This is an overloaded version of DenseCoeffsBase::coeffRef(Index) const - * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts. - * - * See DenseCoeffsBase::coeffRef(Index) const for details. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) - { - return m_storage.data()[index]; - } - - /** This is the const version of coeffRef(Index,Index) which is thus synonym of coeff(Index,Index). - * It is provided for convenience. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeffRef(Index rowId, Index colId) const - { - if(Flags & RowMajorBit) - return m_storage.data()[colId + rowId * m_storage.cols()]; - else // column-major - return m_storage.data()[rowId + colId * m_storage.rows()]; - } - - /** This is the const version of coeffRef(Index) which is thus synonym of coeff(Index). - * It is provided for convenience. */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const - { - return m_storage.data()[index]; - } - - /** \internal */ - template - EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const - { - return internal::ploadt - (m_storage.data() + (Flags & RowMajorBit - ? colId + rowId * m_storage.cols() - : rowId + colId * m_storage.rows())); - } - - /** \internal */ - template - EIGEN_STRONG_INLINE PacketScalar packet(Index index) const - { - return internal::ploadt(m_storage.data() + index); - } - - /** \internal */ - template - EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val) - { - internal::pstoret - (m_storage.data() + (Flags & RowMajorBit - ? colId + rowId * m_storage.cols() - : rowId + colId * m_storage.rows()), val); - } - - /** \internal */ - template - EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val) - { - internal::pstoret(m_storage.data() + index, val); - } - - /** \returns a const pointer to the data array of this matrix */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const - { return m_storage.data(); } - - /** \returns a pointer to the data array of this matrix */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data() - { return m_storage.data(); } - - /** Resizes \c *this to a \a rows x \a cols matrix. - * - * This method is intended for dynamic-size matrices, although it is legal to call it on any - * matrix as long as fixed dimensions are left unchanged. If you only want to change the number - * of rows and/or of columns, you can use resize(NoChange_t, Index), resize(Index, NoChange_t). - * - * If the current number of coefficients of \c *this exactly matches the - * product \a rows * \a cols, then no memory allocation is performed and - * the current values are left unchanged. In all other cases, including - * shrinking, the data is reallocated and all previous values are lost. - * - * Example: \include Matrix_resize_int_int.cpp - * Output: \verbinclude Matrix_resize_int_int.out - * - * \sa resize(Index) for vectors, resize(NoChange_t, Index), resize(Index, NoChange_t) - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void resize(Index rows, Index cols) - { - eigen_assert( EIGEN_IMPLIES(RowsAtCompileTime!=Dynamic,rows==RowsAtCompileTime) - && EIGEN_IMPLIES(ColsAtCompileTime!=Dynamic,cols==ColsAtCompileTime) - && EIGEN_IMPLIES(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic,rows<=MaxRowsAtCompileTime) - && EIGEN_IMPLIES(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic,cols<=MaxColsAtCompileTime) - && rows>=0 && cols>=0 && "Invalid sizes when resizing a matrix or array."); - internal::check_rows_cols_for_overflow::run(rows, cols); - #ifdef EIGEN_INITIALIZE_COEFFS - Index size = rows*cols; - bool size_changed = size != this->size(); - m_storage.resize(size, rows, cols); - if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - #else - m_storage.resize(rows*cols, rows, cols); - #endif - } - - /** Resizes \c *this to a vector of length \a size - * - * \only_for_vectors. This method does not work for - * partially dynamic matrices when the static dimension is anything other - * than 1. For example it will not work with Matrix. - * - * Example: \include Matrix_resize_int.cpp - * Output: \verbinclude Matrix_resize_int.out - * - * \sa resize(Index,Index), resize(NoChange_t, Index), resize(Index, NoChange_t) - */ - EIGEN_DEVICE_FUNC - inline void resize(Index size) - { - EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase) - eigen_assert(((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size<=MaxSizeAtCompileTime)) || SizeAtCompileTime == size) && size>=0); - #ifdef EIGEN_INITIALIZE_COEFFS - bool size_changed = size != this->size(); - #endif - if(RowsAtCompileTime == 1) - m_storage.resize(size, 1, size); - else - m_storage.resize(size, size, 1); - #ifdef EIGEN_INITIALIZE_COEFFS - if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - #endif - } - - /** Resizes the matrix, changing only the number of columns. For the parameter of type NoChange_t, just pass the special value \c NoChange - * as in the example below. - * - * Example: \include Matrix_resize_NoChange_int.cpp - * Output: \verbinclude Matrix_resize_NoChange_int.out - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - inline void resize(NoChange_t, Index cols) - { - resize(rows(), cols); - } - - /** Resizes the matrix, changing only the number of rows. For the parameter of type NoChange_t, just pass the special value \c NoChange - * as in the example below. - * - * Example: \include Matrix_resize_int_NoChange.cpp - * Output: \verbinclude Matrix_resize_int_NoChange.out - * - * \sa resize(Index,Index) - */ - EIGEN_DEVICE_FUNC - inline void resize(Index rows, NoChange_t) - { - resize(rows, cols()); - } - - /** Resizes \c *this to have the same dimensions as \a other. - * Takes care of doing all the checking that's needed. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void resizeLike(const EigenBase& _other) - { - const OtherDerived& other = _other.derived(); - internal::check_rows_cols_for_overflow::run(other.rows(), other.cols()); - const Index othersize = other.rows()*other.cols(); - if(RowsAtCompileTime == 1) - { - eigen_assert(other.rows() == 1 || other.cols() == 1); - resize(1, othersize); - } - else if(ColsAtCompileTime == 1) - { - eigen_assert(other.rows() == 1 || other.cols() == 1); - resize(othersize, 1); - } - else resize(other.rows(), other.cols()); - } - - /** Resizes the matrix to \a rows x \a cols while leaving old values untouched. - * - * The method is intended for matrices of dynamic size. If you only want to change the number - * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or - * conservativeResize(Index, NoChange_t). - * - * Matrices are resized relative to the top-left element. In case values need to be - * appended to the matrix they will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols) - { - internal::conservative_resize_like_impl::run(*this, rows, cols); - } - - /** Resizes the matrix to \a rows x \a cols while leaving old values untouched. - * - * As opposed to conservativeResize(Index rows, Index cols), this version leaves - * the number of columns unchanged. - * - * In case the matrix is growing, new rows will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(Index rows, NoChange_t) - { - // Note: see the comment in conservativeResize(Index,Index) - conservativeResize(rows, cols()); - } - - /** Resizes the matrix to \a rows x \a cols while leaving old values untouched. - * - * As opposed to conservativeResize(Index rows, Index cols), this version leaves - * the number of rows unchanged. - * - * In case the matrix is growing, new columns will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index cols) - { - // Note: see the comment in conservativeResize(Index,Index) - conservativeResize(rows(), cols); - } - - /** Resizes the vector to \a size while retaining old values. - * - * \only_for_vectors. This method does not work for - * partially dynamic matrices when the static dimension is anything other - * than 1. For example it will not work with Matrix. - * - * When values are appended, they will be uninitialized. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResize(Index size) - { - internal::conservative_resize_like_impl::run(*this, size); - } - - /** Resizes the matrix to \a rows x \a cols of \c other, while leaving old values untouched. - * - * The method is intended for matrices of dynamic size. If you only want to change the number - * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or - * conservativeResize(Index, NoChange_t). - * - * Matrices are resized relative to the top-left element. In case values need to be - * appended to the matrix they will copied from \c other. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase& other) - { - internal::conservative_resize_like_impl::run(*this, other); - } - - /** This is a special case of the templated operator=. Its purpose is to - * prevent a default operator= from hiding the templated operator=. - */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other) - { - return _set(other); - } - - /** \sa MatrixBase::lazyAssign() */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase& other) - { - _resize_to_match(other); - return Base::lazyAssign(other.derived()); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue& func) - { - resize(func.rows(), func.cols()); - return Base::operator=(func); - } - - // Prevent user from trying to instantiate PlainObjectBase objects - // by making all its constructor protected. See bug 1074. - protected: - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase() : m_storage() - { -// _check_template_params(); -// EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - -#ifndef EIGEN_PARSED_BY_DOXYGEN - // FIXME is it still needed ? - /** \internal */ - EIGEN_DEVICE_FUNC - explicit PlainObjectBase(internal::constructor_without_unaligned_array_assert) - : m_storage(internal::constructor_without_unaligned_array_assert()) - { -// _check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } -#endif - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC - PlainObjectBase(PlainObjectBase&& other) EIGEN_NOEXCEPT - : m_storage( std::move(other.m_storage) ) - { - } - - EIGEN_DEVICE_FUNC - PlainObjectBase& operator=(PlainObjectBase&& other) EIGEN_NOEXCEPT - { - using std::swap; - swap(m_storage, other.m_storage); - return *this; - } -#endif - - /** Copy constructor */ - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const PlainObjectBase& other) - : Base(), m_storage(other.m_storage) { } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(Index size, Index rows, Index cols) - : m_storage(size, rows, cols) - { -// _check_template_params(); -// EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - - /** \sa PlainObjectBase::operator=(const EigenBase&) */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const DenseBase &other) - : m_storage() - { - _check_template_params(); - resizeLike(other); - _set_noalias(other); - } - - /** \sa PlainObjectBase::operator=(const EigenBase&) */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase &other) - : m_storage() - { - _check_template_params(); - resizeLike(other); - *this = other.derived(); - } - /** \brief Copy constructor with in-place evaluation */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PlainObjectBase(const ReturnByValue& other) - { - _check_template_params(); - // FIXME this does not automatically transpose vectors if necessary - resize(other.rows(), other.cols()); - other.evalTo(this->derived()); - } - - public: - - /** \brief Copies the generic expression \a other into *this. - * \copydetails DenseBase::operator=(const EigenBase &other) - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& operator=(const EigenBase &other) - { - _resize_to_match(other); - Base::operator=(other.derived()); - return this->derived(); - } - - /** \name Map - * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects, - * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned - * \a data pointers. - * - * \see class Map - */ - //@{ - static inline ConstMapType Map(const Scalar* data) - { return ConstMapType(data); } - static inline MapType Map(Scalar* data) - { return MapType(data); } - static inline ConstMapType Map(const Scalar* data, Index size) - { return ConstMapType(data, size); } - static inline MapType Map(Scalar* data, Index size) - { return MapType(data, size); } - static inline ConstMapType Map(const Scalar* data, Index rows, Index cols) - { return ConstMapType(data, rows, cols); } - static inline MapType Map(Scalar* data, Index rows, Index cols) - { return MapType(data, rows, cols); } - - static inline ConstAlignedMapType MapAligned(const Scalar* data) - { return ConstAlignedMapType(data); } - static inline AlignedMapType MapAligned(Scalar* data) - { return AlignedMapType(data); } - static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size) - { return ConstAlignedMapType(data, size); } - static inline AlignedMapType MapAligned(Scalar* data, Index size) - { return AlignedMapType(data, size); } - static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols) - { return ConstAlignedMapType(data, rows, cols); } - static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols) - { return AlignedMapType(data, rows, cols); } - - template - static inline typename StridedConstMapType >::type Map(const Scalar* data, const Stride& stride) - { return typename StridedConstMapType >::type(data, stride); } - template - static inline typename StridedMapType >::type Map(Scalar* data, const Stride& stride) - { return typename StridedMapType >::type(data, stride); } - template - static inline typename StridedConstMapType >::type Map(const Scalar* data, Index size, const Stride& stride) - { return typename StridedConstMapType >::type(data, size, stride); } - template - static inline typename StridedMapType >::type Map(Scalar* data, Index size, const Stride& stride) - { return typename StridedMapType >::type(data, size, stride); } - template - static inline typename StridedConstMapType >::type Map(const Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedConstMapType >::type(data, rows, cols, stride); } - template - static inline typename StridedMapType >::type Map(Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedMapType >::type(data, rows, cols, stride); } - - template - static inline typename StridedConstAlignedMapType >::type MapAligned(const Scalar* data, const Stride& stride) - { return typename StridedConstAlignedMapType >::type(data, stride); } - template - static inline typename StridedAlignedMapType >::type MapAligned(Scalar* data, const Stride& stride) - { return typename StridedAlignedMapType >::type(data, stride); } - template - static inline typename StridedConstAlignedMapType >::type MapAligned(const Scalar* data, Index size, const Stride& stride) - { return typename StridedConstAlignedMapType >::type(data, size, stride); } - template - static inline typename StridedAlignedMapType >::type MapAligned(Scalar* data, Index size, const Stride& stride) - { return typename StridedAlignedMapType >::type(data, size, stride); } - template - static inline typename StridedConstAlignedMapType >::type MapAligned(const Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedConstAlignedMapType >::type(data, rows, cols, stride); } - template - static inline typename StridedAlignedMapType >::type MapAligned(Scalar* data, Index rows, Index cols, const Stride& stride) - { return typename StridedAlignedMapType >::type(data, rows, cols, stride); } - //@} - - using Base::setConstant; - EIGEN_DEVICE_FUNC Derived& setConstant(Index size, const Scalar& val); - EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, Index cols, const Scalar& val); - - using Base::setZero; - EIGEN_DEVICE_FUNC Derived& setZero(Index size); - EIGEN_DEVICE_FUNC Derived& setZero(Index rows, Index cols); - - using Base::setOnes; - EIGEN_DEVICE_FUNC Derived& setOnes(Index size); - EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, Index cols); - - using Base::setRandom; - Derived& setRandom(Index size); - Derived& setRandom(Index rows, Index cols); - - #ifdef EIGEN_PLAINOBJECTBASE_PLUGIN - #include EIGEN_PLAINOBJECTBASE_PLUGIN - #endif - - protected: - /** \internal Resizes *this in preparation for assigning \a other to it. - * Takes care of doing all the checking that's needed. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase& other) - { - #ifdef EIGEN_NO_AUTOMATIC_RESIZING - eigen_assert((this->size()==0 || (IsVectorAtCompileTime ? (this->size() == other.size()) - : (rows() == other.rows() && cols() == other.cols()))) - && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined"); - EIGEN_ONLY_USED_FOR_DEBUG(other); - #else - resizeLike(other); - #endif - } - - /** - * \brief Copies the value of the expression \a other into \c *this with automatic resizing. - * - * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized), - * it will be initialized. - * - * Note that copying a row-vector into a vector (and conversely) is allowed. - * The resizing, if any, is then done in the appropriate way so that row-vectors - * remain row-vectors and vectors remain vectors. - * - * \sa operator=(const MatrixBase&), _set_noalias() - * - * \internal - */ - // aliasing is dealt once in internall::call_assignment - // so at this stage we have to assume aliasing... and resising has to be done later. - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& _set(const DenseBase& other) - { - internal::call_assignment(this->derived(), other.derived()); - return this->derived(); - } - - /** \internal Like _set() but additionally makes the assumption that no aliasing effect can happen (which - * is the case when creating a new matrix) so one can enforce lazy evaluation. - * - * \sa operator=(const MatrixBase&), _set() - */ - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase& other) - { - // I don't think we need this resize call since the lazyAssign will anyways resize - // and lazyAssign will be called by the assign selector. - //_resize_to_match(other); - // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because - // it wouldn't allow to copy a row-vector into a column-vector. - internal::call_assignment_no_alias(this->derived(), other.derived(), internal::assign_op()); - return this->derived(); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init2(Index rows, Index cols, typename internal::enable_if::type* = 0) - { - EIGEN_STATIC_ASSERT(bool(NumTraits::IsInteger) && - bool(NumTraits::IsInteger), - FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED) - resize(rows,cols); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init2(const T0& val0, const T1& val1, typename internal::enable_if::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2) - m_storage.data()[0] = Scalar(val0); - m_storage.data()[1] = Scalar(val1); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init2(const Index& val0, const Index& val1, - typename internal::enable_if< (!internal::is_same::value) - && (internal::is_same::value) - && (internal::is_same::value) - && Base::SizeAtCompileTime==2,T1>::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2) - m_storage.data()[0] = Scalar(val0); - m_storage.data()[1] = Scalar(val1); - } - - // The argument is convertible to the Index type and we either have a non 1x1 Matrix, or a dynamic-sized Array, - // then the argument is meant to be the size of the object. - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(Index size, typename internal::enable_if< (Base::SizeAtCompileTime!=1 || !internal::is_convertible::value) - && ((!internal::is_same::XprKind,ArrayXpr>::value || Base::SizeAtCompileTime==Dynamic)),T>::type* = 0) - { - // NOTE MSVC 2008 complains if we directly put bool(NumTraits::IsInteger) as the EIGEN_STATIC_ASSERT argument. - const bool is_integer = NumTraits::IsInteger; - EIGEN_UNUSED_VARIABLE(is_integer); - EIGEN_STATIC_ASSERT(is_integer, - FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED) - resize(size); - } - - // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type can be implicitely converted) - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Scalar& val0, typename internal::enable_if::value,T>::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1) - m_storage.data()[0] = val0; - } - - // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type match the index type) - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Index& val0, - typename internal::enable_if< (!internal::is_same::value) - && (internal::is_same::value) - && Base::SizeAtCompileTime==1 - && internal::is_convertible::value,T*>::type* = 0) - { - EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1) - m_storage.data()[0] = Scalar(val0); - } - - // Initialize a fixed size matrix from a pointer to raw data - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Scalar* data){ - this->_set_noalias(ConstMapType(data)); - } - - // Initialize an arbitrary matrix from a dense expression - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const DenseBase& other){ - this->_set_noalias(other); - } - - // Initialize an arbitrary matrix from an object convertible to the Derived type. - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Derived& other){ - this->_set_noalias(other); - } - - // Initialize an arbitrary matrix from a generic Eigen expression - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const EigenBase& other){ - this->derived() = other; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const ReturnByValue& other) - { - resize(other.rows(), other.cols()); - other.evalTo(this->derived()); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const RotationBase& r) - { - this->derived() = r; - } - - // For fixed-size Array - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Scalar& val0, - typename internal::enable_if< Base::SizeAtCompileTime!=Dynamic - && Base::SizeAtCompileTime!=1 - && internal::is_convertible::value - && internal::is_same::XprKind,ArrayXpr>::value,T>::type* = 0) - { - Base::setConstant(val0); - } - - // For fixed-size Array - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void _init1(const Index& val0, - typename internal::enable_if< (!internal::is_same::value) - && (internal::is_same::value) - && Base::SizeAtCompileTime!=Dynamic - && Base::SizeAtCompileTime!=1 - && internal::is_convertible::value - && internal::is_same::XprKind,ArrayXpr>::value,T*>::type* = 0) - { - Base::setConstant(val0); - } - - template - friend struct internal::matrix_swap_impl; - - public: - -#ifndef EIGEN_PARSED_BY_DOXYGEN - /** \internal - * \brief Override DenseBase::swap() since for dynamic-sized matrices - * of same type it is enough to swap the data pointers. - */ - template - EIGEN_DEVICE_FUNC - void swap(DenseBase & other) - { - enum { SwapPointers = internal::is_same::value && Base::SizeAtCompileTime==Dynamic }; - internal::matrix_swap_impl::run(this->derived(), other.derived()); - } - - /** \internal - * \brief const version forwarded to DenseBase::swap - */ - template - EIGEN_DEVICE_FUNC - void swap(DenseBase const & other) - { Base::swap(other.derived()); } - - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE void _check_template_params() - { - EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor) - && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, (Options&RowMajor)==0) - && ((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0)) - && ((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0)) - && ((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0)) - && ((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0)) - && (MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime==Dynamic) - && (MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime==Dynamic) - && (Options & (DontAlign|RowMajor)) == Options), - INVALID_MATRIX_TEMPLATE_PARAMETERS) - } - - enum { IsPlainObjectBase = 1 }; -#endif -}; - -namespace internal { - -template -struct conservative_resize_like_impl -{ - static void run(DenseBase& _this, Index rows, Index cols) - { - if (_this.rows() == rows && _this.cols() == cols) return; - EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived) - - if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows - (!Derived::IsRowMajor && _this.rows() == rows) ) // column-major and we change only the number of columns - { - internal::check_rows_cols_for_overflow::run(rows, cols); - _this.derived().m_storage.conservativeResize(rows*cols,rows,cols); - } - else - { - // The storage order does not allow us to use reallocation. - typename Derived::PlainObject tmp(rows,cols); - const Index common_rows = numext::mini(rows, _this.rows()); - const Index common_cols = numext::mini(cols, _this.cols()); - tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols); - _this.derived().swap(tmp); - } - } - - static void run(DenseBase& _this, const DenseBase& other) - { - if (_this.rows() == other.rows() && _this.cols() == other.cols()) return; - - // Note: Here is space for improvement. Basically, for conservativeResize(Index,Index), - // neither RowsAtCompileTime or ColsAtCompileTime must be Dynamic. If only one of the - // dimensions is dynamic, one could use either conservativeResize(Index rows, NoChange_t) or - // conservativeResize(NoChange_t, Index cols). For these methods new static asserts like - // EIGEN_STATIC_ASSERT_DYNAMIC_ROWS and EIGEN_STATIC_ASSERT_DYNAMIC_COLS would be good. - EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived) - EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(OtherDerived) - - if ( ( Derived::IsRowMajor && _this.cols() == other.cols()) || // row-major and we change only the number of rows - (!Derived::IsRowMajor && _this.rows() == other.rows()) ) // column-major and we change only the number of columns - { - const Index new_rows = other.rows() - _this.rows(); - const Index new_cols = other.cols() - _this.cols(); - _this.derived().m_storage.conservativeResize(other.size(),other.rows(),other.cols()); - if (new_rows>0) - _this.bottomRightCorner(new_rows, other.cols()) = other.bottomRows(new_rows); - else if (new_cols>0) - _this.bottomRightCorner(other.rows(), new_cols) = other.rightCols(new_cols); - } - else - { - // The storage order does not allow us to use reallocation. - typename Derived::PlainObject tmp(other); - const Index common_rows = numext::mini(tmp.rows(), _this.rows()); - const Index common_cols = numext::mini(tmp.cols(), _this.cols()); - tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols); - _this.derived().swap(tmp); - } - } -}; - -// Here, the specialization for vectors inherits from the general matrix case -// to allow calling .conservativeResize(rows,cols) on vectors. -template -struct conservative_resize_like_impl - : conservative_resize_like_impl -{ - using conservative_resize_like_impl::run; - - static void run(DenseBase& _this, Index size) - { - const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : size; - const Index new_cols = Derived::RowsAtCompileTime==1 ? size : 1; - _this.derived().m_storage.conservativeResize(size,new_rows,new_cols); - } - - static void run(DenseBase& _this, const DenseBase& other) - { - if (_this.rows() == other.rows() && _this.cols() == other.cols()) return; - - const Index num_new_elements = other.size() - _this.size(); - - const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : other.rows(); - const Index new_cols = Derived::RowsAtCompileTime==1 ? other.cols() : 1; - _this.derived().m_storage.conservativeResize(other.size(),new_rows,new_cols); - - if (num_new_elements > 0) - _this.tail(num_new_elements) = other.tail(num_new_elements); - } -}; - -template -struct matrix_swap_impl -{ - EIGEN_DEVICE_FUNC - static inline void run(MatrixTypeA& a, MatrixTypeB& b) - { - a.base().swap(b); - } -}; - -template -struct matrix_swap_impl -{ - EIGEN_DEVICE_FUNC - static inline void run(MatrixTypeA& a, MatrixTypeB& b) - { - static_cast(a).m_storage.swap(static_cast(b).m_storage); - } -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_DENSESTORAGEBASE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Product.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Product.h deleted file mode 100644 index ae0c94b3..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Product.h +++ /dev/null @@ -1,186 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_PRODUCT_H -#define EIGEN_PRODUCT_H - -namespace Eigen { - -template class ProductImpl; - -namespace internal { - -template -struct traits > -{ - typedef typename remove_all::type LhsCleaned; - typedef typename remove_all::type RhsCleaned; - typedef traits LhsTraits; - typedef traits RhsTraits; - - typedef MatrixXpr XprKind; - - typedef typename ScalarBinaryOpTraits::Scalar, typename traits::Scalar>::ReturnType Scalar; - typedef typename product_promote_storage_type::ret>::ret StorageKind; - typedef typename promote_index_type::type StorageIndex; - - enum { - RowsAtCompileTime = LhsTraits::RowsAtCompileTime, - ColsAtCompileTime = RhsTraits::ColsAtCompileTime, - MaxRowsAtCompileTime = LhsTraits::MaxRowsAtCompileTime, - MaxColsAtCompileTime = RhsTraits::MaxColsAtCompileTime, - - // FIXME: only needed by GeneralMatrixMatrixTriangular - InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(LhsTraits::ColsAtCompileTime, RhsTraits::RowsAtCompileTime), - - // The storage order is somewhat arbitrary here. The correct one will be determined through the evaluator. - Flags = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? RowMajorBit - : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0 - : ( ((LhsTraits::Flags&NoPreferredStorageOrderBit) && (RhsTraits::Flags&RowMajorBit)) - || ((RhsTraits::Flags&NoPreferredStorageOrderBit) && (LhsTraits::Flags&RowMajorBit)) ) ? RowMajorBit - : NoPreferredStorageOrderBit - }; -}; - -} // end namespace internal - -/** \class Product - * \ingroup Core_Module - * - * \brief Expression of the product of two arbitrary matrices or vectors - * - * \tparam _Lhs the type of the left-hand side expression - * \tparam _Rhs the type of the right-hand side expression - * - * This class represents an expression of the product of two arbitrary matrices. - * - * The other template parameters are: - * \tparam Option can be DefaultProduct, AliasFreeProduct, or LazyProduct - * - */ -template -class Product : public ProductImpl<_Lhs,_Rhs,Option, - typename internal::product_promote_storage_type::StorageKind, - typename internal::traits<_Rhs>::StorageKind, - internal::product_type<_Lhs,_Rhs>::ret>::ret> -{ - public: - - typedef _Lhs Lhs; - typedef _Rhs Rhs; - - typedef typename ProductImpl< - Lhs, Rhs, Option, - typename internal::product_promote_storage_type::StorageKind, - typename internal::traits::StorageKind, - internal::product_type::ret>::ret>::Base Base; - EIGEN_GENERIC_PUBLIC_INTERFACE(Product) - - typedef typename internal::ref_selector::type LhsNested; - typedef typename internal::ref_selector::type RhsNested; - typedef typename internal::remove_all::type LhsNestedCleaned; - typedef typename internal::remove_all::type RhsNestedCleaned; - - EIGEN_DEVICE_FUNC Product(const Lhs& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs) - { - eigen_assert(lhs.cols() == rhs.rows() - && "invalid matrix product" - && "if you wanted a coeff-wise or a dot product use the respective explicit functions"); - } - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_lhs.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_rhs.cols(); } - - EIGEN_DEVICE_FUNC const LhsNestedCleaned& lhs() const { return m_lhs; } - EIGEN_DEVICE_FUNC const RhsNestedCleaned& rhs() const { return m_rhs; } - - protected: - - LhsNested m_lhs; - RhsNested m_rhs; -}; - -namespace internal { - -template::ret> -class dense_product_base - : public internal::dense_xpr_base >::type -{}; - -/** Convertion to scalar for inner-products */ -template -class dense_product_base - : public internal::dense_xpr_base >::type -{ - typedef Product ProductXpr; - typedef typename internal::dense_xpr_base::type Base; -public: - using Base::derived; - typedef typename Base::Scalar Scalar; - - operator const Scalar() const - { - return internal::evaluator(derived()).coeff(0,0); - } -}; - -} // namespace internal - -// Generic API dispatcher -template -class ProductImpl : public internal::generic_xpr_base, MatrixXpr, StorageKind>::type -{ - public: - typedef typename internal::generic_xpr_base, MatrixXpr, StorageKind>::type Base; -}; - -template -class ProductImpl - : public internal::dense_product_base -{ - typedef Product Derived; - - public: - - typedef typename internal::dense_product_base Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Derived) - protected: - enum { - IsOneByOne = (RowsAtCompileTime == 1 || RowsAtCompileTime == Dynamic) && - (ColsAtCompileTime == 1 || ColsAtCompileTime == Dynamic), - EnableCoeff = IsOneByOne || Option==LazyProduct - }; - - public: - - EIGEN_DEVICE_FUNC Scalar coeff(Index row, Index col) const - { - EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS); - eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) ); - - return internal::evaluator(derived()).coeff(row,col); - } - - EIGEN_DEVICE_FUNC Scalar coeff(Index i) const - { - EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS); - eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) ); - - return internal::evaluator(derived()).coeff(i); - } - - -}; - -} // end namespace Eigen - -#endif // EIGEN_PRODUCT_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ProductEvaluators.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ProductEvaluators.h deleted file mode 100644 index 583b7f59..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ProductEvaluators.h +++ /dev/null @@ -1,1099 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008-2010 Gael Guennebaud -// Copyright (C) 2011 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -#ifndef EIGEN_PRODUCTEVALUATORS_H -#define EIGEN_PRODUCTEVALUATORS_H - -namespace Eigen { - -namespace internal { - -/** \internal - * Evaluator of a product expression. - * Since products require special treatments to handle all possible cases, - * we simply deffer the evaluation logic to a product_evaluator class - * which offers more partial specialization possibilities. - * - * \sa class product_evaluator - */ -template -struct evaluator > - : public product_evaluator > -{ - typedef Product XprType; - typedef product_evaluator Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {} -}; - -// Catch "scalar * ( A * B )" and transform it to "(A*scalar) * B" -// TODO we should apply that rule only if that's really helpful -template -struct evaluator_assume_aliasing, - const CwiseNullaryOp, Plain1>, - const Product > > -{ - static const bool value = true; -}; -template -struct evaluator, - const CwiseNullaryOp, Plain1>, - const Product > > - : public evaluator > -{ - typedef CwiseBinaryOp, - const CwiseNullaryOp, Plain1>, - const Product > XprType; - typedef evaluator > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : Base(xpr.lhs().functor().m_other * xpr.rhs().lhs() * xpr.rhs().rhs()) - {} -}; - - -template -struct evaluator, DiagIndex> > - : public evaluator, DiagIndex> > -{ - typedef Diagonal, DiagIndex> XprType; - typedef evaluator, DiagIndex> > Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : Base(Diagonal, DiagIndex>( - Product(xpr.nestedExpression().lhs(), xpr.nestedExpression().rhs()), - xpr.index() )) - {} -}; - - -// Helper class to perform a matrix product with the destination at hand. -// Depending on the sizes of the factors, there are different evaluation strategies -// as controlled by internal::product_type. -template< typename Lhs, typename Rhs, - typename LhsShape = typename evaluator_traits::Shape, - typename RhsShape = typename evaluator_traits::Shape, - int ProductType = internal::product_type::value> -struct generic_product_impl; - -template -struct evaluator_assume_aliasing > { - static const bool value = true; -}; - -// This is the default evaluator implementation for products: -// It creates a temporary and call generic_product_impl -template -struct product_evaluator, ProductTag, LhsShape, RhsShape> - : public evaluator::PlainObject> -{ - typedef Product XprType; - typedef typename XprType::PlainObject PlainObject; - typedef evaluator Base; - enum { - Flags = Base::Flags | EvalBeforeNestingBit - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit product_evaluator(const XprType& xpr) - : m_result(xpr.rows(), xpr.cols()) - { - ::new (static_cast(this)) Base(m_result); - -// FIXME shall we handle nested_eval here?, -// if so, then we must take care at removing the call to nested_eval in the specializations (e.g., in permutation_matrix_product, transposition_matrix_product, etc.) -// typedef typename internal::nested_eval::type LhsNested; -// typedef typename internal::nested_eval::type RhsNested; -// typedef typename internal::remove_all::type LhsNestedCleaned; -// typedef typename internal::remove_all::type RhsNestedCleaned; -// -// const LhsNested lhs(xpr.lhs()); -// const RhsNested rhs(xpr.rhs()); -// -// generic_product_impl::evalTo(m_result, lhs, rhs); - - generic_product_impl::evalTo(m_result, xpr.lhs(), xpr.rhs()); - } - -protected: - PlainObject m_result; -}; - -// The following three shortcuts are enabled only if the scalar types match excatly. -// TODO: we could enable them for different scalar types when the product is not vectorized. - -// Dense = Product -template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> -struct Assignment, internal::assign_op, Dense2Dense, - typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct)>::type> -{ - typedef Product SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op &) - { - Index dstRows = src.rows(); - Index dstCols = src.cols(); - if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) - dst.resize(dstRows, dstCols); - // FIXME shall we handle nested_eval here? - generic_product_impl::evalTo(dst, src.lhs(), src.rhs()); - } -}; - -// Dense += Product -template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> -struct Assignment, internal::add_assign_op, Dense2Dense, - typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct)>::type> -{ - typedef Product SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op &) - { - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - // FIXME shall we handle nested_eval here? - generic_product_impl::addTo(dst, src.lhs(), src.rhs()); - } -}; - -// Dense -= Product -template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> -struct Assignment, internal::sub_assign_op, Dense2Dense, - typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct)>::type> -{ - typedef Product SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op &) - { - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - // FIXME shall we handle nested_eval here? - generic_product_impl::subTo(dst, src.lhs(), src.rhs()); - } -}; - - -// Dense ?= scalar * Product -// TODO we should apply that rule if that's really helpful -// for instance, this is not good for inner products -template< typename DstXprType, typename Lhs, typename Rhs, typename AssignFunc, typename Scalar, typename ScalarBis, typename Plain> -struct Assignment, const CwiseNullaryOp,Plain>, - const Product >, AssignFunc, Dense2Dense> -{ - typedef CwiseBinaryOp, - const CwiseNullaryOp,Plain>, - const Product > SrcXprType; - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const AssignFunc& func) - { - call_assignment_no_alias(dst, (src.lhs().functor().m_other * src.rhs().lhs())*src.rhs().rhs(), func); - } -}; - -//---------------------------------------- -// Catch "Dense ?= xpr + Product<>" expression to save one temporary -// FIXME we could probably enable these rules for any product, i.e., not only Dense and DefaultProduct - -template -struct evaluator_assume_aliasing::Scalar>, const OtherXpr, - const Product >, DenseShape > { - static const bool value = true; -}; - -template -struct assignment_from_xpr_op_product -{ - template - static EIGEN_STRONG_INLINE - void run(DstXprType &dst, const SrcXprType &src, const InitialFunc& /*func*/) - { - call_assignment_no_alias(dst, src.lhs(), Func1()); - call_assignment_no_alias(dst, src.rhs(), Func2()); - } -}; - -#define EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(ASSIGN_OP,BINOP,ASSIGN_OP2) \ - template< typename DstXprType, typename OtherXpr, typename Lhs, typename Rhs, typename DstScalar, typename SrcScalar, typename OtherScalar,typename ProdScalar> \ - struct Assignment, const OtherXpr, \ - const Product >, internal::ASSIGN_OP, Dense2Dense> \ - : assignment_from_xpr_op_product, internal::ASSIGN_OP, internal::ASSIGN_OP2 > \ - {} - -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op, scalar_sum_op,add_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op,scalar_sum_op,add_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op,scalar_sum_op,sub_assign_op); - -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op, scalar_difference_op,sub_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op,scalar_difference_op,sub_assign_op); -EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op,scalar_difference_op,add_assign_op); - -//---------------------------------------- - -template -struct generic_product_impl -{ - template - static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - dst.coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum(); - } - - template - static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - dst.coeffRef(0,0) += (lhs.transpose().cwiseProduct(rhs)).sum(); - } - - template - static void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { dst.coeffRef(0,0) -= (lhs.transpose().cwiseProduct(rhs)).sum(); } -}; - - -/*********************************************************************** -* Implementation of outer dense * dense vector product -***********************************************************************/ - -// Column major result -template -void outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const false_type&) -{ - evaluator rhsEval(rhs); - typename nested_eval::type actual_lhs(lhs); - // FIXME if cols is large enough, then it might be useful to make sure that lhs is sequentially stored - // FIXME not very good if rhs is real and lhs complex while alpha is real too - const Index cols = dst.cols(); - for (Index j=0; j -void outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const true_type&) -{ - evaluator lhsEval(lhs); - typename nested_eval::type actual_rhs(rhs); - // FIXME if rows is large enough, then it might be useful to make sure that rhs is sequentially stored - // FIXME not very good if lhs is real and rhs complex while alpha is real too - const Index rows = dst.rows(); - for (Index i=0; i -struct generic_product_impl -{ - template struct is_row_major : internal::conditional<(int(T::Flags)&RowMajorBit), internal::true_type, internal::false_type>::type {}; - typedef typename Product::Scalar Scalar; - - // TODO it would be nice to be able to exploit our *_assign_op functors for that purpose - struct set { template void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() = src; } }; - struct add { template void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() += src; } }; - struct sub { template void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() -= src; } }; - struct adds { - Scalar m_scale; - explicit adds(const Scalar& s) : m_scale(s) {} - template void operator()(const Dst& dst, const Src& src) const { - dst.const_cast_derived() += m_scale * src; - } - }; - - template - static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - internal::outer_product_selector_run(dst, lhs, rhs, set(), is_row_major()); - } - - template - static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - internal::outer_product_selector_run(dst, lhs, rhs, add(), is_row_major()); - } - - template - static inline void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - internal::outer_product_selector_run(dst, lhs, rhs, sub(), is_row_major()); - } - - template - static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - internal::outer_product_selector_run(dst, lhs, rhs, adds(alpha), is_row_major()); - } - -}; - - -// This base class provides default implementations for evalTo, addTo, subTo, in terms of scaleAndAddTo -template -struct generic_product_impl_base -{ - typedef typename Product::Scalar Scalar; - - template - static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { dst.setZero(); scaleAndAddTo(dst, lhs, rhs, Scalar(1)); } - - template - static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { scaleAndAddTo(dst,lhs, rhs, Scalar(1)); } - - template - static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { scaleAndAddTo(dst, lhs, rhs, Scalar(-1)); } - - template - static EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { Derived::scaleAndAddTo(dst,lhs,rhs,alpha); } - -}; - -template -struct generic_product_impl - : generic_product_impl_base > -{ - typedef typename nested_eval::type LhsNested; - typedef typename nested_eval::type RhsNested; - typedef typename Product::Scalar Scalar; - enum { Side = Lhs::IsVectorAtCompileTime ? OnTheLeft : OnTheRight }; - typedef typename internal::remove_all::type>::type MatrixType; - - template - static EIGEN_STRONG_INLINE void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - LhsNested actual_lhs(lhs); - RhsNested actual_rhs(rhs); - internal::gemv_dense_selector::HasUsableDirectAccess) - >::run(actual_lhs, actual_rhs, dst, alpha); - } -}; - -template -struct generic_product_impl -{ - typedef typename Product::Scalar Scalar; - - template - static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - // Same as: dst.noalias() = lhs.lazyProduct(rhs); - // but easier on the compiler side - call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::assign_op()); - } - - template - static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - // dst.noalias() += lhs.lazyProduct(rhs); - call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::add_assign_op()); - } - - template - static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) - { - // dst.noalias() -= lhs.lazyProduct(rhs); - call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op()); - } - -// template -// static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) -// { dst.noalias() += alpha * lhs.lazyProduct(rhs); } -}; - -// This specialization enforces the use of a coefficient-based evaluation strategy -template -struct generic_product_impl - : generic_product_impl {}; - -// Case 2: Evaluate coeff by coeff -// -// This is mostly taken from CoeffBasedProduct.h -// The main difference is that we add an extra argument to the etor_product_*_impl::run() function -// for the inner dimension of the product, because evaluator object do not know their size. - -template -struct etor_product_coeff_impl; - -template -struct etor_product_packet_impl; - -template -struct product_evaluator, ProductTag, DenseShape, DenseShape> - : evaluator_base > -{ - typedef Product XprType; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - explicit product_evaluator(const XprType& xpr) - : m_lhs(xpr.lhs()), - m_rhs(xpr.rhs()), - m_lhsImpl(m_lhs), // FIXME the creation of the evaluator objects should result in a no-op, but check that! - m_rhsImpl(m_rhs), // Moreover, they are only useful for the packet path, so we could completely disable them when not needed, - // or perhaps declare them on the fly on the packet method... We have experiment to check what's best. - m_innerDim(xpr.lhs().cols()) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits::MulCost); - EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits::AddCost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); -#if 0 - std::cerr << "LhsOuterStrideBytes= " << LhsOuterStrideBytes << "\n"; - std::cerr << "RhsOuterStrideBytes= " << RhsOuterStrideBytes << "\n"; - std::cerr << "LhsAlignment= " << LhsAlignment << "\n"; - std::cerr << "RhsAlignment= " << RhsAlignment << "\n"; - std::cerr << "CanVectorizeLhs= " << CanVectorizeLhs << "\n"; - std::cerr << "CanVectorizeRhs= " << CanVectorizeRhs << "\n"; - std::cerr << "CanVectorizeInner= " << CanVectorizeInner << "\n"; - std::cerr << "EvalToRowMajor= " << EvalToRowMajor << "\n"; - std::cerr << "Alignment= " << Alignment << "\n"; - std::cerr << "Flags= " << Flags << "\n"; -#endif - } - - // Everything below here is taken from CoeffBasedProduct.h - - typedef typename internal::nested_eval::type LhsNested; - typedef typename internal::nested_eval::type RhsNested; - - typedef typename internal::remove_all::type LhsNestedCleaned; - typedef typename internal::remove_all::type RhsNestedCleaned; - - typedef evaluator LhsEtorType; - typedef evaluator RhsEtorType; - - enum { - RowsAtCompileTime = LhsNestedCleaned::RowsAtCompileTime, - ColsAtCompileTime = RhsNestedCleaned::ColsAtCompileTime, - InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(LhsNestedCleaned::ColsAtCompileTime, RhsNestedCleaned::RowsAtCompileTime), - MaxRowsAtCompileTime = LhsNestedCleaned::MaxRowsAtCompileTime, - MaxColsAtCompileTime = RhsNestedCleaned::MaxColsAtCompileTime - }; - - typedef typename find_best_packet::type LhsVecPacketType; - typedef typename find_best_packet::type RhsVecPacketType; - - enum { - - LhsCoeffReadCost = LhsEtorType::CoeffReadCost, - RhsCoeffReadCost = RhsEtorType::CoeffReadCost, - CoeffReadCost = InnerSize==0 ? NumTraits::ReadCost - : InnerSize == Dynamic ? HugeCost - : InnerSize * (NumTraits::MulCost + LhsCoeffReadCost + RhsCoeffReadCost) - + (InnerSize - 1) * NumTraits::AddCost, - - Unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT, - - LhsFlags = LhsEtorType::Flags, - RhsFlags = RhsEtorType::Flags, - - LhsRowMajor = LhsFlags & RowMajorBit, - RhsRowMajor = RhsFlags & RowMajorBit, - - LhsVecPacketSize = unpacket_traits::size, - RhsVecPacketSize = unpacket_traits::size, - - // Here, we don't care about alignment larger than the usable packet size. - LhsAlignment = EIGEN_PLAIN_ENUM_MIN(LhsEtorType::Alignment,LhsVecPacketSize*int(sizeof(typename LhsNestedCleaned::Scalar))), - RhsAlignment = EIGEN_PLAIN_ENUM_MIN(RhsEtorType::Alignment,RhsVecPacketSize*int(sizeof(typename RhsNestedCleaned::Scalar))), - - SameType = is_same::value, - - CanVectorizeRhs = bool(RhsRowMajor) && (RhsFlags & PacketAccessBit) && (ColsAtCompileTime!=1), - CanVectorizeLhs = (!LhsRowMajor) && (LhsFlags & PacketAccessBit) && (RowsAtCompileTime!=1), - - EvalToRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1 - : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0 - : (bool(RhsRowMajor) && !CanVectorizeLhs), - - Flags = ((unsigned int)(LhsFlags | RhsFlags) & HereditaryBits & ~RowMajorBit) - | (EvalToRowMajor ? RowMajorBit : 0) - // TODO enable vectorization for mixed types - | (SameType && (CanVectorizeLhs || CanVectorizeRhs) ? PacketAccessBit : 0) - | (XprType::IsVectorAtCompileTime ? LinearAccessBit : 0), - - LhsOuterStrideBytes = int(LhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename LhsNestedCleaned::Scalar)), - RhsOuterStrideBytes = int(RhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename RhsNestedCleaned::Scalar)), - - Alignment = bool(CanVectorizeLhs) ? (LhsOuterStrideBytes<=0 || (int(LhsOuterStrideBytes) % EIGEN_PLAIN_ENUM_MAX(1,LhsAlignment))!=0 ? 0 : LhsAlignment) - : bool(CanVectorizeRhs) ? (RhsOuterStrideBytes<=0 || (int(RhsOuterStrideBytes) % EIGEN_PLAIN_ENUM_MAX(1,RhsAlignment))!=0 ? 0 : RhsAlignment) - : 0, - - /* CanVectorizeInner deserves special explanation. It does not affect the product flags. It is not used outside - * of Product. If the Product itself is not a packet-access expression, there is still a chance that the inner - * loop of the product might be vectorized. This is the meaning of CanVectorizeInner. Since it doesn't affect - * the Flags, it is safe to make this value depend on ActualPacketAccessBit, that doesn't affect the ABI. - */ - CanVectorizeInner = SameType - && LhsRowMajor - && (!RhsRowMajor) - && (LhsFlags & RhsFlags & ActualPacketAccessBit) - && (InnerSize % packet_traits::size == 0) - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index row, Index col) const - { - return (m_lhs.row(row).transpose().cwiseProduct( m_rhs.col(col) )).sum(); - } - - /* Allow index-based non-packet access. It is impossible though to allow index-based packed access, - * which is why we don't set the LinearAccessBit. - * TODO: this seems possible when the result is a vector - */ - EIGEN_DEVICE_FUNC const CoeffReturnType coeff(Index index) const - { - const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? 0 : index; - const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? index : 0; - return (m_lhs.row(row).transpose().cwiseProduct( m_rhs.col(col) )).sum(); - } - - template - const PacketType packet(Index row, Index col) const - { - PacketType res; - typedef etor_product_packet_impl PacketImpl; - PacketImpl::run(row, col, m_lhsImpl, m_rhsImpl, m_innerDim, res); - return res; - } - - template - const PacketType packet(Index index) const - { - const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? 0 : index; - const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? index : 0; - return packet(row,col); - } - -protected: - typename internal::add_const_on_value_type::type m_lhs; - typename internal::add_const_on_value_type::type m_rhs; - - LhsEtorType m_lhsImpl; - RhsEtorType m_rhsImpl; - - // TODO: Get rid of m_innerDim if known at compile time - Index m_innerDim; -}; - -template -struct product_evaluator, LazyCoeffBasedProductMode, DenseShape, DenseShape> - : product_evaluator, CoeffBasedProductMode, DenseShape, DenseShape> -{ - typedef Product XprType; - typedef Product BaseProduct; - typedef product_evaluator Base; - enum { - Flags = Base::Flags | EvalBeforeNestingBit - }; - EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) - : Base(BaseProduct(xpr.lhs(),xpr.rhs())) - {} -}; - -/**************************************** -*** Coeff based product, Packet path *** -****************************************/ - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res) - { - etor_product_packet_impl::run(row, col, lhs, rhs, innerDim, res); - res = pmadd(pset1(lhs.coeff(row, Index(UnrollingIndex-1))), rhs.template packet(Index(UnrollingIndex-1), col), res); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res) - { - etor_product_packet_impl::run(row, col, lhs, rhs, innerDim, res); - res = pmadd(lhs.template packet(row, Index(UnrollingIndex-1)), pset1(rhs.coeff(Index(UnrollingIndex-1), col)), res); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res) - { - res = pmul(pset1(lhs.coeff(row, Index(0))),rhs.template packet(Index(0), col)); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res) - { - res = pmul(lhs.template packet(row, Index(0)), pset1(rhs.coeff(Index(0), col))); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Index /*innerDim*/, Packet &res) - { - res = pset1(typename unpacket_traits::type(0)); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Index /*innerDim*/, Packet &res) - { - res = pset1(typename unpacket_traits::type(0)); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res) - { - res = pset1(typename unpacket_traits::type(0)); - for(Index i = 0; i < innerDim; ++i) - res = pmadd(pset1(lhs.coeff(row, i)), rhs.template packet(i, col), res); - } -}; - -template -struct etor_product_packet_impl -{ - static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res) - { - res = pset1(typename unpacket_traits::type(0)); - for(Index i = 0; i < innerDim; ++i) - res = pmadd(lhs.template packet(row, i), pset1(rhs.coeff(i, col)), res); - } -}; - - -/*************************************************************************** -* Triangular products -***************************************************************************/ -template -struct triangular_product_impl; - -template -struct generic_product_impl - : generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - triangular_product_impl - ::run(dst, lhs.nestedExpression(), rhs, alpha); - } -}; - -template -struct generic_product_impl -: generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - triangular_product_impl::run(dst, lhs, rhs.nestedExpression(), alpha); - } -}; - - -/*************************************************************************** -* SelfAdjoint products -***************************************************************************/ -template -struct selfadjoint_product_impl; - -template -struct generic_product_impl - : generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - selfadjoint_product_impl::run(dst, lhs.nestedExpression(), rhs, alpha); - } -}; - -template -struct generic_product_impl -: generic_product_impl_base > -{ - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) - { - selfadjoint_product_impl::run(dst, lhs, rhs.nestedExpression(), alpha); - } -}; - - -/*************************************************************************** -* Diagonal products -***************************************************************************/ - -template -struct diagonal_product_evaluator_base - : evaluator_base -{ - typedef typename ScalarBinaryOpTraits::ReturnType Scalar; -public: - enum { - CoeffReadCost = NumTraits::MulCost + evaluator::CoeffReadCost + evaluator::CoeffReadCost, - - MatrixFlags = evaluator::Flags, - DiagFlags = evaluator::Flags, - _StorageOrder = MatrixFlags & RowMajorBit ? RowMajor : ColMajor, - _ScalarAccessOnDiag = !((int(_StorageOrder) == ColMajor && int(ProductOrder) == OnTheLeft) - ||(int(_StorageOrder) == RowMajor && int(ProductOrder) == OnTheRight)), - _SameTypes = is_same::value, - // FIXME currently we need same types, but in the future the next rule should be the one - //_Vectorizable = bool(int(MatrixFlags)&PacketAccessBit) && ((!_PacketOnDiag) || (_SameTypes && bool(int(DiagFlags)&PacketAccessBit))), - _Vectorizable = bool(int(MatrixFlags)&PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(int(DiagFlags)&PacketAccessBit))), - _LinearAccessMask = (MatrixType::RowsAtCompileTime==1 || MatrixType::ColsAtCompileTime==1) ? LinearAccessBit : 0, - Flags = ((HereditaryBits|_LinearAccessMask) & (unsigned int)(MatrixFlags)) | (_Vectorizable ? PacketAccessBit : 0), - Alignment = evaluator::Alignment - }; - - diagonal_product_evaluator_base(const MatrixType &mat, const DiagonalType &diag) - : m_diagImpl(diag), m_matImpl(mat) - { - EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits::MulCost); - EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const - { - return m_diagImpl.coeff(idx) * m_matImpl.coeff(idx); - } - -protected: - template - EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::true_type) const - { - return internal::pmul(m_matImpl.template packet(row, col), - internal::pset1(m_diagImpl.coeff(id))); - } - - template - EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::false_type) const - { - enum { - InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime, - DiagonalPacketLoadMode = EIGEN_PLAIN_ENUM_MIN(LoadMode,((InnerSize%16) == 0) ? int(Aligned16) : int(evaluator::Alignment)) // FIXME hardcoded 16!! - }; - return internal::pmul(m_matImpl.template packet(row, col), - m_diagImpl.template packet(id)); - } - - evaluator m_diagImpl; - evaluator m_matImpl; -}; - -// diagonal * dense -template -struct product_evaluator, ProductTag, DiagonalShape, DenseShape> - : diagonal_product_evaluator_base, OnTheLeft> -{ - typedef diagonal_product_evaluator_base, OnTheLeft> Base; - using Base::m_diagImpl; - using Base::m_matImpl; - using Base::coeff; - typedef typename Base::Scalar Scalar; - - typedef Product XprType; - typedef typename XprType::PlainObject PlainObject; - - enum { - StorageOrder = int(Rhs::Flags) & RowMajorBit ? RowMajor : ColMajor - }; - - EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) - : Base(xpr.rhs(), xpr.lhs().diagonal()) - { - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const - { - return m_diagImpl.coeff(row) * m_matImpl.coeff(row, col); - } - -#ifndef __CUDACC__ - template - EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const - { - // FIXME: NVCC used to complain about the template keyword, but we have to check whether this is still the case. - // See also similar calls below. - return this->template packet_impl(row,col, row, - typename internal::conditional::type()); - } - - template - EIGEN_STRONG_INLINE PacketType packet(Index idx) const - { - return packet(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx); - } -#endif -}; - -// dense * diagonal -template -struct product_evaluator, ProductTag, DenseShape, DiagonalShape> - : diagonal_product_evaluator_base, OnTheRight> -{ - typedef diagonal_product_evaluator_base, OnTheRight> Base; - using Base::m_diagImpl; - using Base::m_matImpl; - using Base::coeff; - typedef typename Base::Scalar Scalar; - - typedef Product XprType; - typedef typename XprType::PlainObject PlainObject; - - enum { StorageOrder = int(Lhs::Flags) & RowMajorBit ? RowMajor : ColMajor }; - - EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) - : Base(xpr.lhs(), xpr.rhs().diagonal()) - { - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const - { - return m_matImpl.coeff(row, col) * m_diagImpl.coeff(col); - } - -#ifndef __CUDACC__ - template - EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const - { - return this->template packet_impl(row,col, col, - typename internal::conditional::type()); - } - - template - EIGEN_STRONG_INLINE PacketType packet(Index idx) const - { - return packet(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx); - } -#endif -}; - -/*************************************************************************** -* Products with permutation matrices -***************************************************************************/ - -/** \internal - * \class permutation_matrix_product - * Internal helper class implementing the product between a permutation matrix and a matrix. - * This class is specialized for DenseShape below and for SparseShape in SparseCore/SparsePermutation.h - */ -template -struct permutation_matrix_product; - -template -struct permutation_matrix_product -{ - typedef typename nested_eval::type MatrixType; - typedef typename remove_all::type MatrixTypeCleaned; - - template - static inline void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) - { - MatrixType mat(xpr); - const Index n = Side==OnTheLeft ? mat.rows() : mat.cols(); - // FIXME we need an is_same for expression that is not sensitive to constness. For instance - // is_same_xpr, Block >::value should be true. - //if(is_same::value && extract_data(dst) == extract_data(mat)) - if(is_same_dense(dst, mat)) - { - // apply the permutation inplace - Matrix mask(perm.size()); - mask.fill(false); - Index r = 0; - while(r < perm.size()) - { - // search for the next seed - while(r=perm.size()) - break; - // we got one, let's follow it until we are back to the seed - Index k0 = r++; - Index kPrev = k0; - mask.coeffRef(k0) = true; - for(Index k=perm.indices().coeff(k0); k!=k0; k=perm.indices().coeff(k)) - { - Block(dst, k) - .swap(Block - (dst,((Side==OnTheLeft) ^ Transposed) ? k0 : kPrev)); - - mask.coeffRef(k) = true; - kPrev = k; - } - } - } - else - { - for(Index i = 0; i < n; ++i) - { - Block - (dst, ((Side==OnTheLeft) ^ Transposed) ? perm.indices().coeff(i) : i) - - = - - Block - (mat, ((Side==OnTheRight) ^ Transposed) ? perm.indices().coeff(i) : i); - } - } - } -}; - -template -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - permutation_matrix_product::run(dst, lhs, rhs); - } -}; - -template -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - permutation_matrix_product::run(dst, rhs, lhs); - } -}; - -template -struct generic_product_impl, Rhs, PermutationShape, MatrixShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Inverse& lhs, const Rhs& rhs) - { - permutation_matrix_product::run(dst, lhs.nestedExpression(), rhs); - } -}; - -template -struct generic_product_impl, MatrixShape, PermutationShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Inverse& rhs) - { - permutation_matrix_product::run(dst, rhs.nestedExpression(), lhs); - } -}; - - -/*************************************************************************** -* Products with transpositions matrices -***************************************************************************/ - -// FIXME could we unify Transpositions and Permutation into a single "shape"?? - -/** \internal - * \class transposition_matrix_product - * Internal helper class implementing the product between a permutation matrix and a matrix. - */ -template -struct transposition_matrix_product -{ - typedef typename nested_eval::type MatrixType; - typedef typename remove_all::type MatrixTypeCleaned; - - template - static inline void run(Dest& dst, const TranspositionType& tr, const ExpressionType& xpr) - { - MatrixType mat(xpr); - typedef typename TranspositionType::StorageIndex StorageIndex; - const Index size = tr.size(); - StorageIndex j = 0; - - if(!is_same_dense(dst,mat)) - dst = mat; - - for(Index k=(Transposed?size-1:0) ; Transposed?k>=0:k -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - transposition_matrix_product::run(dst, lhs, rhs); - } -}; - -template -struct generic_product_impl -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) - { - transposition_matrix_product::run(dst, rhs, lhs); - } -}; - - -template -struct generic_product_impl, Rhs, TranspositionsShape, MatrixShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Transpose& lhs, const Rhs& rhs) - { - transposition_matrix_product::run(dst, lhs.nestedExpression(), rhs); - } -}; - -template -struct generic_product_impl, MatrixShape, TranspositionsShape, ProductTag> -{ - template - static void evalTo(Dest& dst, const Lhs& lhs, const Transpose& rhs) - { - transposition_matrix_product::run(dst, rhs.nestedExpression(), lhs); - } -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_PRODUCT_EVALUATORS_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Random.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Random.h deleted file mode 100644 index 486e9ed5..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Random.h +++ /dev/null @@ -1,182 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_RANDOM_H -#define EIGEN_RANDOM_H - -namespace Eigen { - -namespace internal { - -template struct scalar_random_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_random_op) - inline const Scalar operator() () const { return random(); } -}; - -template -struct functor_traits > -{ enum { Cost = 5 * NumTraits::MulCost, PacketAccess = false, IsRepeatable = false }; }; - -} // end namespace internal - -/** \returns a random matrix expression - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * The parameters \a rows and \a cols are the number of rows and of columns of - * the returned matrix. Must be compatible with this MatrixBase type. - * - * \not_reentrant - * - * This variant is meant to be used for dynamic-size matrix types. For fixed-size types, - * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used - * instead. - * - * - * Example: \include MatrixBase_random_int_int.cpp - * Output: \verbinclude MatrixBase_random_int_int.out - * - * This expression has the "evaluate before nesting" flag so that it will be evaluated into - * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected - * behavior with expressions involving random matrices. - * - * See DenseBase::NullaryExpr(Index, const CustomNullaryOp&) for an example using C++11 random generators. - * - * \sa DenseBase::setRandom(), DenseBase::Random(Index), DenseBase::Random() - */ -template -inline const typename DenseBase::RandomReturnType -DenseBase::Random(Index rows, Index cols) -{ - return NullaryExpr(rows, cols, internal::scalar_random_op()); -} - -/** \returns a random vector expression - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * The parameter \a size is the size of the returned vector. - * Must be compatible with this MatrixBase type. - * - * \only_for_vectors - * \not_reentrant - * - * This variant is meant to be used for dynamic-size vector types. For fixed-size types, - * it is redundant to pass \a size as argument, so Random() should be used - * instead. - * - * Example: \include MatrixBase_random_int.cpp - * Output: \verbinclude MatrixBase_random_int.out - * - * This expression has the "evaluate before nesting" flag so that it will be evaluated into - * a temporary vector whenever it is nested in a larger expression. This prevents unexpected - * behavior with expressions involving random matrices. - * - * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random() - */ -template -inline const typename DenseBase::RandomReturnType -DenseBase::Random(Index size) -{ - return NullaryExpr(size, internal::scalar_random_op()); -} - -/** \returns a fixed-size random matrix or vector expression - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you - * need to use the variants taking size arguments. - * - * Example: \include MatrixBase_random.cpp - * Output: \verbinclude MatrixBase_random.out - * - * This expression has the "evaluate before nesting" flag so that it will be evaluated into - * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected - * behavior with expressions involving random matrices. - * - * \not_reentrant - * - * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random(Index) - */ -template -inline const typename DenseBase::RandomReturnType -DenseBase::Random() -{ - return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op()); -} - -/** Sets all coefficients in this expression to random values. - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * \not_reentrant - * - * Example: \include MatrixBase_setRandom.cpp - * Output: \verbinclude MatrixBase_setRandom.out - * - * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index) - */ -template -EIGEN_DEVICE_FUNC inline Derived& DenseBase::setRandom() -{ - return *this = Random(rows(), cols()); -} - -/** Resizes to the given \a newSize, and sets all coefficients in this expression to random values. - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * \only_for_vectors - * \not_reentrant - * - * Example: \include Matrix_setRandom_int.cpp - * Output: \verbinclude Matrix_setRandom_int.out - * - * \sa DenseBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, DenseBase::Random() - */ -template -EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setRandom(Index newSize) -{ - resize(newSize); - return setRandom(); -} - -/** Resizes to the given size, and sets all coefficients in this expression to random values. - * - * Numbers are uniformly spread through their whole definition range for integer types, - * and in the [-1:1] range for floating point scalar types. - * - * \not_reentrant - * - * \param rows the new number of rows - * \param cols the new number of columns - * - * Example: \include Matrix_setRandom_int_int.cpp - * Output: \verbinclude Matrix_setRandom_int_int.out - * - * \sa DenseBase::setRandom(), setRandom(Index), class CwiseNullaryOp, DenseBase::Random() - */ -template -EIGEN_STRONG_INLINE Derived& -PlainObjectBase::setRandom(Index rows, Index cols) -{ - resize(rows, cols); - return setRandom(); -} - -} // end namespace Eigen - -#endif // EIGEN_RANDOM_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Redux.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Redux.h deleted file mode 100644 index 2b5b73bf..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Redux.h +++ /dev/null @@ -1,505 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REDUX_H -#define EIGEN_REDUX_H - -namespace Eigen { - -namespace internal { - -// TODO -// * implement other kind of vectorization -// * factorize code - -/*************************************************************************** -* Part 1 : the logic deciding a strategy for vectorization and unrolling -***************************************************************************/ - -template -struct redux_traits -{ -public: - typedef typename find_best_packet::type PacketType; - enum { - PacketSize = unpacket_traits::size, - InnerMaxSize = int(Derived::IsRowMajor) - ? Derived::MaxColsAtCompileTime - : Derived::MaxRowsAtCompileTime - }; - - enum { - MightVectorize = (int(Derived::Flags)&ActualPacketAccessBit) - && (functor_traits::PacketAccess), - MayLinearVectorize = bool(MightVectorize) && (int(Derived::Flags)&LinearAccessBit), - MaySliceVectorize = bool(MightVectorize) && int(InnerMaxSize)>=3*PacketSize - }; - -public: - enum { - Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal) - : int(MaySliceVectorize) ? int(SliceVectorizedTraversal) - : int(DefaultTraversal) - }; - -public: - enum { - Cost = Derived::SizeAtCompileTime == Dynamic ? HugeCost - : Derived::SizeAtCompileTime * Derived::CoeffReadCost + (Derived::SizeAtCompileTime-1) * functor_traits::Cost, - UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize)) - }; - -public: - enum { - Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling - }; - -#ifdef EIGEN_DEBUG_ASSIGN - static void debug() - { - std::cerr << "Xpr: " << typeid(typename Derived::XprType).name() << std::endl; - std::cerr.setf(std::ios::hex, std::ios::basefield); - EIGEN_DEBUG_VAR(Derived::Flags) - std::cerr.unsetf(std::ios::hex); - EIGEN_DEBUG_VAR(InnerMaxSize) - EIGEN_DEBUG_VAR(PacketSize) - EIGEN_DEBUG_VAR(MightVectorize) - EIGEN_DEBUG_VAR(MayLinearVectorize) - EIGEN_DEBUG_VAR(MaySliceVectorize) - EIGEN_DEBUG_VAR(Traversal) - EIGEN_DEBUG_VAR(UnrollingLimit) - EIGEN_DEBUG_VAR(Unrolling) - std::cerr << std::endl; - } -#endif -}; - -/*************************************************************************** -* Part 2 : unrollers -***************************************************************************/ - -/*** no vectorization ***/ - -template -struct redux_novec_unroller -{ - enum { - HalfLength = Length/2 - }; - - typedef typename Derived::Scalar Scalar; - - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func) - { - return func(redux_novec_unroller::run(mat,func), - redux_novec_unroller::run(mat,func)); - } -}; - -template -struct redux_novec_unroller -{ - enum { - outer = Start / Derived::InnerSizeAtCompileTime, - inner = Start % Derived::InnerSizeAtCompileTime - }; - - typedef typename Derived::Scalar Scalar; - - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func&) - { - return mat.coeffByOuterInner(outer, inner); - } -}; - -// This is actually dead code and will never be called. It is required -// to prevent false warnings regarding failed inlining though -// for 0 length run() will never be called at all. -template -struct redux_novec_unroller -{ - typedef typename Derived::Scalar Scalar; - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived&, const Func&) { return Scalar(); } -}; - -/*** vectorization ***/ - -template -struct redux_vec_unroller -{ - enum { - PacketSize = redux_traits::PacketSize, - HalfLength = Length/2 - }; - - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketScalar; - - static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func& func) - { - return func.packetOp( - redux_vec_unroller::run(mat,func), - redux_vec_unroller::run(mat,func) ); - } -}; - -template -struct redux_vec_unroller -{ - enum { - index = Start * redux_traits::PacketSize, - outer = index / int(Derived::InnerSizeAtCompileTime), - inner = index % int(Derived::InnerSizeAtCompileTime), - alignment = Derived::Alignment - }; - - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketScalar; - - static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func&) - { - return mat.template packetByOuterInner(outer, inner); - } -}; - -/*************************************************************************** -* Part 3 : implementation of all cases -***************************************************************************/ - -template::Traversal, - int Unrolling = redux_traits::Unrolling -> -struct redux_impl; - -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - EIGEN_DEVICE_FUNC - static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func) - { - eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix"); - Scalar res; - res = mat.coeffByOuterInner(0, 0); - for(Index i = 1; i < mat.innerSize(); ++i) - res = func(res, mat.coeffByOuterInner(0, i)); - for(Index i = 1; i < mat.outerSize(); ++i) - for(Index j = 0; j < mat.innerSize(); ++j) - res = func(res, mat.coeffByOuterInner(i, j)); - return res; - } -}; - -template -struct redux_impl - : public redux_novec_unroller -{}; - -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketScalar; - - static Scalar run(const Derived &mat, const Func& func) - { - const Index size = mat.size(); - - const Index packetSize = redux_traits::PacketSize; - const int packetAlignment = unpacket_traits::alignment; - enum { - alignment0 = (bool(Derived::Flags & DirectAccessBit) && bool(packet_traits::AlignedOnScalar)) ? int(packetAlignment) : int(Unaligned), - alignment = EIGEN_PLAIN_ENUM_MAX(alignment0, Derived::Alignment) - }; - const Index alignedStart = internal::first_default_aligned(mat.nestedExpression()); - const Index alignedSize2 = ((size-alignedStart)/(2*packetSize))*(2*packetSize); - const Index alignedSize = ((size-alignedStart)/(packetSize))*(packetSize); - const Index alignedEnd2 = alignedStart + alignedSize2; - const Index alignedEnd = alignedStart + alignedSize; - Scalar res; - if(alignedSize) - { - PacketScalar packet_res0 = mat.template packet(alignedStart); - if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop - { - PacketScalar packet_res1 = mat.template packet(alignedStart+packetSize); - for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize) - { - packet_res0 = func.packetOp(packet_res0, mat.template packet(index)); - packet_res1 = func.packetOp(packet_res1, mat.template packet(index+packetSize)); - } - - packet_res0 = func.packetOp(packet_res0,packet_res1); - if(alignedEnd>alignedEnd2) - packet_res0 = func.packetOp(packet_res0, mat.template packet(alignedEnd2)); - } - res = func.predux(packet_res0); - - for(Index index = 0; index < alignedStart; ++index) - res = func(res,mat.coeff(index)); - - for(Index index = alignedEnd; index < size; ++index) - res = func(res,mat.coeff(index)); - } - else // too small to vectorize anything. - // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize. - { - res = mat.coeff(0); - for(Index index = 1; index < size; ++index) - res = func(res,mat.coeff(index)); - } - - return res; - } -}; - -// NOTE: for SliceVectorizedTraversal we simply bypass unrolling -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - typedef typename redux_traits::PacketType PacketType; - - EIGEN_DEVICE_FUNC static Scalar run(const Derived &mat, const Func& func) - { - eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix"); - const Index innerSize = mat.innerSize(); - const Index outerSize = mat.outerSize(); - enum { - packetSize = redux_traits::PacketSize - }; - const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize; - Scalar res; - if(packetedInnerSize) - { - PacketType packet_res = mat.template packet(0,0); - for(Index j=0; j(j,i)); - - res = func.predux(packet_res); - for(Index j=0; j::run(mat, func); - } - - return res; - } -}; - -template -struct redux_impl -{ - typedef typename Derived::Scalar Scalar; - - typedef typename redux_traits::PacketType PacketScalar; - enum { - PacketSize = redux_traits::PacketSize, - Size = Derived::SizeAtCompileTime, - VectorizedSize = (Size / PacketSize) * PacketSize - }; - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func) - { - eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix"); - if (VectorizedSize > 0) { - Scalar res = func.predux(redux_vec_unroller::run(mat,func)); - if (VectorizedSize != Size) - res = func(res,redux_novec_unroller::run(mat,func)); - return res; - } - else { - return redux_novec_unroller::run(mat,func); - } - } -}; - -// evaluator adaptor -template -class redux_evaluator -{ -public: - typedef _XprType XprType; - EIGEN_DEVICE_FUNC explicit redux_evaluator(const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {} - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename XprType::PacketScalar PacketScalar; - typedef typename XprType::PacketReturnType PacketReturnType; - - enum { - MaxRowsAtCompileTime = XprType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = XprType::MaxColsAtCompileTime, - // TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime from the evaluator - Flags = evaluator::Flags & ~DirectAccessBit, - IsRowMajor = XprType::IsRowMajor, - SizeAtCompileTime = XprType::SizeAtCompileTime, - InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime, - CoeffReadCost = evaluator::CoeffReadCost, - Alignment = evaluator::Alignment - }; - - EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); } - EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); } - EIGEN_DEVICE_FUNC Index size() const { return m_xpr.size(); } - EIGEN_DEVICE_FUNC Index innerSize() const { return m_xpr.innerSize(); } - EIGEN_DEVICE_FUNC Index outerSize() const { return m_xpr.outerSize(); } - - EIGEN_DEVICE_FUNC - CoeffReturnType coeff(Index row, Index col) const - { return m_evaluator.coeff(row, col); } - - EIGEN_DEVICE_FUNC - CoeffReturnType coeff(Index index) const - { return m_evaluator.coeff(index); } - - template - PacketType packet(Index row, Index col) const - { return m_evaluator.template packet(row, col); } - - template - PacketType packet(Index index) const - { return m_evaluator.template packet(index); } - - EIGEN_DEVICE_FUNC - CoeffReturnType coeffByOuterInner(Index outer, Index inner) const - { return m_evaluator.coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); } - - template - PacketType packetByOuterInner(Index outer, Index inner) const - { return m_evaluator.template packet(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); } - - const XprType & nestedExpression() const { return m_xpr; } - -protected: - internal::evaluator m_evaluator; - const XprType &m_xpr; -}; - -} // end namespace internal - -/*************************************************************************** -* Part 4 : public API -***************************************************************************/ - - -/** \returns the result of a full redux operation on the whole matrix or vector using \a func - * - * The template parameter \a BinaryOp is the type of the functor \a func which must be - * an associative operator. Both current C++98 and C++11 functor styles are handled. - * - * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise() - */ -template -template -EIGEN_DEVICE_FUNC typename internal::traits::Scalar -DenseBase::redux(const Func& func) const -{ - eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix"); - - typedef typename internal::redux_evaluator ThisEvaluator; - ThisEvaluator thisEval(derived()); - - return internal::redux_impl::run(thisEval, func); -} - -/** \returns the minimum of all coefficients of \c *this. - * \warning the result is undefined if \c *this contains NaN. - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::minCoeff() const -{ - return derived().redux(Eigen::internal::scalar_min_op()); -} - -/** \returns the maximum of all coefficients of \c *this. - * \warning the result is undefined if \c *this contains NaN. - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::maxCoeff() const -{ - return derived().redux(Eigen::internal::scalar_max_op()); -} - -/** \returns the sum of all coefficients of \c *this - * - * If \c *this is empty, then the value 0 is returned. - * - * \sa trace(), prod(), mean() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::sum() const -{ - if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0)) - return Scalar(0); - return derived().redux(Eigen::internal::scalar_sum_op()); -} - -/** \returns the mean of all coefficients of *this -* -* \sa trace(), prod(), sum() -*/ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::mean() const -{ -#ifdef __INTEL_COMPILER - #pragma warning push - #pragma warning ( disable : 2259 ) -#endif - return Scalar(derived().redux(Eigen::internal::scalar_sum_op())) / Scalar(this->size()); -#ifdef __INTEL_COMPILER - #pragma warning pop -#endif -} - -/** \returns the product of all coefficients of *this - * - * Example: \include MatrixBase_prod.cpp - * Output: \verbinclude MatrixBase_prod.out - * - * \sa sum(), mean(), trace() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -DenseBase::prod() const -{ - if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0)) - return Scalar(1); - return derived().redux(Eigen::internal::scalar_product_op()); -} - -/** \returns the trace of \c *this, i.e. the sum of the coefficients on the main diagonal. - * - * \c *this can be any matrix, not necessarily square. - * - * \sa diagonal(), sum() - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits::Scalar -MatrixBase::trace() const -{ - return derived().diagonal().sum(); -} - -} // end namespace Eigen - -#endif // EIGEN_REDUX_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Ref.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Ref.h deleted file mode 100644 index abb1e512..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Ref.h +++ /dev/null @@ -1,283 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REF_H -#define EIGEN_REF_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : public traits > -{ - typedef _PlainObjectType PlainObjectType; - typedef _StrideType StrideType; - enum { - Options = _Options, - Flags = traits >::Flags | NestByRefBit, - Alignment = traits >::Alignment - }; - - template struct match { - enum { - HasDirectAccess = internal::has_direct_access::ret, - StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)), - InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic) - || int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime) - || (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1), - OuterStrideMatch = Derived::IsVectorAtCompileTime - || int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime), - // NOTE, this indirection of evaluator::Alignment is needed - // to workaround a very strange bug in MSVC related to the instantiation - // of has_*ary_operator in evaluator. - // This line is surprisingly very sensitive. For instance, simply adding parenthesis - // as "DerivedAlignment = (int(evaluator::Alignment))," will make MSVC fail... - DerivedAlignment = int(evaluator::Alignment), - AlignmentMatch = (int(traits::Alignment)==int(Unaligned)) || (DerivedAlignment >= int(Alignment)), // FIXME the first condition is not very clear, it should be replaced by the required alignment - ScalarTypeMatch = internal::is_same::value, - MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch && AlignmentMatch && ScalarTypeMatch - }; - typedef typename internal::conditional::type type; - }; - -}; - -template -struct traits > : public traits {}; - -} - -template class RefBase - : public MapBase -{ - typedef typename internal::traits::PlainObjectType PlainObjectType; - typedef typename internal::traits::StrideType StrideType; - -public: - - typedef MapBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(RefBase) - - EIGEN_DEVICE_FUNC inline Index innerStride() const - { - return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1; - } - - EIGEN_DEVICE_FUNC inline Index outerStride() const - { - return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer() - : IsVectorAtCompileTime ? this->size() - : int(Flags)&RowMajorBit ? this->cols() - : this->rows(); - } - - EIGEN_DEVICE_FUNC RefBase() - : Base(0,RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime), - // Stride<> does not allow default ctor for Dynamic strides, so let' initialize it with dummy values: - m_stride(StrideType::OuterStrideAtCompileTime==Dynamic?0:StrideType::OuterStrideAtCompileTime, - StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime) - {} - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase) - -protected: - - typedef Stride StrideBase; - - template - EIGEN_DEVICE_FUNC void construct(Expression& expr) - { - if(PlainObjectType::RowsAtCompileTime==1) - { - eigen_assert(expr.rows()==1 || expr.cols()==1); - ::new (static_cast(this)) Base(expr.data(), 1, expr.size()); - } - else if(PlainObjectType::ColsAtCompileTime==1) - { - eigen_assert(expr.rows()==1 || expr.cols()==1); - ::new (static_cast(this)) Base(expr.data(), expr.size(), 1); - } - else - ::new (static_cast(this)) Base(expr.data(), expr.rows(), expr.cols()); - - if(Expression::IsVectorAtCompileTime && (!PlainObjectType::IsVectorAtCompileTime) && ((Expression::Flags&RowMajorBit)!=(PlainObjectType::Flags&RowMajorBit))) - ::new (&m_stride) StrideBase(expr.innerStride(), StrideType::InnerStrideAtCompileTime==0?0:1); - else - ::new (&m_stride) StrideBase(StrideType::OuterStrideAtCompileTime==0?0:expr.outerStride(), - StrideType::InnerStrideAtCompileTime==0?0:expr.innerStride()); - } - - StrideBase m_stride; -}; - -/** \class Ref - * \ingroup Core_Module - * - * \brief A matrix or vector expression mapping an existing expression - * - * \tparam PlainObjectType the equivalent matrix type of the mapped data - * \tparam Options specifies the pointer alignment in bytes. It can be: \c #Aligned128, , \c #Aligned64, \c #Aligned32, \c #Aligned16, \c #Aligned8 or \c #Unaligned. - * The default is \c #Unaligned. - * \tparam StrideType optionally specifies strides. By default, Ref implies a contiguous storage along the inner dimension (inner stride==1), - * but accepts a variable outer stride (leading dimension). - * This can be overridden by specifying strides. - * The type passed here must be a specialization of the Stride template, see examples below. - * - * This class provides a way to write non-template functions taking Eigen objects as parameters while limiting the number of copies. - * A Ref<> object can represent either a const expression or a l-value: - * \code - * // in-out argument: - * void foo1(Ref x); - * - * // read-only const argument: - * void foo2(const Ref& x); - * \endcode - * - * In the in-out case, the input argument must satisfy the constraints of the actual Ref<> type, otherwise a compilation issue will be triggered. - * By default, a Ref can reference any dense vector expression of float having a contiguous memory layout. - * Likewise, a Ref can reference any column-major dense matrix expression of float whose column's elements are contiguously stored with - * the possibility to have a constant space in-between each column, i.e. the inner stride must be equal to 1, but the outer stride (or leading dimension) - * can be greater than the number of rows. - * - * In the const case, if the input expression does not match the above requirement, then it is evaluated into a temporary before being passed to the function. - * Here are some examples: - * \code - * MatrixXf A; - * VectorXf a; - * foo1(a.head()); // OK - * foo1(A.col()); // OK - * foo1(A.row()); // Compilation error because here innerstride!=1 - * foo2(A.row()); // Compilation error because A.row() is a 1xN object while foo2 is expecting a Nx1 object - * foo2(A.row().transpose()); // The row is copied into a contiguous temporary - * foo2(2*a); // The expression is evaluated into a temporary - * foo2(A.col().segment(2,4)); // No temporary - * \endcode - * - * The range of inputs that can be referenced without temporary can be enlarged using the last two template parameters. - * Here is an example accepting an innerstride!=1: - * \code - * // in-out argument: - * void foo3(Ref > x); - * foo3(A.row()); // OK - * \endcode - * The downside here is that the function foo3 might be significantly slower than foo1 because it won't be able to exploit vectorization, and will involve more - * expensive address computations even if the input is contiguously stored in memory. To overcome this issue, one might propose to overload internally calling a - * template function, e.g.: - * \code - * // in the .h: - * void foo(const Ref& A); - * void foo(const Ref >& A); - * - * // in the .cpp: - * template void foo_impl(const TypeOfA& A) { - * ... // crazy code goes here - * } - * void foo(const Ref& A) { foo_impl(A); } - * void foo(const Ref >& A) { foo_impl(A); } - * \endcode - * - * See also the following stackoverflow questions for further references: - * - Correct usage of the Eigen::Ref<> class - * - * \sa PlainObjectBase::Map(), \ref TopicStorageOrders - */ -template class Ref - : public RefBase > -{ - private: - typedef internal::traits Traits; - template - EIGEN_DEVICE_FUNC inline Ref(const PlainObjectBase& expr, - typename internal::enable_if::MatchAtCompileTime),Derived>::type* = 0); - public: - - typedef RefBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Ref) - - - #ifndef EIGEN_PARSED_BY_DOXYGEN - template - EIGEN_DEVICE_FUNC inline Ref(PlainObjectBase& expr, - typename internal::enable_if::MatchAtCompileTime),Derived>::type* = 0) - { - EIGEN_STATIC_ASSERT(bool(Traits::template match::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH); - Base::construct(expr.derived()); - } - template - EIGEN_DEVICE_FUNC inline Ref(const DenseBase& expr, - typename internal::enable_if::MatchAtCompileTime),Derived>::type* = 0) - #else - /** Implicit constructor from any dense expression */ - template - inline Ref(DenseBase& expr) - #endif - { - EIGEN_STATIC_ASSERT(bool(internal::is_lvalue::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY); - EIGEN_STATIC_ASSERT(bool(Traits::template match::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH); - EIGEN_STATIC_ASSERT(!Derived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY); - Base::construct(expr.const_cast_derived()); - } - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Ref) - -}; - -// this is the const ref version -template class Ref - : public RefBase > -{ - typedef internal::traits Traits; - public: - - typedef RefBase Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Ref) - - template - EIGEN_DEVICE_FUNC inline Ref(const DenseBase& expr, - typename internal::enable_if::ScalarTypeMatch),Derived>::type* = 0) - { -// std::cout << match_helper::HasDirectAccess << "," << match_helper::OuterStrideMatch << "," << match_helper::InnerStrideMatch << "\n"; -// std::cout << int(StrideType::OuterStrideAtCompileTime) << " - " << int(Derived::OuterStrideAtCompileTime) << "\n"; -// std::cout << int(StrideType::InnerStrideAtCompileTime) << " - " << int(Derived::InnerStrideAtCompileTime) << "\n"; - construct(expr.derived(), typename Traits::template match::type()); - } - - EIGEN_DEVICE_FUNC inline Ref(const Ref& other) : Base(other) { - // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy - } - - template - EIGEN_DEVICE_FUNC inline Ref(const RefBase& other) { - construct(other.derived(), typename Traits::template match::type()); - } - - protected: - - template - EIGEN_DEVICE_FUNC void construct(const Expression& expr,internal::true_type) - { - Base::construct(expr); - } - - template - EIGEN_DEVICE_FUNC void construct(const Expression& expr, internal::false_type) - { - internal::call_assignment_no_alias(m_object,expr,internal::assign_op()); - Base::construct(m_object); - } - - protected: - TPlainObjectType m_object; -}; - -} // end namespace Eigen - -#endif // EIGEN_REF_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Replicate.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Replicate.h deleted file mode 100644 index 0b2d6d74..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Replicate.h +++ /dev/null @@ -1,142 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REPLICATE_H -#define EIGEN_REPLICATE_H - -namespace Eigen { - -namespace internal { -template -struct traits > - : traits -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ref_selector::type MatrixTypeNested; - typedef typename remove_reference::type _MatrixTypeNested; - enum { - RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic - ? Dynamic - : RowFactor * MatrixType::RowsAtCompileTime, - ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic - ? Dynamic - : ColFactor * MatrixType::ColsAtCompileTime, - //FIXME we don't propagate the max sizes !!! - MaxRowsAtCompileTime = RowsAtCompileTime, - MaxColsAtCompileTime = ColsAtCompileTime, - IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1 - : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0 - : (MatrixType::Flags & RowMajorBit) ? 1 : 0, - - // FIXME enable DirectAccess with negative strides? - Flags = IsRowMajor ? RowMajorBit : 0 - }; -}; -} - -/** - * \class Replicate - * \ingroup Core_Module - * - * \brief Expression of the multiple replication of a matrix or vector - * - * \tparam MatrixType the type of the object we are replicating - * \tparam RowFactor number of repetitions at compile time along the vertical direction, can be Dynamic. - * \tparam ColFactor number of repetitions at compile time along the horizontal direction, can be Dynamic. - * - * This class represents an expression of the multiple replication of a matrix or vector. - * It is the return type of DenseBase::replicate() and most of the time - * this is the only way it is used. - * - * \sa DenseBase::replicate() - */ -template class Replicate - : public internal::dense_xpr_base< Replicate >::type -{ - typedef typename internal::traits::MatrixTypeNested MatrixTypeNested; - typedef typename internal::traits::_MatrixTypeNested _MatrixTypeNested; - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Replicate) - typedef typename internal::remove_all::type NestedExpression; - - template - EIGEN_DEVICE_FUNC - inline explicit Replicate(const OriginalMatrixType& matrix) - : m_matrix(matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor) - { - EIGEN_STATIC_ASSERT((internal::is_same::type,OriginalMatrixType>::value), - THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) - eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic); - } - - template - EIGEN_DEVICE_FUNC - inline Replicate(const OriginalMatrixType& matrix, Index rowFactor, Index colFactor) - : m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor) - { - EIGEN_STATIC_ASSERT((internal::is_same::type,OriginalMatrixType>::value), - THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE) - } - - EIGEN_DEVICE_FUNC - inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); } - EIGEN_DEVICE_FUNC - inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); } - - EIGEN_DEVICE_FUNC - const _MatrixTypeNested& nestedExpression() const - { - return m_matrix; - } - - protected: - MatrixTypeNested m_matrix; - const internal::variable_if_dynamic m_rowFactor; - const internal::variable_if_dynamic m_colFactor; -}; - -/** - * \return an expression of the replication of \c *this - * - * Example: \include MatrixBase_replicate.cpp - * Output: \verbinclude MatrixBase_replicate.out - * - * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate - */ -template -template -EIGEN_DEVICE_FUNC const Replicate -DenseBase::replicate() const -{ - return Replicate(derived()); -} - -/** - * \return an expression of the replication of each column (or row) of \c *this - * - * Example: \include DirectionWise_replicate_int.cpp - * Output: \verbinclude DirectionWise_replicate_int.out - * - * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate - */ -template -EIGEN_DEVICE_FUNC const typename VectorwiseOp::ReplicateReturnType -VectorwiseOp::replicate(Index factor) const -{ - return typename VectorwiseOp::ReplicateReturnType - (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1); -} - -} // end namespace Eigen - -#endif // EIGEN_REPLICATE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/ReturnByValue.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/ReturnByValue.h deleted file mode 100644 index 11dc86d0..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/ReturnByValue.h +++ /dev/null @@ -1,117 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Gael Guennebaud -// Copyright (C) 2009-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_RETURNBYVALUE_H -#define EIGEN_RETURNBYVALUE_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : public traits::ReturnType> -{ - enum { - // We're disabling the DirectAccess because e.g. the constructor of - // the Block-with-DirectAccess expression requires to have a coeffRef method. - // Also, we don't want to have to implement the stride stuff. - Flags = (traits::ReturnType>::Flags - | EvalBeforeNestingBit) & ~DirectAccessBit - }; -}; - -/* The ReturnByValue object doesn't even have a coeff() method. - * So the only way that nesting it in an expression can work, is by evaluating it into a plain matrix. - * So internal::nested always gives the plain return matrix type. - * - * FIXME: I don't understand why we need this specialization: isn't this taken care of by the EvalBeforeNestingBit ?? - * Answer: EvalBeforeNestingBit should be deprecated since we have the evaluators - */ -template -struct nested_eval, n, PlainObject> -{ - typedef typename traits::ReturnType type; -}; - -} // end namespace internal - -/** \class ReturnByValue - * \ingroup Core_Module - * - */ -template class ReturnByValue - : public internal::dense_xpr_base< ReturnByValue >::type, internal::no_assignment_operator -{ - public: - typedef typename internal::traits::ReturnType ReturnType; - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue) - - template - EIGEN_DEVICE_FUNC - inline void evalTo(Dest& dst) const - { static_cast(this)->evalTo(dst); } - EIGEN_DEVICE_FUNC inline Index rows() const { return static_cast(this)->rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return static_cast(this)->cols(); } - -#ifndef EIGEN_PARSED_BY_DOXYGEN -#define Unusable YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT - class Unusable{ - Unusable(const Unusable&) {} - Unusable& operator=(const Unusable&) {return *this;} - }; - const Unusable& coeff(Index) const { return *reinterpret_cast(this); } - const Unusable& coeff(Index,Index) const { return *reinterpret_cast(this); } - Unusable& coeffRef(Index) { return *reinterpret_cast(this); } - Unusable& coeffRef(Index,Index) { return *reinterpret_cast(this); } -#undef Unusable -#endif -}; - -template -template -EIGEN_DEVICE_FUNC Derived& DenseBase::operator=(const ReturnByValue& other) -{ - other.evalTo(derived()); - return derived(); -} - -namespace internal { - -// Expression is evaluated in a temporary; default implementation of Assignment is bypassed so that -// when a ReturnByValue expression is assigned, the evaluator is not constructed. -// TODO: Finalize port to new regime; ReturnByValue should not exist in the expression world - -template -struct evaluator > - : public evaluator::ReturnType> -{ - typedef ReturnByValue XprType; - typedef typename internal::traits::ReturnType PlainObject; - typedef evaluator Base; - - EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) - : m_result(xpr.rows(), xpr.cols()) - { - ::new (static_cast(this)) Base(m_result); - xpr.evalTo(m_result); - } - -protected: - PlainObject m_result; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_RETURNBYVALUE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Reverse.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Reverse.h deleted file mode 100644 index 8b6b3ab0..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Reverse.h +++ /dev/null @@ -1,211 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2009 Ricard Marxer -// Copyright (C) 2009-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_REVERSE_H -#define EIGEN_REVERSE_H - -namespace Eigen { - -namespace internal { - -template -struct traits > - : traits -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ref_selector::type MatrixTypeNested; - typedef typename remove_reference::type _MatrixTypeNested; - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, - Flags = _MatrixTypeNested::Flags & (RowMajorBit | LvalueBit) - }; -}; - -template struct reverse_packet_cond -{ - static inline PacketType run(const PacketType& x) { return preverse(x); } -}; - -template struct reverse_packet_cond -{ - static inline PacketType run(const PacketType& x) { return x; } -}; - -} // end namespace internal - -/** \class Reverse - * \ingroup Core_Module - * - * \brief Expression of the reverse of a vector or matrix - * - * \tparam MatrixType the type of the object of which we are taking the reverse - * \tparam Direction defines the direction of the reverse operation, can be Vertical, Horizontal, or BothDirections - * - * This class represents an expression of the reverse of a vector. - * It is the return type of MatrixBase::reverse() and VectorwiseOp::reverse() - * and most of the time this is the only way it is used. - * - * \sa MatrixBase::reverse(), VectorwiseOp::reverse() - */ -template class Reverse - : public internal::dense_xpr_base< Reverse >::type -{ - public: - - typedef typename internal::dense_xpr_base::type Base; - EIGEN_DENSE_PUBLIC_INTERFACE(Reverse) - typedef typename internal::remove_all::type NestedExpression; - using Base::IsRowMajor; - - protected: - enum { - PacketSize = internal::packet_traits::size, - IsColMajor = !IsRowMajor, - ReverseRow = (Direction == Vertical) || (Direction == BothDirections), - ReverseCol = (Direction == Horizontal) || (Direction == BothDirections), - OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1, - OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1, - ReversePacket = (Direction == BothDirections) - || ((Direction == Vertical) && IsColMajor) - || ((Direction == Horizontal) && IsRowMajor) - }; - typedef internal::reverse_packet_cond reverse_packet; - public: - - EIGEN_DEVICE_FUNC explicit inline Reverse(const MatrixType& matrix) : m_matrix(matrix) { } - - EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse) - - EIGEN_DEVICE_FUNC inline Index rows() const { return m_matrix.rows(); } - EIGEN_DEVICE_FUNC inline Index cols() const { return m_matrix.cols(); } - - EIGEN_DEVICE_FUNC inline Index innerStride() const - { - return -m_matrix.innerStride(); - } - - EIGEN_DEVICE_FUNC const typename internal::remove_all::type& - nestedExpression() const - { - return m_matrix; - } - - protected: - typename MatrixType::Nested m_matrix; -}; - -/** \returns an expression of the reverse of *this. - * - * Example: \include MatrixBase_reverse.cpp - * Output: \verbinclude MatrixBase_reverse.out - * - */ -template -EIGEN_DEVICE_FUNC inline typename DenseBase::ReverseReturnType -DenseBase::reverse() -{ - return ReverseReturnType(derived()); -} - - -//reverse const overload moved DenseBase.h due to a CUDA compiler bug - -/** This is the "in place" version of reverse: it reverses \c *this. - * - * In most cases it is probably better to simply use the reversed expression - * of a matrix. However, when reversing the matrix data itself is really needed, - * then this "in-place" version is probably the right choice because it provides - * the following additional benefits: - * - less error prone: doing the same operation with .reverse() requires special care: - * \code m = m.reverse().eval(); \endcode - * - this API enables reverse operations without the need for a temporary - * - it allows future optimizations (cache friendliness, etc.) - * - * \sa VectorwiseOp::reverseInPlace(), reverse() */ -template -EIGEN_DEVICE_FUNC inline void DenseBase::reverseInPlace() -{ - if(cols()>rows()) - { - Index half = cols()/2; - leftCols(half).swap(rightCols(half).reverse()); - if((cols()%2)==1) - { - Index half2 = rows()/2; - col(half).head(half2).swap(col(half).tail(half2).reverse()); - } - } - else - { - Index half = rows()/2; - topRows(half).swap(bottomRows(half).reverse()); - if((rows()%2)==1) - { - Index half2 = cols()/2; - row(half).head(half2).swap(row(half).tail(half2).reverse()); - } - } -} - -namespace internal { - -template -struct vectorwise_reverse_inplace_impl; - -template<> -struct vectorwise_reverse_inplace_impl -{ - template - static void run(ExpressionType &xpr) - { - Index half = xpr.rows()/2; - xpr.topRows(half).swap(xpr.bottomRows(half).colwise().reverse()); - } -}; - -template<> -struct vectorwise_reverse_inplace_impl -{ - template - static void run(ExpressionType &xpr) - { - Index half = xpr.cols()/2; - xpr.leftCols(half).swap(xpr.rightCols(half).rowwise().reverse()); - } -}; - -} // end namespace internal - -/** This is the "in place" version of VectorwiseOp::reverse: it reverses each column or row of \c *this. - * - * In most cases it is probably better to simply use the reversed expression - * of a matrix. However, when reversing the matrix data itself is really needed, - * then this "in-place" version is probably the right choice because it provides - * the following additional benefits: - * - less error prone: doing the same operation with .reverse() requires special care: - * \code m = m.reverse().eval(); \endcode - * - this API enables reverse operations without the need for a temporary - * - * \sa DenseBase::reverseInPlace(), reverse() */ -template -EIGEN_DEVICE_FUNC void VectorwiseOp::reverseInPlace() -{ - internal::vectorwise_reverse_inplace_impl::run(_expression().const_cast_derived()); -} - -} // end namespace Eigen - -#endif // EIGEN_REVERSE_H diff --git a/testbed/nanogui/ext/eigen/Eigen/src/Core/Select.h b/testbed/nanogui/ext/eigen/Eigen/src/Core/Select.h deleted file mode 100644 index 79eec1b5..00000000 --- a/testbed/nanogui/ext/eigen/Eigen/src/Core/Select.h +++ /dev/null @@ -1,162 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_SELECT_H -#define EIGEN_SELECT_H - -namespace Eigen { - -/** \class Select - * \ingroup Core_Module - * - * \brief Expression of a coefficient wise version of the C++ ternary operator ?: - * - * \param ConditionMatrixType the type of the \em condition expression which must be a boolean matrix - * \param ThenMatrixType the type of the \em then expression - * \param ElseMatrixType the type of the \em else expression - * - * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:. - * It is the return type of DenseBase::select() and most of the time this is the only way it is used. - * - * \sa DenseBase::select(const DenseBase&, const DenseBase&) const - */ - -namespace internal { -template -struct traits > - : traits -{ - typedef typename traits::Scalar Scalar; - typedef Dense StorageKind; - typedef typename traits::XprKind XprKind; - typedef typename ConditionMatrixType::Nested ConditionMatrixNested; - typedef typename ThenMatrixType::Nested ThenMatrixNested; - typedef typename ElseMatrixType::Nested ElseMatrixNested; - enum { - RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime, - ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime, - Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & RowMajorBit - }; -}; -} - -template -class Select : public internal::dense_xpr_base< Select >::type, - internal::no_assignment_operator -{ - public: - - typedef typename internal::dense_xpr_base" << endl; - cerr << "available actions:" << endl; - for (auto it = available_actions.begin(); it != available_actions.end(); ++it) { - cerr << " " << (*it)->invokation_name() << endl; - } - cerr << "the input files should each contain an output of benchmark-blocking-sizes" << endl; - exit(1); -} - -int main(int argc, char* argv[]) -{ - cout.precision(default_precision); - cerr.precision(default_precision); - - vector> available_actions; - available_actions.emplace_back(new partition_action_t); - available_actions.emplace_back(new evaluate_defaults_action_t); - - vector input_filenames; - - action_t* action = nullptr; - - if (argc < 2) { - show_usage_and_exit(argc, argv, available_actions); - } - for (int i = 1; i < argc; i++) { - bool arg_handled = false; - // Step 1. Try to match action invokation names. - for (auto it = available_actions.begin(); it != available_actions.end(); ++it) { - if (!strcmp(argv[i], (*it)->invokation_name())) { - if (!action) { - action = it->get(); - arg_handled = true; - break; - } else { - cerr << "can't specify more than one action!" << endl; - show_usage_and_exit(argc, argv, available_actions); - } - } - } - if (arg_handled) { - continue; - } - // Step 2. Try to match option names. - if (argv[i][0] == '-') { - if (!strcmp(argv[i], "--only-cubic-sizes")) { - only_cubic_sizes = true; - arg_handled = true; - } - if (!strcmp(argv[i], "--dump-tables")) { - dump_tables = true; - arg_handled = true; - } - if (!arg_handled) { - cerr << "Unrecognized option: " << argv[i] << endl; - show_usage_and_exit(argc, argv, available_actions); - } - } - if (arg_handled) { - continue; - } - // Step 3. Default to interpreting args as input filenames. - input_filenames.emplace_back(argv[i]); - } - - if (dump_tables && only_cubic_sizes) { - cerr << "Incompatible options: --only-cubic-sizes and --dump-tables." << endl; - show_usage_and_exit(argc, argv, available_actions); - } - - if (!action) { - show_usage_and_exit(argc, argv, available_actions); - } - - action->run(input_filenames); -} diff --git a/testbed/nanogui/ext/eigen/bench/basicbench.cxxlist b/testbed/nanogui/ext/eigen/bench/basicbench.cxxlist deleted file mode 100644 index a8ab34e0..00000000 --- a/testbed/nanogui/ext/eigen/bench/basicbench.cxxlist +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# CLIST[((g++))]="g++-3.4 -O3 -DNDEBUG" -# CLIST[((g++))]="g++-3.4 -O3 -DNDEBUG -finline-limit=20000" - -# CLIST[((g++))]="g++-4.1 -O3 -DNDEBUG" -#CLIST[((g++))]="g++-4.1 -O3 -DNDEBUG -finline-limit=20000" - -# CLIST[((g++))]="g++-4.2 -O3 -DNDEBUG" -#CLIST[((g++))]="g++-4.2 -O3 -DNDEBUG -finline-limit=20000" -# CLIST[((g++))]="g++-4.2 -O3 -DNDEBUG -finline-limit=20000 -fprofile-generate" -# CLIST[((g++))]="g++-4.2 -O3 -DNDEBUG -finline-limit=20000 -fprofile-use" - -# CLIST[((g++))]="g++-4.3 -O3 -DNDEBUG" -#CLIST[((g++))]="g++-4.3 -O3 -DNDEBUG -finline-limit=20000" -# CLIST[((g++))]="g++-4.3 -O3 -DNDEBUG -finline-limit=20000 -fprofile-generate" -# CLIST[((g++))]="g++-4.3 -O3 -DNDEBUG -finline-limit=20000 -fprofile-use" - -# CLIST[((g++))]="icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -prof-genx" -# CLIST[((g++))]="icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -prof-use" - -#CLIST[((g++))]="/opt/intel/Compiler/11.1/072/bin/intel64/icpc -fast -DNDEBUG -fno-exceptions -no-inline-max-size -lrt" -CLIST[((g++))]="/home/orzel/svn/llvm/Release/bin/clang++ -O3 -DNDEBUG -DEIGEN_DONT_VECTORIZE -lrt" -CLIST[((g++))]="/home/orzel/svn/llvm/Release/bin/clang++ -O3 -DNDEBUG -lrt" -CLIST[((g++))]="g++-4.4.4 -O3 -DNDEBUG -DEIGEN_DONT_VECTORIZE -lrt" -CLIST[((g++))]="g++-4.4.4 -O3 -DNDEBUG -lrt" -CLIST[((g++))]="g++-4.5.0 -O3 -DNDEBUG -DEIGEN_DONT_VECTORIZE -lrt" -CLIST[((g++))]="g++-4.5.0 -O3 -DNDEBUG -lrt" diff --git a/testbed/nanogui/ext/eigen/bench/basicbenchmark.cpp b/testbed/nanogui/ext/eigen/bench/basicbenchmark.cpp deleted file mode 100644 index a26ea853..00000000 --- a/testbed/nanogui/ext/eigen/bench/basicbenchmark.cpp +++ /dev/null @@ -1,35 +0,0 @@ - -#include -#include "BenchUtil.h" -#include "basicbenchmark.h" - -int main(int argc, char *argv[]) -{ - DISABLE_SSE_EXCEPTIONS(); - - // this is the list of matrix type and size we want to bench: - // ((suffix) (matrix size) (number of iterations)) - #define MODES ((3d)(3)(4000000)) ((4d)(4)(1000000)) ((Xd)(4)(1000000)) ((Xd)(20)(10000)) -// #define MODES ((Xd)(20)(10000)) - - #define _GENERATE_HEADER(R,ARG,EL) << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_HEAD(EL)) << "-" \ - << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(1,EL)) << "x" \ - << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(1,EL)) << " / " - - std::cout BOOST_PP_SEQ_FOR_EACH(_GENERATE_HEADER, ~, MODES ) << endl; - - const int tries = 10; - - #define _RUN_BENCH(R,ARG,EL) \ - std::cout << ARG( \ - BOOST_PP_CAT(Matrix, BOOST_PP_SEQ_HEAD(EL)) (\ - BOOST_PP_SEQ_ELEM(1,EL),BOOST_PP_SEQ_ELEM(1,EL)), BOOST_PP_SEQ_ELEM(2,EL), tries) \ - << " "; - - BOOST_PP_SEQ_FOR_EACH(_RUN_BENCH, benchBasic, MODES ); - std::cout << endl; - BOOST_PP_SEQ_FOR_EACH(_RUN_BENCH, benchBasic, MODES ); - std::cout << endl; - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/basicbenchmark.h b/testbed/nanogui/ext/eigen/bench/basicbenchmark.h deleted file mode 100644 index 3fdc3573..00000000 --- a/testbed/nanogui/ext/eigen/bench/basicbenchmark.h +++ /dev/null @@ -1,63 +0,0 @@ - -#ifndef EIGEN_BENCH_BASICBENCH_H -#define EIGEN_BENCH_BASICBENCH_H - -enum {LazyEval, EarlyEval, OmpEval}; - -template -void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) __attribute__((noinline)); - -template -void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) -{ - for(int a = 0; a < iterations; a++) - { - if (Mode==LazyEval) - { - asm("#begin_bench_loop LazyEval"); - if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); - m = (I + 0.00005 * (m + m.lazy() * m)).eval(); - } - else if (Mode==OmpEval) - { - asm("#begin_bench_loop OmpEval"); - if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); - m = (I + 0.00005 * (m + m.lazy() * m)).evalOMP(); - } - else - { - asm("#begin_bench_loop EarlyEval"); - if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); - m = I + 0.00005 * (m + m * m); - } - asm("#end_bench_loop"); - } -} - -template -double benchBasic(const MatrixType& mat, int size, int tries) __attribute__((noinline)); - -template -double benchBasic(const MatrixType& mat, int iterations, int tries) -{ - const int rows = mat.rows(); - const int cols = mat.cols(); - - MatrixType I(rows,cols); - MatrixType m(rows,cols); - - initMatrix_identity(I); - - Eigen::BenchTimer timer; - for(uint t=0; t(I, m, iterations); - timer.stop(); - cerr << m; - } - return timer.value(); -}; - -#endif // EIGEN_BENCH_BASICBENCH_H diff --git a/testbed/nanogui/ext/eigen/bench/benchBlasGemm.cpp b/testbed/nanogui/ext/eigen/bench/benchBlasGemm.cpp deleted file mode 100644 index cb086a55..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchBlasGemm.cpp +++ /dev/null @@ -1,219 +0,0 @@ -// g++ -O3 -DNDEBUG -I.. -L /usr/lib64/atlas/ benchBlasGemm.cpp -o benchBlasGemm -lrt -lcblas -// possible options: -// -DEIGEN_DONT_VECTORIZE -// -msse2 - -// #define EIGEN_DEFAULT_TO_ROW_MAJOR -#define _FLOAT - -#include - -#include -#include "BenchTimer.h" - -// include the BLAS headers -extern "C" { -#include -} -#include - -#ifdef _FLOAT -typedef float Scalar; -#define CBLAS_GEMM cblas_sgemm -#else -typedef double Scalar; -#define CBLAS_GEMM cblas_dgemm -#endif - - -typedef Eigen::Matrix MyMatrix; -void bench_eigengemm(MyMatrix& mc, const MyMatrix& ma, const MyMatrix& mb, int nbloops); -void check_product(int M, int N, int K); -void check_product(void); - -int main(int argc, char *argv[]) -{ - // disable SSE exceptions - #ifdef __GNUC__ - { - int aux; - asm( - "stmxcsr %[aux] \n\t" - "orl $32832, %[aux] \n\t" - "ldmxcsr %[aux] \n\t" - : : [aux] "m" (aux)); - } - #endif - - int nbtries=1, nbloops=1, M, N, K; - - if (argc==2) - { - if (std::string(argv[1])=="check") - check_product(); - else - M = N = K = atoi(argv[1]); - } - else if ((argc==3) && (std::string(argv[1])=="auto")) - { - M = N = K = atoi(argv[2]); - nbloops = 1000000000/(M*M*M); - if (nbloops<1) - nbloops = 1; - nbtries = 6; - } - else if (argc==4) - { - M = N = K = atoi(argv[1]); - nbloops = atoi(argv[2]); - nbtries = atoi(argv[3]); - } - else if (argc==6) - { - M = atoi(argv[1]); - N = atoi(argv[2]); - K = atoi(argv[3]); - nbloops = atoi(argv[4]); - nbtries = atoi(argv[5]); - } - else - { - std::cout << "Usage: " << argv[0] << " size \n"; - std::cout << "Usage: " << argv[0] << " auto size\n"; - std::cout << "Usage: " << argv[0] << " size nbloops nbtries\n"; - std::cout << "Usage: " << argv[0] << " M N K nbloops nbtries\n"; - std::cout << "Usage: " << argv[0] << " check\n"; - std::cout << "Options:\n"; - std::cout << " size unique size of the 2 matrices (integer)\n"; - std::cout << " auto automatically set the number of repetitions and tries\n"; - std::cout << " nbloops number of times the GEMM routines is executed\n"; - std::cout << " nbtries number of times the loop is benched (return the best try)\n"; - std::cout << " M N K sizes of the matrices: MxN = MxK * KxN (integers)\n"; - std::cout << " check check eigen product using cblas as a reference\n"; - exit(1); - } - - double nbmad = double(M) * double(N) * double(K) * double(nbloops); - - if (!(std::string(argv[1])=="auto")) - std::cout << M << " x " << N << " x " << K << "\n"; - - Scalar alpha, beta; - MyMatrix ma(M,K), mb(K,N), mc(M,N); - ma = MyMatrix::Random(M,K); - mb = MyMatrix::Random(K,N); - mc = MyMatrix::Random(M,N); - - Eigen::BenchTimer timer; - - // we simply compute c += a*b, so: - alpha = 1; - beta = 1; - - // bench cblas - // ROWS_A, COLS_B, COLS_A, 1.0, A, COLS_A, B, COLS_B, 0.0, C, COLS_B); - if (!(std::string(argv[1])=="auto")) - { - timer.reset(); - for (uint k=0 ; k(1,64); - N = internal::random(1,768); - K = internal::random(1,768); - M = (0 + M) * 1; - std::cout << M << " x " << N << " x " << K << "\n"; - check_product(M, N, K); - } -} - diff --git a/testbed/nanogui/ext/eigen/bench/benchCholesky.cpp b/testbed/nanogui/ext/eigen/bench/benchCholesky.cpp deleted file mode 100644 index 9a8e7cf6..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchCholesky.cpp +++ /dev/null @@ -1,142 +0,0 @@ - -// g++ -DNDEBUG -O3 -I.. benchLLT.cpp -o benchLLT && ./benchLLT -// options: -// -DBENCH_GSL -lgsl /usr/lib/libcblas.so.3 -// -DEIGEN_DONT_VECTORIZE -// -msse2 -// -DREPEAT=100 -// -DTRIES=10 -// -DSCALAR=double - -#include - -#include -#include -#include -using namespace Eigen; - -#ifndef REPEAT -#define REPEAT 10000 -#endif - -#ifndef TRIES -#define TRIES 10 -#endif - -typedef float Scalar; - -template -__attribute__ ((noinline)) void benchLLT(const MatrixType& m) -{ - int rows = m.rows(); - int cols = m.cols(); - - double cost = 0; - for (int j=0; j SquareMatrixType; - - MatrixType a = MatrixType::Random(rows,cols); - SquareMatrixType covMat = a * a.adjoint(); - - BenchTimer timerNoSqrt, timerSqrt; - - Scalar acc = 0; - int r = internal::random(0,covMat.rows()-1); - int c = internal::random(0,covMat.cols()-1); - for (int t=0; t cholnosqrt(covMat); - acc += cholnosqrt.matrixL().coeff(r,c); - } - timerNoSqrt.stop(); - } - - for (int t=0; t chol(covMat); - acc += chol.matrixL().coeff(r,c); - } - timerSqrt.stop(); - } - - if (MatrixType::RowsAtCompileTime==Dynamic) - std::cout << "dyn "; - else - std::cout << "fixed "; - std::cout << covMat.rows() << " \t" - << (timerNoSqrt.best()) / repeats << "s " - << "(" << 1e-9 * cost*repeats/timerNoSqrt.best() << " GFLOPS)\t" - << (timerSqrt.best()) / repeats << "s " - << "(" << 1e-9 * cost*repeats/timerSqrt.best() << " GFLOPS)\n"; - - - #ifdef BENCH_GSL - if (MatrixType::RowsAtCompileTime==Dynamic) - { - timerSqrt.reset(); - - gsl_matrix* gslCovMat = gsl_matrix_alloc(covMat.rows(),covMat.cols()); - gsl_matrix* gslCopy = gsl_matrix_alloc(covMat.rows(),covMat.cols()); - - eiToGsl(covMat, &gslCovMat); - for (int t=0; t0; ++i) - benchLLT(Matrix(dynsizes[i],dynsizes[i])); - - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - benchLLT(Matrix()); - return 0; -} - diff --git a/testbed/nanogui/ext/eigen/bench/benchEigenSolver.cpp b/testbed/nanogui/ext/eigen/bench/benchEigenSolver.cpp deleted file mode 100644 index dd78c7e0..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchEigenSolver.cpp +++ /dev/null @@ -1,212 +0,0 @@ - -// g++ -DNDEBUG -O3 -I.. benchEigenSolver.cpp -o benchEigenSolver && ./benchEigenSolver -// options: -// -DBENCH_GMM -// -DBENCH_GSL -lgsl /usr/lib/libcblas.so.3 -// -DEIGEN_DONT_VECTORIZE -// -msse2 -// -DREPEAT=100 -// -DTRIES=10 -// -DSCALAR=double - -#include - -#include -#include -#include -using namespace Eigen; - -#ifndef REPEAT -#define REPEAT 1000 -#endif - -#ifndef TRIES -#define TRIES 4 -#endif - -#ifndef SCALAR -#define SCALAR float -#endif - -typedef SCALAR Scalar; - -template -__attribute__ ((noinline)) void benchEigenSolver(const MatrixType& m) -{ - int rows = m.rows(); - int cols = m.cols(); - - int stdRepeats = std::max(1,int((REPEAT*1000)/(rows*rows*sqrt(rows)))); - int saRepeats = stdRepeats * 4; - - typedef typename MatrixType::Scalar Scalar; - typedef Matrix SquareMatrixType; - - MatrixType a = MatrixType::Random(rows,cols); - SquareMatrixType covMat = a * a.adjoint(); - - BenchTimer timerSa, timerStd; - - Scalar acc = 0; - int r = internal::random(0,covMat.rows()-1); - int c = internal::random(0,covMat.cols()-1); - { - SelfAdjointEigenSolver ei(covMat); - for (int t=0; t ei(covMat); - for (int t=0; t gmmCovMat(covMat.rows(),covMat.cols()); - gmm::dense_matrix eigvect(covMat.rows(),covMat.cols()); - std::vector eigval(covMat.rows()); - eiToGmm(covMat, gmmCovMat); - for (int t=0; t0; ++i) - benchEigenSolver(Matrix(dynsizes[i],dynsizes[i])); - - benchEigenSolver(Matrix()); - benchEigenSolver(Matrix()); - benchEigenSolver(Matrix()); - benchEigenSolver(Matrix()); - benchEigenSolver(Matrix()); - benchEigenSolver(Matrix()); - benchEigenSolver(Matrix()); - return 0; -} - diff --git a/testbed/nanogui/ext/eigen/bench/benchFFT.cpp b/testbed/nanogui/ext/eigen/bench/benchFFT.cpp deleted file mode 100644 index 3eb1a1ac..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchFFT.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Mark Borgerding mark a borgerding net -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include - -#include -#include -#include -#include - -#include - -using namespace Eigen; -using namespace std; - - -template -string nameof(); - -template <> string nameof() {return "float";} -template <> string nameof() {return "double";} -template <> string nameof() {return "long double";} - -#ifndef TYPE -#define TYPE float -#endif - -#ifndef NFFT -#define NFFT 1024 -#endif -#ifndef NDATA -#define NDATA 1000000 -#endif - -using namespace Eigen; - -template -void bench(int nfft,bool fwd,bool unscaled=false, bool halfspec=false) -{ - typedef typename NumTraits::Real Scalar; - typedef typename std::complex Complex; - int nits = NDATA/nfft; - vector inbuf(nfft); - vector outbuf(nfft); - FFT< Scalar > fft; - - if (unscaled) { - fft.SetFlag(fft.Unscaled); - cout << "unscaled "; - } - if (halfspec) { - fft.SetFlag(fft.HalfSpectrum); - cout << "halfspec "; - } - - - std::fill(inbuf.begin(),inbuf.end(),0); - fft.fwd( outbuf , inbuf); - - BenchTimer timer; - timer.reset(); - for (int k=0;k<8;++k) { - timer.start(); - if (fwd) - for(int i = 0; i < nits; i++) - fft.fwd( outbuf , inbuf); - else - for(int i = 0; i < nits; i++) - fft.inv(inbuf,outbuf); - timer.stop(); - } - - cout << nameof() << " "; - double mflops = 5.*nfft*log2((double)nfft) / (1e6 * timer.value() / (double)nits ); - if ( NumTraits::IsComplex ) { - cout << "complex"; - }else{ - cout << "real "; - mflops /= 2; - } - - - if (fwd) - cout << " fwd"; - else - cout << " inv"; - - cout << " NFFT=" << nfft << " " << (double(1e-6*nfft*nits)/timer.value()) << " MS/s " << mflops << "MFLOPS\n"; -} - -int main(int argc,char ** argv) -{ - bench >(NFFT,true); - bench >(NFFT,false); - bench(NFFT,true); - bench(NFFT,false); - bench(NFFT,false,true); - bench(NFFT,false,true,true); - - bench >(NFFT,true); - bench >(NFFT,false); - bench(NFFT,true); - bench(NFFT,false); - bench >(NFFT,true); - bench >(NFFT,false); - bench(NFFT,true); - bench(NFFT,false); - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/benchGeometry.cpp b/testbed/nanogui/ext/eigen/bench/benchGeometry.cpp deleted file mode 100644 index 6e16c033..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchGeometry.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include -#include -#include -#include - -using namespace Eigen; -using namespace std; - -#ifndef REPEAT -#define REPEAT 1000000 -#endif - -enum func_opt -{ - TV, - TMATV, - TMATVMAT, -}; - - -template -struct func; - -template -struct func -{ - static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 ) - { - asm (""); - return a1 * a2; - } -}; - -template -struct func -{ - static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 ) - { - asm (""); - return a1.matrix() * a2; - } -}; - -template -struct func -{ - static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 ) - { - asm (""); - return res(a1.matrix() * a2.matrix()); - } -}; - -template -struct test_transform -{ - static void run() - { - arg1 a1; - a1.setIdentity(); - arg2 a2; - a2.setIdentity(); - - BenchTimer timer; - timer.reset(); - for (int k=0; k<10; ++k) - { - timer.start(); - for (int k=0; k Trans;\ - typedef Matrix Vec;\ - typedef func Func;\ - test_transform< Func, Trans, Vec >::run();\ - } - -#define run_trans( op, scalar, mode, option ) \ - std::cout << #scalar << "\t " << #mode << "\t " << #option << " "; \ - {\ - typedef Transform Trans;\ - typedef func Func;\ - test_transform< Func, Trans, Trans >::run();\ - } - -int main(int argc, char* argv[]) -{ - cout << "vec = trans * vec" << endl; - run_vec(TV, float, Isometry, AutoAlign, 3); - run_vec(TV, float, Isometry, DontAlign, 3); - run_vec(TV, float, Isometry, AutoAlign, 4); - run_vec(TV, float, Isometry, DontAlign, 4); - run_vec(TV, float, Projective, AutoAlign, 4); - run_vec(TV, float, Projective, DontAlign, 4); - run_vec(TV, double, Isometry, AutoAlign, 3); - run_vec(TV, double, Isometry, DontAlign, 3); - run_vec(TV, double, Isometry, AutoAlign, 4); - run_vec(TV, double, Isometry, DontAlign, 4); - run_vec(TV, double, Projective, AutoAlign, 4); - run_vec(TV, double, Projective, DontAlign, 4); - - cout << "vec = trans.matrix() * vec" << endl; - run_vec(TMATV, float, Isometry, AutoAlign, 4); - run_vec(TMATV, float, Isometry, DontAlign, 4); - run_vec(TMATV, double, Isometry, AutoAlign, 4); - run_vec(TMATV, double, Isometry, DontAlign, 4); - - cout << "trans = trans1 * trans" << endl; - run_trans(TV, float, Isometry, AutoAlign); - run_trans(TV, float, Isometry, DontAlign); - run_trans(TV, double, Isometry, AutoAlign); - run_trans(TV, double, Isometry, DontAlign); - run_trans(TV, float, Projective, AutoAlign); - run_trans(TV, float, Projective, DontAlign); - run_trans(TV, double, Projective, AutoAlign); - run_trans(TV, double, Projective, DontAlign); - - cout << "trans = trans1.matrix() * trans.matrix()" << endl; - run_trans(TMATVMAT, float, Isometry, AutoAlign); - run_trans(TMATVMAT, float, Isometry, DontAlign); - run_trans(TMATVMAT, double, Isometry, AutoAlign); - run_trans(TMATVMAT, double, Isometry, DontAlign); -} - diff --git a/testbed/nanogui/ext/eigen/bench/benchVecAdd.cpp b/testbed/nanogui/ext/eigen/bench/benchVecAdd.cpp deleted file mode 100644 index ce8e1e91..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchVecAdd.cpp +++ /dev/null @@ -1,135 +0,0 @@ - -#include -#include -#include -using namespace Eigen; - -#ifndef SIZE -#define SIZE 50 -#endif - -#ifndef REPEAT -#define REPEAT 10000 -#endif - -typedef float Scalar; - -__attribute__ ((noinline)) void benchVec(Scalar* a, Scalar* b, Scalar* c, int size); -__attribute__ ((noinline)) void benchVec(MatrixXf& a, MatrixXf& b, MatrixXf& c); -__attribute__ ((noinline)) void benchVec(VectorXf& a, VectorXf& b, VectorXf& c); - -int main(int argc, char* argv[]) -{ - int size = SIZE * 8; - int size2 = size * size; - Scalar* a = internal::aligned_new(size2); - Scalar* b = internal::aligned_new(size2+4)+1; - Scalar* c = internal::aligned_new(size2); - - for (int i=0; i2 ; --innersize) - { - if (size2%innersize==0) - { - int outersize = size2/innersize; - MatrixXf ma = Map(a, innersize, outersize ); - MatrixXf mb = Map(b, innersize, outersize ); - MatrixXf mc = Map(c, innersize, outersize ); - timer.reset(); - for (int k=0; k<3; ++k) - { - timer.start(); - benchVec(ma, mb, mc); - timer.stop(); - } - std::cout << innersize << " x " << outersize << " " << timer.value() << "s " << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << " GFlops\n"; - } - } - - VectorXf va = Map(a, size2); - VectorXf vb = Map(b, size2); - VectorXf vc = Map(c, size2); - timer.reset(); - for (int k=0; k<3; ++k) - { - timer.start(); - benchVec(va, vb, vc); - timer.stop(); - } - std::cout << timer.value() << "s " << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << " GFlops\n"; - - return 0; -} - -void benchVec(MatrixXf& a, MatrixXf& b, MatrixXf& c) -{ - for (int k=0; k::type PacketScalar; - const int PacketSize = internal::packet_traits::size; - PacketScalar a0, a1, a2, a3, b0, b1, b2, b3; - for (int k=0; k -// -DSCALARA=double or -DSCALARB=double -// -DHAVE_BLAS -// -DDECOUPLED -// - -#include -#include -#include - -using namespace std; -using namespace Eigen; - -#ifndef SCALAR -// #define SCALAR std::complex -#define SCALAR float -#endif - -#ifndef SCALARA -#define SCALARA SCALAR -#endif - -#ifndef SCALARB -#define SCALARB SCALAR -#endif - -typedef SCALAR Scalar; -typedef NumTraits::Real RealScalar; -typedef Matrix A; -typedef Matrix B; -typedef Matrix C; -typedef Matrix M; - -#ifdef HAVE_BLAS - -extern "C" { - #include -} - -static float fone = 1; -static float fzero = 0; -static double done = 1; -static double szero = 0; -static std::complex cfone = 1; -static std::complex cfzero = 0; -static std::complex cdone = 1; -static std::complex cdzero = 0; -static char notrans = 'N'; -static char trans = 'T'; -static char nonunit = 'N'; -static char lower = 'L'; -static char right = 'R'; -static int intone = 1; - -void blas_gemm(const MatrixXf& a, const MatrixXf& b, MatrixXf& c) -{ - int M = c.rows(); int N = c.cols(); int K = a.cols(); - int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows(); - - sgemm_(¬rans,¬rans,&M,&N,&K,&fone, - const_cast(a.data()),&lda, - const_cast(b.data()),&ldb,&fone, - c.data(),&ldc); -} - -EIGEN_DONT_INLINE void blas_gemm(const MatrixXd& a, const MatrixXd& b, MatrixXd& c) -{ - int M = c.rows(); int N = c.cols(); int K = a.cols(); - int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows(); - - dgemm_(¬rans,¬rans,&M,&N,&K,&done, - const_cast(a.data()),&lda, - const_cast(b.data()),&ldb,&done, - c.data(),&ldc); -} - -void blas_gemm(const MatrixXcf& a, const MatrixXcf& b, MatrixXcf& c) -{ - int M = c.rows(); int N = c.cols(); int K = a.cols(); - int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows(); - - cgemm_(¬rans,¬rans,&M,&N,&K,(float*)&cfone, - const_cast((const float*)a.data()),&lda, - const_cast((const float*)b.data()),&ldb,(float*)&cfone, - (float*)c.data(),&ldc); -} - -void blas_gemm(const MatrixXcd& a, const MatrixXcd& b, MatrixXcd& c) -{ - int M = c.rows(); int N = c.cols(); int K = a.cols(); - int lda = a.rows(); int ldb = b.rows(); int ldc = c.rows(); - - zgemm_(¬rans,¬rans,&M,&N,&K,(double*)&cdone, - const_cast((const double*)a.data()),&lda, - const_cast((const double*)b.data()),&ldb,(double*)&cdone, - (double*)c.data(),&ldc); -} - - - -#endif - -void matlab_cplx_cplx(const M& ar, const M& ai, const M& br, const M& bi, M& cr, M& ci) -{ - cr.noalias() += ar * br; - cr.noalias() -= ai * bi; - ci.noalias() += ar * bi; - ci.noalias() += ai * br; -} - -void matlab_real_cplx(const M& a, const M& br, const M& bi, M& cr, M& ci) -{ - cr.noalias() += a * br; - ci.noalias() += a * bi; -} - -void matlab_cplx_real(const M& ar, const M& ai, const M& b, M& cr, M& ci) -{ - cr.noalias() += ar * b; - ci.noalias() += ai * b; -} - -template -EIGEN_DONT_INLINE void gemm(const A& a, const B& b, C& c) -{ - c.noalias() += a * b; -} - -int main(int argc, char ** argv) -{ - std::ptrdiff_t l1 = internal::queryL1CacheSize(); - std::ptrdiff_t l2 = internal::queryTopLevelCacheSize(); - std::cout << "L1 cache size = " << (l1>0 ? l1/1024 : -1) << " KB\n"; - std::cout << "L2/L3 cache size = " << (l2>0 ? l2/1024 : -1) << " KB\n"; - typedef internal::gebp_traits Traits; - std::cout << "Register blocking = " << Traits::mr << " x " << Traits::nr << "\n"; - - int rep = 1; // number of repetitions per try - int tries = 2; // number of tries, we keep the best - - int s = 2048; - int m = s; - int n = s; - int p = s; - int cache_size1=-1, cache_size2=l2, cache_size3 = 0; - - bool need_help = false; - for (int i=1; i -c -t -p \n"; - std::cout << " : size\n"; - std::cout << " : rows columns depth\n"; - return 1; - } - -#if EIGEN_VERSION_AT_LEAST(3,2,90) - if(cache_size1>0) - setCpuCacheSizes(cache_size1,cache_size2,cache_size3); -#endif - - A a(m,p); a.setRandom(); - B b(p,n); b.setRandom(); - C c(m,n); c.setOnes(); - C rc = c; - - std::cout << "Matrix sizes = " << m << "x" << p << " * " << p << "x" << n << "\n"; - std::ptrdiff_t mc(m), nc(n), kc(p); - internal::computeProductBlockingSizes(kc, mc, nc); - std::cout << "blocking size (mc x kc) = " << mc << " x " << kc << "\n"; - - C r = c; - - // check the parallel product is correct - #if defined EIGEN_HAS_OPENMP - Eigen::initParallel(); - int procs = omp_get_max_threads(); - if(procs>1) - { - #ifdef HAVE_BLAS - blas_gemm(a,b,r); - #else - omp_set_num_threads(1); - r.noalias() += a * b; - omp_set_num_threads(procs); - #endif - c.noalias() += a * b; - if(!r.isApprox(c)) std::cerr << "Warning, your parallel product is crap!\n\n"; - } - #elif defined HAVE_BLAS - blas_gemm(a,b,r); - c.noalias() += a * b; - if(!r.isApprox(c)) { - std::cout << r - c << "\n"; - std::cerr << "Warning, your product is crap!\n\n"; - } - #else - if(1.*m*n*p<2000.*2000*2000) - { - gemm(a,b,c); - r.noalias() += a.cast() .lazyProduct( b.cast() ); - if(!r.isApprox(c)) { - std::cout << r - c << "\n"; - std::cerr << "Warning, your product is crap!\n\n"; - } - } - #endif - - #ifdef HAVE_BLAS - BenchTimer tblas; - c = rc; - BENCH(tblas, tries, rep, blas_gemm(a,b,c)); - std::cout << "blas cpu " << tblas.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tblas.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << tblas.total(CPU_TIMER) << "s)\n"; - std::cout << "blas real " << tblas.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tblas.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << tblas.total(REAL_TIMER) << "s)\n"; - #endif - - BenchTimer tmt; - c = rc; - BENCH(tmt, tries, rep, gemm(a,b,c)); - std::cout << "eigen cpu " << tmt.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tmt.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << tmt.total(CPU_TIMER) << "s)\n"; - std::cout << "eigen real " << tmt.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tmt.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << tmt.total(REAL_TIMER) << "s)\n"; - - #ifdef EIGEN_HAS_OPENMP - if(procs>1) - { - BenchTimer tmono; - omp_set_num_threads(1); - Eigen::setNbThreads(1); - c = rc; - BENCH(tmono, tries, rep, gemm(a,b,c)); - std::cout << "eigen mono cpu " << tmono.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tmono.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << tmono.total(CPU_TIMER) << "s)\n"; - std::cout << "eigen mono real " << tmono.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tmono.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << tmono.total(REAL_TIMER) << "s)\n"; - std::cout << "mt speed up x" << tmono.best(CPU_TIMER) / tmt.best(REAL_TIMER) << " => " << (100.0*tmono.best(CPU_TIMER) / tmt.best(REAL_TIMER))/procs << "%\n"; - } - #endif - - if(1.*m*n*p<30*30*30) - { - BenchTimer tmt; - c = rc; - BENCH(tmt, tries, rep, c.noalias()+=a.lazyProduct(b)); - std::cout << "lazy cpu " << tmt.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tmt.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << tmt.total(CPU_TIMER) << "s)\n"; - std::cout << "lazy real " << tmt.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/tmt.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << tmt.total(REAL_TIMER) << "s)\n"; - } - - #ifdef DECOUPLED - if((NumTraits::IsComplex) && (NumTraits::IsComplex)) - { - M ar(m,p); ar.setRandom(); - M ai(m,p); ai.setRandom(); - M br(p,n); br.setRandom(); - M bi(p,n); bi.setRandom(); - M cr(m,n); cr.setRandom(); - M ci(m,n); ci.setRandom(); - - BenchTimer t; - BENCH(t, tries, rep, matlab_cplx_cplx(ar,ai,br,bi,cr,ci)); - std::cout << "\"matlab\" cpu " << t.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/t.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << t.total(CPU_TIMER) << "s)\n"; - std::cout << "\"matlab\" real " << t.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/t.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << t.total(REAL_TIMER) << "s)\n"; - } - if((!NumTraits::IsComplex) && (NumTraits::IsComplex)) - { - M a(m,p); a.setRandom(); - M br(p,n); br.setRandom(); - M bi(p,n); bi.setRandom(); - M cr(m,n); cr.setRandom(); - M ci(m,n); ci.setRandom(); - - BenchTimer t; - BENCH(t, tries, rep, matlab_real_cplx(a,br,bi,cr,ci)); - std::cout << "\"matlab\" cpu " << t.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/t.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << t.total(CPU_TIMER) << "s)\n"; - std::cout << "\"matlab\" real " << t.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/t.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << t.total(REAL_TIMER) << "s)\n"; - } - if((NumTraits::IsComplex) && (!NumTraits::IsComplex)) - { - M ar(m,p); ar.setRandom(); - M ai(m,p); ai.setRandom(); - M b(p,n); b.setRandom(); - M cr(m,n); cr.setRandom(); - M ci(m,n); ci.setRandom(); - - BenchTimer t; - BENCH(t, tries, rep, matlab_cplx_real(ar,ai,b,cr,ci)); - std::cout << "\"matlab\" cpu " << t.best(CPU_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/t.best(CPU_TIMER))*1e-9 << " GFLOPS \t(" << t.total(CPU_TIMER) << "s)\n"; - std::cout << "\"matlab\" real " << t.best(REAL_TIMER)/rep << "s \t" << (double(m)*n*p*rep*2/t.best(REAL_TIMER))*1e-9 << " GFLOPS \t(" << t.total(REAL_TIMER) << "s)\n"; - } - #endif - - return 0; -} - diff --git a/testbed/nanogui/ext/eigen/bench/bench_multi_compilers.sh b/testbed/nanogui/ext/eigen/bench/bench_multi_compilers.sh deleted file mode 100755 index 27e91f1d..00000000 --- a/testbed/nanogui/ext/eigen/bench/bench_multi_compilers.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -if (($# < 2)); then - echo "Usage: $0 compilerlist.txt benchfile.cpp" -else - -compilerlist=$1 -benchfile=$2 - -g=0 -source $compilerlist - -# for each compiler, compile benchfile and run the benchmark -for (( i=0 ; i /dev/null - echo "" - else - echo "compiler not found: $compiler" - fi -done - -fi diff --git a/testbed/nanogui/ext/eigen/bench/bench_norm.cpp b/testbed/nanogui/ext/eigen/bench/bench_norm.cpp deleted file mode 100644 index 129afcfb..00000000 --- a/testbed/nanogui/ext/eigen/bench/bench_norm.cpp +++ /dev/null @@ -1,360 +0,0 @@ -#include -#include -#include -#include "BenchTimer.h" -using namespace Eigen; -using namespace std; - -template -EIGEN_DONT_INLINE typename T::Scalar sqsumNorm(T& v) -{ - return v.norm(); -} - -template -EIGEN_DONT_INLINE typename T::Scalar stableNorm(T& v) -{ - return v.stableNorm(); -} - -template -EIGEN_DONT_INLINE typename T::Scalar hypotNorm(T& v) -{ - return v.hypotNorm(); -} - -template -EIGEN_DONT_INLINE typename T::Scalar blueNorm(T& v) -{ - return v.blueNorm(); -} - -template -EIGEN_DONT_INLINE typename T::Scalar lapackNorm(T& v) -{ - typedef typename T::Scalar Scalar; - int n = v.size(); - Scalar scale = 0; - Scalar ssq = 1; - for (int i=0;i= ax) - { - ssq += numext::abs2(ax/scale); - } - else - { - ssq = Scalar(1) + ssq * numext::abs2(scale/ax); - scale = ax; - } - } - return scale * std::sqrt(ssq); -} - -template -EIGEN_DONT_INLINE typename T::Scalar twopassNorm(T& v) -{ - typedef typename T::Scalar Scalar; - Scalar s = v.array().abs().maxCoeff(); - return s*(v/s).norm(); -} - -template -EIGEN_DONT_INLINE typename T::Scalar bl2passNorm(T& v) -{ - return v.stableNorm(); -} - -template -EIGEN_DONT_INLINE typename T::Scalar divacNorm(T& v) -{ - int n =v.size() / 2; - for (int i=0;i0) - { - for (int i=0;i -EIGEN_DONT_INLINE typename T::Scalar pblueNorm(const T& v) -{ - #ifndef EIGEN_VECTORIZE - return v.blueNorm(); - #else - typedef typename T::Scalar Scalar; - - static int nmax = 0; - static Scalar b1, b2, s1m, s2m, overfl, rbig, relerr; - int n; - - if(nmax <= 0) - { - int nbig, ibeta, it, iemin, iemax, iexp; - Scalar abig, eps; - - nbig = std::numeric_limits::max(); // largest integer - ibeta = std::numeric_limits::radix; //NumTraits::Base; // base for floating-point numbers - it = std::numeric_limits::digits; //NumTraits::Mantissa; // number of base-beta digits in mantissa - iemin = std::numeric_limits::min_exponent; // minimum exponent - iemax = std::numeric_limits::max_exponent; // maximum exponent - rbig = std::numeric_limits::max(); // largest floating-point number - - // Check the basic machine-dependent constants. - if(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5) - || (it<=4 && ibeta <= 3 ) || it<2) - { - eigen_assert(false && "the algorithm cannot be guaranteed on this computer"); - } - iexp = -((1-iemin)/2); - b1 = std::pow(ibeta, iexp); // lower boundary of midrange - iexp = (iemax + 1 - it)/2; - b2 = std::pow(ibeta,iexp); // upper boundary of midrange - - iexp = (2-iemin)/2; - s1m = std::pow(ibeta,iexp); // scaling factor for lower range - iexp = - ((iemax+it)/2); - s2m = std::pow(ibeta,iexp); // scaling factor for upper range - - overfl = rbig*s2m; // overfow boundary for abig - eps = std::pow(ibeta, 1-it); - relerr = std::sqrt(eps); // tolerance for neglecting asml - abig = 1.0/eps - 1.0; - if (Scalar(nbig)>abig) nmax = abig; // largest safe n - else nmax = nbig; - } - - typedef typename internal::packet_traits::type Packet; - const int ps = internal::packet_traits::size; - Packet pasml = internal::pset1(Scalar(0)); - Packet pamed = internal::pset1(Scalar(0)); - Packet pabig = internal::pset1(Scalar(0)); - Packet ps2m = internal::pset1(s2m); - Packet ps1m = internal::pset1(s1m); - Packet pb2 = internal::pset1(b2); - Packet pb1 = internal::pset1(b1); - for(int j=0; j(j)); - Packet ax_s2m = internal::pmul(ax,ps2m); - Packet ax_s1m = internal::pmul(ax,ps1m); - Packet maskBig = internal::plt(pb2,ax); - Packet maskSml = internal::plt(ax,pb1); - -// Packet maskMed = internal::pand(maskSml,maskBig); -// Packet scale = internal::pset1(Scalar(0)); -// scale = internal::por(scale, internal::pand(maskBig,ps2m)); -// scale = internal::por(scale, internal::pand(maskSml,ps1m)); -// scale = internal::por(scale, internal::pandnot(internal::pset1(Scalar(1)),maskMed)); -// ax = internal::pmul(ax,scale); -// ax = internal::pmul(ax,ax); -// pabig = internal::padd(pabig, internal::pand(maskBig, ax)); -// pasml = internal::padd(pasml, internal::pand(maskSml, ax)); -// pamed = internal::padd(pamed, internal::pandnot(ax,maskMed)); - - - pabig = internal::padd(pabig, internal::pand(maskBig, internal::pmul(ax_s2m,ax_s2m))); - pasml = internal::padd(pasml, internal::pand(maskSml, internal::pmul(ax_s1m,ax_s1m))); - pamed = internal::padd(pamed, internal::pandnot(internal::pmul(ax,ax),internal::pand(maskSml,maskBig))); - } - Scalar abig = internal::predux(pabig); - Scalar asml = internal::predux(pasml); - Scalar amed = internal::predux(pamed); - if(abig > Scalar(0)) - { - abig = std::sqrt(abig); - if(abig > overfl) - { - eigen_assert(false && "overflow"); - return rbig; - } - if(amed > Scalar(0)) - { - abig = abig/s2m; - amed = std::sqrt(amed); - } - else - { - return abig/s2m; - } - - } - else if(asml > Scalar(0)) - { - if (amed > Scalar(0)) - { - abig = std::sqrt(amed); - amed = std::sqrt(asml) / s1m; - } - else - { - return std::sqrt(asml)/s1m; - } - } - else - { - return std::sqrt(amed); - } - asml = std::min(abig, amed); - abig = std::max(abig, amed); - if(asml <= abig*relerr) - return abig; - else - return abig * std::sqrt(Scalar(1) + numext::abs2(asml/abig)); - #endif -} - -#define BENCH_PERF(NRM) { \ - float af = 0; double ad = 0; std::complex ac = 0; \ - Eigen::BenchTimer tf, td, tcf; tf.reset(); td.reset(); tcf.reset();\ - for (int k=0; k()); - double yd = based * std::abs(internal::random()); - VectorXf vf = VectorXf::Ones(s) * yf; - VectorXd vd = VectorXd::Ones(s) * yd; - - std::cout << "reference\t" << std::sqrt(double(s))*yf << "\t" << std::sqrt(double(s))*yd << "\n"; - std::cout << "sqsumNorm\t" << sqsumNorm(vf) << "\t" << sqsumNorm(vd) << "\n"; - std::cout << "hypotNorm\t" << hypotNorm(vf) << "\t" << hypotNorm(vd) << "\n"; - std::cout << "blueNorm\t" << blueNorm(vf) << "\t" << blueNorm(vd) << "\n"; - std::cout << "pblueNorm\t" << pblueNorm(vf) << "\t" << pblueNorm(vd) << "\n"; - std::cout << "lapackNorm\t" << lapackNorm(vf) << "\t" << lapackNorm(vd) << "\n"; - std::cout << "twopassNorm\t" << twopassNorm(vf) << "\t" << twopassNorm(vd) << "\n"; - std::cout << "bl2passNorm\t" << bl2passNorm(vf) << "\t" << bl2passNorm(vd) << "\n"; -} - -void check_accuracy_var(int ef0, int ef1, int ed0, int ed1, int s) -{ - VectorXf vf(s); - VectorXd vd(s); - for (int i=0; i()) * std::pow(double(10), internal::random(ef0,ef1)); - vd[i] = std::abs(internal::random()) * std::pow(double(10), internal::random(ed0,ed1)); - } - - //std::cout << "reference\t" << internal::sqrt(double(s))*yf << "\t" << internal::sqrt(double(s))*yd << "\n"; - std::cout << "sqsumNorm\t" << sqsumNorm(vf) << "\t" << sqsumNorm(vd) << "\t" << sqsumNorm(vf.cast()) << "\t" << sqsumNorm(vd.cast()) << "\n"; - std::cout << "hypotNorm\t" << hypotNorm(vf) << "\t" << hypotNorm(vd) << "\t" << hypotNorm(vf.cast()) << "\t" << hypotNorm(vd.cast()) << "\n"; - std::cout << "blueNorm\t" << blueNorm(vf) << "\t" << blueNorm(vd) << "\t" << blueNorm(vf.cast()) << "\t" << blueNorm(vd.cast()) << "\n"; - std::cout << "pblueNorm\t" << pblueNorm(vf) << "\t" << pblueNorm(vd) << "\t" << blueNorm(vf.cast()) << "\t" << blueNorm(vd.cast()) << "\n"; - std::cout << "lapackNorm\t" << lapackNorm(vf) << "\t" << lapackNorm(vd) << "\t" << lapackNorm(vf.cast()) << "\t" << lapackNorm(vd.cast()) << "\n"; - std::cout << "twopassNorm\t" << twopassNorm(vf) << "\t" << twopassNorm(vd) << "\t" << twopassNorm(vf.cast()) << "\t" << twopassNorm(vd.cast()) << "\n"; -// std::cout << "bl2passNorm\t" << bl2passNorm(vf) << "\t" << bl2passNorm(vd) << "\t" << bl2passNorm(vf.cast()) << "\t" << bl2passNorm(vd.cast()) << "\n"; -} - -int main(int argc, char** argv) -{ - int tries = 10; - int iters = 100000; - double y = 1.1345743233455785456788e12 * internal::random(); - VectorXf v = VectorXf::Ones(1024) * y; - -// return 0; - int s = 10000; - double basef_ok = 1.1345743233455785456788e15; - double based_ok = 1.1345743233455785456788e95; - - double basef_under = 1.1345743233455785456788e-27; - double based_under = 1.1345743233455785456788e-303; - - double basef_over = 1.1345743233455785456788e+27; - double based_over = 1.1345743233455785456788e+302; - - std::cout.precision(20); - - std::cerr << "\nNo under/overflow:\n"; - check_accuracy(basef_ok, based_ok, s); - - std::cerr << "\nUnderflow:\n"; - check_accuracy(basef_under, based_under, s); - - std::cerr << "\nOverflow:\n"; - check_accuracy(basef_over, based_over, s); - - std::cerr << "\nVarying (over):\n"; - for (int k=0; k<1; ++k) - { - check_accuracy_var(20,27,190,302,s); - std::cout << "\n"; - } - - std::cerr << "\nVarying (under):\n"; - for (int k=0; k<1; ++k) - { - check_accuracy_var(-27,20,-302,-190,s); - std::cout << "\n"; - } - - y = 1; - std::cout.precision(4); - int s1 = 1024*1024*32; - std::cerr << "Performance (out of cache, " << s1 << "):\n"; - { - int iters = 1; - VectorXf vf = VectorXf::Random(s1) * y; - VectorXd vd = VectorXd::Random(s1) * y; - VectorXcf vcf = VectorXcf::Random(s1) * y; - BENCH_PERF(sqsumNorm); - BENCH_PERF(stableNorm); - BENCH_PERF(blueNorm); - BENCH_PERF(pblueNorm); - BENCH_PERF(lapackNorm); - BENCH_PERF(hypotNorm); - BENCH_PERF(twopassNorm); - BENCH_PERF(bl2passNorm); - } - - std::cerr << "\nPerformance (in cache, " << 512 << "):\n"; - { - int iters = 100000; - VectorXf vf = VectorXf::Random(512) * y; - VectorXd vd = VectorXd::Random(512) * y; - VectorXcf vcf = VectorXcf::Random(512) * y; - BENCH_PERF(sqsumNorm); - BENCH_PERF(stableNorm); - BENCH_PERF(blueNorm); - BENCH_PERF(pblueNorm); - BENCH_PERF(lapackNorm); - BENCH_PERF(hypotNorm); - BENCH_PERF(twopassNorm); - BENCH_PERF(bl2passNorm); - } -} diff --git a/testbed/nanogui/ext/eigen/bench/bench_reverse.cpp b/testbed/nanogui/ext/eigen/bench/bench_reverse.cpp deleted file mode 100644 index 1e69ca1b..00000000 --- a/testbed/nanogui/ext/eigen/bench/bench_reverse.cpp +++ /dev/null @@ -1,84 +0,0 @@ - -#include -#include -#include -using namespace Eigen; - -#ifndef REPEAT -#define REPEAT 100000 -#endif - -#ifndef TRIES -#define TRIES 20 -#endif - -typedef double Scalar; - -template -__attribute__ ((noinline)) void bench_reverse(const MatrixType& m) -{ - int rows = m.rows(); - int cols = m.cols(); - int size = m.size(); - - int repeats = (REPEAT*1000)/size; - MatrixType a = MatrixType::Random(rows,cols); - MatrixType b = MatrixType::Random(rows,cols); - - BenchTimer timerB, timerH, timerV; - - Scalar acc = 0; - int r = internal::random(0,rows-1); - int c = internal::random(0,cols-1); - for (int t=0; t0; ++i) - { - bench_reverse(Matrix(dynsizes[i],dynsizes[i])); - bench_reverse(Matrix(dynsizes[i]*dynsizes[i])); - } -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); -// bench_reverse(Matrix()); - return 0; -} - diff --git a/testbed/nanogui/ext/eigen/bench/bench_sum.cpp b/testbed/nanogui/ext/eigen/bench/bench_sum.cpp deleted file mode 100644 index a3d925e4..00000000 --- a/testbed/nanogui/ext/eigen/bench/bench_sum.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -int main() -{ - typedef Matrix Vec; - Vec v(SIZE); - v.setZero(); - v[0] = 1; - v[1] = 2; - for(int i = 0; i < 1000000; i++) - { - v.coeffRef(0) += v.sum() * SCALAR(1e-20); - } - cout << v.sum() << endl; -} diff --git a/testbed/nanogui/ext/eigen/bench/bench_unrolling b/testbed/nanogui/ext/eigen/bench/bench_unrolling deleted file mode 100755 index 82644384..00000000 --- a/testbed/nanogui/ext/eigen/bench/bench_unrolling +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# gcc : CXX="g++ -finline-limit=10000 -ftemplate-depth-2000 --param max-inline-recursive-depth=2000" -# icc : CXX="icpc -fast -no-inline-max-size -fno-exceptions" -CXX=${CXX-g++ -finline-limit=10000 -ftemplate-depth-2000 --param max-inline-recursive-depth=2000} # default value - -for ((i=1; i<16; ++i)); do - echo "Matrix size: $i x $i :" - $CXX -O3 -I.. -DNDEBUG benchmark.cpp -DMATSIZE=$i -DEIGEN_UNROLLING_LIMIT=400 -o benchmark && time ./benchmark >/dev/null - $CXX -O3 -I.. -DNDEBUG -finline-limit=10000 benchmark.cpp -DMATSIZE=$i -DEIGEN_DONT_USE_UNROLLED_LOOPS=1 -o benchmark && time ./benchmark >/dev/null - echo " " -done diff --git a/testbed/nanogui/ext/eigen/bench/benchmark-blocking-sizes.cpp b/testbed/nanogui/ext/eigen/bench/benchmark-blocking-sizes.cpp deleted file mode 100644 index 827be288..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchmark-blocking-sizes.cpp +++ /dev/null @@ -1,677 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include -#include -#include -#include -#include -#include -#include - -bool eigen_use_specific_block_size; -int eigen_block_size_k, eigen_block_size_m, eigen_block_size_n; -#define EIGEN_TEST_SPECIFIC_BLOCKING_SIZES eigen_use_specific_block_size -#define EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_K eigen_block_size_k -#define EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_M eigen_block_size_m -#define EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_N eigen_block_size_n -#include - -#include - -using namespace Eigen; -using namespace std; - -static BenchTimer timer; - -// how many times we repeat each measurement. -// measurements are randomly shuffled - we're not doing -// all N identical measurements in a row. -const int measurement_repetitions = 3; - -// Timings below this value are too short to be accurate, -// we'll repeat measurements with more iterations until -// we get a timing above that threshold. -const float min_accurate_time = 1e-2f; - -// See --min-working-set-size command line parameter. -size_t min_working_set_size = 0; - -float max_clock_speed = 0.0f; - -// range of sizes that we will benchmark (in all 3 K,M,N dimensions) -const size_t maxsize = 2048; -const size_t minsize = 16; - -typedef MatrixXf MatrixType; -typedef MatrixType::Scalar Scalar; -typedef internal::packet_traits::type Packet; - -static_assert((maxsize & (maxsize - 1)) == 0, "maxsize must be a power of two"); -static_assert((minsize & (minsize - 1)) == 0, "minsize must be a power of two"); -static_assert(maxsize > minsize, "maxsize must be larger than minsize"); -static_assert(maxsize < (minsize << 16), "maxsize must be less than (minsize<<16)"); - -// just a helper to store a triple of K,M,N sizes for matrix product -struct size_triple_t -{ - size_t k, m, n; - size_triple_t() : k(0), m(0), n(0) {} - size_triple_t(size_t _k, size_t _m, size_t _n) : k(_k), m(_m), n(_n) {} - size_triple_t(const size_triple_t& o) : k(o.k), m(o.m), n(o.n) {} - size_triple_t(uint16_t compact) - { - k = 1 << ((compact & 0xf00) >> 8); - m = 1 << ((compact & 0x0f0) >> 4); - n = 1 << ((compact & 0x00f) >> 0); - } -}; - -uint8_t log2_pot(size_t x) { - size_t l = 0; - while (x >>= 1) l++; - return l; -} - -// Convert between size tripes and a compact form fitting in 12 bits -// where each size, which must be a POT, is encoded as its log2, on 4 bits -// so the largest representable size is 2^15 == 32k ... big enough. -uint16_t compact_size_triple(size_t k, size_t m, size_t n) -{ - return (log2_pot(k) << 8) | (log2_pot(m) << 4) | log2_pot(n); -} - -uint16_t compact_size_triple(const size_triple_t& t) -{ - return compact_size_triple(t.k, t.m, t.n); -} - -// A single benchmark. Initially only contains benchmark params. -// Then call run(), which stores the result in the gflops field. -struct benchmark_t -{ - uint16_t compact_product_size; - uint16_t compact_block_size; - bool use_default_block_size; - float gflops; - benchmark_t() - : compact_product_size(0) - , compact_block_size(0) - , use_default_block_size(false) - , gflops(0) - { - } - benchmark_t(size_t pk, size_t pm, size_t pn, - size_t bk, size_t bm, size_t bn) - : compact_product_size(compact_size_triple(pk, pm, pn)) - , compact_block_size(compact_size_triple(bk, bm, bn)) - , use_default_block_size(false) - , gflops(0) - {} - benchmark_t(size_t pk, size_t pm, size_t pn) - : compact_product_size(compact_size_triple(pk, pm, pn)) - , compact_block_size(0) - , use_default_block_size(true) - , gflops(0) - {} - - void run(); -}; - -ostream& operator<<(ostream& s, const benchmark_t& b) -{ - s << hex << b.compact_product_size << dec; - if (b.use_default_block_size) { - size_triple_t t(b.compact_product_size); - Index k = t.k, m = t.m, n = t.n; - internal::computeProductBlockingSizes(k, m, n); - s << " default(" << k << ", " << m << ", " << n << ")"; - } else { - s << " " << hex << b.compact_block_size << dec; - } - s << " " << b.gflops; - return s; -} - -// We sort first by increasing benchmark parameters, -// then by decreasing performance. -bool operator<(const benchmark_t& b1, const benchmark_t& b2) -{ - return b1.compact_product_size < b2.compact_product_size || - (b1.compact_product_size == b2.compact_product_size && ( - (b1.compact_block_size < b2.compact_block_size || ( - b1.compact_block_size == b2.compact_block_size && - b1.gflops > b2.gflops)))); -} - -void benchmark_t::run() -{ - size_triple_t productsizes(compact_product_size); - - if (use_default_block_size) { - eigen_use_specific_block_size = false; - } else { - // feed eigen with our custom blocking params - eigen_use_specific_block_size = true; - size_triple_t blocksizes(compact_block_size); - eigen_block_size_k = blocksizes.k; - eigen_block_size_m = blocksizes.m; - eigen_block_size_n = blocksizes.n; - } - - // set up the matrix pool - - const size_t combined_three_matrices_sizes = - sizeof(Scalar) * - (productsizes.k * productsizes.m + - productsizes.k * productsizes.n + - productsizes.m * productsizes.n); - - // 64 M is large enough that nobody has a cache bigger than that, - // while still being small enough that everybody has this much RAM, - // so conveniently we don't need to special-case platforms here. - const size_t unlikely_large_cache_size = 64 << 20; - - const size_t working_set_size = - min_working_set_size ? min_working_set_size : unlikely_large_cache_size; - - const size_t matrix_pool_size = - 1 + working_set_size / combined_three_matrices_sizes; - - MatrixType *lhs = new MatrixType[matrix_pool_size]; - MatrixType *rhs = new MatrixType[matrix_pool_size]; - MatrixType *dst = new MatrixType[matrix_pool_size]; - - for (size_t i = 0; i < matrix_pool_size; i++) { - lhs[i] = MatrixType::Zero(productsizes.m, productsizes.k); - rhs[i] = MatrixType::Zero(productsizes.k, productsizes.n); - dst[i] = MatrixType::Zero(productsizes.m, productsizes.n); - } - - // main benchmark loop - - int iters_at_a_time = 1; - float time_per_iter = 0.0f; - size_t matrix_index = 0; - while (true) { - - double starttime = timer.getCpuTime(); - for (int i = 0; i < iters_at_a_time; i++) { - dst[matrix_index].noalias() = lhs[matrix_index] * rhs[matrix_index]; - matrix_index++; - if (matrix_index == matrix_pool_size) { - matrix_index = 0; - } - } - double endtime = timer.getCpuTime(); - - const float timing = float(endtime - starttime); - - if (timing >= min_accurate_time) { - time_per_iter = timing / iters_at_a_time; - break; - } - - iters_at_a_time *= 2; - } - - delete[] lhs; - delete[] rhs; - delete[] dst; - - gflops = 2e-9 * productsizes.k * productsizes.m * productsizes.n / time_per_iter; -} - -void print_cpuinfo() -{ -#ifdef __linux__ - cout << "contents of /proc/cpuinfo:" << endl; - string line; - ifstream cpuinfo("/proc/cpuinfo"); - if (cpuinfo.is_open()) { - while (getline(cpuinfo, line)) { - cout << line << endl; - } - cpuinfo.close(); - } - cout << endl; -#elif defined __APPLE__ - cout << "output of sysctl hw:" << endl; - system("sysctl hw"); - cout << endl; -#endif -} - -template -string type_name() -{ - return "unknown"; -} - -template<> -string type_name() -{ - return "float"; -} - -template<> -string type_name() -{ - return "double"; -} - -struct action_t -{ - virtual const char* invokation_name() const { abort(); return nullptr; } - virtual void run() const { abort(); } - virtual ~action_t() {} -}; - -void show_usage_and_exit(int /*argc*/, char* argv[], - const vector>& available_actions) -{ - cerr << "usage: " << argv[0] << " [options...]" << endl << endl; - cerr << "available actions:" << endl << endl; - for (auto it = available_actions.begin(); it != available_actions.end(); ++it) { - cerr << " " << (*it)->invokation_name() << endl; - } - cerr << endl; - cerr << "options:" << endl << endl; - cerr << " --min-working-set-size=N:" << endl; - cerr << " Set the minimum working set size to N bytes." << endl; - cerr << " This is rounded up as needed to a multiple of matrix size." << endl; - cerr << " A larger working set lowers the chance of a warm cache." << endl; - cerr << " The default value 0 means use a large enough working" << endl; - cerr << " set to likely outsize caches." << endl; - cerr << " A value of 1 (that is, 1 byte) would mean don't do anything to" << endl; - cerr << " avoid warm caches." << endl; - exit(1); -} - -float measure_clock_speed() -{ - cerr << "Measuring clock speed... \r" << flush; - - vector all_gflops; - for (int i = 0; i < 8; i++) { - benchmark_t b(1024, 1024, 1024); - b.run(); - all_gflops.push_back(b.gflops); - } - - sort(all_gflops.begin(), all_gflops.end()); - float stable_estimate = all_gflops[2] + all_gflops[3] + all_gflops[4] + all_gflops[5]; - - // multiply by an arbitrary constant to discourage trying doing anything with the - // returned values besides just comparing them with each other. - float result = stable_estimate * 123.456f; - - return result; -} - -struct human_duration_t -{ - int seconds; - human_duration_t(int s) : seconds(s) {} -}; - -ostream& operator<<(ostream& s, const human_duration_t& d) -{ - int remainder = d.seconds; - if (remainder > 3600) { - int hours = remainder / 3600; - s << hours << " h "; - remainder -= hours * 3600; - } - if (remainder > 60) { - int minutes = remainder / 60; - s << minutes << " min "; - remainder -= minutes * 60; - } - if (d.seconds < 600) { - s << remainder << " s"; - } - return s; -} - -const char session_filename[] = "/data/local/tmp/benchmark-blocking-sizes-session.data"; - -void serialize_benchmarks(const char* filename, const vector& benchmarks, size_t first_benchmark_to_run) -{ - FILE* file = fopen(filename, "w"); - if (!file) { - cerr << "Could not open file " << filename << " for writing." << endl; - cerr << "Do you have write permissions on the current working directory?" << endl; - exit(1); - } - size_t benchmarks_vector_size = benchmarks.size(); - fwrite(&max_clock_speed, sizeof(max_clock_speed), 1, file); - fwrite(&benchmarks_vector_size, sizeof(benchmarks_vector_size), 1, file); - fwrite(&first_benchmark_to_run, sizeof(first_benchmark_to_run), 1, file); - fwrite(benchmarks.data(), sizeof(benchmark_t), benchmarks.size(), file); - fclose(file); -} - -bool deserialize_benchmarks(const char* filename, vector& benchmarks, size_t& first_benchmark_to_run) -{ - FILE* file = fopen(filename, "r"); - if (!file) { - return false; - } - if (1 != fread(&max_clock_speed, sizeof(max_clock_speed), 1, file)) { - return false; - } - size_t benchmarks_vector_size = 0; - if (1 != fread(&benchmarks_vector_size, sizeof(benchmarks_vector_size), 1, file)) { - return false; - } - if (1 != fread(&first_benchmark_to_run, sizeof(first_benchmark_to_run), 1, file)) { - return false; - } - benchmarks.resize(benchmarks_vector_size); - if (benchmarks.size() != fread(benchmarks.data(), sizeof(benchmark_t), benchmarks.size(), file)) { - return false; - } - unlink(filename); - return true; -} - -void try_run_some_benchmarks( - vector& benchmarks, - double time_start, - size_t& first_benchmark_to_run) -{ - if (first_benchmark_to_run == benchmarks.size()) { - return; - } - - double time_last_progress_update = 0; - double time_last_clock_speed_measurement = 0; - double time_now = 0; - - size_t benchmark_index = first_benchmark_to_run; - - while (true) { - float ratio_done = float(benchmark_index) / benchmarks.size(); - time_now = timer.getRealTime(); - - // We check clock speed every minute and at the end. - if (benchmark_index == benchmarks.size() || - time_now > time_last_clock_speed_measurement + 60.0f) - { - time_last_clock_speed_measurement = time_now; - - // Ensure that clock speed is as expected - float current_clock_speed = measure_clock_speed(); - - // The tolerance needs to be smaller than the relative difference between - // clock speeds that a device could operate under. - // It seems unlikely that a device would be throttling clock speeds by - // amounts smaller than 2%. - // With a value of 1%, I was getting within noise on a Sandy Bridge. - const float clock_speed_tolerance = 0.02f; - - if (current_clock_speed > (1 + clock_speed_tolerance) * max_clock_speed) { - // Clock speed is now higher than we previously measured. - // Either our initial measurement was inaccurate, which won't happen - // too many times as we are keeping the best clock speed value and - // and allowing some tolerance; or something really weird happened, - // which invalidates all benchmark results collected so far. - // Either way, we better restart all over again now. - if (benchmark_index) { - cerr << "Restarting at " << 100.0f * ratio_done - << " % because clock speed increased. " << endl; - } - max_clock_speed = current_clock_speed; - first_benchmark_to_run = 0; - return; - } - - bool rerun_last_tests = false; - - if (current_clock_speed < (1 - clock_speed_tolerance) * max_clock_speed) { - cerr << "Measurements completed so far: " - << 100.0f * ratio_done - << " % " << endl; - cerr << "Clock speed seems to be only " - << current_clock_speed/max_clock_speed - << " times what it used to be." << endl; - - unsigned int seconds_to_sleep_if_lower_clock_speed = 1; - - while (current_clock_speed < (1 - clock_speed_tolerance) * max_clock_speed) { - if (seconds_to_sleep_if_lower_clock_speed > 32) { - cerr << "Sleeping longer probably won't make a difference." << endl; - cerr << "Serializing benchmarks to " << session_filename << endl; - serialize_benchmarks(session_filename, benchmarks, first_benchmark_to_run); - cerr << "Now restart this benchmark, and it should pick up where we left." << endl; - exit(2); - } - rerun_last_tests = true; - cerr << "Sleeping " - << seconds_to_sleep_if_lower_clock_speed - << " s... \r" << endl; - sleep(seconds_to_sleep_if_lower_clock_speed); - current_clock_speed = measure_clock_speed(); - seconds_to_sleep_if_lower_clock_speed *= 2; - } - } - - if (rerun_last_tests) { - cerr << "Redoing the last " - << 100.0f * float(benchmark_index - first_benchmark_to_run) / benchmarks.size() - << " % because clock speed had been low. " << endl; - return; - } - - // nothing wrong with the clock speed so far, so there won't be a need to rerun - // benchmarks run so far in case we later encounter a lower clock speed. - first_benchmark_to_run = benchmark_index; - } - - if (benchmark_index == benchmarks.size()) { - // We're done! - first_benchmark_to_run = benchmarks.size(); - // Erase progress info - cerr << " " << endl; - return; - } - - // Display progress info on stderr - if (time_now > time_last_progress_update + 1.0f) { - time_last_progress_update = time_now; - cerr << "Measurements... " << 100.0f * ratio_done - << " %, ETA " - << human_duration_t(float(time_now - time_start) * (1.0f - ratio_done) / ratio_done) - << " \r" << flush; - } - - // This is where we actually run a benchmark! - benchmarks[benchmark_index].run(); - benchmark_index++; - } -} - -void run_benchmarks(vector& benchmarks) -{ - size_t first_benchmark_to_run; - vector deserialized_benchmarks; - bool use_deserialized_benchmarks = false; - if (deserialize_benchmarks(session_filename, deserialized_benchmarks, first_benchmark_to_run)) { - cerr << "Found serialized session with " - << 100.0f * first_benchmark_to_run / deserialized_benchmarks.size() - << " % already done" << endl; - if (deserialized_benchmarks.size() == benchmarks.size() && - first_benchmark_to_run > 0 && - first_benchmark_to_run < benchmarks.size()) - { - use_deserialized_benchmarks = true; - } - } - - if (use_deserialized_benchmarks) { - benchmarks = deserialized_benchmarks; - } else { - // not using deserialized benchmarks, starting from scratch - first_benchmark_to_run = 0; - - // Randomly shuffling benchmarks allows us to get accurate enough progress info, - // as now the cheap/expensive benchmarks are randomly mixed so they average out. - // It also means that if data is corrupted for some time span, the odds are that - // not all repetitions of a given benchmark will be corrupted. - random_shuffle(benchmarks.begin(), benchmarks.end()); - } - - for (int i = 0; i < 4; i++) { - max_clock_speed = max(max_clock_speed, measure_clock_speed()); - } - - double time_start = 0.0; - while (first_benchmark_to_run < benchmarks.size()) { - if (first_benchmark_to_run == 0) { - time_start = timer.getRealTime(); - } - try_run_some_benchmarks(benchmarks, - time_start, - first_benchmark_to_run); - } - - // Sort timings by increasing benchmark parameters, and decreasing gflops. - // The latter is very important. It means that we can ignore all but the first - // benchmark with given parameters. - sort(benchmarks.begin(), benchmarks.end()); - - // Collect best (i.e. now first) results for each parameter values. - vector best_benchmarks; - for (auto it = benchmarks.begin(); it != benchmarks.end(); ++it) { - if (best_benchmarks.empty() || - best_benchmarks.back().compact_product_size != it->compact_product_size || - best_benchmarks.back().compact_block_size != it->compact_block_size) - { - best_benchmarks.push_back(*it); - } - } - - // keep and return only the best benchmarks - benchmarks = best_benchmarks; -} - -struct measure_all_pot_sizes_action_t : action_t -{ - virtual const char* invokation_name() const { return "all-pot-sizes"; } - virtual void run() const - { - vector benchmarks; - for (int repetition = 0; repetition < measurement_repetitions; repetition++) { - for (size_t ksize = minsize; ksize <= maxsize; ksize *= 2) { - for (size_t msize = minsize; msize <= maxsize; msize *= 2) { - for (size_t nsize = minsize; nsize <= maxsize; nsize *= 2) { - for (size_t kblock = minsize; kblock <= ksize; kblock *= 2) { - for (size_t mblock = minsize; mblock <= msize; mblock *= 2) { - for (size_t nblock = minsize; nblock <= nsize; nblock *= 2) { - benchmarks.emplace_back(ksize, msize, nsize, kblock, mblock, nblock); - } - } - } - } - } - } - } - - run_benchmarks(benchmarks); - - cout << "BEGIN MEASUREMENTS ALL POT SIZES" << endl; - for (auto it = benchmarks.begin(); it != benchmarks.end(); ++it) { - cout << *it << endl; - } - } -}; - -struct measure_default_sizes_action_t : action_t -{ - virtual const char* invokation_name() const { return "default-sizes"; } - virtual void run() const - { - vector benchmarks; - for (int repetition = 0; repetition < measurement_repetitions; repetition++) { - for (size_t ksize = minsize; ksize <= maxsize; ksize *= 2) { - for (size_t msize = minsize; msize <= maxsize; msize *= 2) { - for (size_t nsize = minsize; nsize <= maxsize; nsize *= 2) { - benchmarks.emplace_back(ksize, msize, nsize); - } - } - } - } - - run_benchmarks(benchmarks); - - cout << "BEGIN MEASUREMENTS DEFAULT SIZES" << endl; - for (auto it = benchmarks.begin(); it != benchmarks.end(); ++it) { - cout << *it << endl; - } - } -}; - -int main(int argc, char* argv[]) -{ - double time_start = timer.getRealTime(); - cout.precision(4); - cerr.precision(4); - - vector> available_actions; - available_actions.emplace_back(new measure_all_pot_sizes_action_t); - available_actions.emplace_back(new measure_default_sizes_action_t); - - auto action = available_actions.end(); - - if (argc <= 1) { - show_usage_and_exit(argc, argv, available_actions); - } - for (auto it = available_actions.begin(); it != available_actions.end(); ++it) { - if (!strcmp(argv[1], (*it)->invokation_name())) { - action = it; - break; - } - } - - if (action == available_actions.end()) { - show_usage_and_exit(argc, argv, available_actions); - } - - for (int i = 2; i < argc; i++) { - if (argv[i] == strstr(argv[i], "--min-working-set-size=")) { - const char* equals_sign = strchr(argv[i], '='); - min_working_set_size = strtoul(equals_sign+1, nullptr, 10); - } else { - cerr << "unrecognized option: " << argv[i] << endl << endl; - show_usage_and_exit(argc, argv, available_actions); - } - } - - print_cpuinfo(); - - cout << "benchmark parameters:" << endl; - cout << "pointer size: " << 8*sizeof(void*) << " bits" << endl; - cout << "scalar type: " << type_name() << endl; - cout << "packet size: " << internal::packet_traits::size << endl; - cout << "minsize = " << minsize << endl; - cout << "maxsize = " << maxsize << endl; - cout << "measurement_repetitions = " << measurement_repetitions << endl; - cout << "min_accurate_time = " << min_accurate_time << endl; - cout << "min_working_set_size = " << min_working_set_size; - if (min_working_set_size == 0) { - cout << " (try to outsize caches)"; - } - cout << endl << endl; - - (*action)->run(); - - double time_end = timer.getRealTime(); - cerr << "Finished in " << human_duration_t(time_end - time_start) << endl; -} diff --git a/testbed/nanogui/ext/eigen/bench/benchmark.cpp b/testbed/nanogui/ext/eigen/bench/benchmark.cpp deleted file mode 100644 index c721b908..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchmark.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// g++ -O3 -DNDEBUG -DMATSIZE= benchmark.cpp -o benchmark && time ./benchmark - -#include - -#include - -#ifndef MATSIZE -#define MATSIZE 3 -#endif - -using namespace std; -using namespace Eigen; - -#ifndef REPEAT -#define REPEAT 40000000 -#endif - -#ifndef SCALAR -#define SCALAR double -#endif - -int main(int argc, char *argv[]) -{ - Matrix I = Matrix::Ones(); - Matrix m; - for(int i = 0; i < MATSIZE; i++) - for(int j = 0; j < MATSIZE; j++) - { - m(i,j) = (i+MATSIZE*j); - } - asm("#begin"); - for(int a = 0; a < REPEAT; a++) - { - m = Matrix::Ones() + 0.00005 * (m + (m*m)); - } - asm("#end"); - cout << m << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/benchmarkSlice.cpp b/testbed/nanogui/ext/eigen/bench/benchmarkSlice.cpp deleted file mode 100644 index c5b89c54..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchmarkSlice.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// g++ -O3 -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX - -#include - -#include - -using namespace std; -using namespace Eigen; - -#ifndef REPEAT -#define REPEAT 10000 -#endif - -#ifndef SCALAR -#define SCALAR float -#endif - -int main(int argc, char *argv[]) -{ - typedef Matrix Mat; - Mat m(100, 100); - m.setRandom(); - - for(int a = 0; a < REPEAT; a++) - { - int r, c, nr, nc; - r = Eigen::internal::random(0,10); - c = Eigen::internal::random(0,10); - nr = Eigen::internal::random(50,80); - nc = Eigen::internal::random(50,80); - m.block(r,c,nr,nc) += Mat::Ones(nr,nc); - m.block(r,c,nr,nc) *= SCALAR(10); - m.block(r,c,nr,nc) -= Mat::constant(nr,nc,10); - m.block(r,c,nr,nc) /= SCALAR(10); - } - cout << m[0] << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/benchmarkX.cpp b/testbed/nanogui/ext/eigen/bench/benchmarkX.cpp deleted file mode 100644 index 8e4b60c2..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchmarkX.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// g++ -fopenmp -I .. -O3 -DNDEBUG -finline-limit=1000 benchmarkX.cpp -o b && time ./b - -#include - -#include - -using namespace std; -using namespace Eigen; - -#ifndef MATTYPE -#define MATTYPE MatrixXLd -#endif - -#ifndef MATSIZE -#define MATSIZE 400 -#endif - -#ifndef REPEAT -#define REPEAT 100 -#endif - -int main(int argc, char *argv[]) -{ - MATTYPE I = MATTYPE::Ones(MATSIZE,MATSIZE); - MATTYPE m(MATSIZE,MATSIZE); - for(int i = 0; i < MATSIZE; i++) for(int j = 0; j < MATSIZE; j++) - { - m(i,j) = (i+j+1)/(MATSIZE*MATSIZE); - } - for(int a = 0; a < REPEAT; a++) - { - m = I + 0.0001 * (m + m*m); - } - cout << m(0,0) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/benchmarkXcwise.cpp b/testbed/nanogui/ext/eigen/bench/benchmarkXcwise.cpp deleted file mode 100644 index 62437435..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchmarkXcwise.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// g++ -O3 -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX - -#include -#include - -using namespace std; -using namespace Eigen; - -#ifndef VECTYPE -#define VECTYPE VectorXLd -#endif - -#ifndef VECSIZE -#define VECSIZE 1000000 -#endif - -#ifndef REPEAT -#define REPEAT 1000 -#endif - -int main(int argc, char *argv[]) -{ - VECTYPE I = VECTYPE::Ones(VECSIZE); - VECTYPE m(VECSIZE,1); - for(int i = 0; i < VECSIZE; i++) - { - m[i] = 0.1 * i/VECSIZE; - } - for(int a = 0; a < REPEAT; a++) - { - m = VECTYPE::Ones(VECSIZE) + 0.00005 * (m.cwise().square() + m/4); - } - cout << m[0] << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/benchmark_suite b/testbed/nanogui/ext/eigen/bench/benchmark_suite deleted file mode 100755 index 3f21d366..00000000 --- a/testbed/nanogui/ext/eigen/bench/benchmark_suite +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -CXX=${CXX-g++} # default value unless caller has defined CXX -echo "Fixed size 3x3, column-major, -DNDEBUG" -$CXX -O3 -I .. -DNDEBUG benchmark.cpp -o benchmark && time ./benchmark >/dev/null -echo "Fixed size 3x3, column-major, with asserts" -$CXX -O3 -I .. benchmark.cpp -o benchmark && time ./benchmark >/dev/null -echo "Fixed size 3x3, row-major, -DNDEBUG" -$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR -DNDEBUG benchmark.cpp -o benchmark && time ./benchmark >/dev/null -echo "Fixed size 3x3, row-major, with asserts" -$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR benchmark.cpp -o benchmark && time ./benchmark >/dev/null -echo "Dynamic size 20x20, column-major, -DNDEBUG" -$CXX -O3 -I .. -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null -echo "Dynamic size 20x20, column-major, with asserts" -$CXX -O3 -I .. benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null -echo "Dynamic size 20x20, row-major, -DNDEBUG" -$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR -DNDEBUG benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null -echo "Dynamic size 20x20, row-major, with asserts" -$CXX -O3 -I .. -DEIGEN_DEFAULT_TO_ROW_MAJOR benchmarkX.cpp -o benchmarkX && time ./benchmarkX >/dev/null diff --git a/testbed/nanogui/ext/eigen/bench/btl/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/CMakeLists.txt deleted file mode 100644 index 38ff9f48..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/CMakeLists.txt +++ /dev/null @@ -1,107 +0,0 @@ -PROJECT(BTL) - -CMAKE_MINIMUM_REQUIRED(VERSION 2.6.2) - -set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${Eigen_SOURCE_DIR}/cmake) -include(MacroOptionalAddSubdirectory) - -OPTION(BTL_NOVEC "Disable SSE/Altivec optimizations when possible" OFF) - -SET(CMAKE_INCLUDE_CURRENT_DIR ON) - -string(REGEX MATCH icpc IS_ICPC ${CMAKE_CXX_COMPILER}) -IF(CMAKE_COMPILER_IS_GNUCXX OR IS_ICPC) - SET(CMAKE_CXX_FLAGS "-g0 -O3 -DNDEBUG ${CMAKE_CXX_FLAGS}") - SET(CMAKE_Fortran_FLAGS "-g0 -O3 -DNDEBUG ${CMAKE_Fortran_FLAGS}") - IF(BTL_NOVEC) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE") - ENDIF(BTL_NOVEC) -ENDIF(CMAKE_COMPILER_IS_GNUCXX OR IS_ICPC) - -IF(MSVC) - SET(CMAKE_CXX_FLAGS " /O2 /Ot /GL /fp:fast -DNDEBUG") -# SET(CMAKE_Fortran_FLAGS "-g0 -O3 -DNDEBUG") - IF(BTL_NOVEC) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE") - ENDIF(BTL_NOVEC) -ENDIF(MSVC) - -if(IS_ICPC) - set(CMAKE_CXX_FLAGS "-fast ${CMAKE_CXX_FLAGS}") - set(CMAKE_Fortran_FLAGS "-fast ${CMAKE_Fortran_FLAGS}") -endif(IS_ICPC) - -include_directories( - ${PROJECT_SOURCE_DIR}/actions - ${PROJECT_SOURCE_DIR}/generic_bench - ${PROJECT_SOURCE_DIR}/generic_bench/utils - ${PROJECT_SOURCE_DIR}/libs/STL) - -# find_package(MKL) -# if (MKL_FOUND) -# add_definitions(-DHAVE_MKL) -# set(DEFAULT_LIBRARIES ${MKL_LIBRARIES}) -# endif (MKL_FOUND) - -find_library(EIGEN_BTL_RT_LIBRARY rt) -# if we cannot find it easily, then we don't need it! -if(NOT EIGEN_BTL_RT_LIBRARY) - set(EIGEN_BTL_RT_LIBRARY "") -endif() - -MACRO(BTL_ADD_BENCH targetname) - - foreach(_current_var ${ARGN}) - set(_last_var ${_current_var}) - endforeach(_current_var) - - set(_sources ${ARGN}) - list(LENGTH _sources _argn_length) - - list(REMOVE_ITEM _sources ON OFF TRUE FALSE) - - list(LENGTH _sources _src_length) - - if (${_argn_length} EQUAL ${_src_length}) - set(_last_var ON) - endif (${_argn_length} EQUAL ${_src_length}) - - OPTION(BUILD_${targetname} "Build benchmark ${targetname}" ${_last_var}) - - IF(BUILD_${targetname}) - ADD_EXECUTABLE(${targetname} ${_sources}) - ADD_TEST(${targetname} "${targetname}") - target_link_libraries(${targetname} ${DEFAULT_LIBRARIES} ${EIGEN_BTL_RT_LIBRARY}) - ENDIF(BUILD_${targetname}) - -ENDMACRO(BTL_ADD_BENCH) - -macro(btl_add_target_property target prop value) - - if(BUILD_${target}) - get_target_property(previous ${target} ${prop}) - if(NOT previous) - set(previous "") - endif() - set_target_properties(${target} PROPERTIES ${prop} "${previous} ${value}") - endif() - -endmacro(btl_add_target_property) - -ENABLE_TESTING() - -add_subdirectory(libs/eigen3) -add_subdirectory(libs/eigen2) -add_subdirectory(libs/tensors) -add_subdirectory(libs/BLAS) -add_subdirectory(libs/ublas) -add_subdirectory(libs/gmm) -add_subdirectory(libs/mtl4) -add_subdirectory(libs/blitz) -add_subdirectory(libs/tvmet) -add_subdirectory(libs/STL) -add_subdirectory(libs/blaze) - -add_subdirectory(data) - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/COPYING b/testbed/nanogui/ext/eigen/bench/btl/COPYING deleted file mode 100644 index 486449cc..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/testbed/nanogui/ext/eigen/bench/btl/README b/testbed/nanogui/ext/eigen/bench/btl/README deleted file mode 100644 index f3f5fb36..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/README +++ /dev/null @@ -1,154 +0,0 @@ -Bench Template Library - -**************************************** -Introduction : - -The aim of this project is to compare the performance -of available numerical libraries. The code is designed -as generic and modular as possible. Thus, adding new -numerical libraries or new numerical tests should -require minimal effort. - - -***************************************** - -Installation : - -BTL uses cmake / ctest: - -1 - create a build directory: - - $ mkdir build - $ cd build - -2 - configure: - - $ ccmake .. - -3 - run the bench using ctest: - - $ ctest -V - -You can run the benchmarks only on libraries matching a given regular expression: - ctest -V -R -For instance: - ctest -V -R eigen2 - -You can also select a given set of actions defining the environment variable BTL_CONFIG this way: - BTL_CONFIG="-a action1{:action2}*" ctest -V -An exemple: - BTL_CONFIG="-a axpy:vector_matrix:trisolve:ata" ctest -V -R eigen2 - -Finally, if bench results already exist (the bench*.dat files) then they merges by keeping the best for each matrix size. If you want to overwrite the previous ones you can simply add the "--overwrite" option: - BTL_CONFIG="-a axpy:vector_matrix:trisolve:ata --overwrite" ctest -V -R eigen2 - -4 : Analyze the result. different data files (.dat) are produced in each libs directories. - If gnuplot is available, choose a directory name in the data directory to store the results and type: - $ cd data - $ mkdir my_directory - $ cp ../libs/*/*.dat my_directory - Build the data utilities in this (data) directory - make - Then you can look the raw data, - go_mean my_directory - or smooth the data first : - smooth_all.sh my_directory - go_mean my_directory_smooth - - -************************************************* - -Files and directories : - - generic_bench : all the bench sources common to all libraries - - actions : sources for different action wrappers (axpy, matrix-matrix product) to be tested. - - libs/* : bench sources specific to each tested libraries. - - machine_dep : directory used to store machine specific Makefile.in - - data : directory used to store gnuplot scripts and data analysis utilities - -************************************************** - -Principles : the code modularity is achieved by defining two concepts : - - ****** Action concept : This is a class defining which kind - of test must be performed (e.g. a matrix_vector_product). - An Action should define the following methods : - - *** Ctor using the size of the problem (matrix or vector size) as an argument - Action action(size); - *** initialize : this method initialize the calculation (e.g. initialize the matrices and vectors arguments) - action.initialize(); - *** calculate : this method actually launch the calculation to be benchmarked - action.calculate; - *** nb_op_base() : this method returns the complexity of the calculate method (allowing the mflops evaluation) - *** name() : this method returns the name of the action (std::string) - - ****** Interface concept : This is a class or namespace defining how to use a given library and - its specific containers (matrix and vector). Up to now an interface should following types - - *** real_type : kind of float to be used (float or double) - *** stl_vector : must correspond to std::vector - *** stl_matrix : must correspond to std::vector - *** gene_vector : the vector type for this interface --> e.g. (real_type *) for the C_interface - *** gene_matrix : the matrix type for this interface --> e.g. (gene_vector *) for the C_interface - - + the following common methods - - *** free_matrix(gene_matrix & A, int N) dealocation of a N sized gene_matrix A - *** free_vector(gene_vector & B) dealocation of a N sized gene_vector B - *** matrix_from_stl(gene_matrix & A, stl_matrix & A_stl) copy the content of an stl_matrix A_stl into a gene_matrix A. - The allocation of A is done in this function. - *** vector_to_stl(gene_vector & B, stl_vector & B_stl) copy the content of an stl_vector B_stl into a gene_vector B. - The allocation of B is done in this function. - *** matrix_to_stl(gene_matrix & A, stl_matrix & A_stl) copy the content of an gene_matrix A into an stl_matrix A_stl. - The size of A_STL must corresponds to the size of A. - *** vector_to_stl(gene_vector & A, stl_vector & A_stl) copy the content of an gene_vector A into an stl_vector A_stl. - The size of B_STL must corresponds to the size of B. - *** copy_matrix(gene_matrix & source, gene_matrix & cible, int N) : copy the content of source in cible. Both source - and cible must be sized NxN. - *** copy_vector(gene_vector & source, gene_vector & cible, int N) : copy the content of source in cible. Both source - and cible must be sized N. - - and the following method corresponding to the action one wants to be benchmarked : - - *** matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int N) - *** matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N) - *** ata_product(const gene_matrix & A, gene_matrix & X, int N) - *** aat_product(const gene_matrix & A, gene_matrix & X, int N) - *** axpy(real coef, const gene_vector & X, gene_vector & Y, int N) - - The bench algorithm (generic_bench/bench.hh) is templated with an action itself templated with - an interface. A typical main.cpp source stored in a given library directory libs/A_LIB - looks like : - - bench< AN_ACTION < AN_INTERFACE > >( 10 , 1000 , 50 ) ; - - this function will produce XY data file containing measured mflops as a function of the size for 50 - sizes between 10 and 10000. - - This algorithm can be adapted by providing a given Perf_Analyzer object which determines how the time - measurements must be done. For example, the X86_Perf_Analyzer use the asm rdtsc function and provides - a very fast and accurate (but less portable) timing method. The default is the Portable_Perf_Analyzer - so - - bench< AN_ACTION < AN_INTERFACE > >( 10 , 1000 , 50 ) ; - - is equivalent to - - bench< Portable_Perf_Analyzer,AN_ACTION < AN_INTERFACE > >( 10 , 1000 , 50 ) ; - - If your system supports it we suggest to use a mixed implementation (X86_perf_Analyzer+Portable_Perf_Analyzer). - replace - bench(size_min,size_max,nb_point); - with - bench(size_min,size_max,nb_point); - in generic/bench.hh - -. - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_aat_product.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_aat_product.hh deleted file mode 100644 index aa5b35c9..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_aat_product.hh +++ /dev/null @@ -1,145 +0,0 @@ -//===================================================== -// File : action_aat_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_AAT_PRODUCT -#define ACTION_AAT_PRODUCT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_aat_product { - -public : - - // Ctor - - Action_aat_product( int size ):_size(size) - { - MESSAGE("Action_aat_product Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_matrix(X_stl,_size); - init_matrix(resu_stl,_size); - - // generic matrix and vector initialization - - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(X_ref,X_stl); - - Interface::matrix_from_stl(A,A_stl); - Interface::matrix_from_stl(X,X_stl); - - } - - // invalidate copy ctor - - Action_aat_product( const Action_aat_product & ) - { - INFOS("illegal call to Action_aat_product Copy Ctor"); - exit(0); - } - - // Dtor - - ~Action_aat_product( void ){ - - MESSAGE("Action_aat_product Dtor"); - - // deallocation - - Interface::free_matrix(A,_size); - Interface::free_matrix(X,_size); - - Interface::free_matrix(A_ref,_size); - Interface::free_matrix(X_ref,_size); - - } - - // action name - - static inline std::string name( void ) - { - return "aat_"+Interface::name(); - } - - double nb_op_base( void ){ - return double(_size)*double(_size)*double(_size); - } - - inline void initialize( void ){ - - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_matrix(X_ref,X,_size); - - } - - inline void calculate( void ) { - - Interface::aat_product(A,X,_size); - - } - - void check_result( void ){ - if (_size>128) return; - // calculation check - - Interface::matrix_to_stl(X,resu_stl); - - STL_interface::aat_product(A_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(1); - } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_matrix X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_matrix X; - - - int _size; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_ata_product.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_ata_product.hh deleted file mode 100644 index 04364fe6..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_ata_product.hh +++ /dev/null @@ -1,145 +0,0 @@ -//===================================================== -// File : action_ata_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_ATA_PRODUCT -#define ACTION_ATA_PRODUCT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_ata_product { - -public : - - // Ctor - - Action_ata_product( int size ):_size(size) - { - MESSAGE("Action_ata_product Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_matrix(X_stl,_size); - init_matrix(resu_stl,_size); - - // generic matrix and vector initialization - - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(X_ref,X_stl); - - Interface::matrix_from_stl(A,A_stl); - Interface::matrix_from_stl(X,X_stl); - - } - - // invalidate copy ctor - - Action_ata_product( const Action_ata_product & ) - { - INFOS("illegal call to Action_ata_product Copy Ctor"); - exit(0); - } - - // Dtor - - ~Action_ata_product( void ){ - - MESSAGE("Action_ata_product Dtor"); - - // deallocation - - Interface::free_matrix(A,_size); - Interface::free_matrix(X,_size); - - Interface::free_matrix(A_ref,_size); - Interface::free_matrix(X_ref,_size); - - } - - // action name - - static inline std::string name( void ) - { - return "ata_"+Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size*_size*_size; - } - - inline void initialize( void ){ - - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_matrix(X_ref,X,_size); - - } - - inline void calculate( void ) { - - Interface::ata_product(A,X,_size); - - } - - void check_result( void ){ - if (_size>128) return; - // calculation check - - Interface::matrix_to_stl(X,resu_stl); - - STL_interface::ata_product(A_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(1); - } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_matrix X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_matrix X; - - - int _size; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_atv_product.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_atv_product.hh deleted file mode 100644 index a8234514..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_atv_product.hh +++ /dev/null @@ -1,134 +0,0 @@ -//===================================================== -// File : action_atv_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_ATV_PRODUCT -#define ACTION_ATV_PRODUCT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_atv_product { - -public : - - Action_atv_product( int size ) : _size(size) - { - MESSAGE("Action_atv_product Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_vector(B_stl,_size); - init_vector(X_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - - Interface::matrix_from_stl(A_ref,A_stl); - Interface::vector_from_stl(B_ref,B_stl); - Interface::vector_from_stl(X_ref,X_stl); - - Interface::matrix_from_stl(A,A_stl); - Interface::vector_from_stl(B,B_stl); - Interface::vector_from_stl(X,X_stl); - } - - // invalidate copy ctor - Action_atv_product( const Action_atv_product & ) - { - INFOS("illegal call to Action_atv_product Copy Ctor"); - exit(1); - } - - ~Action_atv_product( void ) - { - MESSAGE("Action_atv_product Dtor"); - - Interface::free_matrix(A,_size); - Interface::free_vector(B); - Interface::free_vector(X); - - Interface::free_matrix(A_ref,_size); - Interface::free_vector(B_ref); - Interface::free_vector(X_ref); - } - - static inline std::string name() { return "atv_" + Interface::name(); } - - double nb_op_base( void ) { return 2.0*_size*_size; } - - inline void initialize( void ){ - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_vector(B_ref,B,_size); - Interface::copy_vector(X_ref,X,_size); - } - - BTL_DONT_INLINE void calculate( void ) { - BTL_ASM_COMMENT("begin atv"); - Interface::atv_product(A,B,X,_size); - BTL_ASM_COMMENT("end atv"); - } - - void check_result( void ) - { - if (_size>128) return; - Interface::vector_to_stl(X,resu_stl); - - STL_interface::atv_product(A_stl,B_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(1); - } - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector X_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_vector B_ref; - typename Interface::gene_vector X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_vector B; - typename Interface::gene_vector X; - - - int _size; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_axpby.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_axpby.hh deleted file mode 100644 index dadd0ccf..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_axpby.hh +++ /dev/null @@ -1,127 +0,0 @@ -//===================================================== -// File : action_axpby.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_AXPBY -#define ACTION_AXPBY -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_axpby { - -public : - - // Ctor - Action_axpby( int size ):_alpha(0.5),_beta(0.95),_size(size) - { - MESSAGE("Action_axpby Ctor"); - - // STL vector initialization - init_vector(X_stl,_size); - init_vector(Y_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - Interface::vector_from_stl(X_ref,X_stl); - Interface::vector_from_stl(Y_ref,Y_stl); - - Interface::vector_from_stl(X,X_stl); - Interface::vector_from_stl(Y,Y_stl); - } - - // invalidate copy ctor - Action_axpby( const Action_axpby & ) - { - INFOS("illegal call to Action_axpby Copy Ctor"); - exit(1); - } - - // Dtor - ~Action_axpby( void ){ - MESSAGE("Action_axpby Dtor"); - - // deallocation - Interface::free_vector(X_ref); - Interface::free_vector(Y_ref); - - Interface::free_vector(X); - Interface::free_vector(Y); - } - - // action name - static inline std::string name( void ) - { - return "axpby_"+Interface::name(); - } - - double nb_op_base( void ){ - return 3.0*_size; - } - - inline void initialize( void ){ - Interface::copy_vector(X_ref,X,_size); - Interface::copy_vector(Y_ref,Y,_size); - } - - inline void calculate( void ) { - BTL_ASM_COMMENT("mybegin axpby"); - Interface::axpby(_alpha,X,_beta,Y,_size); - BTL_ASM_COMMENT("myend axpby"); - } - - void check_result( void ){ - if (_size>128) return; - // calculation check - Interface::vector_to_stl(Y,resu_stl); - - STL_interface::axpby(_alpha,X_stl,_beta,Y_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(Y_stl,resu_stl); - - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(2); - } - } - -private : - - typename Interface::stl_vector X_stl; - typename Interface::stl_vector Y_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_vector X_ref; - typename Interface::gene_vector Y_ref; - - typename Interface::gene_vector X; - typename Interface::gene_vector Y; - - typename Interface::real_type _alpha; - typename Interface::real_type _beta; - - int _size; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_axpy.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_axpy.hh deleted file mode 100644 index 261be4cb..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_axpy.hh +++ /dev/null @@ -1,139 +0,0 @@ -//===================================================== -// File : action_axpy.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_AXPY -#define ACTION_AXPY -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_axpy { - -public : - - // Ctor - - Action_axpy( int size ):_coef(1.0),_size(size) - { - MESSAGE("Action_axpy Ctor"); - - // STL vector initialization - - init_vector(X_stl,_size); - init_vector(Y_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - - Interface::vector_from_stl(X_ref,X_stl); - Interface::vector_from_stl(Y_ref,Y_stl); - - Interface::vector_from_stl(X,X_stl); - Interface::vector_from_stl(Y,Y_stl); - - - } - - // invalidate copy ctor - - Action_axpy( const Action_axpy & ) - { - INFOS("illegal call to Action_axpy Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_axpy( void ){ - - MESSAGE("Action_axpy Dtor"); - - // deallocation - - Interface::free_vector(X_ref); - Interface::free_vector(Y_ref); - - Interface::free_vector(X); - Interface::free_vector(Y); - } - - // action name - - static inline std::string name( void ) - { - return "axpy_"+Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size; - } - - inline void initialize( void ){ - Interface::copy_vector(X_ref,X,_size); - Interface::copy_vector(Y_ref,Y,_size); - } - - inline void calculate( void ) { - BTL_ASM_COMMENT("mybegin axpy"); - Interface::axpy(_coef,X,Y,_size); - BTL_ASM_COMMENT("myend axpy"); - } - - void check_result( void ){ - if (_size>128) return; - // calculation check - - Interface::vector_to_stl(Y,resu_stl); - - STL_interface::axpy(_coef,X_stl,Y_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(Y_stl,resu_stl); - - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(0); - } - - } - -private : - - typename Interface::stl_vector X_stl; - typename Interface::stl_vector Y_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_vector X_ref; - typename Interface::gene_vector Y_ref; - - typename Interface::gene_vector X; - typename Interface::gene_vector Y; - - typename Interface::real_type _coef; - - int _size; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_cholesky.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_cholesky.hh deleted file mode 100644 index 5f66d113..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_cholesky.hh +++ /dev/null @@ -1,128 +0,0 @@ -//===================================================== -// File : action_cholesky.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_CHOLESKY -#define ACTION_CHOLESKY -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_cholesky { - -public : - - // Ctor - - Action_cholesky( int size ):_size(size) - { - MESSAGE("Action_cholesky Ctor"); - - // STL mat/vec initialization - init_matrix_symm(X_stl,_size); - init_matrix(C_stl,_size); - - // make sure X is invertible - for (int i=0; i<_size; ++i) - X_stl[i][i] = std::abs(X_stl[i][i]) * 1e2 + 100; - - // generic matrix and vector initialization - Interface::matrix_from_stl(X_ref,X_stl); - Interface::matrix_from_stl(X,X_stl); - Interface::matrix_from_stl(C,C_stl); - - _cost = 0; - for (int j=0; j<_size; ++j) - { - double r = std::max(_size - j -1,0); - _cost += 2*(r*j+r+j); - } - } - - // invalidate copy ctor - - Action_cholesky( const Action_cholesky & ) - { - INFOS("illegal call to Action_cholesky Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_cholesky( void ){ - - MESSAGE("Action_cholesky Dtor"); - - // deallocation - Interface::free_matrix(X_ref,_size); - Interface::free_matrix(X,_size); - Interface::free_matrix(C,_size); - } - - // action name - - static inline std::string name( void ) - { - return "cholesky_"+Interface::name(); - } - - double nb_op_base( void ){ - return _cost; - } - - inline void initialize( void ){ - Interface::copy_matrix(X_ref,X,_size); - } - - inline void calculate( void ) { - Interface::cholesky(X,C,_size); - } - - void check_result( void ){ - // calculation check -// STL_interface::cholesky(X_stl,C_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(C_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); -// } - - } - -private : - - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix C_stl; - - typename Interface::gene_matrix X_ref; - typename Interface::gene_matrix X; - typename Interface::gene_matrix C; - - int _size; - double _cost; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_ger.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_ger.hh deleted file mode 100644 index dc766efc..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_ger.hh +++ /dev/null @@ -1,128 +0,0 @@ - -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_GER -#define ACTION_GER -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_ger { - -public : - - // Ctor - BTL_DONT_INLINE Action_ger( int size ):_size(size) - { - MESSAGE("Action_ger Ctor"); - - // STL matrix and vector initialization - typename Interface::stl_matrix tmp; - init_matrix(A_stl,_size); - init_vector(B_stl,_size); - init_vector(X_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(A,A_stl); - Interface::vector_from_stl(B_ref,B_stl); - Interface::vector_from_stl(B,B_stl); - Interface::vector_from_stl(X_ref,X_stl); - Interface::vector_from_stl(X,X_stl); - } - - // invalidate copy ctor - Action_ger( const Action_ger & ) - { - INFOS("illegal call to Action_ger Copy Ctor"); - exit(1); - } - - // Dtor - BTL_DONT_INLINE ~Action_ger( void ){ - MESSAGE("Action_ger Dtor"); - Interface::free_matrix(A,_size); - Interface::free_vector(B); - Interface::free_vector(X); - Interface::free_matrix(A_ref,_size); - Interface::free_vector(B_ref); - Interface::free_vector(X_ref); - - } - - // action name - static inline std::string name( void ) - { - return "ger_" + Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size*_size; - } - - BTL_DONT_INLINE void initialize( void ){ - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_vector(B_ref,B,_size); - Interface::copy_vector(X_ref,X,_size); - } - - BTL_DONT_INLINE void calculate( void ) { - BTL_ASM_COMMENT("#begin ger"); - Interface::ger(A,B,X,_size); - BTL_ASM_COMMENT("end ger"); - } - - BTL_DONT_INLINE void check_result( void ){ - // calculation check - Interface::vector_to_stl(X,resu_stl); - - STL_interface::ger(A_stl,B_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-3){ - INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); - } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector X_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_vector B_ref; - typename Interface::gene_vector X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_vector B; - typename Interface::gene_vector X; - - int _size; -}; - - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_hessenberg.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_hessenberg.hh deleted file mode 100644 index 2100ebd8..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_hessenberg.hh +++ /dev/null @@ -1,233 +0,0 @@ -//===================================================== -// File : action_hessenberg.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_HESSENBERG -#define ACTION_HESSENBERG -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_hessenberg { - -public : - - // Ctor - - Action_hessenberg( int size ):_size(size) - { - MESSAGE("Action_hessenberg Ctor"); - - // STL vector initialization - init_matrix(X_stl,_size); - - init_matrix(C_stl,_size); - init_matrix(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(X_ref,X_stl); - Interface::matrix_from_stl(X,X_stl); - Interface::matrix_from_stl(C,C_stl); - - _cost = 0; - for (int j=0; j<_size-2; ++j) - { - double r = std::max(0,_size-j-1); - double b = std::max(0,_size-j-2); - _cost += 6 + 3*b + r*r*4 + r*_size*4; - } - } - - // invalidate copy ctor - - Action_hessenberg( const Action_hessenberg & ) - { - INFOS("illegal call to Action_hessenberg Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_hessenberg( void ){ - - MESSAGE("Action_hessenberg Dtor"); - - // deallocation - Interface::free_matrix(X_ref,_size); - Interface::free_matrix(X,_size); - Interface::free_matrix(C,_size); - } - - // action name - - static inline std::string name( void ) - { - return "hessenberg_"+Interface::name(); - } - - double nb_op_base( void ){ - return _cost; - } - - inline void initialize( void ){ - Interface::copy_matrix(X_ref,X,_size); - } - - inline void calculate( void ) { - Interface::hessenberg(X,C,_size); - } - - void check_result( void ){ - // calculation check - Interface::matrix_to_stl(C,resu_stl); - -// STL_interface::hessenberg(X_stl,C_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(C_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); -// } - - } - -private : - - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix C_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix X_ref; - typename Interface::gene_matrix X; - typename Interface::gene_matrix C; - - int _size; - double _cost; -}; - -template -class Action_tridiagonalization { - -public : - - // Ctor - - Action_tridiagonalization( int size ):_size(size) - { - MESSAGE("Action_tridiagonalization Ctor"); - - // STL vector initialization - init_matrix(X_stl,_size); - - for(int i=0; i<_size; ++i) - { - for(int j=0; j(C_stl,_size); - init_matrix(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(X_ref,X_stl); - Interface::matrix_from_stl(X,X_stl); - Interface::matrix_from_stl(C,C_stl); - - _cost = 0; - for (int j=0; j<_size-2; ++j) - { - double r = std::max(0,_size-j-1); - double b = std::max(0,_size-j-2); - _cost += 6. + 3.*b + r*r*8.; - } - } - - // invalidate copy ctor - - Action_tridiagonalization( const Action_tridiagonalization & ) - { - INFOS("illegal call to Action_tridiagonalization Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_tridiagonalization( void ){ - - MESSAGE("Action_tridiagonalization Dtor"); - - // deallocation - Interface::free_matrix(X_ref,_size); - Interface::free_matrix(X,_size); - Interface::free_matrix(C,_size); - } - - // action name - - static inline std::string name( void ) { return "tridiagonalization_"+Interface::name(); } - - double nb_op_base( void ){ - return _cost; - } - - inline void initialize( void ){ - Interface::copy_matrix(X_ref,X,_size); - } - - inline void calculate( void ) { - Interface::tridiagonalization(X,C,_size); - } - - void check_result( void ){ - // calculation check - Interface::matrix_to_stl(C,resu_stl); - -// STL_interface::tridiagonalization(X_stl,C_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(C_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); -// } - - } - -private : - - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix C_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix X_ref; - typename Interface::gene_matrix X; - typename Interface::gene_matrix C; - - int _size; - double _cost; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_lu_decomp.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_lu_decomp.hh deleted file mode 100644 index 2448e82c..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_lu_decomp.hh +++ /dev/null @@ -1,124 +0,0 @@ -//===================================================== -// File : action_lu_decomp.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_LU_DECOMP -#define ACTION_LU_DECOMP -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_lu_decomp { - -public : - - // Ctor - - Action_lu_decomp( int size ):_size(size) - { - MESSAGE("Action_lu_decomp Ctor"); - - // STL vector initialization - init_matrix(X_stl,_size); - - init_matrix(C_stl,_size); - init_matrix(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(X_ref,X_stl); - Interface::matrix_from_stl(X,X_stl); - Interface::matrix_from_stl(C,C_stl); - - _cost = 2.0*size*size*size/3.0 + size*size; - } - - // invalidate copy ctor - - Action_lu_decomp( const Action_lu_decomp & ) - { - INFOS("illegal call to Action_lu_decomp Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_lu_decomp( void ){ - - MESSAGE("Action_lu_decomp Dtor"); - - // deallocation - Interface::free_matrix(X_ref,_size); - Interface::free_matrix(X,_size); - Interface::free_matrix(C,_size); - } - - // action name - - static inline std::string name( void ) - { - return "complete_lu_decomp_"+Interface::name(); - } - - double nb_op_base( void ){ - return _cost; - } - - inline void initialize( void ){ - Interface::copy_matrix(X_ref,X,_size); - } - - inline void calculate( void ) { - Interface::lu_decomp(X,C,_size); - } - - void check_result( void ){ - // calculation check - Interface::matrix_to_stl(C,resu_stl); - -// STL_interface::lu_decomp(X_stl,C_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(C_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); -// } - - } - -private : - - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix C_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix X_ref; - typename Interface::gene_matrix X; - typename Interface::gene_matrix C; - - int _size; - double _cost; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_lu_solve.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_lu_solve.hh deleted file mode 100644 index 5a81e634..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_lu_solve.hh +++ /dev/null @@ -1,136 +0,0 @@ -//===================================================== -// File : action_lu_solve.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_LU_SOLVE -#define ACTION_LU_SOLVE -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_lu_solve -{ - -public : - - static inline std::string name( void ) - { - return "lu_solve_"+Interface::name(); - } - - static double nb_op_base(int size){ - return 2.0*size*size*size/3.0; // questionable but not really important - } - - - static double calculate( int nb_calc, int size ) { - - // STL matrix and vector initialization - - typename Interface::stl_matrix A_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector X_stl; - - init_matrix(A_stl,size); - init_vector(B_stl,size); - init_vector(X_stl,size); - - // generic matrix and vector initialization - - typename Interface::gene_matrix A; - typename Interface::gene_vector B; - typename Interface::gene_vector X; - - typename Interface::gene_matrix LU; - - Interface::matrix_from_stl(A,A_stl); - Interface::vector_from_stl(B,B_stl); - Interface::vector_from_stl(X,X_stl); - Interface::matrix_from_stl(LU,A_stl); - - // local variable : - - typename Interface::Pivot_Vector pivot; // pivot vector - Interface::new_Pivot_Vector(pivot,size); - - // timer utilities - - Portable_Timer chronos; - - // time measurement - - chronos.start(); - - for (int ii=0;ii::matrix_vector_product(A_stl,X_stl,B_new_stl,size); - - typename Interface::real_type error= - STL_interface::norm_diff(B_stl,B_new_stl); - - if (error>1.e-5){ - INFOS("WRONG CALCULATION...residual=" << error); - STL_interface::display_vector(B_stl); - STL_interface::display_vector(B_new_stl); - exit(0); - } - - // deallocation and return time - - Interface::free_matrix(A,size); - Interface::free_vector(B); - Interface::free_vector(X); - Interface::free_Pivot_Vector(pivot); - - return time; - } - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_matrix_product.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_matrix_product.hh deleted file mode 100644 index f65ee052..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_matrix_product.hh +++ /dev/null @@ -1,150 +0,0 @@ -//===================================================== -// File : action_matrix_matrix_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_MATRIX_MATRIX_PRODUCT -#define ACTION_MATRIX_MATRIX_PRODUCT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_matrix_matrix_product { - -public : - - // Ctor - - Action_matrix_matrix_product( int size ):_size(size) - { - MESSAGE("Action_matrix_matrix_product Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_matrix(B_stl,_size); - init_matrix(X_stl,_size); - init_matrix(resu_stl,_size); - - // generic matrix and vector initialization - - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(B_ref,B_stl); - Interface::matrix_from_stl(X_ref,X_stl); - - Interface::matrix_from_stl(A,A_stl); - Interface::matrix_from_stl(B,B_stl); - Interface::matrix_from_stl(X,X_stl); - - } - - // invalidate copy ctor - - Action_matrix_matrix_product( const Action_matrix_matrix_product & ) - { - INFOS("illegal call to Action_matrix_matrix_product Copy Ctor"); - exit(0); - } - - // Dtor - - ~Action_matrix_matrix_product( void ){ - - MESSAGE("Action_matrix_matrix_product Dtor"); - - // deallocation - - Interface::free_matrix(A,_size); - Interface::free_matrix(B,_size); - Interface::free_matrix(X,_size); - - Interface::free_matrix(A_ref,_size); - Interface::free_matrix(B_ref,_size); - Interface::free_matrix(X_ref,_size); - - } - - // action name - - static inline std::string name( void ) - { - return "matrix_matrix_"+Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size*_size*_size; - } - - inline void initialize( void ){ - - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_matrix(B_ref,B,_size); - Interface::copy_matrix(X_ref,X,_size); - - } - - inline void calculate( void ) { - Interface::matrix_matrix_product(A,B,X,_size); - } - - void check_result( void ){ - - // calculation check - if (_size<200) - { - Interface::matrix_to_stl(X,resu_stl); - STL_interface::matrix_matrix_product(A_stl,B_stl,X_stl,_size); - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(1); - } - } - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_matrix B_stl; - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_matrix B_ref; - typename Interface::gene_matrix X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_matrix B; - typename Interface::gene_matrix X; - - - int _size; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_matrix_product_bis.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_matrix_product_bis.hh deleted file mode 100644 index 29c10a6e..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_matrix_product_bis.hh +++ /dev/null @@ -1,152 +0,0 @@ -//===================================================== -// File : action_matrix_matrix_product_bis.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_MATRIX_MATRIX_PRODUCT_BIS -#define ACTION_MATRIX_MATRIX_PRODUCT_BIS -#include "utilities.h" -#include "STL_interface.hh" -#include "STL_timer.hh" -#include -#include "init_function.hh" -#include "init_vector.hh" -#include "init_matrix.hh" - -using namespace std; - -template -class Action_matrix_matrix_product_bis { - -public : - - static inline std::string name( void ) - { - return "matrix_matrix_"+Interface::name(); - } - - static double nb_op_base(int size){ - return 2.0*size*size*size; - } - - static double calculate( int nb_calc, int size ) { - - // STL matrix and vector initialization - - typename Interface::stl_matrix A_stl; - typename Interface::stl_matrix B_stl; - typename Interface::stl_matrix X_stl; - - init_matrix(A_stl,size); - init_matrix(B_stl,size); - init_matrix(X_stl,size); - - // generic matrix and vector initialization - - typename Interface::gene_matrix A_ref; - typename Interface::gene_matrix B_ref; - typename Interface::gene_matrix X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_matrix B; - typename Interface::gene_matrix X; - - - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(B_ref,B_stl); - Interface::matrix_from_stl(X_ref,X_stl); - - Interface::matrix_from_stl(A,A_stl); - Interface::matrix_from_stl(B,B_stl); - Interface::matrix_from_stl(X,X_stl); - - - // STL_timer utilities - - STL_timer chronos; - - // Baseline evaluation - - chronos.start_baseline(nb_calc); - - do { - - Interface::copy_matrix(A_ref,A,size); - Interface::copy_matrix(B_ref,B,size); - Interface::copy_matrix(X_ref,X,size); - - - // Interface::matrix_matrix_product(A,B,X,size); This line must be commented !!!! - } - while(chronos.check()); - - chronos.report(true); - - // Time measurement - - chronos.start(nb_calc); - - do { - - Interface::copy_matrix(A_ref,A,size); - Interface::copy_matrix(B_ref,B,size); - Interface::copy_matrix(X_ref,X,size); - - Interface::matrix_matrix_product(A,B,X,size); // here it is not commented !!!! - } - while(chronos.check()); - - chronos.report(true); - - double time=chronos.calculated_time/2000.0; - - // calculation check - - typename Interface::stl_matrix resu_stl(size); - - Interface::matrix_to_stl(X,resu_stl); - - STL_interface::matrix_matrix_product(A_stl,B_stl,X_stl,size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-6){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(1); - } - - // deallocation and return time - - Interface::free_matrix(A,size); - Interface::free_matrix(B,size); - Interface::free_matrix(X,size); - - Interface::free_matrix(A_ref,size); - Interface::free_matrix(B_ref,size); - Interface::free_matrix(X_ref,size); - - return time; - } - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_vector_product.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_vector_product.hh deleted file mode 100644 index 8bab79d1..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_matrix_vector_product.hh +++ /dev/null @@ -1,153 +0,0 @@ -//===================================================== -// File : action_matrix_vector_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_MATRIX_VECTOR_PRODUCT -#define ACTION_MATRIX_VECTOR_PRODUCT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_matrix_vector_product { - -public : - - // Ctor - - BTL_DONT_INLINE Action_matrix_vector_product( int size ):_size(size) - { - MESSAGE("Action_matrix_vector_product Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_vector(B_stl,_size); - init_vector(X_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(A,A_stl); - Interface::vector_from_stl(B_ref,B_stl); - Interface::vector_from_stl(B,B_stl); - Interface::vector_from_stl(X_ref,X_stl); - Interface::vector_from_stl(X,X_stl); - - } - - // invalidate copy ctor - - Action_matrix_vector_product( const Action_matrix_vector_product & ) - { - INFOS("illegal call to Action_matrix_vector_product Copy Ctor"); - exit(1); - } - - // Dtor - - BTL_DONT_INLINE ~Action_matrix_vector_product( void ){ - - MESSAGE("Action_matrix_vector_product Dtor"); - - // deallocation - - Interface::free_matrix(A,_size); - Interface::free_vector(B); - Interface::free_vector(X); - - Interface::free_matrix(A_ref,_size); - Interface::free_vector(B_ref); - Interface::free_vector(X_ref); - - } - - // action name - - static inline std::string name( void ) - { - return "matrix_vector_" + Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size*_size; - } - - BTL_DONT_INLINE void initialize( void ){ - - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_vector(B_ref,B,_size); - Interface::copy_vector(X_ref,X,_size); - - } - - BTL_DONT_INLINE void calculate( void ) { - BTL_ASM_COMMENT("#begin matrix_vector_product"); - Interface::matrix_vector_product(A,B,X,_size); - BTL_ASM_COMMENT("end matrix_vector_product"); - } - - BTL_DONT_INLINE void check_result( void ){ - - // calculation check - - Interface::vector_to_stl(X,resu_stl); - - STL_interface::matrix_vector_product(A_stl,B_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-5){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(0); - } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector X_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_vector B_ref; - typename Interface::gene_vector X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_vector B; - typename Interface::gene_vector X; - - - int _size; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_partial_lu.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_partial_lu.hh deleted file mode 100644 index 770ea1d1..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_partial_lu.hh +++ /dev/null @@ -1,125 +0,0 @@ -//===================================================== -// File : action_lu_decomp.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_PARTIAL_LU -#define ACTION_PARTIAL_LU -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_partial_lu { - -public : - - // Ctor - - Action_partial_lu( int size ):_size(size) - { - MESSAGE("Action_partial_lu Ctor"); - - // STL vector initialization - init_matrix(X_stl,_size); - init_matrix(C_stl,_size); - - // make sure X is invertible - for (int i=0; i<_size; ++i) - X_stl[i][i] = X_stl[i][i] * 1e2 + 1; - - // generic matrix and vector initialization - Interface::matrix_from_stl(X_ref,X_stl); - Interface::matrix_from_stl(X,X_stl); - Interface::matrix_from_stl(C,C_stl); - - _cost = 2.0*size*size*size/3.0 + size*size; - } - - // invalidate copy ctor - - Action_partial_lu( const Action_partial_lu & ) - { - INFOS("illegal call to Action_partial_lu Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_partial_lu( void ){ - - MESSAGE("Action_partial_lu Dtor"); - - // deallocation - Interface::free_matrix(X_ref,_size); - Interface::free_matrix(X,_size); - Interface::free_matrix(C,_size); - } - - // action name - - static inline std::string name( void ) - { - return "partial_lu_decomp_"+Interface::name(); - } - - double nb_op_base( void ){ - return _cost; - } - - inline void initialize( void ){ - Interface::copy_matrix(X_ref,X,_size); - } - - inline void calculate( void ) { - Interface::partial_lu_decomp(X,C,_size); - } - - void check_result( void ){ - // calculation check -// Interface::matrix_to_stl(C,resu_stl); - -// STL_interface::lu_decomp(X_stl,C_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(C_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); -// } - - } - -private : - - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix C_stl; - - typename Interface::gene_matrix X_ref; - typename Interface::gene_matrix X; - typename Interface::gene_matrix C; - - int _size; - double _cost; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_rot.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_rot.hh deleted file mode 100644 index df822a6d..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_rot.hh +++ /dev/null @@ -1,116 +0,0 @@ - -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_ROT -#define ACTION_ROT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_rot { - -public : - - // Ctor - BTL_DONT_INLINE Action_rot( int size ):_size(size) - { - MESSAGE("Action_rot Ctor"); - - // STL matrix and vector initialization - typename Interface::stl_matrix tmp; - init_vector(A_stl,_size); - init_vector(B_stl,_size); - - // generic matrix and vector initialization - Interface::vector_from_stl(A_ref,A_stl); - Interface::vector_from_stl(A,A_stl); - Interface::vector_from_stl(B_ref,B_stl); - Interface::vector_from_stl(B,B_stl); - } - - // invalidate copy ctor - Action_rot( const Action_rot & ) - { - INFOS("illegal call to Action_rot Copy Ctor"); - exit(1); - } - - // Dtor - BTL_DONT_INLINE ~Action_rot( void ){ - MESSAGE("Action_rot Dtor"); - Interface::free_vector(A); - Interface::free_vector(B); - Interface::free_vector(A_ref); - Interface::free_vector(B_ref); - } - - // action name - static inline std::string name( void ) - { - return "rot_" + Interface::name(); - } - - double nb_op_base( void ){ - return 6.0*_size; - } - - BTL_DONT_INLINE void initialize( void ){ - Interface::copy_vector(A_ref,A,_size); - Interface::copy_vector(B_ref,B,_size); - } - - BTL_DONT_INLINE void calculate( void ) { - BTL_ASM_COMMENT("#begin rot"); - Interface::rot(A,B,0.5,0.6,_size); - BTL_ASM_COMMENT("end rot"); - } - - BTL_DONT_INLINE void check_result( void ){ - // calculation check -// Interface::vector_to_stl(X,resu_stl); - -// STL_interface::rot(A_stl,B_stl,X_stl,_size); - -// typename Interface::real_type error= -// STL_interface::norm_diff(X_stl,resu_stl); - -// if (error>1.e-3){ -// INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); -// } - - } - -private : - - typename Interface::stl_vector A_stl; - typename Interface::stl_vector B_stl; - - typename Interface::gene_vector A_ref; - typename Interface::gene_vector B_ref; - - typename Interface::gene_vector A; - typename Interface::gene_vector B; - - int _size; -}; - - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_symv.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_symv.hh deleted file mode 100644 index a32b9dfa..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_symv.hh +++ /dev/null @@ -1,139 +0,0 @@ -//===================================================== -// File : action_symv.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_SYMV -#define ACTION_SYMV -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_symv { - -public : - - // Ctor - - BTL_DONT_INLINE Action_symv( int size ):_size(size) - { - MESSAGE("Action_symv Ctor"); - - // STL matrix and vector initialization - init_matrix_symm(A_stl,_size); - init_vector(B_stl,_size); - init_vector(X_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(A,A_stl); - Interface::vector_from_stl(B_ref,B_stl); - Interface::vector_from_stl(B,B_stl); - Interface::vector_from_stl(X_ref,X_stl); - Interface::vector_from_stl(X,X_stl); - - } - - // invalidate copy ctor - - Action_symv( const Action_symv & ) - { - INFOS("illegal call to Action_symv Copy Ctor"); - exit(1); - } - - // Dtor - BTL_DONT_INLINE ~Action_symv( void ){ - Interface::free_matrix(A,_size); - Interface::free_vector(B); - Interface::free_vector(X); - Interface::free_matrix(A_ref,_size); - Interface::free_vector(B_ref); - Interface::free_vector(X_ref); - } - - // action name - - static inline std::string name( void ) - { - return "symv_" + Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size*_size; - } - - BTL_DONT_INLINE void initialize( void ){ - - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_vector(B_ref,B,_size); - Interface::copy_vector(X_ref,X,_size); - - } - - BTL_DONT_INLINE void calculate( void ) { - BTL_ASM_COMMENT("#begin symv"); - Interface::symv(A,B,X,_size); - BTL_ASM_COMMENT("end symv"); - } - - BTL_DONT_INLINE void check_result( void ){ - if (_size>128) return; - // calculation check - Interface::vector_to_stl(X,resu_stl); - - STL_interface::symv(A_stl,B_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-5){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(0); - } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector X_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_vector B_ref; - typename Interface::gene_vector X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_vector B; - typename Interface::gene_vector X; - - - int _size; - -}; - - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_syr2.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_syr2.hh deleted file mode 100644 index 7c6712b1..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_syr2.hh +++ /dev/null @@ -1,133 +0,0 @@ -//===================================================== -// File : action_syr2.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_SYR2 -#define ACTION_SYR2 -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_syr2 { - -public : - - // Ctor - - BTL_DONT_INLINE Action_syr2( int size ):_size(size) - { - // STL matrix and vector initialization - typename Interface::stl_matrix tmp; - init_matrix(A_stl,_size); - init_vector(B_stl,_size); - init_vector(X_stl,_size); - init_vector(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(A_ref,A_stl); - Interface::matrix_from_stl(A,A_stl); - Interface::vector_from_stl(B_ref,B_stl); - Interface::vector_from_stl(B,B_stl); - Interface::vector_from_stl(X_ref,X_stl); - Interface::vector_from_stl(X,X_stl); - } - - // invalidate copy ctor - Action_syr2( const Action_syr2 & ) - { - INFOS("illegal call to Action_syr2 Copy Ctor"); - exit(1); - } - - // Dtor - BTL_DONT_INLINE ~Action_syr2( void ){ - Interface::free_matrix(A,_size); - Interface::free_vector(B); - Interface::free_vector(X); - Interface::free_matrix(A_ref,_size); - Interface::free_vector(B_ref); - Interface::free_vector(X_ref); - } - - // action name - - static inline std::string name( void ) - { - return "syr2_" + Interface::name(); - } - - double nb_op_base( void ){ - return 2.0*_size*_size; - } - - BTL_DONT_INLINE void initialize( void ){ - Interface::copy_matrix(A_ref,A,_size); - Interface::copy_vector(B_ref,B,_size); - Interface::copy_vector(X_ref,X,_size); - } - - BTL_DONT_INLINE void calculate( void ) { - BTL_ASM_COMMENT("#begin syr2"); - Interface::syr2(A,B,X,_size); - BTL_ASM_COMMENT("end syr2"); - } - - BTL_DONT_INLINE void check_result( void ){ - // calculation check - Interface::vector_to_stl(X,resu_stl); - - STL_interface::syr2(A_stl,B_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-3){ - INFOS("WRONG CALCULATION...residual=" << error); -// exit(0); - } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector X_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_vector B_ref; - typename Interface::gene_vector X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_vector B; - typename Interface::gene_vector X; - - - int _size; - -}; - - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_trisolve.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_trisolve.hh deleted file mode 100644 index d6f0b477..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_trisolve.hh +++ /dev/null @@ -1,137 +0,0 @@ -//===================================================== -// File : action_trisolve.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_TRISOLVE -#define ACTION_TRISOLVE -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_trisolve { - -public : - - // Ctor - - Action_trisolve( int size ):_size(size) - { - MESSAGE("Action_trisolve Ctor"); - - // STL vector initialization - init_matrix(L_stl,_size); - init_vector(B_stl,_size); - init_vector(X_stl,_size); - for (int j=0; j<_size; ++j) - { - for (int i=0; i(resu_stl,_size); - - // generic matrix and vector initialization - Interface::matrix_from_stl(L,L_stl); - Interface::vector_from_stl(X,X_stl); - Interface::vector_from_stl(B,B_stl); - - _cost = 0; - for (int j=0; j<_size; ++j) - { - _cost += 2*j + 1; - } - } - - // invalidate copy ctor - - Action_trisolve( const Action_trisolve & ) - { - INFOS("illegal call to Action_trisolve Copy Ctor"); - exit(1); - } - - // Dtor - - ~Action_trisolve( void ){ - - MESSAGE("Action_trisolve Dtor"); - - // deallocation - Interface::free_matrix(L,_size); - Interface::free_vector(B); - Interface::free_vector(X); - } - - // action name - - static inline std::string name( void ) - { - return "trisolve_vector_"+Interface::name(); - } - - double nb_op_base( void ){ - return _cost; - } - - inline void initialize( void ){ - //Interface::copy_vector(X_ref,X,_size); - } - - inline void calculate( void ) { - Interface::trisolve_lower(L,B,X,_size); - } - - void check_result(){ - if (_size>128) return; - // calculation check - Interface::vector_to_stl(X,resu_stl); - - STL_interface::trisolve_lower(L_stl,B_stl,X_stl,_size); - - typename Interface::real_type error= - STL_interface::norm_diff(X_stl,resu_stl); - - if (error>1.e-4){ - INFOS("WRONG CALCULATION...residual=" << error); - exit(2); - } //else INFOS("CALCULATION OK...residual=" << error); - - } - -private : - - typename Interface::stl_matrix L_stl; - typename Interface::stl_vector X_stl; - typename Interface::stl_vector B_stl; - typename Interface::stl_vector resu_stl; - - typename Interface::gene_matrix L; - typename Interface::gene_vector X; - typename Interface::gene_vector B; - - int _size; - double _cost; -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_trisolve_matrix.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_trisolve_matrix.hh deleted file mode 100644 index 0fc2bb9e..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_trisolve_matrix.hh +++ /dev/null @@ -1,165 +0,0 @@ -//===================================================== -// File : action_matrix_matrix_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_TRISOLVE_MATRIX_PRODUCT -#define ACTION_TRISOLVE_MATRIX_PRODUCT -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_trisolve_matrix { - -public : - - // Ctor - - Action_trisolve_matrix( int size ):_size(size) - { - MESSAGE("Action_trisolve_matrix Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_matrix(B_stl,_size); - init_matrix(X_stl,_size); - init_matrix(resu_stl,_size); - - for (int j=0; j<_size; ++j) - { - for (int i=0; i::matrix_matrix_product(A_stl,B_stl,X_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(X_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// // exit(1); -// } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_matrix B_stl; - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_matrix B_ref; - typename Interface::gene_matrix X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_matrix B; - typename Interface::gene_matrix X; - - int _size; - double _cost; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/action_trmm.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/action_trmm.hh deleted file mode 100644 index 8f781381..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/action_trmm.hh +++ /dev/null @@ -1,165 +0,0 @@ -//===================================================== -// File : action_matrix_matrix_product.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef ACTION_TRMM -#define ACTION_TRMM -#include "utilities.h" -#include "STL_interface.hh" -#include -#include "init/init_function.hh" -#include "init/init_vector.hh" -#include "init/init_matrix.hh" - -using namespace std; - -template -class Action_trmm { - -public : - - // Ctor - - Action_trmm( int size ):_size(size) - { - MESSAGE("Action_trmm Ctor"); - - // STL matrix and vector initialization - - init_matrix(A_stl,_size); - init_matrix(B_stl,_size); - init_matrix(X_stl,_size); - init_matrix(resu_stl,_size); - - for (int j=0; j<_size; ++j) - { - for (int i=0; i::matrix_matrix_product(A_stl,B_stl,X_stl,_size); -// -// typename Interface::real_type error= -// STL_interface::norm_diff(X_stl,resu_stl); -// -// if (error>1.e-6){ -// INFOS("WRONG CALCULATION...residual=" << error); -// // exit(1); -// } - - } - -private : - - typename Interface::stl_matrix A_stl; - typename Interface::stl_matrix B_stl; - typename Interface::stl_matrix X_stl; - typename Interface::stl_matrix resu_stl; - - typename Interface::gene_matrix A_ref; - typename Interface::gene_matrix B_ref; - typename Interface::gene_matrix X_ref; - - typename Interface::gene_matrix A; - typename Interface::gene_matrix B; - typename Interface::gene_matrix X; - - int _size; - double _cost; - -}; - - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/actions/basic_actions.hh b/testbed/nanogui/ext/eigen/bench/btl/actions/basic_actions.hh deleted file mode 100644 index 62442f01..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/actions/basic_actions.hh +++ /dev/null @@ -1,21 +0,0 @@ - -#include "action_axpy.hh" -#include "action_axpby.hh" - -#include "action_matrix_vector_product.hh" -#include "action_atv_product.hh" - -#include "action_matrix_matrix_product.hh" -#include "action_ata_product.hh" -#include "action_aat_product.hh" - -#include "action_trisolve.hh" -#include "action_trmm.hh" -#include "action_symv.hh" -// #include "action_symm.hh" -#include "action_syr2.hh" -#include "action_ger.hh" -#include "action_rot.hh" - -// #include "action_lu_solve.hh" - diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindACML.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindACML.cmake deleted file mode 100644 index 4989fa2f..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindACML.cmake +++ /dev/null @@ -1,51 +0,0 @@ - -if (ACML_LIBRARIES) - set(ACML_FIND_QUIETLY TRUE) -endif (ACML_LIBRARIES) - -find_library(ACML_LIBRARIES - NAMES - acml_mp acml_mv - PATHS - $ENV{ACMLDIR}/lib - $ENV{ACML_DIR}/lib - ${LIB_INSTALL_DIR} -) - -find_file(ACML_LIBRARIES - NAMES - libacml_mp.so - PATHS - /usr/lib - /usr/lib64 - $ENV{ACMLDIR}/lib - ${LIB_INSTALL_DIR} -) - -if(NOT ACML_LIBRARIES) - message(STATUS "Multi-threaded library not found, looking for single-threaded") - find_library(ACML_LIBRARIES - NAMES - acml acml_mv - PATHS - $ENV{ACMLDIR}/lib - $ENV{ACML_DIR}/lib - ${LIB_INSTALL_DIR} - ) - find_file(ACML_LIBRARIES - libacml.so libacml_mv.so - PATHS - /usr/lib - /usr/lib64 - $ENV{ACMLDIR}/lib - ${LIB_INSTALL_DIR} - ) -endif() - - - - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(ACML DEFAULT_MSG ACML_LIBRARIES) - -mark_as_advanced(ACML_LIBRARIES) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindATLAS.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindATLAS.cmake deleted file mode 100644 index 4136a989..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindATLAS.cmake +++ /dev/null @@ -1,31 +0,0 @@ - -if (ATLAS_LIBRARIES) - set(ATLAS_FIND_QUIETLY TRUE) -endif (ATLAS_LIBRARIES) - -find_file(ATLAS_LIB libatlas.so.3 PATHS /usr/lib /usr/lib/atlas /usr/lib64 /usr/lib64/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR}) -find_library(ATLAS_LIB satlas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR}) - -find_file(ATLAS_LAPACK NAMES liblapack_atlas.so.3 liblapack.so.3 PATHS /usr/lib /usr/lib/atlas /usr/lib64 /usr/lib64/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR}) -find_library(ATLAS_LAPACK NAMES lapack_atlas lapack PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR}) - -find_file(ATLAS_F77BLAS libf77blas.so.3 PATHS /usr/lib /usr/lib/atlas /usr/lib64 /usr/lib64/atlas $ENV{ATLASDIR} ${LIB_INSTALL_DIR}) -find_library(ATLAS_F77BLAS f77blas PATHS $ENV{ATLASDIR} ${LIB_INSTALL_DIR}) - -if(ATLAS_LIB AND ATLAS_CBLAS AND ATLAS_LAPACK AND ATLAS_F77BLAS) - - set(ATLAS_LIBRARIES ${ATLAS_LAPACK} ${ATLAS_LIB}) - - # search the default lapack lib link to it - find_file(ATLAS_REFERENCE_LAPACK liblapack.so.3 PATHS /usr/lib /usr/lib64) - find_library(ATLAS_REFERENCE_LAPACK NAMES lapack) -# if(ATLAS_REFERENCE_LAPACK) -# set(ATLAS_LIBRARIES ${ATLAS_LIBRARIES} ${ATLAS_REFERENCE_LAPACK}) -# endif() - -endif(ATLAS_LIB AND ATLAS_CBLAS AND ATLAS_LAPACK AND ATLAS_F77BLAS) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(ATLAS DEFAULT_MSG ATLAS_LIBRARIES) - -mark_as_advanced(ATLAS_LIBRARIES) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindBLAZE.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindBLAZE.cmake deleted file mode 100644 index dba4c89f..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindBLAZE.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# - Try to find eigen2 headers -# Once done this will define -# -# BLAZE_FOUND - system has blaze lib -# BLAZE_INCLUDE_DIR - the blaze include directory -# -# Copyright (C) 2008 Gael Guennebaud -# Adapted from FindEigen.cmake: -# Copyright (c) 2006, 2007 Montel Laurent, -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -if (BLAZE_INCLUDE_DIR) - - # in cache already - set(BLAZE_FOUND TRUE) - -else (BLAZE_INCLUDE_DIR) - -find_path(BLAZE_INCLUDE_DIR NAMES blaze/Blaze.h - PATHS - ${INCLUDE_INSTALL_DIR} - ) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(BLAZE DEFAULT_MSG BLAZE_INCLUDE_DIR) - -mark_as_advanced(BLAZE_INCLUDE_DIR) - -endif(BLAZE_INCLUDE_DIR) - diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindBlitz.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindBlitz.cmake deleted file mode 100644 index 92880bbe..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindBlitz.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# - Try to find blitz lib -# Once done this will define -# -# BLITZ_FOUND - system has blitz lib -# BLITZ_INCLUDES - the blitz include directory -# BLITZ_LIBRARIES - The libraries needed to use blitz - -# Copyright (c) 2006, Montel Laurent, -# Copyright (c) 2007, Allen Winter, -# Copyright (C) 2008 Gael Guennebaud -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -# include(FindLibraryWithDebug) - -if (BLITZ_INCLUDES AND BLITZ_LIBRARIES) - set(Blitz_FIND_QUIETLY TRUE) -endif (BLITZ_INCLUDES AND BLITZ_LIBRARIES) - -find_path(BLITZ_INCLUDES - NAMES - blitz/array.h - PATH_SUFFIXES blitz* - PATHS - $ENV{BLITZDIR}/include - ${INCLUDE_INSTALL_DIR} -) - -find_library(BLITZ_LIBRARIES - blitz - PATHS - $ENV{BLITZDIR}/lib - ${LIB_INSTALL_DIR} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Blitz DEFAULT_MSG - BLITZ_INCLUDES BLITZ_LIBRARIES) - -mark_as_advanced(BLITZ_INCLUDES BLITZ_LIBRARIES) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindCBLAS.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindCBLAS.cmake deleted file mode 100644 index ce0f2f2b..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindCBLAS.cmake +++ /dev/null @@ -1,35 +0,0 @@ -# include(FindLibraryWithDebug) - -if (CBLAS_INCLUDES AND CBLAS_LIBRARIES) - set(CBLAS_FIND_QUIETLY TRUE) -endif (CBLAS_INCLUDES AND CBLAS_LIBRARIES) - -find_path(CBLAS_INCLUDES - NAMES - cblas.h - PATHS - $ENV{CBLASDIR}/include - ${INCLUDE_INSTALL_DIR} -) - -find_library(CBLAS_LIBRARIES - cblas - PATHS - $ENV{CBLASDIR}/lib - ${LIB_INSTALL_DIR} -) - -find_file(CBLAS_LIBRARIES - libcblas.so.3 - PATHS - /usr/lib - /usr/lib64 - $ENV{CBLASDIR}/lib - ${LIB_INSTALL_DIR} -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(CBLAS DEFAULT_MSG - CBLAS_INCLUDES CBLAS_LIBRARIES) - -mark_as_advanced(CBLAS_INCLUDES CBLAS_LIBRARIES) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindGMM.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindGMM.cmake deleted file mode 100644 index 5049c64e..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindGMM.cmake +++ /dev/null @@ -1,17 +0,0 @@ -if (GMM_INCLUDE_DIR) - # in cache already - set(GMM_FOUND TRUE) -else (GMM_INCLUDE_DIR) - -find_path(GMM_INCLUDE_DIR NAMES gmm/gmm.h - PATHS - ${INCLUDE_INSTALL_DIR} - ${GMM_INCLUDE_PATH} - ) - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(GMM DEFAULT_MSG GMM_INCLUDE_DIR ) - -mark_as_advanced(GMM_INCLUDE_DIR) - -endif(GMM_INCLUDE_DIR) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindMKL.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindMKL.cmake deleted file mode 100644 index f4d7c6eb..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindMKL.cmake +++ /dev/null @@ -1,65 +0,0 @@ - -if (MKL_LIBRARIES) - set(MKL_FIND_QUIETLY TRUE) -endif (MKL_LIBRARIES) - -if(CMAKE_MINOR_VERSION GREATER 4) - -if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64") - -find_library(MKL_LIBRARIES - mkl_core - PATHS - $ENV{MKLLIB} - /opt/intel/mkl/*/lib/em64t - /opt/intel/Compiler/*/*/mkl/lib/em64t - ${LIB_INSTALL_DIR} -) - -find_library(MKL_GUIDE - guide - PATHS - $ENV{MKLLIB} - /opt/intel/mkl/*/lib/em64t - /opt/intel/Compiler/*/*/mkl/lib/em64t - /opt/intel/Compiler/*/*/lib/intel64 - ${LIB_INSTALL_DIR} -) - -if(MKL_LIBRARIES AND MKL_GUIDE) - set(MKL_LIBRARIES ${MKL_LIBRARIES} mkl_intel_lp64 mkl_sequential ${MKL_GUIDE} pthread) -endif() - -else(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64") - -find_library(MKL_LIBRARIES - mkl_core - PATHS - $ENV{MKLLIB} - /opt/intel/mkl/*/lib/32 - /opt/intel/Compiler/*/*/mkl/lib/32 - ${LIB_INSTALL_DIR} -) - -find_library(MKL_GUIDE - guide - PATHS - $ENV{MKLLIB} - /opt/intel/mkl/*/lib/32 - /opt/intel/Compiler/*/*/mkl/lib/32 - /opt/intel/Compiler/*/*/lib/intel32 - ${LIB_INSTALL_DIR} -) - -if(MKL_LIBRARIES AND MKL_GUIDE) - set(MKL_LIBRARIES ${MKL_LIBRARIES} mkl_intel mkl_sequential ${MKL_GUIDE} pthread) -endif() - -endif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64") - -endif(CMAKE_MINOR_VERSION GREATER 4) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MKL DEFAULT_MSG MKL_LIBRARIES) - -mark_as_advanced(MKL_LIBRARIES) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindMTL4.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindMTL4.cmake deleted file mode 100644 index 3de49098..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindMTL4.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# - Try to find eigen2 headers -# Once done this will define -# -# MTL4_FOUND - system has eigen2 lib -# MTL4_INCLUDE_DIR - the eigen2 include directory -# -# Copyright (C) 2008 Gael Guennebaud -# Adapted from FindEigen.cmake: -# Copyright (c) 2006, 2007 Montel Laurent, -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -if (MTL4_INCLUDE_DIR) - - # in cache already - set(MTL4_FOUND TRUE) - -else (MTL4_INCLUDE_DIR) - -find_path(MTL4_INCLUDE_DIR NAMES boost/numeric/mtl/mtl.hpp - PATHS - ${INCLUDE_INSTALL_DIR} - ) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MTL4 DEFAULT_MSG MTL4_INCLUDE_DIR) - -mark_as_advanced(MTL4_INCLUDE_DIR) - -endif(MTL4_INCLUDE_DIR) - diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindOPENBLAS.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindOPENBLAS.cmake deleted file mode 100644 index 2a091943..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindOPENBLAS.cmake +++ /dev/null @@ -1,17 +0,0 @@ - -if (OPENBLAS_LIBRARIES) - set(OPENBLAS_FIND_QUIETLY TRUE) -endif (OPENBLAS_LIBRARIES) - -find_file(OPENBLAS_LIBRARIES NAMES libopenblas.so libopenblas.so.0 PATHS /usr/lib /usr/lib64 $ENV{OPENBLASDIR} ${LIB_INSTALL_DIR}) -find_library(OPENBLAS_LIBRARIES openblas PATHS $ENV{OPENBLASDIR} ${LIB_INSTALL_DIR}) - -if(OPENBLAS_LIBRARIES AND CMAKE_COMPILER_IS_GNUCXX) - set(OPENBLAS_LIBRARIES ${OPENBLAS_LIBRARIES} "-lpthread -lgfortran") -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(OPENBLAS DEFAULT_MSG - OPENBLAS_LIBRARIES) - -mark_as_advanced(OPENBLAS_LIBRARIES) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindPackageHandleStandardArgs.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindPackageHandleStandardArgs.cmake deleted file mode 100644 index 7f122edc..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindPackageHandleStandardArgs.cmake +++ /dev/null @@ -1,60 +0,0 @@ -# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME (DEFAULT_MSG|"Custom failure message") VAR1 ... ) -# -# This macro is intended to be used in FindXXX.cmake modules files. -# It handles the REQUIRED and QUIET argument to FIND_PACKAGE() and -# it also sets the _FOUND variable. -# The package is found if all variables listed are TRUE. -# Example: -# -# FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR) -# -# LibXml2 is considered to be found, if both LIBXML2_LIBRARIES and -# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE. -# If it is not found and REQUIRED was used, it fails with FATAL_ERROR, -# independent whether QUIET was used or not. -# -# If it is found, the location is reported using the VAR1 argument, so -# here a message "Found LibXml2: /usr/lib/libxml2.so" will be printed out. -# If the second argument is DEFAULT_MSG, the message in the failure case will -# be "Could NOT find LibXml2", if you don't like this message you can specify -# your own custom failure message there. - -MACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FAIL_MSG _VAR1 ) - - IF("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") - IF (${_NAME}_FIND_REQUIRED) - SET(_FAIL_MESSAGE "Could not find REQUIRED package ${_NAME}") - ELSE (${_NAME}_FIND_REQUIRED) - SET(_FAIL_MESSAGE "Could not find OPTIONAL package ${_NAME}") - ENDIF (${_NAME}_FIND_REQUIRED) - ELSE("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") - SET(_FAIL_MESSAGE "${_FAIL_MSG}") - ENDIF("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") - - STRING(TOUPPER ${_NAME} _NAME_UPPER) - - SET(${_NAME_UPPER}_FOUND TRUE) - IF(NOT ${_VAR1}) - SET(${_NAME_UPPER}_FOUND FALSE) - ENDIF(NOT ${_VAR1}) - - FOREACH(_CURRENT_VAR ${ARGN}) - IF(NOT ${_CURRENT_VAR}) - SET(${_NAME_UPPER}_FOUND FALSE) - ENDIF(NOT ${_CURRENT_VAR}) - ENDFOREACH(_CURRENT_VAR) - - IF (${_NAME_UPPER}_FOUND) - IF (NOT ${_NAME}_FIND_QUIETLY) - MESSAGE(STATUS "Found ${_NAME}: ${${_VAR1}}") - ENDIF (NOT ${_NAME}_FIND_QUIETLY) - ELSE (${_NAME_UPPER}_FOUND) - IF (${_NAME}_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "${_FAIL_MESSAGE}") - ELSE (${_NAME}_FIND_REQUIRED) - IF (NOT ${_NAME}_FIND_QUIETLY) - MESSAGE(STATUS "${_FAIL_MESSAGE}") - ENDIF (NOT ${_NAME}_FIND_QUIETLY) - ENDIF (${_NAME}_FIND_REQUIRED) - ENDIF (${_NAME_UPPER}_FOUND) -ENDMACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS) diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindTvmet.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/FindTvmet.cmake deleted file mode 100644 index 26a29d96..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/FindTvmet.cmake +++ /dev/null @@ -1,32 +0,0 @@ -# - Try to find tvmet headers -# Once done this will define -# -# TVMET_FOUND - system has tvmet lib -# TVMET_INCLUDE_DIR - the tvmet include directory -# -# Copyright (C) 2008 Gael Guennebaud -# Adapted from FindEigen.cmake: -# Copyright (c) 2006, 2007 Montel Laurent, -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -if (TVMET_INCLUDE_DIR) - - # in cache already - set(TVMET_FOUND TRUE) - -else (TVMET_INCLUDE_DIR) - -find_path(TVMET_INCLUDE_DIR NAMES tvmet/tvmet.h - PATHS - ${TVMETDIR}/ - ${INCLUDE_INSTALL_DIR} - ) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Tvmet DEFAULT_MSG TVMET_INCLUDE_DIR) - -mark_as_advanced(TVMET_INCLUDE_DIR) - -endif(TVMET_INCLUDE_DIR) - diff --git a/testbed/nanogui/ext/eigen/bench/btl/cmake/MacroOptionalAddSubdirectory.cmake b/testbed/nanogui/ext/eigen/bench/btl/cmake/MacroOptionalAddSubdirectory.cmake deleted file mode 100644 index 545048b6..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/cmake/MacroOptionalAddSubdirectory.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# - MACRO_OPTIONAL_ADD_SUBDIRECTORY() combines ADD_SUBDIRECTORY() with an OPTION() -# MACRO_OPTIONAL_ADD_SUBDIRECTORY( ) -# If you use MACRO_OPTIONAL_ADD_SUBDIRECTORY() instead of ADD_SUBDIRECTORY(), -# this will have two effects -# 1 - CMake will not complain if the directory doesn't exist -# This makes sense if you want to distribute just one of the subdirs -# in a source package, e.g. just one of the subdirs in kdeextragear. -# 2 - If the directory exists, it will offer an option to skip the -# subdirectory. -# This is useful if you want to compile only a subset of all -# directories. - -# Copyright (c) 2007, Alexander Neundorf, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - - -MACRO (MACRO_OPTIONAL_ADD_SUBDIRECTORY _dir ) - GET_FILENAME_COMPONENT(_fullPath ${_dir} ABSOLUTE) - IF(EXISTS ${_fullPath}) - IF(${ARGC} EQUAL 2) - OPTION(BUILD_${_dir} "Build directory ${_dir}" ${ARGV1}) - ELSE(${ARGC} EQUAL 2) - OPTION(BUILD_${_dir} "Build directory ${_dir}" TRUE) - ENDIF(${ARGC} EQUAL 2) - IF(BUILD_${_dir}) - ADD_SUBDIRECTORY(${_dir}) - ENDIF(BUILD_${_dir}) - ENDIF(EXISTS ${_fullPath}) -ENDMACRO (MACRO_OPTIONAL_ADD_SUBDIRECTORY) diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/data/CMakeLists.txt deleted file mode 100644 index 6af2a366..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ - -ADD_CUSTOM_TARGET(copy_scripts) - -SET(script_files go_mean mk_mean_script.sh mk_new_gnuplot.sh - perlib_plot_settings.txt action_settings.txt gnuplot_common_settings.hh ) - -FOREACH(script_file ${script_files}) -ADD_CUSTOM_COMMAND( - TARGET copy_scripts - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${script_file} ${CMAKE_CURRENT_BINARY_DIR}/ - ARGS -) -ENDFOREACH(script_file) - -ADD_CUSTOM_COMMAND( - TARGET copy_scripts - POST_BUILD - COMMAND ${CMAKE_CXX_COMPILER} --version | head -n 1 > ${CMAKE_CURRENT_BINARY_DIR}/compiler_version.txt - ARGS -) -ADD_CUSTOM_COMMAND( - TARGET copy_scripts - POST_BUILD - COMMAND echo "${Eigen_SOURCE_DIR}" > ${CMAKE_CURRENT_BINARY_DIR}/eigen_root_dir.txt - ARGS -) - -add_executable(smooth smooth.cxx) -add_executable(regularize regularize.cxx) -add_executable(main mean.cxx) -add_dependencies(main copy_scripts) diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/action_settings.txt b/testbed/nanogui/ext/eigen/bench/btl/data/action_settings.txt deleted file mode 100644 index 39d2b5dc..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/action_settings.txt +++ /dev/null @@ -1,19 +0,0 @@ -aat ; "{/*1.5 A x A^T}" ; "matrix size" ; 4:5000 -ata ; "{/*1.5 A^T x A}" ; "matrix size" ; 4:5000 -atv ; "{/*1.5 matrix^T x vector}" ; "matrix size" ; 4:5000 -axpby ; "{/*1.5 Y = alpha X + beta Y}" ; "vector size" ; 5:1000000 -axpy ; "{/*1.5 Y += alpha X}" ; "vector size" ; 5:1000000 -matrix_matrix ; "{/*1.5 matrix matrix product}" ; "matrix size" ; 4:5000 -matrix_vector ; "{/*1.5 matrix vector product}" ; "matrix size" ; 4:5000 -trmm ; "{/*1.5 triangular matrix matrix product}" ; "matrix size" ; 4:5000 -trisolve_vector ; "{/*1.5 triangular solver - vector (X = inv(L) X)}" ; "size" ; 4:5000 -trisolve_matrix ; "{/*1.5 triangular solver - matrix (M = inv(L) M)}" ; "size" ; 4:5000 -cholesky ; "{/*1.5 Cholesky decomposition}" ; "matrix size" ; 4:5000 -complete_lu_decomp ; "{/*1.5 Complete LU decomposition}" ; "matrix size" ; 4:5000 -partial_lu_decomp ; "{/*1.5 Partial LU decomposition}" ; "matrix size" ; 4:5000 -tridiagonalization ; "{/*1.5 Tridiagonalization}" ; "matrix size" ; 4:5000 -hessenberg ; "{/*1.5 Hessenberg decomposition}" ; "matrix size" ; 4:5000 -symv ; "{/*1.5 symmetric matrix vector product}" ; "matrix size" ; 4:5000 -syr2 ; "{/*1.5 symmretric rank-2 update (A += u^T v + u v^T)}" ; "matrix size" ; 4:5000 -ger ; "{/*1.5 general rank-1 update (A += u v^T)}" ; "matrix size" ; 4:5000 -rot ; "{/*1.5 apply rotation in the plane}" ; "vector size" ; 4:1000000 diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/gnuplot_common_settings.hh b/testbed/nanogui/ext/eigen/bench/btl/data/gnuplot_common_settings.hh deleted file mode 100644 index 6f677df6..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/gnuplot_common_settings.hh +++ /dev/null @@ -1,87 +0,0 @@ -set noclip points -set clip one -set noclip two -set bar 1.000000 -set border 31 lt -1 lw 1.000 -set xdata -set ydata -set zdata -set x2data -set y2data -set boxwidth -set dummy x,y -set format x "%g" -set format y "%g" -set format x2 "%g" -set format y2 "%g" -set format z "%g" -set angles radians -set nogrid -set key title "" -set key left top Right noreverse box linetype -2 linewidth 1.000 samplen 4 spacing 1 width 0 -set nolabel -set noarrow -# set nolinestyle # deprecated -set nologscale -set logscale x 10 -set offsets 0, 0, 0, 0 -set pointsize 1 -set encoding default -set nopolar -set noparametric -set view 60, 30, 1, 1 -set samples 100, 100 -set isosamples 10, 10 -set surface -set nocontour -set clabel '%8.3g' -set mapping cartesian -set nohidden3d -set cntrparam order 4 -set cntrparam linear -set cntrparam levels auto 5 -set cntrparam points 5 -set size ratio 0 1,1 -set origin 0,0 -# set data style lines -# set function style lines -set xzeroaxis lt -2 lw 1.000 -set x2zeroaxis lt -2 lw 1.000 -set yzeroaxis lt -2 lw 1.000 -set y2zeroaxis lt -2 lw 1.000 -set tics in -set ticslevel 0.5 -set tics scale 1, 0.5 -set mxtics default -set mytics default -set mx2tics default -set my2tics default -set xtics border mirror norotate autofreq -set ytics border mirror norotate autofreq -set ztics border nomirror norotate autofreq -set nox2tics -set noy2tics -set timestamp "" bottom norotate offset 0,0 -set rrange [ * : * ] noreverse nowriteback # (currently [-0:10] ) -set trange [ * : * ] noreverse nowriteback # (currently [-5:5] ) -set urange [ * : * ] noreverse nowriteback # (currently [-5:5] ) -set vrange [ * : * ] noreverse nowriteback # (currently [-5:5] ) -set xlabel "matrix size" offset 0,0 -set x2label "" offset 0,0 -set timefmt "%d/%m/%y\n%H:%M" -set xrange [ 10 : 1000 ] noreverse nowriteback -set x2range [ * : * ] noreverse nowriteback # (currently [-10:10] ) -set ylabel "MFLOPS" offset 0,0 -set y2label "" offset 0,0 -set yrange [ * : * ] noreverse nowriteback # (currently [-10:10] ) -set y2range [ * : * ] noreverse nowriteback # (currently [-10:10] ) -set zlabel "" offset 0,0 -set zrange [ * : * ] noreverse nowriteback # (currently [-10:10] ) -set zero 1e-08 -set lmargin -1 -set bmargin -1 -set rmargin -1 -set tmargin -1 -set locale "C" -set xrange [4:1024] - diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/go_mean b/testbed/nanogui/ext/eigen/bench/btl/data/go_mean deleted file mode 100755 index 42338ca2..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/go_mean +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -if [ $# < 1 ]; then - echo "Usage: $0 working_directory [tiny|large [prefix]]" -else - -mkdir -p $1 -##cp ../libs/*/*.dat $1 - -mode=large -if [ $# > 2 ]; then - mode=$2 -fi -if [ $# > 3 ]; then - prefix=$3 -fi - -EIGENDIR=`cat eigen_root_dir.txt` - -webpagefilename=$1/index.html -meanstatsfilename=$1/mean.html - -echo '' > $meanstatsfilename -echo '' > $webpagefilename -echo '

Configuration' >> $webpagefilename -echo '

    '\ - '
  • ' `cat /proc/cpuinfo | grep "model name" | head -n 1`\ - ' (' `uname -m` ')
  • '\ - '
  • compiler: ' `cat compiler_version.txt` '
  • '\ - '
  • eigen3: ' `hg identify -i $EIGENDIR` '
  • '\ - '
' \ - '

' >> $webpagefilename - -source mk_mean_script.sh axpy $1 11 2500 100000 250000 $mode $prefix -source mk_mean_script.sh axpby $1 11 2500 100000 250000 $mode $prefix -source mk_mean_script.sh matrix_vector $1 11 50 300 1000 $mode $prefix -source mk_mean_script.sh atv $1 11 50 300 1000 $mode $prefix -source mk_mean_script.sh matrix_matrix $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh aat $1 11 100 300 1000 $mode $prefix -# source mk_mean_script.sh ata $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh trmm $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh trisolve_vector $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh trisolve_matrix $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh cholesky $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh partial_lu_decomp $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh tridiagonalization $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh hessenberg $1 11 100 300 1000 $mode $prefix -source mk_mean_script.sh symv $1 11 50 300 1000 $mode $prefix -source mk_mean_script.sh syr2 $1 11 50 300 1000 $mode $prefix -source mk_mean_script.sh ger $1 11 50 300 1000 $mode $prefix -source mk_mean_script.sh rot $1 11 2500 100000 250000 $mode $prefix -source mk_mean_script.sh complete_lu_decomp $1 11 100 300 1000 $mode $prefix - -fi - -## compile the web page ## - -#echo `cat footer.html` >> $webpagefilename \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/mean.cxx b/testbed/nanogui/ext/eigen/bench/btl/data/mean.cxx deleted file mode 100644 index c567ef33..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/mean.cxx +++ /dev/null @@ -1,182 +0,0 @@ -//===================================================== -// File : mean.cxx -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:15 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include -#include -#include -#include -#include "bench_parameter.hh" -#include "utils/xy_file.hh" -#include - -using namespace std; - -double mean_calc(const vector & tab_sizes, const vector & tab_mflops, const int size_min, const int size_max); - -class Lib_Mean{ - -public: - Lib_Mean( void ):_lib_name(),_mean_in_cache(),_mean_out_of_cache(){ - MESSAGE("Lib_mean Default Ctor"); - MESSAGE("!!! should not be used"); - exit(0); - } - Lib_Mean(const string & name, const double & mic, const double & moc):_lib_name(name),_mean_in_cache(mic),_mean_out_of_cache(moc){ - MESSAGE("Lib_mean Ctor"); - } - Lib_Mean(const Lib_Mean & lm):_lib_name(lm._lib_name),_mean_in_cache(lm._mean_in_cache),_mean_out_of_cache(lm._mean_out_of_cache){ - MESSAGE("Lib_mean Copy Ctor"); - } - ~Lib_Mean( void ){ - MESSAGE("Lib_mean Dtor"); - } - - double _mean_in_cache; - double _mean_out_of_cache; - string _lib_name; - - bool operator < ( const Lib_Mean &right) const - { - //return ( this->_mean_out_of_cache > right._mean_out_of_cache) ; - return ( this->_mean_in_cache > right._mean_in_cache) ; - } - -}; - - -int main( int argc , char *argv[] ) -{ - - if (argc<6){ - INFOS("!!! Error ... usage : main what mic Mic moc Moc filename1 finename2..."); - exit(0); - } - INFOS(argc); - - int min_in_cache=atoi(argv[2]); - int max_in_cache=atoi(argv[3]); - int min_out_of_cache=atoi(argv[4]); - int max_out_of_cache=atoi(argv[5]); - - - multiset s_lib_mean ; - - for (int i=6;i tab_sizes; - vector tab_mflops; - - read_xy_file(filename,tab_sizes,tab_mflops); - - mic=mean_calc(tab_sizes,tab_mflops,min_in_cache,max_in_cache); - moc=mean_calc(tab_sizes,tab_mflops,min_out_of_cache,max_out_of_cache); - - Lib_Mean cur_lib_mean(filename,mic,moc); - - s_lib_mean.insert(cur_lib_mean); - - } - - } - - - cout << "" << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - - multiset::iterator is = s_lib_mean.begin(); - Lib_Mean best(*is); - - - for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){ - - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - cout << " " << endl ; - - } - - cout << "
" << argv[1] << " in cache
mean perf
Mflops
in cache
% best
out of cache
mean perf
Mflops
out of cache
% best
details comments
" << is->_lib_name << " " << is->_mean_in_cache << " " << 100*(is->_mean_in_cache/best._mean_in_cache) << " " << is->_mean_out_of_cache << " " << 100*(is->_mean_out_of_cache/best._mean_out_of_cache) << " " << - "_lib_name<<"_"<snippet/" - "_lib_name<<"_flags\">flags " << - "_lib_name<<"_comments\">click here
" << endl ; - - ofstream output_file ("../order_lib",ios::out) ; - - for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){ - output_file << is->_lib_name << endl ; - } - - output_file.close(); - -} - -double mean_calc(const vector & tab_sizes, const vector & tab_mflops, const int size_min, const int size_max){ - - int size=tab_sizes.size(); - int nb_sample=0; - double mean=0.0; - - for (int i=0;i=size_min)&&(tab_sizes[i]<=size_max)){ - - nb_sample++; - mean+=tab_mflops[i]; - - } - - - } - - if (nb_sample==0){ - INFOS("no data for mean calculation"); - return 0.0; - } - - return mean/nb_sample; -} - - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/mk_gnuplot_script.sh b/testbed/nanogui/ext/eigen/bench/btl/data/mk_gnuplot_script.sh deleted file mode 100644 index 2ca7b5cb..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/mk_gnuplot_script.sh +++ /dev/null @@ -1,68 +0,0 @@ -#! /bin/bash -WHAT=$1 -DIR=$2 -echo $WHAT script generation -cat $WHAT.hh > $WHAT.gnuplot - -DATA_FILE=`find $DIR -name "*.dat" | grep $WHAT` - -echo plot \\ >> $WHAT.gnuplot - -for FILE in $DATA_FILE -do - LAST=$FILE -done - -echo LAST=$LAST - -for FILE in $DATA_FILE -do - if [ $FILE != $LAST ] - then - BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} - echo "'"$FILE"'" title "'"$TITLE"'" ",\\" >> $WHAT.gnuplot - fi -done -BASE=${LAST##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} -echo "'"$LAST"'" title "'"$TITLE"'" >> $WHAT.gnuplot - -#echo set term postscript color >> $WHAT.gnuplot -#echo set output "'"$WHAT.ps"'" >> $WHAT.gnuplot -echo set term pbm small color >> $WHAT.gnuplot -echo set output "'"$WHAT.ppm"'" >> $WHAT.gnuplot -echo plot \\ >> $WHAT.gnuplot - -for FILE in $DATA_FILE -do - if [ $FILE != $LAST ] - then - BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} - echo "'"$FILE"'" title "'"$TITLE"'" ",\\" >> $WHAT.gnuplot - fi -done -BASE=${LAST##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} -echo "'"$LAST"'" title "'"$TITLE"'" >> $WHAT.gnuplot - -echo set term jpeg large >> $WHAT.gnuplot -echo set output "'"$WHAT.jpg"'" >> $WHAT.gnuplot -echo plot \\ >> $WHAT.gnuplot - -for FILE in $DATA_FILE -do - if [ $FILE != $LAST ] - then - BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} - echo "'"$FILE"'" title "'"$TITLE"'" ",\\" >> $WHAT.gnuplot - fi -done -BASE=${LAST##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} -echo "'"$LAST"'" title "'"$TITLE"'" >> $WHAT.gnuplot - - -gnuplot -persist < $WHAT.gnuplot - -rm $WHAT.gnuplot - - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/mk_mean_script.sh b/testbed/nanogui/ext/eigen/bench/btl/data/mk_mean_script.sh deleted file mode 100644 index b10df024..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/mk_mean_script.sh +++ /dev/null @@ -1,52 +0,0 @@ -#! /bin/bash -WHAT=$1 -DIR=$2 -MINIC=$3 -MAXIC=$4 -MINOC=$5 -MAXOC=$6 -prefix=$8 - -meanstatsfilename=$2/mean.html - -WORK_DIR=tmp -mkdir $WORK_DIR - -DATA_FILE=`find $DIR -name "*.dat" | grep _${WHAT}` - -if [ -n "$DATA_FILE" ]; then - - echo "" - echo "$1..." - for FILE in $DATA_FILE - do - ##echo hello world - ##echo "mk_mean_script1" ${FILE} - BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} - - ##echo "mk_mean_script1" ${TITLE} - cp $FILE ${WORK_DIR}/${TITLE} - - done - - cd $WORK_DIR - ../main $1 $3 $4 $5 $6 * >> ../$meanstatsfilename - ../mk_new_gnuplot.sh $1 $2 $7 - rm -f *.gnuplot - cd .. - - echo '
' >> $meanstatsfilename - - webpagefilename=$2/index.html - # echo '

'${WHAT}'

' >> $webpagefilename - echo '
'${WHAT}'
' >> $webpagefilename - -fi - -rm -R $WORK_DIR - - - - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/mk_new_gnuplot.sh b/testbed/nanogui/ext/eigen/bench/btl/data/mk_new_gnuplot.sh deleted file mode 100755 index fad3b23a..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/mk_new_gnuplot.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -WHAT=$1 -DIR=$2 - -cat ../gnuplot_common_settings.hh > ${WHAT}.gnuplot - -echo "set title " `grep ${WHAT} ../action_settings.txt | head -n 1 | cut -d ";" -f 2` >> $WHAT.gnuplot -echo "set xlabel " `grep ${WHAT} ../action_settings.txt | head -n 1 | cut -d ";" -f 3` " offset 0,0" >> $WHAT.gnuplot -echo "set xrange [" `grep ${WHAT} ../action_settings.txt | head -n 1 | cut -d ";" -f 4` "]" >> $WHAT.gnuplot - -if [ $# > 3 ]; then - if [ "$3" == "tiny" ]; then - echo "set xrange [2:16]" >> $WHAT.gnuplot - echo "set nologscale" >> $WHAT.gnuplot - fi -fi - - - -DATA_FILE=`cat ../order_lib` -echo set term postscript color rounded enhanced >> $WHAT.gnuplot -echo set output "'"../${DIR}/$WHAT.ps"'" >> $WHAT.gnuplot - -# echo set term svg color rounded enhanced >> $WHAT.gnuplot -# echo "set terminal svg enhanced size 1000 1000 fname \"Times\" fsize 36" >> $WHAT.gnuplot -# echo set output "'"../${DIR}/$WHAT.svg"'" >> $WHAT.gnuplot - -echo plot \\ >> $WHAT.gnuplot - -for FILE in $DATA_FILE -do - LAST=$FILE -done - -for FILE in $DATA_FILE -do - BASE=${FILE##*/} ; BASE=${FILE##*/} ; AVANT=bench_${WHAT}_ ; REDUC=${BASE##*$AVANT} ; TITLE=${REDUC%.dat} - - echo "'"$FILE"'" `grep $TITLE ../perlib_plot_settings.txt | head -n 1 | cut -d ";" -f 2` "\\" >> $WHAT.gnuplot - if [ $FILE != $LAST ] - then - echo ", \\" >> $WHAT.gnuplot - fi -done -echo " " >> $WHAT.gnuplot - -gnuplot -persist < $WHAT.gnuplot - -rm $WHAT.gnuplot - -ps2pdf ../${DIR}/$WHAT.ps ../${DIR}/$WHAT.pdf -convert -background white -density 120 -rotate 90 -resize 800 +dither -colors 256 -quality 0 ../${DIR}/$WHAT.ps -background white -flatten ../${DIR}/$WHAT.png - -# pstoedit -rotate -90 -xscale 0.8 -yscale 0.8 -centered -yshift -50 -xshift -100 -f plot-svg aat.ps aat2.svg diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/perlib_plot_settings.txt b/testbed/nanogui/ext/eigen/bench/btl/data/perlib_plot_settings.txt deleted file mode 100644 index f023cfe0..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/perlib_plot_settings.txt +++ /dev/null @@ -1,16 +0,0 @@ -eigen3 ; with lines lw 4 lt 1 lc rgbcolor "black" -eigen2 ; with lines lw 3 lt 1 lc rgbcolor "#999999" -EigenBLAS ; with lines lw 3 lt 3 lc rgbcolor "#999999" -eigen3_novec ; with lines lw 2 lt 1 lc rgbcolor "#999999" -eigen3_nogccvec ; with lines lw 2 lt 2 lc rgbcolor "#991010" -INTEL_MKL ; with lines lw 3 lt 1 lc rgbcolor "#ff0000" -ATLAS ; with lines lw 3 lt 1 lc rgbcolor "#008000" -gmm ; with lines lw 3 lt 1 lc rgbcolor "#0000ff" -ublas ; with lines lw 3 lt 1 lc rgbcolor "#00b7ff" -mtl4 ; with lines lw 3 lt 1 lc rgbcolor "#d18847" -blitz ; with lines lw 3 lt 1 lc rgbcolor "#ff00ff" -F77 ; with lines lw 3 lt 3 lc rgbcolor "#e6e64c" -OPENBLAS ; with lines lw 3 lt 1 lc rgbcolor "#C05600" -C ; with lines lw 3 lt 3 lc rgbcolor "#e6bd96" -ACML ; with lines lw 2 lt 3 lc rgbcolor "#e6e64c" -blaze ; with lines lw 3 lt 1 lc rgbcolor "#ff00ff" diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/regularize.cxx b/testbed/nanogui/ext/eigen/bench/btl/data/regularize.cxx deleted file mode 100644 index eea2b8b8..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/regularize.cxx +++ /dev/null @@ -1,131 +0,0 @@ -//===================================================== -// File : regularize.cxx -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:15 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include -#include -#include -#include -#include "bench_parameter.hh" -#include - -using namespace std; - -void read_xy_file(const string & filename, vector & tab_sizes, vector & tab_mflops); -void regularize_curve(const string & filename, - const vector & tab_mflops, - const vector & tab_sizes, - int start_cut_size, int stop_cut_size); -///////////////////////////////////////////////////////////////////////////////////////////////// - -int main( int argc , char *argv[] ) -{ - - // input data - - if (argc<4){ - INFOS("!!! Error ... usage : main filename start_cut_size stop_cut_size regularize_filename"); - exit(0); - } - INFOS(argc); - - int start_cut_size=atoi(argv[2]); - int stop_cut_size=atoi(argv[3]); - - string filename=argv[1]; - string regularize_filename=argv[4]; - - INFOS(filename); - INFOS("start_cut_size="< tab_sizes; - vector tab_mflops; - - read_xy_file(filename,tab_sizes,tab_mflops); - - // regularizeing - - regularize_curve(regularize_filename,tab_mflops,tab_sizes,start_cut_size,stop_cut_size); - - -} - -////////////////////////////////////////////////////////////////////////////////////// - -void regularize_curve(const string & filename, - const vector & tab_mflops, - const vector & tab_sizes, - int start_cut_size, int stop_cut_size) -{ - int size=tab_mflops.size(); - ofstream output_file (filename.c_str(),ios::out) ; - - int i=0; - - while(tab_sizes[i] & tab_sizes, vector & tab_mflops){ - - ifstream input_file (filename.c_str(),ios::in) ; - - if (!input_file){ - INFOS("!!! Error opening "<> size >> mflops ){ - nb_point++; - tab_sizes.push_back(size); - tab_mflops.push_back(mflops); - } - SCRUTE(nb_point); - - input_file.close(); -} - diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/smooth.cxx b/testbed/nanogui/ext/eigen/bench/btl/data/smooth.cxx deleted file mode 100644 index e5270cc3..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/smooth.cxx +++ /dev/null @@ -1,198 +0,0 @@ -//===================================================== -// File : smooth.cxx -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:15 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include -#include -#include -#include -#include -#include "bench_parameter.hh" -#include - -using namespace std; - -void read_xy_file(const string & filename, vector & tab_sizes, vector & tab_mflops); -void write_xy_file(const string & filename, vector & tab_sizes, vector & tab_mflops); -void smooth_curve(const vector & tab_mflops, vector & smooth_tab_mflops,int window_half_width); -void centered_smooth_curve(const vector & tab_mflops, vector & smooth_tab_mflops,int window_half_width); - -///////////////////////////////////////////////////////////////////////////////////////////////// - -int main( int argc , char *argv[] ) -{ - - // input data - - if (argc<3){ - INFOS("!!! Error ... usage : main filename window_half_width smooth_filename"); - exit(0); - } - INFOS(argc); - - int window_half_width=atoi(argv[2]); - - string filename=argv[1]; - string smooth_filename=argv[3]; - - INFOS(filename); - INFOS("window_half_width="< tab_sizes; - vector tab_mflops; - - read_xy_file(filename,tab_sizes,tab_mflops); - - // smoothing - - vector smooth_tab_mflops; - - //smooth_curve(tab_mflops,smooth_tab_mflops,window_half_width); - centered_smooth_curve(tab_mflops,smooth_tab_mflops,window_half_width); - - // output result - - write_xy_file(smooth_filename,tab_sizes,smooth_tab_mflops); - - -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -template -double weighted_mean(const VECTOR & data) -{ - - double mean=0.0; - - for (int i=0 ; i & tab_mflops, vector & smooth_tab_mflops,int window_half_width){ - - int window_width=2*window_half_width+1; - - int size=tab_mflops.size(); - - vector sample(window_width); - - for (int i=0 ; i < size ; i++){ - - for ( int j=0 ; j < window_width ; j++ ){ - - int shifted_index=i+j-window_half_width; - if (shifted_index<0) shifted_index=0; - if (shifted_index>size-1) shifted_index=size-1; - sample[j]=tab_mflops[shifted_index]; - - } - - smooth_tab_mflops.push_back(weighted_mean(sample)); - - } - -} - -void centered_smooth_curve(const vector & tab_mflops, vector & smooth_tab_mflops,int window_half_width){ - - int max_window_width=2*window_half_width+1; - - int size=tab_mflops.size(); - - - for (int i=0 ; i < size ; i++){ - - deque sample; - - - sample.push_back(tab_mflops[i]); - - for ( int j=1 ; j <= window_half_width ; j++ ){ - - int before=i-j; - int after=i+j; - - if ((before>=0)&&(after & tab_sizes, vector & tab_mflops){ - - ofstream output_file (filename.c_str(),ios::out) ; - - for (int i=0 ; i < tab_sizes.size() ; i++) - { - output_file << tab_sizes[i] << " " << tab_mflops[i] << endl ; - } - - output_file.close(); - -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void read_xy_file(const string & filename, vector & tab_sizes, vector & tab_mflops){ - - ifstream input_file (filename.c_str(),ios::in) ; - - if (!input_file){ - INFOS("!!! Error opening "<> size >> mflops ){ - nb_point++; - tab_sizes.push_back(size); - tab_mflops.push_back(mflops); - } - SCRUTE(nb_point); - - input_file.close(); -} - diff --git a/testbed/nanogui/ext/eigen/bench/btl/data/smooth_all.sh b/testbed/nanogui/ext/eigen/bench/btl/data/smooth_all.sh deleted file mode 100755 index 3e5bfdf4..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/data/smooth_all.sh +++ /dev/null @@ -1,68 +0,0 @@ -#! /bin/bash -ORIG_DIR=$1 -SMOOTH_DIR=${ORIG_DIR}_smooth -mkdir ${SMOOTH_DIR} - -AXPY_FILE=`find ${ORIG_DIR} -name "*.dat" | grep axpy` -for FILE in ${AXPY_FILE} -do - echo $FILE - BASE=${FILE##*/} - ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}_tmp - ./regularize ${SMOOTH_DIR}/${BASE}_tmp 2500 15000 ${SMOOTH_DIR}/${BASE} - rm -f ${SMOOTH_DIR}/${BASE}_tmp -done - - -MATRIX_VECTOR_FILE=`find ${ORIG_DIR} -name "*.dat" | grep matrix_vector` -for FILE in ${MATRIX_VECTOR_FILE} -do - echo $FILE - BASE=${FILE##*/} - ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE}_tmp - ./regularize ${SMOOTH_DIR}/${BASE}_tmp 50 180 ${SMOOTH_DIR}/${BASE} - rm -f ${SMOOTH_DIR}/${BASE}_tmp -done - -MATRIX_MATRIX_FILE=`find ${ORIG_DIR} -name "*.dat" | grep matrix_matrix` -for FILE in ${MATRIX_MATRIX_FILE} -do - echo $FILE - BASE=${FILE##*/} - ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE} -done - -AAT_FILE=`find ${ORIG_DIR} -name "*.dat" | grep _aat` -for FILE in ${AAT_FILE} -do - echo $FILE - BASE=${FILE##*/} - ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE} -done - - -ATA_FILE=`find ${ORIG_DIR} -name "*.dat" | grep _ata` -for FILE in ${ATA_FILE} -do - echo $FILE - BASE=${FILE##*/} - ./smooth ${ORIG_DIR}/${BASE} 4 ${SMOOTH_DIR}/${BASE} -done - -### no smoothing for tinyvector and matrices libs - -TINY_BLITZ_FILE=`find ${ORIG_DIR} -name "*.dat" | grep tiny_blitz` -for FILE in ${TINY_BLITZ_FILE} -do - echo $FILE - BASE=${FILE##*/} - cp ${ORIG_DIR}/${BASE} ${SMOOTH_DIR}/${BASE} -done - -TVMET_FILE=`find ${ORIG_DIR} -name "*.dat" | grep tvmet` -for FILE in ${TVMET_FILE} -do - echo $FILE - BASE=${FILE##*/} - cp ${ORIG_DIR}/${BASE} ${SMOOTH_DIR}/${BASE} -done diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/bench.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/bench.hh deleted file mode 100644 index 7b7b951b..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/bench.hh +++ /dev/null @@ -1,168 +0,0 @@ -//===================================================== -// File : bench.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:16 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BENCH_HH -#define BENCH_HH - -#include "btl.hh" -#include "bench_parameter.hh" -#include -#include "utilities.h" -#include "size_lin_log.hh" -#include "xy_file.hh" -#include -#include -#include "timers/portable_perf_analyzer.hh" -// #include "timers/mixed_perf_analyzer.hh" -// #include "timers/x86_perf_analyzer.hh" -// #include "timers/STL_perf_analyzer.hh" -#ifdef HAVE_MKL -extern "C" void cblas_saxpy(const int, const float, const float*, const int, float *, const int); -#endif -using namespace std; - -template class Perf_Analyzer, class Action> -BTL_DONT_INLINE void bench( int size_min, int size_max, int nb_point ) -{ - if (BtlConfig::skipAction(Action::name())) - return; - - string filename="bench_"+Action::name()+".dat"; - - INFOS("starting " < tab_mflops(nb_point); - std::vector tab_sizes(nb_point); - - // matrices and vector size calculations - size_lin_log(nb_point,size_min,size_max,tab_sizes); - - std::vector oldSizes; - std::vector oldFlops; - bool hasOldResults = read_xy_file(filename, oldSizes, oldFlops, true); - int oldi = oldSizes.size() - 1; - - // loop on matrix size - Perf_Analyzer perf_action; - for (int i=nb_point-1;i>=0;i--) - { - //INFOS("size=" <=0 && oldSizes[oldi]>tab_sizes[i]) - --oldi; - if (oldi>=0 && oldSizes[oldi]==tab_sizes[i]) - { - if (oldFlops[oldi] "; - else - std::cout << "\t < "; - std::cout << oldFlops[oldi]; - } - --oldi; - } - std::cout << " MFlops (" << nb_point-i << "/" << nb_point << ")" << std::endl; - } - - if (!BtlConfig::Instance.overwriteResults) - { - if (hasOldResults) - { - // merge the two data - std::vector newSizes; - std::vector newFlops; - unsigned int i=0; - unsigned int j=0; - while (i -BTL_DONT_INLINE void bench( int size_min, int size_max, int nb_point ){ - - // if the rdtsc is not available : - bench(size_min,size_max,nb_point); - // if the rdtsc is available : -// bench(size_min,size_max,nb_point); - - - // Only for small problem size. Otherwize it will be too long -// bench(size_min,size_max,nb_point); -// bench(size_min,size_max,nb_point); - -} - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/bench_parameter.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/bench_parameter.hh deleted file mode 100644 index 2b01149f..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/bench_parameter.hh +++ /dev/null @@ -1,53 +0,0 @@ -//===================================================== -// File : bench_parameter.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:16 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BENCH_PARAMETER_HH -#define BENCH_PARAMETER_HH - -// minimal time for each measurement -#define REAL_TYPE float -// minimal time for each measurement -#define MIN_TIME 0.2 -// nb of point on bench curves -#define NB_POINT 100 -// min vector size for axpy bench -#define MIN_AXPY 5 -// max vector size for axpy bench -#define MAX_AXPY 3000000 -// min matrix size for matrix vector product bench -#define MIN_MV 5 -// max matrix size for matrix vector product bench -#define MAX_MV 5000 -// min matrix size for matrix matrix product bench -#define MIN_MM 5 -// max matrix size for matrix matrix product bench -#define MAX_MM MAX_MV -// min matrix size for LU bench -#define MIN_LU 5 -// max matrix size for LU bench -#define MAX_LU 3000 -// max size for tiny vector and matrix -#define TINY_MV_MAX_SIZE 16 -// default nb_sample for x86 timer -#define DEFAULT_NB_SAMPLE 1000 - -// how many times we run a single bench (keep the best perf) -#define DEFAULT_NB_TRIES 3 - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/btl.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/btl.hh deleted file mode 100644 index 706b00fb..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/btl.hh +++ /dev/null @@ -1,242 +0,0 @@ -//===================================================== -// File : btl.hh -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BTL_HH -#define BTL_HH - -#include "bench_parameter.hh" -#include -#include -#include -#include -#include "utilities.h" - -#if (defined __GNUC__) -#define BTL_ALWAYS_INLINE __attribute__((always_inline)) inline -#else -#define BTL_ALWAYS_INLINE inline -#endif - -#if (defined __GNUC__) -#define BTL_DONT_INLINE __attribute__((noinline)) -#else -#define BTL_DONT_INLINE -#endif - -#if (defined __GNUC__) -#define BTL_ASM_COMMENT(X) asm("#" X) -#else -#define BTL_ASM_COMMENT(X) -#endif - -#ifdef __SSE__ -#include "xmmintrin.h" -// This enables flush to zero (FTZ) and denormals are zero (DAZ) modes: -#define BTL_DISABLE_SSE_EXCEPTIONS() { _mm_setcsr(_mm_getcsr() | 0x8040); } -#else -#define BTL_DISABLE_SSE_EXCEPTIONS() -#endif - -/** Enhanced std::string -*/ -class BtlString : public std::string -{ -public: - BtlString() : std::string() {} - BtlString(const BtlString& str) : std::string(static_cast(str)) {} - BtlString(const std::string& str) : std::string(str) {} - BtlString(const char* str) : std::string(str) {} - - operator const char* () const { return c_str(); } - - void trim( bool left = true, bool right = true ) - { - int lspaces, rspaces, len = length(), i; - lspaces = rspaces = 0; - - if ( left ) - for (i=0; i=0 && (at(i)==' '||at(i)=='\t'||at(i)=='\r'||at(i)=='\n'); rspaces++,i--); - - *this = substr(lspaces, len-lspaces-rspaces); - } - - std::vector split( const BtlString& delims = "\t\n ") const - { - std::vector ret; - unsigned int numSplits = 0; - size_t start, pos; - start = 0; - do - { - pos = find_first_of(delims, start); - if (pos == start) - { - ret.push_back(""); - start = pos + 1; - } - else if (pos == npos) - ret.push_back( substr(start) ); - else - { - ret.push_back( substr(start, pos - start) ); - start = pos + 1; - } - //start = find_first_not_of(delims, start); - ++numSplits; - } while (pos != npos); - return ret; - } - - bool endsWith(const BtlString& str) const - { - if(str.size()>this->size()) - return false; - return this->substr(this->size()-str.size(),str.size()) == str; - } - bool contains(const BtlString& str) const - { - return this->find(str)size(); - } - bool beginsWith(const BtlString& str) const - { - if(str.size()>this->size()) - return false; - return this->substr(0,str.size()) == str; - } - - BtlString toLowerCase( void ) - { - std::transform(begin(), end(), begin(), static_cast(::tolower) ); - return *this; - } - BtlString toUpperCase( void ) - { - std::transform(begin(), end(), begin(), static_cast(::toupper) ); - return *this; - } - - /** Case insensitive comparison. - */ - bool isEquiv(const BtlString& str) const - { - BtlString str0 = *this; - str0.toLowerCase(); - BtlString str1 = str; - str1.toLowerCase(); - return str0 == str1; - } - - /** Decompose the current string as a path and a file. - For instance: "dir1/dir2/file.ext" leads to path="dir1/dir2/" and filename="file.ext" - */ - void decomposePathAndFile(BtlString& path, BtlString& filename) const - { - std::vector elements = this->split("/\\"); - path = ""; - filename = elements.back(); - elements.pop_back(); - if (this->at(0)=='/') - path = "/"; - for (unsigned int i=0 ; i config = BtlString(_config).split(" \t\n"); - for (unsigned int i = 0; i m_selectedActionNames; -}; - -#define BTL_MAIN \ - BtlConfig BtlConfig::Instance - -#endif // BTL_HH diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/init/init_function.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/init/init_function.hh deleted file mode 100644 index e467cb64..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/init/init_function.hh +++ /dev/null @@ -1,54 +0,0 @@ -//===================================================== -// File : init_function.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:18 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef INIT_FUNCTION_HH -#define INIT_FUNCTION_HH - -double simple_function(int index) -{ - return index; -} - -double simple_function(int index_i, int index_j) -{ - return index_i+index_j; -} - -double pseudo_random(int /*index*/) -{ - return std::rand()/double(RAND_MAX); -} - -double pseudo_random(int /*index_i*/, int /*index_j*/) -{ - return std::rand()/double(RAND_MAX); -} - - -double null_function(int /*index*/) -{ - return 0.0; -} - -double null_function(int /*index_i*/, int /*index_j*/) -{ - return 0.0; -} - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/init/init_matrix.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/init/init_matrix.hh deleted file mode 100644 index 6382d30c..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/init/init_matrix.hh +++ /dev/null @@ -1,64 +0,0 @@ -//===================================================== -// File : init_matrix.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:19 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef INIT_MATRIX_HH -#define INIT_MATRIX_HH - -// The Vector class must satisfy the following part of STL vector concept : -// resize() method -// [] operator for setting element -// value_type defined -template -BTL_DONT_INLINE void init_row(Vector & X, int size, int row){ - - X.resize(size); - - for (unsigned int j=0;j -BTL_DONT_INLINE void init_matrix(Vector & A, int size){ - A.resize(size); - for (unsigned int row=0; row(A[row],size,row); - } -} - -template -BTL_DONT_INLINE void init_matrix_symm(Matrix& A, int size){ - A.resize(size); - for (unsigned int row=0; row -// Copyright (C) EDF R&D, lun sep 30 14:23:18 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef INIT_VECTOR_HH -#define INIT_VECTOR_HH - -// The Vector class must satisfy the following part of STL vector concept : -// resize() method -// [] operator for setting element -// value_type defined -template -void init_vector(Vector & X, int size){ - - X.resize(size); - - for (unsigned int i=0;i -// Copyright (C) EDF R&D, lun sep 30 14:23:16 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BENCH_STATIC_HH -#define BENCH_STATIC_HH - -#include "btl.hh" -#include "bench_parameter.hh" -#include -#include "utilities.h" -#include "xy_file.hh" -#include "static/static_size_generator.hh" -#include "timers/portable_perf_analyzer.hh" -// #include "timers/mixed_perf_analyzer.hh" -// #include "timers/x86_perf_analyzer.hh" - -using namespace std; - - -template class Perf_Analyzer, template class Action, template class Interface> -BTL_DONT_INLINE void bench_static(void) -{ - if (BtlConfig::skipAction(Action >::name())) - return; - - string filename = "bench_" + Action >::name() + ".dat"; - - INFOS("starting " << filename); - - const int max_size = TINY_MV_MAX_SIZE; - - std::vector tab_mflops; - std::vector tab_sizes; - - static_size_generator::go(tab_sizes,tab_mflops); - - dump_xy_file(tab_sizes,tab_mflops,filename); -} - -// default Perf Analyzer -template class Action, template class Interface> -BTL_DONT_INLINE void bench_static(void) -{ - bench_static(); - //bench_static(); - //bench_static(); -} - -#endif - - - - - - - - - - - - - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/static/intel_bench_fixed_size.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/static/intel_bench_fixed_size.hh deleted file mode 100644 index b4edcbc4..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/static/intel_bench_fixed_size.hh +++ /dev/null @@ -1,66 +0,0 @@ -//===================================================== -// File : intel_bench_fixed_size.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, mar dc 3 18:59:37 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _BENCH_FIXED_SIZE_HH_ -#define _BENCH_FIXED_SIZE_HH_ - -#include "utilities.h" -#include "function_time.hh" - -template -double bench_fixed_size(int size, unsigned long long & nb_calc,unsigned long long & nb_init) -{ - - Action action(size); - - double time_baseline=time_init(nb_init,action); - - while (time_baseline < MIN_TIME) { - - //INFOS("nb_init="< > > perf_action; - tab_mflops.push_back(perf_action.eval_mflops(SIZE)); - std::cout << tab_mflops.back() << " MFlops" << std::endl; - static_size_generator::go(tab_sizes,tab_mflops); - }; -}; - -//recursion end - -template class Perf_Analyzer, template class Action, template class Interface> -struct static_size_generator<1,Perf_Analyzer,Action,Interface>{ - static void go(vector & tab_sizes, vector & tab_mflops) - { - tab_sizes.push_back(1); - Perf_Analyzer > > perf_action; - tab_mflops.push_back(perf_action.eval_mflops(1)); - }; -}; - -#endif - - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/STL_perf_analyzer.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/STL_perf_analyzer.hh deleted file mode 100644 index c9f894b1..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/STL_perf_analyzer.hh +++ /dev/null @@ -1,82 +0,0 @@ -//===================================================== -// File : STL_perf_analyzer.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, mar dc 3 18:59:35 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _STL_PERF_ANALYSER_HH -#define _STL_PERF_ANALYSER_HH - -#include "STL_timer.hh" -#include "bench_parameter.hh" - -template -class STL_Perf_Analyzer{ -public: - STL_Perf_Analyzer(unsigned long long nb_sample=DEFAULT_NB_SAMPLE):_nb_sample(nb_sample),_chronos() - { - MESSAGE("STL_Perf_Analyzer Ctor"); - }; - STL_Perf_Analyzer( const STL_Perf_Analyzer & ){ - INFOS("Copy Ctor not implemented"); - exit(0); - }; - ~STL_Perf_Analyzer( void ){ - MESSAGE("STL_Perf_Analyzer Dtor"); - }; - - - inline double eval_mflops(int size) - { - - ACTION action(size); - - _chronos.start_baseline(_nb_sample); - - do { - - action.initialize(); - } while (_chronos.check()); - - double baseline_time=_chronos.get_time(); - - _chronos.start(_nb_sample); - do { - action.initialize(); - action.calculate(); - } while (_chronos.check()); - - double calculate_time=_chronos.get_time(); - - double corrected_time=calculate_time-baseline_time; - - // cout << size <<" "< -// Copyright (C) EDF R&D, mar dc 3 18:59:35 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// STL Timer Class. Adapted (L.P.) from the timer class by Musser et Al -// described int the Book : STL Tutorial and reference guide. -// Define a timer class for analyzing algorithm performance. -#include -#include -#include -#include -#include -using namespace std; - -class STL_Timer { -public: - STL_Timer(){ baseline = false; }; // Default constructor - // Start a series of r trials: - void start(unsigned int r){ - reps = r; - count = 0; - iterations.clear(); - iterations.reserve(reps); - initial = time(0); - }; - // Start a series of r trials to determine baseline time: - void start_baseline(unsigned int r) - { - baseline = true; - start(r); - } - // Returns true if the trials have been completed, else false - bool check() - { - ++count; - final = time(0); - if (initial < final) { - iterations.push_back(count); - initial = final; - count = 0; - } - return (iterations.size() < reps); - }; - // Returns the results for external use - double get_time( void ) - { - sort(iterations.begin(), iterations.end()); - return 1.0/iterations[reps/2]; - }; -private: - unsigned int reps; // Number of trials - // For storing loop iterations of a trial - vector iterations; - // For saving initial and final times of a trial - time_t initial, final; - // For counting loop iterations of a trial - unsigned long count; - // true if this is a baseline computation, false otherwise - bool baseline; - // For recording the baseline time - double baseline_time; -}; - diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/mixed_perf_analyzer.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/mixed_perf_analyzer.hh deleted file mode 100644 index e190236e..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/mixed_perf_analyzer.hh +++ /dev/null @@ -1,73 +0,0 @@ -//===================================================== -// File : mixed_perf_analyzer.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, mar dc 3 18:59:36 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _MIXED_PERF_ANALYSER_HH -#define _MIXED_PERF_ANALYSER_HH - -#include "x86_perf_analyzer.hh" -#include "portable_perf_analyzer.hh" - -// choose portable perf analyzer for long calculations and x86 analyser for short ones - - -template -class Mixed_Perf_Analyzer{ - -public: - Mixed_Perf_Analyzer( void ):_x86pa(),_ppa(),_use_ppa(true) - { - MESSAGE("Mixed_Perf_Analyzer Ctor"); - }; - Mixed_Perf_Analyzer( const Mixed_Perf_Analyzer & ){ - INFOS("Copy Ctor not implemented"); - exit(0); - }; - ~Mixed_Perf_Analyzer( void ){ - MESSAGE("Mixed_Perf_Analyzer Dtor"); - }; - - - inline double eval_mflops(int size) - { - - double result=0.0; - if (_use_ppa){ - result=_ppa.eval_mflops(size); - if (_ppa.get_nb_calc()>DEFAULT_NB_SAMPLE){_use_ppa=false;} - } - else{ - result=_x86pa.eval_mflops(size); - } - - return result; - } - -private: - - Portable_Perf_Analyzer _ppa; - X86_Perf_Analyzer _x86pa; - bool _use_ppa; - -}; - -#endif - - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/portable_perf_analyzer.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/portable_perf_analyzer.hh deleted file mode 100644 index 5e579fb4..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/portable_perf_analyzer.hh +++ /dev/null @@ -1,103 +0,0 @@ -//===================================================== -// File : portable_perf_analyzer.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, mar d�c 3 18:59:35 CET 2002 -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _PORTABLE_PERF_ANALYZER_HH -#define _PORTABLE_PERF_ANALYZER_HH - -#include "utilities.h" -#include "timers/portable_timer.hh" - -template -class Portable_Perf_Analyzer{ -public: - Portable_Perf_Analyzer( ):_nb_calc(0), m_time_action(0), _chronos(){ - MESSAGE("Portable_Perf_Analyzer Ctor"); - }; - Portable_Perf_Analyzer( const Portable_Perf_Analyzer & ){ - INFOS("Copy Ctor not implemented"); - exit(0); - }; - ~Portable_Perf_Analyzer(){ - MESSAGE("Portable_Perf_Analyzer Dtor"); - }; - - BTL_DONT_INLINE double eval_mflops(int size) - { - Action action(size); - -// action.initialize(); -// time_action = time_calculate(action); - while (m_time_action < MIN_TIME) - { - if(_nb_calc==0) _nb_calc = 1; - else _nb_calc *= 2; - action.initialize(); - m_time_action = time_calculate(action); - } - - // optimize - for (int i=1; i -// Copyright (C) EDF R&D, mar d�c 3 18:59:35 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _PORTABLE_PERF_ANALYZER_HH -#define _PORTABLE_PERF_ANALYZER_HH - -#include "utilities.h" -#include "timers/portable_timer.hh" - -template -class Portable_Perf_Analyzer{ -public: - Portable_Perf_Analyzer( void ):_nb_calc(1),_nb_init(1),_chronos(){ - MESSAGE("Portable_Perf_Analyzer Ctor"); - }; - Portable_Perf_Analyzer( const Portable_Perf_Analyzer & ){ - INFOS("Copy Ctor not implemented"); - exit(0); - }; - ~Portable_Perf_Analyzer( void ){ - MESSAGE("Portable_Perf_Analyzer Dtor"); - }; - - - - inline double eval_mflops(int size) - { - - Action action(size); - -// double time_baseline = time_init(action); -// while (time_baseline < MIN_TIME_INIT) -// { -// _nb_init *= 2; -// time_baseline = time_init(action); -// } -// -// // optimize -// for (int i=1; i -#include - - -class Portable_Timer -{ - public: - - Portable_Timer() - { - } - - void start() - { - m_start_time = double(mach_absolute_time())*1e-9;; - - } - - void stop() - { - m_stop_time = double(mach_absolute_time())*1e-9;; - - } - - double elapsed() - { - return user_time(); - } - - double user_time() - { - return m_stop_time - m_start_time; - } - - -private: - - double m_stop_time, m_start_time; - -}; // Portable_Timer (Apple) - -#else - -#include -#include -#include -#include - -class Portable_Timer -{ - public: - - Portable_Timer() - { - m_clkid = BtlConfig::Instance.realclock ? CLOCK_REALTIME : CLOCK_PROCESS_CPUTIME_ID; - } - - Portable_Timer(int clkid) : m_clkid(clkid) - {} - - void start() - { - timespec ts; - clock_gettime(m_clkid, &ts); - m_start_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec); - - } - - void stop() - { - timespec ts; - clock_gettime(m_clkid, &ts); - m_stop_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec); - - } - - double elapsed() - { - return user_time(); - } - - double user_time() - { - return m_stop_time - m_start_time; - } - - -private: - - int m_clkid; - double m_stop_time, m_start_time; - -}; // Portable_Timer (Linux) - -#endif - -#endif // PORTABLE_TIMER_HPP diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/x86_perf_analyzer.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/x86_perf_analyzer.hh deleted file mode 100644 index 37ea21dc..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/timers/x86_perf_analyzer.hh +++ /dev/null @@ -1,108 +0,0 @@ -//===================================================== -// File : x86_perf_analyzer.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, mar d�c 3 18:59:35 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _X86_PERF_ANALYSER_HH -#define _X86_PERF_ANALYSER_HH - -#include "x86_timer.hh" -#include "bench_parameter.hh" - -template -class X86_Perf_Analyzer{ -public: - X86_Perf_Analyzer( unsigned long long nb_sample=DEFAULT_NB_SAMPLE):_nb_sample(nb_sample),_chronos() - { - MESSAGE("X86_Perf_Analyzer Ctor"); - _chronos.find_frequency(); - }; - X86_Perf_Analyzer( const X86_Perf_Analyzer & ){ - INFOS("Copy Ctor not implemented"); - exit(0); - }; - ~X86_Perf_Analyzer( void ){ - MESSAGE("X86_Perf_Analyzer Dtor"); - }; - - - inline double eval_mflops(int size) - { - - ACTION action(size); - - int nb_loop=5; - double calculate_time=0.0; - double baseline_time=0.0; - - for (int j=0 ; j < nb_loop ; j++){ - - _chronos.clear(); - - for(int i=0 ; i < _nb_sample ; i++) - { - _chronos.start(); - action.initialize(); - action.calculate(); - _chronos.stop(); - _chronos.add_get_click(); - } - - calculate_time += double(_chronos.get_shortest_clicks())/_chronos.frequency(); - - if (j==0) action.check_result(); - - _chronos.clear(); - - for(int i=0 ; i < _nb_sample ; i++) - { - _chronos.start(); - action.initialize(); - _chronos.stop(); - _chronos.add_get_click(); - - } - - baseline_time+=double(_chronos.get_shortest_clicks())/_chronos.frequency(); - - } - - double corrected_time = (calculate_time-baseline_time)/double(nb_loop); - - -// INFOS("_nb_sample="<<_nb_sample); -// INFOS("baseline_time="< -// Copyright (C) EDF R&D, mar d�c 3 18:59:35 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef _X86_TIMER_HH -#define _X86_TIMER_HH - -#include -#include -#include -#include -//#include "system_time.h" -#define u32 unsigned int -#include -#include "utilities.h" -#include -#include -#include -#include - -// frequence de la becanne en Hz -//#define FREQUENCY 648000000 -//#define FREQUENCY 1400000000 -#define FREQUENCY 1695000000 - -using namespace std; - - -class X86_Timer { - -public : - - X86_Timer( void ):_frequency(FREQUENCY),_nb_sample(0) - { - MESSAGE("X86_Timer Default Ctor"); - } - - inline void start( void ){ - - rdtsc(_click_start.n32[0],_click_start.n32[1]); - - } - - - inline void stop( void ){ - - rdtsc(_click_stop.n32[0],_click_stop.n32[1]); - - } - - - inline double frequency( void ){ - return _frequency; - } - - double get_elapsed_time_in_second( void ){ - - return (_click_stop.n64-_click_start.n64)/double(FREQUENCY); - - - } - - unsigned long long get_click( void ){ - - return (_click_stop.n64-_click_start.n64); - - } - - inline void find_frequency( void ){ - - time_t initial, final; - int dummy=2; - - initial = time(0); - start(); - do { - dummy+=2; - } - while(time(0)==initial); - // On est au debut d'un cycle d'une seconde !!! - initial = time(0); - start(); - do { - dummy+=2; - } - while(time(0)==initial); - final=time(0); - stop(); - // INFOS("fine grained time : "<< get_elapsed_time_in_second()); - // INFOS("coarse grained time : "<< final-initial); - _frequency=_frequency*get_elapsed_time_in_second()/double(final-initial); - /// INFOS("CPU frequency : "<< _frequency); - - } - - void add_get_click( void ){ - - _nb_sample++; - _counted_clicks[get_click()]++; - fill_history_clicks(); - - } - - void dump_statistics(string filemane){ - - ofstream outfile (filemane.c_str(),ios::out) ; - - std::map::iterator itr; - for(itr=_counted_clicks.begin() ; itr!=_counted_clicks.end() ; itr++) - { - outfile << (*itr).first << " " << (*itr).second << endl ; - } - - outfile.close(); - - } - - void dump_history(string filemane){ - - ofstream outfile (filemane.c_str(),ios::out) ; - - - - for(int i=0 ; i<_history_mean_clicks.size() ; i++) - { - outfile << i << " " - << _history_mean_clicks[i] << " " - << _history_shortest_clicks[i] << " " - << _history_most_occured_clicks[i] << endl ; - } - - outfile.close(); - - } - - - - double get_mean_clicks( void ){ - - std::map::iterator itr; - - unsigned long long mean_clicks=0; - - for(itr=_counted_clicks.begin() ; itr!=_counted_clicks.end() ; itr++) - { - - mean_clicks+=(*itr).second*(*itr).first; - } - - return mean_clicks/double(_nb_sample); - - } - - double get_shortest_clicks( void ){ - - return double((*_counted_clicks.begin()).first); - - } - - void fill_history_clicks( void ){ - - _history_mean_clicks.push_back(get_mean_clicks()); - _history_shortest_clicks.push_back(get_shortest_clicks()); - _history_most_occured_clicks.push_back(get_most_occured_clicks()); - - } - - - double get_most_occured_clicks( void ){ - - unsigned long long moc=0; - unsigned long long max_occurence=0; - - std::map::iterator itr; - - for(itr=_counted_clicks.begin() ; itr!=_counted_clicks.end() ; itr++) - { - - if (max_occurence<=(*itr).second){ - max_occurence=(*itr).second; - moc=(*itr).first; - } - } - - return double(moc); - - } - - void clear( void ) - { - _counted_clicks.clear(); - - _history_mean_clicks.clear(); - _history_shortest_clicks.clear(); - _history_most_occured_clicks.clear(); - - _nb_sample=0; - } - - - -private : - - union - { - unsigned long int n32[2] ; - unsigned long long n64 ; - } _click_start; - - union - { - unsigned long int n32[2] ; - unsigned long long n64 ; - } _click_stop; - - double _frequency ; - - map _counted_clicks; - - vector _history_mean_clicks; - vector _history_shortest_clicks; - vector _history_most_occured_clicks; - - unsigned long long _nb_sample; - - - -}; - - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/utils/size_lin_log.hh b/testbed/nanogui/ext/eigen/bench/btl/generic_bench/utils/size_lin_log.hh deleted file mode 100644 index bbc9f543..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/generic_bench/utils/size_lin_log.hh +++ /dev/null @@ -1,70 +0,0 @@ -//===================================================== -// File : size_lin_log.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, mar dc 3 18:59:37 CET 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef SIZE_LIN_LOG -#define SIZE_LIN_LOG - -#include "size_log.hh" - -template -void size_lin_log(const int nb_point, const int /*size_min*/, const int size_max, Vector & X) -{ - int ten=10; - int nine=9; - - X.resize(nb_point); - - if (nb_point>ten){ - - for (int i=0;i -void size_log(const int nb_point, const int size_min, const int size_max, Vector & X) -{ - X.resize(nb_point); - - float ls_min=log(float(size_min)); - float ls_max=log(float(size_max)); - - float ls=0.0; - - float delta_ls=(ls_max-ls_min)/(float(nb_point-1)); - - int size=0; - - for (int i=0;i -//# include ok for gcc3.01 -# include - -/* --- INFOS is always defined (without _DEBUG_): to be used for warnings, with release version --- */ - -# define HEREWEARE cout< -// Copyright (C) EDF R&D, lun sep 30 14:23:20 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef XY_FILE_HH -#define XY_FILE_HH -#include -#include -#include -#include -using namespace std; - -bool read_xy_file(const std::string & filename, std::vector & tab_sizes, - std::vector & tab_mflops, bool quiet = false) -{ - - std::ifstream input_file (filename.c_str(),std::ios::in); - - if (!input_file){ - if (!quiet) { - INFOS("!!! Error opening "<> size >> mflops ){ - nb_point++; - tab_sizes.push_back(size); - tab_mflops.push_back(mflops); - } - SCRUTE(nb_point); - - input_file.close(); - return true; -} - -// The Vector class must satisfy the following part of STL vector concept : -// resize() method -// [] operator for seting element -// the vector element must have the << operator define - -using namespace std; - -template -void dump_xy_file(const Vector_A & X, const Vector_B & Y, const std::string & filename){ - - ofstream outfile (filename.c_str(),ios::out) ; - int size=X.size(); - - for (int i=0;i BLASFUNC(cdotu) (int *, float *, int *, float *, int *); -std::complex BLASFUNC(cdotc) (int *, float *, int *, float *, int *); -std::complex BLASFUNC(zdotu) (int *, double *, int *, double *, int *); -std::complex BLASFUNC(zdotc) (int *, double *, int *, double *, int *); -double BLASFUNC(xdotu) (int *, double *, int *, double *, int *); -double BLASFUNC(xdotc) (int *, double *, int *, double *, int *); -#endif - -int BLASFUNC(cdotuw) (int *, float *, int *, float *, int *, float*); -int BLASFUNC(cdotcw) (int *, float *, int *, float *, int *, float*); -int BLASFUNC(zdotuw) (int *, double *, int *, double *, int *, double*); -int BLASFUNC(zdotcw) (int *, double *, int *, double *, int *, double*); - -int BLASFUNC(saxpy) (int *, float *, float *, int *, float *, int *); -int BLASFUNC(daxpy) (int *, double *, double *, int *, double *, int *); -int BLASFUNC(qaxpy) (int *, double *, double *, int *, double *, int *); -int BLASFUNC(caxpy) (int *, float *, float *, int *, float *, int *); -int BLASFUNC(zaxpy) (int *, double *, double *, int *, double *, int *); -int BLASFUNC(xaxpy) (int *, double *, double *, int *, double *, int *); -int BLASFUNC(caxpyc)(int *, float *, float *, int *, float *, int *); -int BLASFUNC(zaxpyc)(int *, double *, double *, int *, double *, int *); -int BLASFUNC(xaxpyc)(int *, double *, double *, int *, double *, int *); - -int BLASFUNC(scopy) (int *, float *, int *, float *, int *); -int BLASFUNC(dcopy) (int *, double *, int *, double *, int *); -int BLASFUNC(qcopy) (int *, double *, int *, double *, int *); -int BLASFUNC(ccopy) (int *, float *, int *, float *, int *); -int BLASFUNC(zcopy) (int *, double *, int *, double *, int *); -int BLASFUNC(xcopy) (int *, double *, int *, double *, int *); - -int BLASFUNC(sswap) (int *, float *, int *, float *, int *); -int BLASFUNC(dswap) (int *, double *, int *, double *, int *); -int BLASFUNC(qswap) (int *, double *, int *, double *, int *); -int BLASFUNC(cswap) (int *, float *, int *, float *, int *); -int BLASFUNC(zswap) (int *, double *, int *, double *, int *); -int BLASFUNC(xswap) (int *, double *, int *, double *, int *); - -float BLASFUNC(sasum) (int *, float *, int *); -float BLASFUNC(scasum)(int *, float *, int *); -double BLASFUNC(dasum) (int *, double *, int *); -double BLASFUNC(qasum) (int *, double *, int *); -double BLASFUNC(dzasum)(int *, double *, int *); -double BLASFUNC(qxasum)(int *, double *, int *); - -int BLASFUNC(isamax)(int *, float *, int *); -int BLASFUNC(idamax)(int *, double *, int *); -int BLASFUNC(iqamax)(int *, double *, int *); -int BLASFUNC(icamax)(int *, float *, int *); -int BLASFUNC(izamax)(int *, double *, int *); -int BLASFUNC(ixamax)(int *, double *, int *); - -int BLASFUNC(ismax) (int *, float *, int *); -int BLASFUNC(idmax) (int *, double *, int *); -int BLASFUNC(iqmax) (int *, double *, int *); -int BLASFUNC(icmax) (int *, float *, int *); -int BLASFUNC(izmax) (int *, double *, int *); -int BLASFUNC(ixmax) (int *, double *, int *); - -int BLASFUNC(isamin)(int *, float *, int *); -int BLASFUNC(idamin)(int *, double *, int *); -int BLASFUNC(iqamin)(int *, double *, int *); -int BLASFUNC(icamin)(int *, float *, int *); -int BLASFUNC(izamin)(int *, double *, int *); -int BLASFUNC(ixamin)(int *, double *, int *); - -int BLASFUNC(ismin)(int *, float *, int *); -int BLASFUNC(idmin)(int *, double *, int *); -int BLASFUNC(iqmin)(int *, double *, int *); -int BLASFUNC(icmin)(int *, float *, int *); -int BLASFUNC(izmin)(int *, double *, int *); -int BLASFUNC(ixmin)(int *, double *, int *); - -float BLASFUNC(samax) (int *, float *, int *); -double BLASFUNC(damax) (int *, double *, int *); -double BLASFUNC(qamax) (int *, double *, int *); -float BLASFUNC(scamax)(int *, float *, int *); -double BLASFUNC(dzamax)(int *, double *, int *); -double BLASFUNC(qxamax)(int *, double *, int *); - -float BLASFUNC(samin) (int *, float *, int *); -double BLASFUNC(damin) (int *, double *, int *); -double BLASFUNC(qamin) (int *, double *, int *); -float BLASFUNC(scamin)(int *, float *, int *); -double BLASFUNC(dzamin)(int *, double *, int *); -double BLASFUNC(qxamin)(int *, double *, int *); - -float BLASFUNC(smax) (int *, float *, int *); -double BLASFUNC(dmax) (int *, double *, int *); -double BLASFUNC(qmax) (int *, double *, int *); -float BLASFUNC(scmax) (int *, float *, int *); -double BLASFUNC(dzmax) (int *, double *, int *); -double BLASFUNC(qxmax) (int *, double *, int *); - -float BLASFUNC(smin) (int *, float *, int *); -double BLASFUNC(dmin) (int *, double *, int *); -double BLASFUNC(qmin) (int *, double *, int *); -float BLASFUNC(scmin) (int *, float *, int *); -double BLASFUNC(dzmin) (int *, double *, int *); -double BLASFUNC(qxmin) (int *, double *, int *); - -int BLASFUNC(sscal) (int *, float *, float *, int *); -int BLASFUNC(dscal) (int *, double *, double *, int *); -int BLASFUNC(qscal) (int *, double *, double *, int *); -int BLASFUNC(cscal) (int *, float *, float *, int *); -int BLASFUNC(zscal) (int *, double *, double *, int *); -int BLASFUNC(xscal) (int *, double *, double *, int *); -int BLASFUNC(csscal)(int *, float *, float *, int *); -int BLASFUNC(zdscal)(int *, double *, double *, int *); -int BLASFUNC(xqscal)(int *, double *, double *, int *); - -float BLASFUNC(snrm2) (int *, float *, int *); -float BLASFUNC(scnrm2)(int *, float *, int *); - -double BLASFUNC(dnrm2) (int *, double *, int *); -double BLASFUNC(qnrm2) (int *, double *, int *); -double BLASFUNC(dznrm2)(int *, double *, int *); -double BLASFUNC(qxnrm2)(int *, double *, int *); - -int BLASFUNC(srot) (int *, float *, int *, float *, int *, float *, float *); -int BLASFUNC(drot) (int *, double *, int *, double *, int *, double *, double *); -int BLASFUNC(qrot) (int *, double *, int *, double *, int *, double *, double *); -int BLASFUNC(csrot) (int *, float *, int *, float *, int *, float *, float *); -int BLASFUNC(zdrot) (int *, double *, int *, double *, int *, double *, double *); -int BLASFUNC(xqrot) (int *, double *, int *, double *, int *, double *, double *); - -int BLASFUNC(srotg) (float *, float *, float *, float *); -int BLASFUNC(drotg) (double *, double *, double *, double *); -int BLASFUNC(qrotg) (double *, double *, double *, double *); -int BLASFUNC(crotg) (float *, float *, float *, float *); -int BLASFUNC(zrotg) (double *, double *, double *, double *); -int BLASFUNC(xrotg) (double *, double *, double *, double *); - -int BLASFUNC(srotmg)(float *, float *, float *, float *, float *); -int BLASFUNC(drotmg)(double *, double *, double *, double *, double *); - -int BLASFUNC(srotm) (int *, float *, int *, float *, int *, float *); -int BLASFUNC(drotm) (int *, double *, int *, double *, int *, double *); -int BLASFUNC(qrotm) (int *, double *, int *, double *, int *, double *); - -/* Level 2 routines */ - -int BLASFUNC(sger)(int *, int *, float *, float *, int *, - float *, int *, float *, int *); -int BLASFUNC(dger)(int *, int *, double *, double *, int *, - double *, int *, double *, int *); -int BLASFUNC(qger)(int *, int *, double *, double *, int *, - double *, int *, double *, int *); -int BLASFUNC(cgeru)(int *, int *, float *, float *, int *, - float *, int *, float *, int *); -int BLASFUNC(cgerc)(int *, int *, float *, float *, int *, - float *, int *, float *, int *); -int BLASFUNC(zgeru)(int *, int *, double *, double *, int *, - double *, int *, double *, int *); -int BLASFUNC(zgerc)(int *, int *, double *, double *, int *, - double *, int *, double *, int *); -int BLASFUNC(xgeru)(int *, int *, double *, double *, int *, - double *, int *, double *, int *); -int BLASFUNC(xgerc)(int *, int *, double *, double *, int *, - double *, int *, double *, int *); - -int BLASFUNC(sgemv)(char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(dgemv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(qgemv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(cgemv)(char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zgemv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xgemv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(strsv) (char *, char *, char *, int *, float *, int *, - float *, int *); -int BLASFUNC(dtrsv) (char *, char *, char *, int *, double *, int *, - double *, int *); -int BLASFUNC(qtrsv) (char *, char *, char *, int *, double *, int *, - double *, int *); -int BLASFUNC(ctrsv) (char *, char *, char *, int *, float *, int *, - float *, int *); -int BLASFUNC(ztrsv) (char *, char *, char *, int *, double *, int *, - double *, int *); -int BLASFUNC(xtrsv) (char *, char *, char *, int *, double *, int *, - double *, int *); - -int BLASFUNC(stpsv) (char *, char *, char *, int *, float *, float *, int *); -int BLASFUNC(dtpsv) (char *, char *, char *, int *, double *, double *, int *); -int BLASFUNC(qtpsv) (char *, char *, char *, int *, double *, double *, int *); -int BLASFUNC(ctpsv) (char *, char *, char *, int *, float *, float *, int *); -int BLASFUNC(ztpsv) (char *, char *, char *, int *, double *, double *, int *); -int BLASFUNC(xtpsv) (char *, char *, char *, int *, double *, double *, int *); - -int BLASFUNC(strmv) (char *, char *, char *, int *, float *, int *, - float *, int *); -int BLASFUNC(dtrmv) (char *, char *, char *, int *, double *, int *, - double *, int *); -int BLASFUNC(qtrmv) (char *, char *, char *, int *, double *, int *, - double *, int *); -int BLASFUNC(ctrmv) (char *, char *, char *, int *, float *, int *, - float *, int *); -int BLASFUNC(ztrmv) (char *, char *, char *, int *, double *, int *, - double *, int *); -int BLASFUNC(xtrmv) (char *, char *, char *, int *, double *, int *, - double *, int *); - -int BLASFUNC(stpmv) (char *, char *, char *, int *, float *, float *, int *); -int BLASFUNC(dtpmv) (char *, char *, char *, int *, double *, double *, int *); -int BLASFUNC(qtpmv) (char *, char *, char *, int *, double *, double *, int *); -int BLASFUNC(ctpmv) (char *, char *, char *, int *, float *, float *, int *); -int BLASFUNC(ztpmv) (char *, char *, char *, int *, double *, double *, int *); -int BLASFUNC(xtpmv) (char *, char *, char *, int *, double *, double *, int *); - -int BLASFUNC(stbmv) (char *, char *, char *, int *, int *, float *, int *, float *, int *); -int BLASFUNC(dtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); -int BLASFUNC(qtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); -int BLASFUNC(ctbmv) (char *, char *, char *, int *, int *, float *, int *, float *, int *); -int BLASFUNC(ztbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); -int BLASFUNC(xtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); - -int BLASFUNC(stbsv) (char *, char *, char *, int *, int *, float *, int *, float *, int *); -int BLASFUNC(dtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); -int BLASFUNC(qtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); -int BLASFUNC(ctbsv) (char *, char *, char *, int *, int *, float *, int *, float *, int *); -int BLASFUNC(ztbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); -int BLASFUNC(xtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *); - -int BLASFUNC(ssymv) (char *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(dsymv) (char *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(qsymv) (char *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(csymv) (char *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zsymv) (char *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xsymv) (char *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(sspmv) (char *, int *, float *, float *, - float *, int *, float *, float *, int *); -int BLASFUNC(dspmv) (char *, int *, double *, double *, - double *, int *, double *, double *, int *); -int BLASFUNC(qspmv) (char *, int *, double *, double *, - double *, int *, double *, double *, int *); -int BLASFUNC(cspmv) (char *, int *, float *, float *, - float *, int *, float *, float *, int *); -int BLASFUNC(zspmv) (char *, int *, double *, double *, - double *, int *, double *, double *, int *); -int BLASFUNC(xspmv) (char *, int *, double *, double *, - double *, int *, double *, double *, int *); - -int BLASFUNC(ssyr) (char *, int *, float *, float *, int *, - float *, int *); -int BLASFUNC(dsyr) (char *, int *, double *, double *, int *, - double *, int *); -int BLASFUNC(qsyr) (char *, int *, double *, double *, int *, - double *, int *); -int BLASFUNC(csyr) (char *, int *, float *, float *, int *, - float *, int *); -int BLASFUNC(zsyr) (char *, int *, double *, double *, int *, - double *, int *); -int BLASFUNC(xsyr) (char *, int *, double *, double *, int *, - double *, int *); - -int BLASFUNC(ssyr2) (char *, int *, float *, - float *, int *, float *, int *, float *, int *); -int BLASFUNC(dsyr2) (char *, int *, double *, - double *, int *, double *, int *, double *, int *); -int BLASFUNC(qsyr2) (char *, int *, double *, - double *, int *, double *, int *, double *, int *); -int BLASFUNC(csyr2) (char *, int *, float *, - float *, int *, float *, int *, float *, int *); -int BLASFUNC(zsyr2) (char *, int *, double *, - double *, int *, double *, int *, double *, int *); -int BLASFUNC(xsyr2) (char *, int *, double *, - double *, int *, double *, int *, double *, int *); - -int BLASFUNC(sspr) (char *, int *, float *, float *, int *, - float *); -int BLASFUNC(dspr) (char *, int *, double *, double *, int *, - double *); -int BLASFUNC(qspr) (char *, int *, double *, double *, int *, - double *); -int BLASFUNC(cspr) (char *, int *, float *, float *, int *, - float *); -int BLASFUNC(zspr) (char *, int *, double *, double *, int *, - double *); -int BLASFUNC(xspr) (char *, int *, double *, double *, int *, - double *); - -int BLASFUNC(sspr2) (char *, int *, float *, - float *, int *, float *, int *, float *); -int BLASFUNC(dspr2) (char *, int *, double *, - double *, int *, double *, int *, double *); -int BLASFUNC(qspr2) (char *, int *, double *, - double *, int *, double *, int *, double *); -int BLASFUNC(cspr2) (char *, int *, float *, - float *, int *, float *, int *, float *); -int BLASFUNC(zspr2) (char *, int *, double *, - double *, int *, double *, int *, double *); -int BLASFUNC(xspr2) (char *, int *, double *, - double *, int *, double *, int *, double *); - -int BLASFUNC(cher) (char *, int *, float *, float *, int *, - float *, int *); -int BLASFUNC(zher) (char *, int *, double *, double *, int *, - double *, int *); -int BLASFUNC(xher) (char *, int *, double *, double *, int *, - double *, int *); - -int BLASFUNC(chpr) (char *, int *, float *, float *, int *, float *); -int BLASFUNC(zhpr) (char *, int *, double *, double *, int *, double *); -int BLASFUNC(xhpr) (char *, int *, double *, double *, int *, double *); - -int BLASFUNC(cher2) (char *, int *, float *, - float *, int *, float *, int *, float *, int *); -int BLASFUNC(zher2) (char *, int *, double *, - double *, int *, double *, int *, double *, int *); -int BLASFUNC(xher2) (char *, int *, double *, - double *, int *, double *, int *, double *, int *); - -int BLASFUNC(chpr2) (char *, int *, float *, - float *, int *, float *, int *, float *); -int BLASFUNC(zhpr2) (char *, int *, double *, - double *, int *, double *, int *, double *); -int BLASFUNC(xhpr2) (char *, int *, double *, - double *, int *, double *, int *, double *); - -int BLASFUNC(chemv) (char *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zhemv) (char *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xhemv) (char *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(chpmv) (char *, int *, float *, float *, - float *, int *, float *, float *, int *); -int BLASFUNC(zhpmv) (char *, int *, double *, double *, - double *, int *, double *, double *, int *); -int BLASFUNC(xhpmv) (char *, int *, double *, double *, - double *, int *, double *, double *, int *); - -int BLASFUNC(snorm)(char *, int *, int *, float *, int *); -int BLASFUNC(dnorm)(char *, int *, int *, double *, int *); -int BLASFUNC(cnorm)(char *, int *, int *, float *, int *); -int BLASFUNC(znorm)(char *, int *, int *, double *, int *); - -int BLASFUNC(sgbmv)(char *, int *, int *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(dgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(qgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(cgbmv)(char *, int *, int *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(ssbmv)(char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(dsbmv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(qsbmv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(csbmv)(char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zsbmv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xsbmv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(chbmv)(char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zhbmv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xhbmv)(char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -/* Level 3 routines */ - -int BLASFUNC(sgemm)(char *, char *, int *, int *, int *, float *, - float *, int *, float *, int *, float *, float *, int *); -int BLASFUNC(dgemm)(char *, char *, int *, int *, int *, double *, - double *, int *, double *, int *, double *, double *, int *); -int BLASFUNC(qgemm)(char *, char *, int *, int *, int *, double *, - double *, int *, double *, int *, double *, double *, int *); -int BLASFUNC(cgemm)(char *, char *, int *, int *, int *, float *, - float *, int *, float *, int *, float *, float *, int *); -int BLASFUNC(zgemm)(char *, char *, int *, int *, int *, double *, - double *, int *, double *, int *, double *, double *, int *); -int BLASFUNC(xgemm)(char *, char *, int *, int *, int *, double *, - double *, int *, double *, int *, double *, double *, int *); - -int BLASFUNC(cgemm3m)(char *, char *, int *, int *, int *, float *, - float *, int *, float *, int *, float *, float *, int *); -int BLASFUNC(zgemm3m)(char *, char *, int *, int *, int *, double *, - double *, int *, double *, int *, double *, double *, int *); -int BLASFUNC(xgemm3m)(char *, char *, int *, int *, int *, double *, - double *, int *, double *, int *, double *, double *, int *); - -int BLASFUNC(sge2mm)(char *, char *, char *, int *, int *, - float *, float *, int *, float *, int *, - float *, float *, int *); -int BLASFUNC(dge2mm)(char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *, - double *, double *, int *); -int BLASFUNC(cge2mm)(char *, char *, char *, int *, int *, - float *, float *, int *, float *, int *, - float *, float *, int *); -int BLASFUNC(zge2mm)(char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *, - double *, double *, int *); - -int BLASFUNC(strsm)(char *, char *, char *, char *, int *, int *, - float *, float *, int *, float *, int *); -int BLASFUNC(dtrsm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); -int BLASFUNC(qtrsm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); -int BLASFUNC(ctrsm)(char *, char *, char *, char *, int *, int *, - float *, float *, int *, float *, int *); -int BLASFUNC(ztrsm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); -int BLASFUNC(xtrsm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); - -int BLASFUNC(strmm)(char *, char *, char *, char *, int *, int *, - float *, float *, int *, float *, int *); -int BLASFUNC(dtrmm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); -int BLASFUNC(qtrmm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); -int BLASFUNC(ctrmm)(char *, char *, char *, char *, int *, int *, - float *, float *, int *, float *, int *); -int BLASFUNC(ztrmm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); -int BLASFUNC(xtrmm)(char *, char *, char *, char *, int *, int *, - double *, double *, int *, double *, int *); - -int BLASFUNC(ssymm)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(dsymm)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(qsymm)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(csymm)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zsymm)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xsymm)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(csymm3m)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zsymm3m)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xsymm3m)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(ssyrk)(char *, char *, int *, int *, float *, float *, int *, - float *, float *, int *); -int BLASFUNC(dsyrk)(char *, char *, int *, int *, double *, double *, int *, - double *, double *, int *); -int BLASFUNC(qsyrk)(char *, char *, int *, int *, double *, double *, int *, - double *, double *, int *); -int BLASFUNC(csyrk)(char *, char *, int *, int *, float *, float *, int *, - float *, float *, int *); -int BLASFUNC(zsyrk)(char *, char *, int *, int *, double *, double *, int *, - double *, double *, int *); -int BLASFUNC(xsyrk)(char *, char *, int *, int *, double *, double *, int *, - double *, double *, int *); - -int BLASFUNC(ssyr2k)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(dsyr2k)(char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); -int BLASFUNC(qsyr2k)(char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); -int BLASFUNC(csyr2k)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zsyr2k)(char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); -int BLASFUNC(xsyr2k)(char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); - -int BLASFUNC(chemm)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zhemm)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xhemm)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(chemm3m)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zhemm3m)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); -int BLASFUNC(xhemm3m)(char *, char *, int *, int *, double *, double *, int *, - double *, int *, double *, double *, int *); - -int BLASFUNC(cherk)(char *, char *, int *, int *, float *, float *, int *, - float *, float *, int *); -int BLASFUNC(zherk)(char *, char *, int *, int *, double *, double *, int *, - double *, double *, int *); -int BLASFUNC(xherk)(char *, char *, int *, int *, double *, double *, int *, - double *, double *, int *); - -int BLASFUNC(cher2k)(char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zher2k)(char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); -int BLASFUNC(xher2k)(char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); -int BLASFUNC(cher2m)(char *, char *, char *, int *, int *, float *, float *, int *, - float *, int *, float *, float *, int *); -int BLASFUNC(zher2m)(char *, char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); -int BLASFUNC(xher2m)(char *, char *, char *, int *, int *, double *, double *, int *, - double*, int *, double *, double *, int *); - -int BLASFUNC(sgemt)(char *, int *, int *, float *, float *, int *, - float *, int *); -int BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *, - double *, int *); -int BLASFUNC(cgemt)(char *, int *, int *, float *, float *, int *, - float *, int *); -int BLASFUNC(zgemt)(char *, int *, int *, double *, double *, int *, - double *, int *); - -int BLASFUNC(sgema)(char *, char *, int *, int *, float *, - float *, int *, float *, float *, int *, float *, int *); -int BLASFUNC(dgema)(char *, char *, int *, int *, double *, - double *, int *, double*, double *, int *, double*, int *); -int BLASFUNC(cgema)(char *, char *, int *, int *, float *, - float *, int *, float *, float *, int *, float *, int *); -int BLASFUNC(zgema)(char *, char *, int *, int *, double *, - double *, int *, double*, double *, int *, double*, int *); - -int BLASFUNC(sgems)(char *, char *, int *, int *, float *, - float *, int *, float *, float *, int *, float *, int *); -int BLASFUNC(dgems)(char *, char *, int *, int *, double *, - double *, int *, double*, double *, int *, double*, int *); -int BLASFUNC(cgems)(char *, char *, int *, int *, float *, - float *, int *, float *, float *, int *, float *, int *); -int BLASFUNC(zgems)(char *, char *, int *, int *, double *, - double *, int *, double*, double *, int *, double*, int *); - -int BLASFUNC(sgetf2)(int *, int *, float *, int *, int *, int *); -int BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *); -int BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *); -int BLASFUNC(cgetf2)(int *, int *, float *, int *, int *, int *); -int BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *); -int BLASFUNC(xgetf2)(int *, int *, double *, int *, int *, int *); - -int BLASFUNC(sgetrf)(int *, int *, float *, int *, int *, int *); -int BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *); -int BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *); -int BLASFUNC(cgetrf)(int *, int *, float *, int *, int *, int *); -int BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *); -int BLASFUNC(xgetrf)(int *, int *, double *, int *, int *, int *); - -int BLASFUNC(slaswp)(int *, float *, int *, int *, int *, int *, int *); -int BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *); -int BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *); -int BLASFUNC(claswp)(int *, float *, int *, int *, int *, int *, int *); -int BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *); -int BLASFUNC(xlaswp)(int *, double *, int *, int *, int *, int *, int *); - -int BLASFUNC(sgetrs)(char *, int *, int *, float *, int *, int *, float *, int *, int *); -int BLASFUNC(dgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *); -int BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *); -int BLASFUNC(cgetrs)(char *, int *, int *, float *, int *, int *, float *, int *, int *); -int BLASFUNC(zgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *); -int BLASFUNC(xgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *); - -int BLASFUNC(sgesv)(int *, int *, float *, int *, int *, float *, int *, int *); -int BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double*, int *, int *); -int BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double*, int *, int *); -int BLASFUNC(cgesv)(int *, int *, float *, int *, int *, float *, int *, int *); -int BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double*, int *, int *); -int BLASFUNC(xgesv)(int *, int *, double *, int *, int *, double*, int *, int *); - -int BLASFUNC(spotf2)(char *, int *, float *, int *, int *); -int BLASFUNC(dpotf2)(char *, int *, double *, int *, int *); -int BLASFUNC(qpotf2)(char *, int *, double *, int *, int *); -int BLASFUNC(cpotf2)(char *, int *, float *, int *, int *); -int BLASFUNC(zpotf2)(char *, int *, double *, int *, int *); -int BLASFUNC(xpotf2)(char *, int *, double *, int *, int *); - -int BLASFUNC(spotrf)(char *, int *, float *, int *, int *); -int BLASFUNC(dpotrf)(char *, int *, double *, int *, int *); -int BLASFUNC(qpotrf)(char *, int *, double *, int *, int *); -int BLASFUNC(cpotrf)(char *, int *, float *, int *, int *); -int BLASFUNC(zpotrf)(char *, int *, double *, int *, int *); -int BLASFUNC(xpotrf)(char *, int *, double *, int *, int *); - -int BLASFUNC(slauu2)(char *, int *, float *, int *, int *); -int BLASFUNC(dlauu2)(char *, int *, double *, int *, int *); -int BLASFUNC(qlauu2)(char *, int *, double *, int *, int *); -int BLASFUNC(clauu2)(char *, int *, float *, int *, int *); -int BLASFUNC(zlauu2)(char *, int *, double *, int *, int *); -int BLASFUNC(xlauu2)(char *, int *, double *, int *, int *); - -int BLASFUNC(slauum)(char *, int *, float *, int *, int *); -int BLASFUNC(dlauum)(char *, int *, double *, int *, int *); -int BLASFUNC(qlauum)(char *, int *, double *, int *, int *); -int BLASFUNC(clauum)(char *, int *, float *, int *, int *); -int BLASFUNC(zlauum)(char *, int *, double *, int *, int *); -int BLASFUNC(xlauum)(char *, int *, double *, int *, int *); - -int BLASFUNC(strti2)(char *, char *, int *, float *, int *, int *); -int BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *); -int BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *); -int BLASFUNC(ctrti2)(char *, char *, int *, float *, int *, int *); -int BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *); -int BLASFUNC(xtrti2)(char *, char *, int *, double *, int *, int *); - -int BLASFUNC(strtri)(char *, char *, int *, float *, int *, int *); -int BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *); -int BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *); -int BLASFUNC(ctrtri)(char *, char *, int *, float *, int *, int *); -int BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *); -int BLASFUNC(xtrtri)(char *, char *, int *, double *, int *, int *); - -int BLASFUNC(spotri)(char *, int *, float *, int *, int *); -int BLASFUNC(dpotri)(char *, int *, double *, int *, int *); -int BLASFUNC(qpotri)(char *, int *, double *, int *, int *); -int BLASFUNC(cpotri)(char *, int *, float *, int *, int *); -int BLASFUNC(zpotri)(char *, int *, double *, int *, int *); -int BLASFUNC(xpotri)(char *, int *, double *, int *, int *); - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/blas_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/blas_interface.hh deleted file mode 100644 index 65105463..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/blas_interface.hh +++ /dev/null @@ -1,83 +0,0 @@ -//===================================================== -// File : blas_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:28 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef blas_PRODUIT_MATRICE_VECTEUR_HH -#define blas_PRODUIT_MATRICE_VECTEUR_HH - -#include -#include -extern "C" -{ -#include "blas.h" - - // Cholesky Factorization -// void spotrf_(const char* uplo, const int* n, float *a, const int* ld, int* info); -// void dpotrf_(const char* uplo, const int* n, double *a, const int* ld, int* info); - void ssytrd_(char *uplo, const int *n, float *a, const int *lda, float *d, float *e, float *tau, float *work, int *lwork, int *info ); - void dsytrd_(char *uplo, const int *n, double *a, const int *lda, double *d, double *e, double *tau, double *work, int *lwork, int *info ); - void sgehrd_( const int *n, int *ilo, int *ihi, float *a, const int *lda, float *tau, float *work, int *lwork, int *info ); - void dgehrd_( const int *n, int *ilo, int *ihi, double *a, const int *lda, double *tau, double *work, int *lwork, int *info ); - - // LU row pivoting -// void dgetrf_( int *m, int *n, double *a, int *lda, int *ipiv, int *info ); -// void sgetrf_(const int* m, const int* n, float *a, const int* ld, int* ipivot, int* info); - // LU full pivoting - void sgetc2_(const int* n, float *a, const int *lda, int *ipiv, int *jpiv, int*info ); - void dgetc2_(const int* n, double *a, const int *lda, int *ipiv, int *jpiv, int*info ); -#ifdef HAS_LAPACK -#endif -} - -#define MAKE_STRING2(S) #S -#define MAKE_STRING(S) MAKE_STRING2(S) - -#define CAT2(A,B) A##B -#define CAT(A,B) CAT2(A,B) - - -template class blas_interface; - - -static char notrans = 'N'; -static char trans = 'T'; -static char nonunit = 'N'; -static char lower = 'L'; -static char right = 'R'; -static char left = 'L'; -static int intone = 1; - - - -#define SCALAR float -#define SCALAR_PREFIX s -#include "blas_interface_impl.hh" -#undef SCALAR -#undef SCALAR_PREFIX - - -#define SCALAR double -#define SCALAR_PREFIX d -#include "blas_interface_impl.hh" -#undef SCALAR -#undef SCALAR_PREFIX - -#endif - - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/blas_interface_impl.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/blas_interface_impl.hh deleted file mode 100644 index 9e0a6490..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/blas_interface_impl.hh +++ /dev/null @@ -1,147 +0,0 @@ - -#define BLAS_FUNC(NAME) CAT(CAT(SCALAR_PREFIX,NAME),_) - -template<> class blas_interface : public c_interface_base -{ - -public : - - static SCALAR fone; - static SCALAR fzero; - - static inline std::string name() - { - return MAKE_STRING(CBLASNAME); - } - - static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){ - BLAS_FUNC(gemv)(¬rans,&N,&N,&fone,A,&N,B,&intone,&fzero,X,&intone); - } - - static inline void symv(gene_matrix & A, gene_vector & B, gene_vector & X, int N){ - BLAS_FUNC(symv)(&lower, &N,&fone,A,&N,B,&intone,&fzero,X,&intone); - } - - static inline void syr2(gene_matrix & A, gene_vector & B, gene_vector & X, int N){ - BLAS_FUNC(syr2)(&lower,&N,&fone,B,&intone,X,&intone,A,&N); - } - - static inline void ger(gene_matrix & A, gene_vector & X, gene_vector & Y, int N){ - BLAS_FUNC(ger)(&N,&N,&fone,X,&intone,Y,&intone,A,&N); - } - - static inline void rot(gene_vector & A, gene_vector & B, SCALAR c, SCALAR s, int N){ - BLAS_FUNC(rot)(&N,A,&intone,B,&intone,&c,&s); - } - - static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){ - BLAS_FUNC(gemv)(&trans,&N,&N,&fone,A,&N,B,&intone,&fzero,X,&intone); - } - - static inline void matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){ - BLAS_FUNC(gemm)(¬rans,¬rans,&N,&N,&N,&fone,A,&N,B,&N,&fzero,X,&N); - } - - static inline void transposed_matrix_matrix_product(gene_matrix & A, gene_matrix & B, gene_matrix & X, int N){ - BLAS_FUNC(gemm)(¬rans,¬rans,&N,&N,&N,&fone,A,&N,B,&N,&fzero,X,&N); - } - - static inline void ata_product(gene_matrix & A, gene_matrix & X, int N){ - BLAS_FUNC(syrk)(&lower,&trans,&N,&N,&fone,A,&N,&fzero,X,&N); - } - - static inline void aat_product(gene_matrix & A, gene_matrix & X, int N){ - BLAS_FUNC(syrk)(&lower,¬rans,&N,&N,&fone,A,&N,&fzero,X,&N); - } - - static inline void axpy(SCALAR coef, const gene_vector & X, gene_vector & Y, int N){ - BLAS_FUNC(axpy)(&N,&coef,X,&intone,Y,&intone); - } - - static inline void axpby(SCALAR a, const gene_vector & X, SCALAR b, gene_vector & Y, int N){ - BLAS_FUNC(scal)(&N,&b,Y,&intone); - BLAS_FUNC(axpy)(&N,&a,X,&intone,Y,&intone); - } - - static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){ - int N2 = N*N; - BLAS_FUNC(copy)(&N2, X, &intone, C, &intone); - char uplo = 'L'; - int info = 0; - BLAS_FUNC(potrf)(&uplo, &N, C, &N, &info); - if(info!=0) std::cerr << "potrf_ error " << info << "\n"; - } - - static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int N){ - int N2 = N*N; - BLAS_FUNC(copy)(&N2, X, &intone, C, &intone); - int info = 0; - int * ipiv = (int*)alloca(sizeof(int)*N); - BLAS_FUNC(getrf)(&N, &N, C, &N, ipiv, &info); - if(info!=0) std::cerr << "getrf_ error " << info << "\n"; - } - - static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){ - BLAS_FUNC(copy)(&N, B, &intone, X, &intone); - BLAS_FUNC(trsv)(&lower, ¬rans, &nonunit, &N, L, &N, X, &intone); - } - - static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix & X, int N){ - BLAS_FUNC(copy)(&N, B, &intone, X, &intone); - BLAS_FUNC(trsm)(&right, &lower, ¬rans, &nonunit, &N, &N, &fone, L, &N, X, &N); - } - - static inline void trmm(gene_matrix & A, gene_matrix & B, gene_matrix & /*X*/, int N){ - BLAS_FUNC(trmm)(&left, &lower, ¬rans,&nonunit, &N,&N,&fone,A,&N,B,&N); - } - - #ifdef HAS_LAPACK - - static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){ - int N2 = N*N; - BLAS_FUNC(copy)(&N2, X, &intone, C, &intone); - int info = 0; - int * ipiv = (int*)alloca(sizeof(int)*N); - int * jpiv = (int*)alloca(sizeof(int)*N); - BLAS_FUNC(getc2)(&N, C, &N, ipiv, jpiv, &info); - } - - - - static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int N){ - { - int N2 = N*N; - int inc = 1; - BLAS_FUNC(copy)(&N2, X, &inc, C, &inc); - } - int info = 0; - int ilo = 1; - int ihi = N; - int bsize = 64; - int worksize = N*bsize; - SCALAR* d = new SCALAR[N+worksize]; - BLAS_FUNC(gehrd)(&N, &ilo, &ihi, C, &N, d, d+N, &worksize, &info); - delete[] d; - } - - static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){ - { - int N2 = N*N; - int inc = 1; - BLAS_FUNC(copy)(&N2, X, &inc, C, &inc); - } - char uplo = 'U'; - int info = 0; - int bsize = 64; - int worksize = N*bsize; - SCALAR* d = new SCALAR[3*N+worksize]; - BLAS_FUNC(sytrd)(&uplo, &N, C, &N, d, d+N, d+2*N, d+3*N, &worksize, &info); - delete[] d; - } - - #endif // HAS_LAPACK - -}; - -SCALAR blas_interface::fone = SCALAR(1); -SCALAR blas_interface::fzero = SCALAR(0); diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/c_interface_base.h b/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/c_interface_base.h deleted file mode 100644 index de613803..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/BLAS/c_interface_base.h +++ /dev/null @@ -1,73 +0,0 @@ - -#ifndef BTL_C_INTERFACE_BASE_H -#define BTL_C_INTERFACE_BASE_H - -#include "utilities.h" -#include - -template class c_interface_base -{ - -public: - - typedef real real_type; - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef real* gene_matrix; - typedef real* gene_vector; - - static void free_matrix(gene_matrix & A, int /*N*/){ - delete[] A; - } - - static void free_vector(gene_vector & B){ - delete[] B; - } - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - int N = A_stl.size(); - A = new real[N*N]; - for (int j=0;j -// Copyright (C) EDF R&D, lun sep 30 14:23:28 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "blas_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -#include "action_cholesky.hh" -#include "action_lu_decomp.hh" -#include "action_partial_lu.hh" -#include "action_trisolve_matrix.hh" - -#ifdef HAS_LAPACK -#include "action_hessenberg.hh" -#endif - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); - - #ifdef HAS_LAPACK -// bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); - #endif - - //bench > >(MIN_LU,MAX_LU,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/STL/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/STL/CMakeLists.txt deleted file mode 100644 index 4cfc2dcf..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/STL/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ - -btl_add_bench(btl_STL main.cpp OFF) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/STL/STL_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/STL/STL_interface.hh deleted file mode 100644 index 16658c4b..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/STL/STL_interface.hh +++ /dev/null @@ -1,244 +0,0 @@ -//===================================================== -// File : STL_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:24 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef STL_INTERFACE_HH -#define STL_INTERFACE_HH -#include -#include -#include "utilities.h" - -using namespace std; - -template -class STL_interface{ - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef stl_matrix gene_matrix; - - typedef stl_vector gene_vector; - - static inline std::string name( void ) - { - return "STL"; - } - - static void free_matrix(gene_matrix & /*A*/, int /*N*/){} - - static void free_vector(gene_vector & /*B*/){} - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A = A_stl; - } - - static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){ - B = B_stl; - } - - static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){ - B_stl = B ; - } - - - static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){ - A_stl = A ; - } - - static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){ - for (int i=0;i=j) - { - for (int k=0;k > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/CMakeLists.txt deleted file mode 100644 index e99a0855..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ - -find_package(BLAZE) -find_package(Boost COMPONENTS system) -if (BLAZE_FOUND AND Boost_FOUND) - include_directories(${BLAZE_INCLUDE_DIR} ${Boost_INCLUDE_DIRS}) - btl_add_bench(btl_blaze main.cpp) - # Note: The newest blaze version requires C++14. - # Ideally, we should set this depending on the version of Blaze we found - set_property(TARGET btl_blaze PROPERTY CXX_STANDARD 14) - if(BUILD_btl_blaze) - target_link_libraries(btl_blaze ${Boost_LIBRARIES}) - endif() -endif () diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/blaze_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/blaze_interface.hh deleted file mode 100644 index 7b418f6d..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/blaze_interface.hh +++ /dev/null @@ -1,141 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BLAZE_INTERFACE_HH -#define BLAZE_INTERFACE_HH - -#include -#include -#include -// using namespace blaze; - -#include - -template -class blaze_interface { - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef blaze::DynamicMatrix gene_matrix; - typedef blaze::DynamicVector gene_vector; - - static inline std::string name() { return "blaze"; } - - static void free_matrix(gene_matrix & A, int N){ - return ; - } - - static void free_vector(gene_vector & B){ - return ; - } - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(A_stl[0].size(), A_stl.size()); - - for (int j=0; j ipvt(N); -// lu_factor(R, ipvt); -// } - -// static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){ -// X = lower_trisolve(L, B); -// } - - static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){ - cible = source; - } - - static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){ - cible = source; - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/main.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/main.cpp deleted file mode 100644 index ccae0cbd..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blaze/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "blaze_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/CMakeLists.txt deleted file mode 100644 index 880ab733..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -find_package(Blitz) - -if (BLITZ_FOUND) - include_directories(${BLITZ_INCLUDES}) - - btl_add_bench(btl_blitz btl_blitz.cpp) - if (BUILD_btl_blitz) - target_link_libraries(btl_blitz ${BLITZ_LIBRARIES}) - endif (BUILD_btl_blitz) - - btl_add_bench(btl_tiny_blitz btl_tiny_blitz.cpp OFF) - if (BUILD_btl_tiny_blitz) - target_link_libraries(btl_tiny_blitz ${BLITZ_LIBRARIES}) - endif (BUILD_btl_tiny_blitz) - -endif (BLITZ_FOUND) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/blitz_LU_solve_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/blitz_LU_solve_interface.hh deleted file mode 100644 index dcb9f567..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/blitz_LU_solve_interface.hh +++ /dev/null @@ -1,192 +0,0 @@ -//===================================================== -// File : blitz_LU_solve_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:31 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BLITZ_LU_SOLVE_INTERFACE_HH -#define BLITZ_LU_SOLVE_INTERFACE_HH - -#include "blitz/array.h" -#include - -BZ_USING_NAMESPACE(blitz) - -template -class blitz_LU_solve_interface : public blitz_interface -{ - -public : - - typedef typename blitz_interface::gene_matrix gene_matrix; - typedef typename blitz_interface::gene_vector gene_vector; - - typedef blitz::Array Pivot_Vector; - - inline static void new_Pivot_Vector(Pivot_Vector & pivot,int N) - { - - pivot.resize(N); - - } - - inline static void free_Pivot_Vector(Pivot_Vector & pivot) - { - - return; - - } - - - static inline real matrix_vector_product_sliced(const gene_matrix & A, gene_vector B, int row, int col_start, int col_end) - { - - real somme=0.; - - for (int j=col_start ; j=big ) big = abs( LU( i, j ) ) ; - } - if( big==0. ) { - INFOS( "blitz_LU_factor::Singular matrix" ) ; - exit( 0 ) ; - } - ImplicitScaling( i ) = 1./big ; - } - // Loop over columns of Crout's method : - for( int j=0; j=big ) { - dum = ImplicitScaling( i )*abs( theSum ) ; - big = dum ; - index_max = i ; - } - } - // Interchanging rows and the scale factor : - if( j!=index_max ) { - for( int k=0; k=0; i-- ) { - theSum = X( i ) ; - // theSum = B( i ) ; - theSum -= matrix_vector_product_sliced(LU, X, i, i+1, N) ; - // theSum -= sum( LU( i, Range( i+1, toEnd ) )*X( Range( i+1, toEnd ) ) ) ; - // theSum -= sum( LU( i, Range( i+1, toEnd ) )*B( Range( i+1, toEnd ) ) ) ; - // Store a component of the solution vector : - X( i ) = theSum/LU( i, i ) ; - // B( i ) = theSum/LU( i, i ) ; - } - - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/blitz_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/blitz_interface.hh deleted file mode 100644 index a67c47c7..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/blitz_interface.hh +++ /dev/null @@ -1,147 +0,0 @@ -//===================================================== -// File : blitz_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:30 CEST 2002 -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BLITZ_INTERFACE_HH -#define BLITZ_INTERFACE_HH - -#include -#include -#include -#include -#include -#include - -BZ_USING_NAMESPACE(blitz) - -template -class blitz_interface{ - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef blitz::Array gene_matrix; - typedef blitz::Array gene_vector; -// typedef blitz::Matrix gene_matrix; -// typedef blitz::Vector gene_vector; - - static inline std::string name() { return "blitz"; } - - static void free_matrix(gene_matrix & A, int N){} - - static void free_vector(gene_vector & B){} - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(A_stl[0].size(),A_stl.size()); - for (int j=0; j(source); -// for (int i=0;i(source); - cible = source; - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/btl_blitz.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/btl_blitz.cpp deleted file mode 100644 index 16d2b595..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/btl_blitz.cpp +++ /dev/null @@ -1,51 +0,0 @@ -//===================================================== -// File : main.cpp -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:30 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "blitz_interface.hh" -#include "blitz_LU_solve_interface.hh" -#include "bench.hh" -#include "action_matrix_vector_product.hh" -#include "action_matrix_matrix_product.hh" -#include "action_axpy.hh" -#include "action_lu_solve.hh" -#include "action_ata_product.hh" -#include "action_aat_product.hh" -#include "action_atv_product.hh" - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - //bench > >(MIN_LU,MAX_LU,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/btl_tiny_blitz.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/btl_tiny_blitz.cpp deleted file mode 100644 index 9fddde75..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/btl_tiny_blitz.cpp +++ /dev/null @@ -1,38 +0,0 @@ -//===================================================== -// File : main.cpp -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:30 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "tiny_blitz_interface.hh" -#include "static/bench_static.hh" -#include "action_matrix_vector_product.hh" -#include "action_matrix_matrix_product.hh" -#include "action_axpy.hh" - -BTL_MAIN; - -int main() -{ - bench_static(); - bench_static(); - bench_static(); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/tiny_blitz_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/tiny_blitz_interface.hh deleted file mode 100644 index 6b26db72..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/blitz/tiny_blitz_interface.hh +++ /dev/null @@ -1,106 +0,0 @@ -//===================================================== -// File : tiny_blitz_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:30 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef TINY_BLITZ_INTERFACE_HH -#define TINY_BLITZ_INTERFACE_HH - -#include "blitz/array.h" -#include "blitz/tiny.h" -#include "blitz/tinymat.h" -#include "blitz/tinyvec.h" -#include - -#include - -BZ_USING_NAMESPACE(blitz) - -template -class tiny_blitz_interface -{ - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef TinyVector gene_vector; - typedef TinyMatrix gene_matrix; - - static inline std::string name() { return "tiny_blitz"; } - - static void free_matrix(gene_matrix & A, int N){} - - static void free_vector(gene_vector & B){} - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - for (int j=0; j -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen3_interface.hh" -#include "static/bench_static.hh" -#include "action_matrix_vector_product.hh" -#include "action_matrix_matrix_product.hh" -#include "action_axpy.hh" -#include "action_lu_solve.hh" -#include "action_ata_product.hh" -#include "action_aat_product.hh" -#include "action_atv_product.hh" -#include "action_cholesky.hh" -#include "action_trisolve.hh" - -BTL_MAIN; - -int main() -{ - - bench_static(); - bench_static(); - bench_static(); - bench_static(); - bench_static(); - bench_static(); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/eigen2_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/eigen2_interface.hh deleted file mode 100644 index 1deabdae..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/eigen2_interface.hh +++ /dev/null @@ -1,168 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef EIGEN2_INTERFACE_HH -#define EIGEN2_INTERFACE_HH -// #include -#include -#include -#include -#include -#include -#include "btl.hh" - -using namespace Eigen; - -template -class eigen2_interface -{ - -public : - - enum {IsFixedSize = (SIZE!=Dynamic)}; - - typedef real real_type; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef Eigen::Matrix gene_matrix; - typedef Eigen::Matrix gene_vector; - - static inline std::string name( void ) - { - #if defined(EIGEN_VECTORIZE_SSE) - if (SIZE==Dynamic) return "eigen2"; else return "tiny_eigen2"; - #elif defined(EIGEN_VECTORIZE_ALTIVEC) || defined(EIGEN_VECTORIZE_VSX) - if (SIZE==Dynamic) return "eigen2"; else return "tiny_eigen2"; - #else - if (SIZE==Dynamic) return "eigen2_novec"; else return "tiny_eigen2_novec"; - #endif - } - - static void free_matrix(gene_matrix & A, int N) {} - - static void free_vector(gene_vector & B) {} - - static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(A_stl[0].size(), A_stl.size()); - - for (int j=0; j().solveTriangular(B); - } - - static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int N){ - X = L.template marked().solveTriangular(B); - } - - static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){ - C = X.llt().matrixL(); -// C = X; -// Cholesky::computeInPlace(C); -// Cholesky::computeInPlaceBlock(C); - } - - static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int N){ - C = X.lu().matrixLU(); -// C = X.inverse(); - } - - static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){ - C = Tridiagonalization(X).packedMatrix(); - } - - static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int N){ - C = HessenbergDecomposition(X).packedMatrix(); - } - - - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_adv.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_adv.cpp deleted file mode 100644 index fe336892..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_adv.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen2_interface.hh" -#include "bench.hh" -#include "action_trisolve.hh" -#include "action_trisolve_matrix.hh" -#include "action_cholesky.hh" -#include "action_hessenberg.hh" -#include "action_lu_decomp.hh" -// #include "action_partial_lu.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_linear.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_linear.cpp deleted file mode 100644 index c17d16c0..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_linear.cpp +++ /dev/null @@ -1,34 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen2_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_matmat.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_matmat.cpp deleted file mode 100644 index cd9dc9cb..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_matmat.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen2_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_vecmat.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_vecmat.cpp deleted file mode 100644 index 8b66cd2d..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen2/main_vecmat.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen2_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); -// bench > >(MIN_MV,MAX_MV,NB_POINT); -// bench > >(MIN_MV,MAX_MV,NB_POINT); -// bench > >(MIN_MV,MAX_MV,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/CMakeLists.txt deleted file mode 100644 index 00cae23d..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/CMakeLists.txt +++ /dev/null @@ -1,65 +0,0 @@ - - -if((NOT EIGEN3_INCLUDE_DIR) AND Eigen_SOURCE_DIR) - # unless EIGEN3_INCLUDE_DIR is defined, let's use current Eigen version - set(EIGEN3_INCLUDE_DIR ${Eigen_SOURCE_DIR}) - set(EIGEN3_FOUND TRUE) -else() - find_package(Eigen3) -endif() - -if (EIGEN3_FOUND) - - include_directories(${EIGEN3_INCLUDE_DIR}) - btl_add_bench(btl_eigen3_linear main_linear.cpp) - btl_add_bench(btl_eigen3_vecmat main_vecmat.cpp) - btl_add_bench(btl_eigen3_matmat main_matmat.cpp) - btl_add_bench(btl_eigen3_adv main_adv.cpp ) - - btl_add_target_property(btl_eigen3_linear COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=eigen3") - btl_add_target_property(btl_eigen3_vecmat COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=eigen3") - btl_add_target_property(btl_eigen3_matmat COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=eigen3") - btl_add_target_property(btl_eigen3_adv COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=eigen3") - - option(BTL_BENCH_NOGCCVEC "also bench Eigen explicit vec without GCC's auto vec" OFF) - if(CMAKE_COMPILER_IS_GNUCXX AND BTL_BENCH_NOGCCVEC) - btl_add_bench(btl_eigen3_nogccvec_linear main_linear.cpp) - btl_add_bench(btl_eigen3_nogccvec_vecmat main_vecmat.cpp) - btl_add_bench(btl_eigen3_nogccvec_matmat main_matmat.cpp) - btl_add_bench(btl_eigen3_nogccvec_adv main_adv.cpp ) - - btl_add_target_property(btl_eigen3_nogccvec_linear COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec") - btl_add_target_property(btl_eigen3_nogccvec_vecmat COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec") - btl_add_target_property(btl_eigen3_nogccvec_matmat COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec") - btl_add_target_property(btl_eigen3_nogccvec_adv COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=eigen3_nogccvec") - endif() - - - if(NOT BTL_NOVEC) - btl_add_bench(btl_eigen3_novec_linear main_linear.cpp OFF) - btl_add_bench(btl_eigen3_novec_vecmat main_vecmat.cpp OFF) - btl_add_bench(btl_eigen3_novec_matmat main_matmat.cpp OFF) - btl_add_bench(btl_eigen3_novec_adv main_adv.cpp OFF) - btl_add_target_property(btl_eigen3_novec_linear COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec") - btl_add_target_property(btl_eigen3_novec_vecmat COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec") - btl_add_target_property(btl_eigen3_novec_matmat COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec") - btl_add_target_property(btl_eigen3_novec_adv COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_novec") - -# if(BUILD_btl_eigen3_adv) -# target_link_libraries(btl_eigen3_adv ${MKL_LIBRARIES}) -# endif(BUILD_btl_eigen3_adv) - - endif(NOT BTL_NOVEC) - - btl_add_bench(btl_tiny_eigen3 btl_tiny_eigen3.cpp OFF) - - if(NOT BTL_NOVEC) - btl_add_bench(btl_tiny_eigen3_novec btl_tiny_eigen3.cpp OFF) - btl_add_target_property(btl_tiny_eigen3_novec COMPILE_FLAGS "-DBTL_PREFIX=eigen3_tiny") - - if(BUILD_btl_tiny_eigen3_novec) - btl_add_target_property(btl_tiny_eigen3_novec COMPILE_FLAGS "-DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=eigen3_tiny_novec") - endif(BUILD_btl_tiny_eigen3_novec) - endif(NOT BTL_NOVEC) - -endif (EIGEN3_FOUND) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/btl_tiny_eigen3.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/btl_tiny_eigen3.cpp deleted file mode 100644 index d1515be8..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/btl_tiny_eigen3.cpp +++ /dev/null @@ -1,46 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen3_interface.hh" -#include "static/bench_static.hh" -#include "action_matrix_vector_product.hh" -#include "action_matrix_matrix_product.hh" -#include "action_axpy.hh" -#include "action_lu_solve.hh" -#include "action_ata_product.hh" -#include "action_aat_product.hh" -#include "action_atv_product.hh" -#include "action_cholesky.hh" -#include "action_trisolve.hh" - -BTL_MAIN; - -int main() -{ - - bench_static(); - bench_static(); - bench_static(); - bench_static(); - bench_static(); - bench_static(); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/eigen3_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/eigen3_interface.hh deleted file mode 100644 index 2e302d07..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/eigen3_interface.hh +++ /dev/null @@ -1,242 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef EIGEN3_INTERFACE_HH -#define EIGEN3_INTERFACE_HH - -#include -#include -#include "btl.hh" - -using namespace Eigen; - -template -class eigen3_interface -{ - -public : - - enum {IsFixedSize = (SIZE!=Dynamic)}; - - typedef real real_type; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef Eigen::Matrix gene_matrix; - typedef Eigen::Matrix gene_vector; - - static inline std::string name( void ) - { - return EIGEN_MAKESTRING(BTL_PREFIX); - } - - static void free_matrix(gene_matrix & /*A*/, int /*N*/) {} - - static void free_vector(gene_vector & /*B*/) {} - - static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(A_stl[0].size(), A_stl.size()); - - for (unsigned int j=0; j().setZero(); - X.template selfadjointView().rankUpdate(A.transpose()); - } - - static inline void aat_product(const gene_matrix & A, gene_matrix & X, int /*N*/){ - X.template triangularView().setZero(); - X.template selfadjointView().rankUpdate(A); - } - - static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int /*N*/){ - X.noalias() = A*B; - } - - static inline void symv(const gene_matrix & A, const gene_vector & B, gene_vector & X, int /*N*/){ - X.noalias() = (A.template selfadjointView() * B); -// internal::product_selfadjoint_vector(N,A.data(),N, B.data(), 1, X.data(), 1); - } - - template static void triassign(Dest& dst, const Src& src) - { - typedef typename Dest::Scalar Scalar; - typedef typename internal::packet_traits::type Packet; - const int PacketSize = sizeof(Packet)/sizeof(Scalar); - int size = dst.cols(); - for(int j=0; j(j, index, src); - else - dst.template copyPacket(index, j, src); - } - - // do the non-vectorizable part of the assignment - for (int index = alignedEnd; index(N,A.data(),N, X.data(), 1, Y.data(), 1, -1); - for(int j=0; j(c,s)); - } - - static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int /*N*/){ - X.noalias() = (A.transpose()*B); - } - - static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int /*N*/){ - Y += coef * X; - } - - static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int /*N*/){ - Y = a*X + b*Y; - } - - static EIGEN_DONT_INLINE void copy_matrix(const gene_matrix & source, gene_matrix & cible, int /*N*/){ - cible = source; - } - - static EIGEN_DONT_INLINE void copy_vector(const gene_vector & source, gene_vector & cible, int /*N*/){ - cible = source; - } - - static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector& X, int /*N*/){ - X = L.template triangularView().solve(B); - } - - static inline void trisolve_lower_matrix(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int /*N*/){ - X = L.template triangularView().solve(B); - } - - static inline void trmm(const gene_matrix & L, const gene_matrix& B, gene_matrix& X, int /*N*/){ - X.noalias() = L.template triangularView() * B; - } - - static inline void cholesky(const gene_matrix & X, gene_matrix & C, int /*N*/){ - C = X; - internal::llt_inplace::blocked(C); - //C = X.llt().matrixL(); -// C = X; -// Cholesky::computeInPlace(C); -// Cholesky::computeInPlaceBlock(C); - } - - static inline void lu_decomp(const gene_matrix & X, gene_matrix & C, int /*N*/){ - C = X.fullPivLu().matrixLU(); - } - - static inline void partial_lu_decomp(const gene_matrix & X, gene_matrix & C, int N){ - Matrix piv(N); - DenseIndex nb; - C = X; - internal::partial_lu_inplace(C,piv,nb); -// C = X.partialPivLu().matrixLU(); - } - - static inline void tridiagonalization(const gene_matrix & X, gene_matrix & C, int N){ - typename Tridiagonalization::CoeffVectorType aux(N-1); - C = X; - internal::tridiagonalization_inplace(C, aux); - } - - static inline void hessenberg(const gene_matrix & X, gene_matrix & C, int /*N*/){ - C = HessenbergDecomposition(X).packedMatrix(); - } - - - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_adv.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_adv.cpp deleted file mode 100644 index 95865357..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_adv.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen3_interface.hh" -#include "bench.hh" -#include "action_trisolve.hh" -#include "action_trisolve_matrix.hh" -#include "action_cholesky.hh" -#include "action_hessenberg.hh" -#include "action_lu_decomp.hh" -#include "action_partial_lu.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); -// bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); - -// bench > >(MIN_LU,MAX_LU,NB_POINT); - bench > >(MIN_LU,MAX_LU,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_linear.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_linear.cpp deleted file mode 100644 index e8538b7d..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_linear.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen3_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_matmat.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_matmat.cpp deleted file mode 100644 index 052810a1..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_matmat.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen3_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_vecmat.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_vecmat.cpp deleted file mode 100644 index 0dda444c..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/eigen3/main_vecmat.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "eigen3_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/CMakeLists.txt deleted file mode 100644 index bc258624..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ - -find_package(GMM) -if (GMM_FOUND) - include_directories(${GMM_INCLUDES}) - btl_add_bench(btl_gmm main.cpp) -endif (GMM_FOUND) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/gmm_LU_solve_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/gmm_LU_solve_interface.hh deleted file mode 100644 index dcb9f567..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/gmm_LU_solve_interface.hh +++ /dev/null @@ -1,192 +0,0 @@ -//===================================================== -// File : blitz_LU_solve_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:31 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BLITZ_LU_SOLVE_INTERFACE_HH -#define BLITZ_LU_SOLVE_INTERFACE_HH - -#include "blitz/array.h" -#include - -BZ_USING_NAMESPACE(blitz) - -template -class blitz_LU_solve_interface : public blitz_interface -{ - -public : - - typedef typename blitz_interface::gene_matrix gene_matrix; - typedef typename blitz_interface::gene_vector gene_vector; - - typedef blitz::Array Pivot_Vector; - - inline static void new_Pivot_Vector(Pivot_Vector & pivot,int N) - { - - pivot.resize(N); - - } - - inline static void free_Pivot_Vector(Pivot_Vector & pivot) - { - - return; - - } - - - static inline real matrix_vector_product_sliced(const gene_matrix & A, gene_vector B, int row, int col_start, int col_end) - { - - real somme=0.; - - for (int j=col_start ; j=big ) big = abs( LU( i, j ) ) ; - } - if( big==0. ) { - INFOS( "blitz_LU_factor::Singular matrix" ) ; - exit( 0 ) ; - } - ImplicitScaling( i ) = 1./big ; - } - // Loop over columns of Crout's method : - for( int j=0; j=big ) { - dum = ImplicitScaling( i )*abs( theSum ) ; - big = dum ; - index_max = i ; - } - } - // Interchanging rows and the scale factor : - if( j!=index_max ) { - for( int k=0; k=0; i-- ) { - theSum = X( i ) ; - // theSum = B( i ) ; - theSum -= matrix_vector_product_sliced(LU, X, i, i+1, N) ; - // theSum -= sum( LU( i, Range( i+1, toEnd ) )*X( Range( i+1, toEnd ) ) ) ; - // theSum -= sum( LU( i, Range( i+1, toEnd ) )*B( Range( i+1, toEnd ) ) ) ; - // Store a component of the solution vector : - X( i ) = theSum/LU( i, i ) ; - // B( i ) = theSum/LU( i, i ) ; - } - - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/gmm_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/gmm_interface.hh deleted file mode 100644 index 3ea303c1..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/gmm_interface.hh +++ /dev/null @@ -1,144 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef GMM_INTERFACE_HH -#define GMM_INTERFACE_HH - -#include -#include - -using namespace gmm; - -template -class gmm_interface { - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef gmm::dense_matrix gene_matrix; - typedef stl_vector gene_vector; - - static inline std::string name( void ) - { - return "gmm"; - } - - static void free_matrix(gene_matrix & A, int N){ - return ; - } - - static void free_vector(gene_vector & B){ - return ; - } - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(A_stl[0].size(),A_stl.size()); - - for (int j=0; j ipvt(N); - gmm::lu_factor(R, ipvt); - } - - static inline void hessenberg(const gene_matrix & X, gene_matrix & R, int N){ - gmm::copy(X,R); - gmm::Hessenberg_reduction(R,X,false); - } - - static inline void tridiagonalization(const gene_matrix & X, gene_matrix & R, int N){ - gmm::copy(X,R); - gmm::Householder_tridiagonalization(R,X,false); - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/main.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/main.cpp deleted file mode 100644 index 1f0c051e..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/gmm/main.cpp +++ /dev/null @@ -1,51 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "gmm_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" -#include "action_hessenberg.hh" -#include "action_partial_lu.hh" - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - //bench > >(MIN_LU,MAX_LU,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/.kdbgrc.main b/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/.kdbgrc.main deleted file mode 100644 index fed082f7..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/.kdbgrc.main +++ /dev/null @@ -1,12 +0,0 @@ -[General] -DebuggerCmdStr= -DriverName=GDB -FileVersion=1 -OptionsSelected= -ProgramArgs= -TTYLevel=7 -WorkingDirectory= - -[Memory] -ColumnWidths=80,0 -NumExprs=0 diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/CMakeLists.txt deleted file mode 100644 index 14b47a80..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ - -find_package(MTL4) -if (MTL4_FOUND) - include_directories(${MTL4_INCLUDE_DIR}) - btl_add_bench(btl_mtl4 main.cpp) -endif (MTL4_FOUND) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/main.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/main.cpp deleted file mode 100644 index 96fcfb9c..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/main.cpp +++ /dev/null @@ -1,46 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "mtl4_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" -#include "action_cholesky.hh" -// #include "action_lu_decomp.hh" - -BTL_MAIN; - -int main() -{ - - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/mtl4_LU_solve_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/mtl4_LU_solve_interface.hh deleted file mode 100644 index dcb9f567..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/mtl4_LU_solve_interface.hh +++ /dev/null @@ -1,192 +0,0 @@ -//===================================================== -// File : blitz_LU_solve_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:31 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef BLITZ_LU_SOLVE_INTERFACE_HH -#define BLITZ_LU_SOLVE_INTERFACE_HH - -#include "blitz/array.h" -#include - -BZ_USING_NAMESPACE(blitz) - -template -class blitz_LU_solve_interface : public blitz_interface -{ - -public : - - typedef typename blitz_interface::gene_matrix gene_matrix; - typedef typename blitz_interface::gene_vector gene_vector; - - typedef blitz::Array Pivot_Vector; - - inline static void new_Pivot_Vector(Pivot_Vector & pivot,int N) - { - - pivot.resize(N); - - } - - inline static void free_Pivot_Vector(Pivot_Vector & pivot) - { - - return; - - } - - - static inline real matrix_vector_product_sliced(const gene_matrix & A, gene_vector B, int row, int col_start, int col_end) - { - - real somme=0.; - - for (int j=col_start ; j=big ) big = abs( LU( i, j ) ) ; - } - if( big==0. ) { - INFOS( "blitz_LU_factor::Singular matrix" ) ; - exit( 0 ) ; - } - ImplicitScaling( i ) = 1./big ; - } - // Loop over columns of Crout's method : - for( int j=0; j=big ) { - dum = ImplicitScaling( i )*abs( theSum ) ; - big = dum ; - index_max = i ; - } - } - // Interchanging rows and the scale factor : - if( j!=index_max ) { - for( int k=0; k=0; i-- ) { - theSum = X( i ) ; - // theSum = B( i ) ; - theSum -= matrix_vector_product_sliced(LU, X, i, i+1, N) ; - // theSum -= sum( LU( i, Range( i+1, toEnd ) )*X( Range( i+1, toEnd ) ) ) ; - // theSum -= sum( LU( i, Range( i+1, toEnd ) )*B( Range( i+1, toEnd ) ) ) ; - // Store a component of the solution vector : - X( i ) = theSum/LU( i, i ) ; - // B( i ) = theSum/LU( i, i ) ; - } - - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/mtl4_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/mtl4_interface.hh deleted file mode 100644 index 3795ac61..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/mtl4/mtl4_interface.hh +++ /dev/null @@ -1,144 +0,0 @@ -//===================================================== -// Copyright (C) 2008 Gael Guennebaud -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef MTL4_INTERFACE_HH -#define MTL4_INTERFACE_HH - -#include -#include -// #include -#include - -using namespace mtl; - -template -class mtl4_interface { - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef mtl::dense2D > gene_matrix; - typedef mtl::dense_vector gene_vector; - - static inline std::string name() { return "mtl4"; } - - static void free_matrix(gene_matrix & A, int N){ - return ; - } - - static void free_vector(gene_vector & B){ - return ; - } - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.change_dim(A_stl[0].size(), A_stl.size()); - - for (int j=0; j C(N,N); -// C = B; -// X = (A*C); - } - - static inline void transposed_matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N){ - X = (trans(A)*trans(B)); - } - -// static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N){ -// X = (trans(A)*A); -// } - - static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N){ - X = (A*trans(A)); - } - - static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){ - X = (A*B); - } - - static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N){ - X = (trans(A)*B); - } - - static inline void axpy(const real coef, const gene_vector & X, gene_vector & Y, int N){ - Y += coef * X; - } - - static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int N){ - Y = a*X + b*Y; - } - -// static inline void cholesky(const gene_matrix & X, gene_matrix & C, int N){ -// C = X; -// recursive_cholesky(C); -// } - -// static inline void lu_decomp(const gene_matrix & X, gene_matrix & R, int N){ -// R = X; -// std::vector ipvt(N); -// lu_factor(R, ipvt); -// } - - static inline void trisolve_lower(const gene_matrix & L, const gene_vector& B, gene_vector & X, int N){ - X = lower_trisolve(L, B); - } - - static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){ - cible = source; - } - - static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){ - cible = source; - } - -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/CMakeLists.txt deleted file mode 100644 index 09d6d8e4..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ - - -if((NOT TENSOR_INCLUDE_DIR) AND Eigen_SOURCE_DIR) - # unless TENSOR_INCLUDE_DIR is defined, let's use current Eigen version - set(TENSOR_INCLUDE_DIR ${Eigen_SOURCE_DIR}) - set(TENSOR_FOUND TRUE) -else() - find_package(Tensor) -endif() - -if (TENSOR_FOUND) - - include_directories(${TENSOR_INCLUDE_DIR}) - btl_add_bench(btl_tensor_linear main_linear.cpp) - btl_add_bench(btl_tensor_vecmat main_vecmat.cpp) - btl_add_bench(btl_tensor_matmat main_matmat.cpp) - - btl_add_target_property(btl_tensor_linear COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=tensor") - btl_add_target_property(btl_tensor_vecmat COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=tensor") - btl_add_target_property(btl_tensor_matmat COMPILE_FLAGS "-fno-exceptions -DBTL_PREFIX=tensor") - - option(BTL_BENCH_NOGCCVEC "also bench Eigen explicit vec without GCC's auto vec" OFF) - if(CMAKE_COMPILER_IS_GNUCXX AND BTL_BENCH_NOGCCVEC) - btl_add_bench(btl_tensor_nogccvec_linear main_linear.cpp) - btl_add_bench(btl_tensor_nogccvec_vecmat main_vecmat.cpp) - btl_add_bench(btl_tensor_nogccvec_matmat main_matmat.cpp) - - btl_add_target_property(btl_tensor_nogccvec_linear COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=tensor_nogccvec") - btl_add_target_property(btl_tensor_nogccvec_vecmat COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=tensor_nogccvec") - btl_add_target_property(btl_tensor_nogccvec_matmat COMPILE_FLAGS "-fno-exceptions -fno-tree-vectorize -DBTL_PREFIX=tensor_nogccvec") - endif() - - - if(NOT BTL_NOVEC) - btl_add_bench(btl_tensor_novec_linear main_linear.cpp OFF) - btl_add_bench(btl_tensor_novec_vecmat main_vecmat.cpp OFF) - btl_add_bench(btl_tensor_novec_matmat main_matmat.cpp OFF) - btl_add_target_property(btl_tensor_novec_linear COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=tensor_novec") - btl_add_target_property(btl_tensor_novec_vecmat COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=tensor_novec") - btl_add_target_property(btl_tensor_novec_matmat COMPILE_FLAGS "-fno-exceptions -DEIGEN_DONT_VECTORIZE -DBTL_PREFIX=tensor_novec") - - endif(NOT BTL_NOVEC) - -endif (TENSOR_FOUND) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_linear.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_linear.cpp deleted file mode 100644 index e257f1e7..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_linear.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "utilities.h" -#include "tensor_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_matmat.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_matmat.cpp deleted file mode 100644 index 675fcfc6..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_matmat.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//===================================================== -// Copyright (C) 2014 Benoit Steiner -//===================================================== -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -#include "utilities.h" -#include "tensor_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_vecmat.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_vecmat.cpp deleted file mode 100644 index 1af00c81..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/main_vecmat.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//===================================================== -// Copyright (C) 2014 Benoit Steiner -//===================================================== -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -#include "utilities.h" -#include "tensor_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_MV,MAX_MV,NB_POINT); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/tensor_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/tensor_interface.hh deleted file mode 100644 index 97b8e0f0..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tensors/tensor_interface.hh +++ /dev/null @@ -1,105 +0,0 @@ -//===================================================== -// Copyright (C) 2014 Benoit Steiner -//===================================================== -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -#ifndef TENSOR_INTERFACE_HH -#define TENSOR_INTERFACE_HH - -#include -#include -#include "btl.hh" - -using namespace Eigen; - -template -class tensor_interface -{ -public : - typedef real real_type; - typedef typename Eigen::Tensor::Index Index; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef Eigen::Tensor gene_matrix; - typedef Eigen::Tensor gene_vector; - - - static inline std::string name( void ) - { - return EIGEN_MAKESTRING(BTL_PREFIX); - } - - static void free_matrix(gene_matrix & /*A*/, int /*N*/) {} - - static void free_vector(gene_vector & /*B*/) {} - - static BTL_DONT_INLINE void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(Eigen::array(A_stl[0].size(), A_stl.size())); - - for (unsigned int j=0; j(i,j)) = A_stl[j][i]; - } - } - } - - static BTL_DONT_INLINE void vector_from_stl(gene_vector & B, stl_vector & B_stl){ - B.resize(B_stl.size()); - - for (unsigned int i=0; i(i,j)); - } - } - } - - static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int /*N*/){ - typedef typename Eigen::Tensor::DimensionPair DimPair; - const Eigen::array dims(DimPair(1, 0)); - X/*.noalias()*/ = A.contract(B, dims); - } - - static inline void matrix_vector_product(const gene_matrix & A, const gene_vector & B, gene_vector & X, int /*N*/){ - typedef typename Eigen::Tensor::DimensionPair DimPair; - const Eigen::array dims(DimPair(1, 0)); - X/*.noalias()*/ = A.contract(B, dims); - } - - static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int /*N*/){ - Y += X.constant(coef) * X; - } - - static inline void axpby(real a, const gene_vector & X, real b, gene_vector & Y, int /*N*/){ - Y = X.constant(a)*X + Y.constant(b)*Y; - } - - static EIGEN_DONT_INLINE void copy_matrix(const gene_matrix & source, gene_matrix & cible, int /*N*/){ - cible = source; - } - - static EIGEN_DONT_INLINE void copy_vector(const gene_vector & source, gene_vector & cible, int /*N*/){ - cible = source; - } -}; - -#endif diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/CMakeLists.txt b/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/CMakeLists.txt deleted file mode 100644 index 25b565b9..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ - -find_package(Tvmet) -if (TVMET_FOUND) - include_directories(${TVMET_INCLUDE_DIR}) - btl_add_bench(btl_tvmet main.cpp OFF) -endif (TVMET_FOUND) diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/main.cpp b/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/main.cpp deleted file mode 100644 index 633215c4..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//===================================================== -// File : main.cpp -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:30 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "tvmet_interface.hh" -#include "static/bench_static.hh" -#include "action_matrix_vector_product.hh" -#include "action_matrix_matrix_product.hh" -#include "action_atv_product.hh" -#include "action_axpy.hh" - -BTL_MAIN; - -int main() -{ - bench_static(); - bench_static(); - bench_static(); - bench_static(); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/tvmet_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/tvmet_interface.hh deleted file mode 100644 index b441ada2..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/tvmet/tvmet_interface.hh +++ /dev/null @@ -1,104 +0,0 @@ -//===================================================== -// File : tvmet_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:30 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef TVMET_INTERFACE_HH -#define TVMET_INTERFACE_HH - -#include -#include -#include - -#include - -using namespace tvmet; - -template -class tvmet_interface{ - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef Vector gene_vector; - typedef Matrix gene_matrix; - - static inline std::string name() { return "tiny_tvmet"; } - - static void free_matrix(gene_matrix & A, int N){} - - static void free_vector(gene_vector & B){} - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - for (int j=0; j -// Copyright (C) EDF R&D, lun sep 30 14:23:27 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#include "utilities.h" -#include "ublas_interface.hh" -#include "bench.hh" -#include "basic_actions.hh" - -BTL_MAIN; - -int main() -{ - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - bench > >(MIN_AXPY,MAX_AXPY,NB_POINT); - - bench > >(MIN_MV,MAX_MV,NB_POINT); - bench > >(MIN_MV,MAX_MV,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); -// bench > >(MIN_MM,MAX_MM,NB_POINT); - - bench > >(MIN_MM,MAX_MM,NB_POINT); - - return 0; -} - - diff --git a/testbed/nanogui/ext/eigen/bench/btl/libs/ublas/ublas_interface.hh b/testbed/nanogui/ext/eigen/bench/btl/libs/ublas/ublas_interface.hh deleted file mode 100644 index 95cad519..00000000 --- a/testbed/nanogui/ext/eigen/bench/btl/libs/ublas/ublas_interface.hh +++ /dev/null @@ -1,141 +0,0 @@ -//===================================================== -// File : ublas_interface.hh -// Author : L. Plagne -// Copyright (C) EDF R&D, lun sep 30 14:23:27 CEST 2002 -//===================================================== -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program 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 -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -#ifndef UBLAS_INTERFACE_HH -#define UBLAS_INTERFACE_HH - -#include -#include -#include -#include - -using namespace boost::numeric; - -template -class ublas_interface{ - -public : - - typedef real real_type ; - - typedef std::vector stl_vector; - typedef std::vector stl_matrix; - - typedef typename boost::numeric::ublas::matrix gene_matrix; - typedef typename boost::numeric::ublas::vector gene_vector; - - static inline std::string name( void ) { return "ublas"; } - - static void free_matrix(gene_matrix & A, int N) {} - - static void free_vector(gene_vector & B) {} - - static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){ - A.resize(A_stl.size(),A_stl[0].size()); - for (int j=0; j -#include "../Eigen/Core" - -using namespace Eigen; -using namespace std; - -#define DUMP_CPUID(CODE) {\ - int abcd[4]; \ - abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;\ - EIGEN_CPUID(abcd, CODE, 0); \ - std::cout << "The code " << CODE << " gives " \ - << (int*)(abcd[0]) << " " << (int*)(abcd[1]) << " " \ - << (int*)(abcd[2]) << " " << (int*)(abcd[3]) << " " << std::endl; \ - } - -int main() -{ - cout << "Eigen's L1 = " << internal::queryL1CacheSize() << endl; - cout << "Eigen's L2/L3 = " << internal::queryTopLevelCacheSize() << endl; - int l1, l2, l3; - internal::queryCacheSizes(l1, l2, l3); - cout << "Eigen's L1, L2, L3 = " << l1 << " " << l2 << " " << l3 << endl; - - #ifdef EIGEN_CPUID - - int abcd[4]; - int string[8]; - char* string_char = (char*)(string); - - // vendor ID - EIGEN_CPUID(abcd,0x0,0); - string[0] = abcd[1]; - string[1] = abcd[3]; - string[2] = abcd[2]; - string[3] = 0; - cout << endl; - cout << "vendor id = " << string_char << endl; - cout << endl; - int max_funcs = abcd[0]; - - internal::queryCacheSizes_intel_codes(l1, l2, l3); - cout << "Eigen's intel codes L1, L2, L3 = " << l1 << " " << l2 << " " << l3 << endl; - if(max_funcs>=4) - { - internal::queryCacheSizes_intel_direct(l1, l2, l3); - cout << "Eigen's intel direct L1, L2, L3 = " << l1 << " " << l2 << " " << l3 << endl; - } - internal::queryCacheSizes_amd(l1, l2, l3); - cout << "Eigen's amd L1, L2, L3 = " << l1 << " " << l2 << " " << l3 << endl; - cout << endl; - - // dump Intel direct method - if(max_funcs>=4) - { - l1 = l2 = l3 = 0; - int cache_id = 0; - int cache_type = 0; - do { - abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0; - EIGEN_CPUID(abcd,0x4,cache_id); - cache_type = (abcd[0] & 0x0F) >> 0; - int cache_level = (abcd[0] & 0xE0) >> 5; // A[7:5] - int ways = (abcd[1] & 0xFFC00000) >> 22; // B[31:22] - int partitions = (abcd[1] & 0x003FF000) >> 12; // B[21:12] - int line_size = (abcd[1] & 0x00000FFF) >> 0; // B[11:0] - int sets = (abcd[2]); // C[31:0] - int cache_size = (ways+1) * (partitions+1) * (line_size+1) * (sets+1); - - cout << "cache[" << cache_id << "].type = " << cache_type << "\n"; - cout << "cache[" << cache_id << "].level = " << cache_level << "\n"; - cout << "cache[" << cache_id << "].ways = " << ways << "\n"; - cout << "cache[" << cache_id << "].partitions = " << partitions << "\n"; - cout << "cache[" << cache_id << "].line_size = " << line_size << "\n"; - cout << "cache[" << cache_id << "].sets = " << sets << "\n"; - cout << "cache[" << cache_id << "].size = " << cache_size << "\n"; - - cache_id++; - } while(cache_type>0 && cache_id<16); - } - - // dump everything - std::cout << endl <<"Raw dump:" << endl; - for(int i=0; i -#include "BenchTimer.h" -#include -#include -#include -#include -#include -using namespace Eigen; - -std::map > results; -std::vector labels; -std::vector sizes; - -template -EIGEN_DONT_INLINE -void compute_norm_equation(Solver &solver, const MatrixType &A) { - if(A.rows()!=A.cols()) - solver.compute(A.transpose()*A); - else - solver.compute(A); -} - -template -EIGEN_DONT_INLINE -void compute(Solver &solver, const MatrixType &A) { - solver.compute(A); -} - -template -void bench(int id, int rows, int size = Size) -{ - typedef Matrix Mat; - typedef Matrix MatDyn; - typedef Matrix MatSquare; - Mat A(rows,size); - A.setRandom(); - if(rows==size) - A = A*A.adjoint(); - BenchTimer t_llt, t_ldlt, t_lu, t_fplu, t_qr, t_cpqr, t_cod, t_fpqr, t_jsvd, t_bdcsvd; - - int svd_opt = ComputeThinU|ComputeThinV; - - int tries = 5; - int rep = 1000/size; - if(rep==0) rep = 1; -// rep = rep*rep; - - LLT llt(size); - LDLT ldlt(size); - PartialPivLU lu(size); - FullPivLU fplu(size,size); - HouseholderQR qr(A.rows(),A.cols()); - ColPivHouseholderQR cpqr(A.rows(),A.cols()); - CompleteOrthogonalDecomposition cod(A.rows(),A.cols()); - FullPivHouseholderQR fpqr(A.rows(),A.cols()); - JacobiSVD jsvd(A.rows(),A.cols()); - BDCSVD bdcsvd(A.rows(),A.cols()); - - BENCH(t_llt, tries, rep, compute_norm_equation(llt,A)); - BENCH(t_ldlt, tries, rep, compute_norm_equation(ldlt,A)); - BENCH(t_lu, tries, rep, compute_norm_equation(lu,A)); - if(size<=1000) - BENCH(t_fplu, tries, rep, compute_norm_equation(fplu,A)); - BENCH(t_qr, tries, rep, compute(qr,A)); - BENCH(t_cpqr, tries, rep, compute(cpqr,A)); - BENCH(t_cod, tries, rep, compute(cod,A)); - if(size*rows<=10000000) - BENCH(t_fpqr, tries, rep, compute(fpqr,A)); - if(size<500) // JacobiSVD is really too slow for too large matrices - BENCH(t_jsvd, tries, rep, jsvd.compute(A,svd_opt)); -// if(size*rows<=20000000) - BENCH(t_bdcsvd, tries, rep, bdcsvd.compute(A,svd_opt)); - - results["LLT"][id] = t_llt.best(); - results["LDLT"][id] = t_ldlt.best(); - results["PartialPivLU"][id] = t_lu.best(); - results["FullPivLU"][id] = t_fplu.best(); - results["HouseholderQR"][id] = t_qr.best(); - results["ColPivHouseholderQR"][id] = t_cpqr.best(); - results["CompleteOrthogonalDecomposition"][id] = t_cod.best(); - results["FullPivHouseholderQR"][id] = t_fpqr.best(); - results["JacobiSVD"][id] = t_jsvd.best(); - results["BDCSVD"][id] = t_bdcsvd.best(); -} - - -int main() -{ - labels.push_back("LLT"); - labels.push_back("LDLT"); - labels.push_back("PartialPivLU"); - labels.push_back("FullPivLU"); - labels.push_back("HouseholderQR"); - labels.push_back("ColPivHouseholderQR"); - labels.push_back("CompleteOrthogonalDecomposition"); - labels.push_back("FullPivHouseholderQR"); - labels.push_back("JacobiSVD"); - labels.push_back("BDCSVD"); - - for(int i=0; i(k,sizes[k](0),sizes[k](1)); - } - - cout.width(32); - cout << "solver/size"; - cout << " "; - for(int k=0; k=1e6) cout << "-"; - else cout << r(k); - cout << " "; - } - cout << endl; - } - - // HTML output - cout << "" << endl; - cout << "" << endl; - for(int k=0; k" << sizes[k](0) << "x" << sizes[k](1) << ""; - cout << "" << endl; - for(int i=0; i"; - ArrayXf r = (results[labels[i]]*100000.f).floor()/100.f; - for(int k=0; k=1e6) cout << ""; - else - { - cout << ""; - } - } - cout << "" << endl; - } - cout << "
solver/size
" << labels[i] << "-" << r(k); - if(i>0) - cout << " (x" << numext::round(10.f*results[labels[i]](k)/results["LLT"](k))/10.f << ")"; - if(i<4 && sizes[k](0)!=sizes[k](1)) - cout << " *"; - cout << "
" << endl; - -// cout << "LLT (ms) " << (results["LLT"]*1000.).format(fmt) << "\n"; -// cout << "LDLT (%) " << (results["LDLT"]/results["LLT"]).format(fmt) << "\n"; -// cout << "PartialPivLU (%) " << (results["PartialPivLU"]/results["LLT"]).format(fmt) << "\n"; -// cout << "FullPivLU (%) " << (results["FullPivLU"]/results["LLT"]).format(fmt) << "\n"; -// cout << "HouseholderQR (%) " << (results["HouseholderQR"]/results["LLT"]).format(fmt) << "\n"; -// cout << "ColPivHouseholderQR (%) " << (results["ColPivHouseholderQR"]/results["LLT"]).format(fmt) << "\n"; -// cout << "CompleteOrthogonalDecomposition (%) " << (results["CompleteOrthogonalDecomposition"]/results["LLT"]).format(fmt) << "\n"; -// cout << "FullPivHouseholderQR (%) " << (results["FullPivHouseholderQR"]/results["LLT"]).format(fmt) << "\n"; -// cout << "JacobiSVD (%) " << (results["JacobiSVD"]/results["LLT"]).format(fmt) << "\n"; -// cout << "BDCSVD (%) " << (results["BDCSVD"]/results["LLT"]).format(fmt) << "\n"; -} diff --git a/testbed/nanogui/ext/eigen/bench/eig33.cpp b/testbed/nanogui/ext/eigen/bench/eig33.cpp deleted file mode 100644 index 47947a9b..00000000 --- a/testbed/nanogui/ext/eigen/bench/eig33.cpp +++ /dev/null @@ -1,195 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// The computeRoots function included in this is based on materials -// covered by the following copyright and license: -// -// Geometric Tools, LLC -// Copyright (c) 1998-2010 -// Distributed under the Boost Software License, Version 1.0. -// -// Permission is hereby granted, free of charge, to any person or organization -// obtaining a copy of the software and accompanying documentation covered by -// this license (the "Software") to use, reproduce, display, distribute, -// execute, and transmit the Software, and to prepare derivative works of the -// Software, and to permit third-parties to whom the Software is furnished to -// do so, all subject to the following: -// -// The copyright notices in the Software and this entire statement, including -// the above license grant, this restriction and the following disclaimer, -// must be included in all copies of the Software, in whole or in part, and -// all derivative works of the Software, unless such copies or derivative -// works are solely in the form of machine-executable object code generated by -// a source language processor. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -#include -#include -#include -#include -#include - -using namespace Eigen; -using namespace std; - -template -inline void computeRoots(const Matrix& m, Roots& roots) -{ - typedef typename Matrix::Scalar Scalar; - const Scalar s_inv3 = 1.0/3.0; - const Scalar s_sqrt3 = std::sqrt(Scalar(3.0)); - - // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0. The - // eigenvalues are the roots to this equation, all guaranteed to be - // real-valued, because the matrix is symmetric. - Scalar c0 = m(0,0)*m(1,1)*m(2,2) + Scalar(2)*m(0,1)*m(0,2)*m(1,2) - m(0,0)*m(1,2)*m(1,2) - m(1,1)*m(0,2)*m(0,2) - m(2,2)*m(0,1)*m(0,1); - Scalar c1 = m(0,0)*m(1,1) - m(0,1)*m(0,1) + m(0,0)*m(2,2) - m(0,2)*m(0,2) + m(1,1)*m(2,2) - m(1,2)*m(1,2); - Scalar c2 = m(0,0) + m(1,1) + m(2,2); - - // Construct the parameters used in classifying the roots of the equation - // and in solving the equation for the roots in closed form. - Scalar c2_over_3 = c2*s_inv3; - Scalar a_over_3 = (c1 - c2*c2_over_3)*s_inv3; - if (a_over_3 > Scalar(0)) - a_over_3 = Scalar(0); - - Scalar half_b = Scalar(0.5)*(c0 + c2_over_3*(Scalar(2)*c2_over_3*c2_over_3 - c1)); - - Scalar q = half_b*half_b + a_over_3*a_over_3*a_over_3; - if (q > Scalar(0)) - q = Scalar(0); - - // Compute the eigenvalues by solving for the roots of the polynomial. - Scalar rho = std::sqrt(-a_over_3); - Scalar theta = std::atan2(std::sqrt(-q),half_b)*s_inv3; - Scalar cos_theta = std::cos(theta); - Scalar sin_theta = std::sin(theta); - roots(2) = c2_over_3 + Scalar(2)*rho*cos_theta; - roots(0) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta); - roots(1) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta); -} - -template -void eigen33(const Matrix& mat, Matrix& evecs, Vector& evals) -{ - typedef typename Matrix::Scalar Scalar; - // Scale the matrix so its entries are in [-1,1]. The scaling is applied - // only when at least one matrix entry has magnitude larger than 1. - - Scalar shift = mat.trace()/3; - Matrix scaledMat = mat; - scaledMat.diagonal().array() -= shift; - Scalar scale = scaledMat.cwiseAbs()/*.template triangularView()*/.maxCoeff(); - scale = std::max(scale,Scalar(1)); - scaledMat/=scale; - - // Compute the eigenvalues -// scaledMat.setZero(); - computeRoots(scaledMat,evals); - - // compute the eigen vectors - // **here we assume 3 differents eigenvalues** - - // "optimized version" which appears to be slower with gcc! -// Vector base; -// Scalar alpha, beta; -// base << scaledMat(1,0) * scaledMat(2,1), -// scaledMat(1,0) * scaledMat(2,0), -// -scaledMat(1,0) * scaledMat(1,0); -// for(int k=0; k<2; ++k) -// { -// alpha = scaledMat(0,0) - evals(k); -// beta = scaledMat(1,1) - evals(k); -// evecs.col(k) = (base + Vector(-beta*scaledMat(2,0), -alpha*scaledMat(2,1), alpha*beta)).normalized(); -// } -// evecs.col(2) = evecs.col(0).cross(evecs.col(1)).normalized(); - -// // naive version -// Matrix tmp; -// tmp = scaledMat; -// tmp.diagonal().array() -= evals(0); -// evecs.col(0) = tmp.row(0).cross(tmp.row(1)).normalized(); -// -// tmp = scaledMat; -// tmp.diagonal().array() -= evals(1); -// evecs.col(1) = tmp.row(0).cross(tmp.row(1)).normalized(); -// -// tmp = scaledMat; -// tmp.diagonal().array() -= evals(2); -// evecs.col(2) = tmp.row(0).cross(tmp.row(1)).normalized(); - - // a more stable version: - if((evals(2)-evals(0))<=Eigen::NumTraits::epsilon()) - { - evecs.setIdentity(); - } - else - { - Matrix tmp; - tmp = scaledMat; - tmp.diagonal ().array () -= evals (2); - evecs.col (2) = tmp.row (0).cross (tmp.row (1)).normalized (); - - tmp = scaledMat; - tmp.diagonal ().array () -= evals (1); - evecs.col(1) = tmp.row (0).cross(tmp.row (1)); - Scalar n1 = evecs.col(1).norm(); - if(n1<=Eigen::NumTraits::epsilon()) - evecs.col(1) = evecs.col(2).unitOrthogonal(); - else - evecs.col(1) /= n1; - - // make sure that evecs[1] is orthogonal to evecs[2] - evecs.col(1) = evecs.col(2).cross(evecs.col(1).cross(evecs.col(2))).normalized(); - evecs.col(0) = evecs.col(2).cross(evecs.col(1)); - } - - // Rescale back to the original size. - evals *= scale; - evals.array()+=shift; -} - -int main() -{ - BenchTimer t; - int tries = 10; - int rep = 400000; - typedef Matrix3d Mat; - typedef Vector3d Vec; - Mat A = Mat::Random(3,3); - A = A.adjoint() * A; -// Mat Q = A.householderQr().householderQ(); -// A = Q * Vec(2.2424567,2.2424566,7.454353).asDiagonal() * Q.transpose(); - - SelfAdjointEigenSolver eig(A); - BENCH(t, tries, rep, eig.compute(A)); - std::cout << "Eigen iterative: " << t.best() << "s\n"; - - BENCH(t, tries, rep, eig.computeDirect(A)); - std::cout << "Eigen direct : " << t.best() << "s\n"; - - Mat evecs; - Vec evals; - BENCH(t, tries, rep, eigen33(A,evecs,evals)); - std::cout << "Direct: " << t.best() << "s\n\n"; - -// std::cerr << "Eigenvalue/eigenvector diffs:\n"; -// std::cerr << (evals - eig.eigenvalues()).transpose() << "\n"; -// for(int k=0;k<3;++k) -// if(evecs.col(k).dot(eig.eigenvectors().col(k))<0) -// evecs.col(k) = -evecs.col(k); -// std::cerr << evecs - eig.eigenvectors() << "\n\n"; -} diff --git a/testbed/nanogui/ext/eigen/bench/geometry.cpp b/testbed/nanogui/ext/eigen/bench/geometry.cpp deleted file mode 100644 index b187a515..00000000 --- a/testbed/nanogui/ext/eigen/bench/geometry.cpp +++ /dev/null @@ -1,126 +0,0 @@ - -#include -#include -#include - -using namespace std; -using namespace Eigen; - -#ifndef SCALAR -#define SCALAR float -#endif - -#ifndef SIZE -#define SIZE 8 -#endif - -typedef SCALAR Scalar; -typedef NumTraits::Real RealScalar; -typedef Matrix A; -typedef Matrix B; -typedef Matrix C; -typedef Matrix M; - -template -EIGEN_DONT_INLINE void transform(const Transformation& t, Data& data) -{ - EIGEN_ASM_COMMENT("begin"); - data = t * data; - EIGEN_ASM_COMMENT("end"); -} - -template -EIGEN_DONT_INLINE void transform(const Quaternion& t, Data& data) -{ - EIGEN_ASM_COMMENT("begin quat"); - for(int i=0;i struct ToRotationMatrixWrapper -{ - enum {Dim = T::Dim}; - typedef typename T::Scalar Scalar; - ToRotationMatrixWrapper(const T& o) : object(o) {} - T object; -}; - -template -EIGEN_DONT_INLINE void transform(const ToRotationMatrixWrapper& t, Data& data) -{ - EIGEN_ASM_COMMENT("begin quat via mat"); - data = t.object.toRotationMatrix() * data; - EIGEN_ASM_COMMENT("end quat via mat"); -} - -template -EIGEN_DONT_INLINE void transform(const Transform& t, Data& data) -{ - data = (t * data.colwise().homogeneous()).template block(0,0); -} - -template struct get_dim { enum { Dim = T::Dim }; }; -template -struct get_dim > { enum { Dim = R }; }; - -template -struct bench_impl -{ - static EIGEN_DONT_INLINE void run(const Transformation& t) - { - Matrix::Dim,N> data; - data.setRandom(); - bench_impl::run(t); - BenchTimer timer; - BENCH(timer,10,100000,transform(t,data)); - cout.width(9); - cout << timer.best() << " "; - } -}; - - -template -struct bench_impl -{ - static EIGEN_DONT_INLINE void run(const Transformation&) {} -}; - -template -EIGEN_DONT_INLINE void bench(const std::string& msg, const Transformation& t) -{ - cout << msg << " "; - bench_impl::run(t); - std::cout << "\n"; -} - -int main(int argc, char ** argv) -{ - Matrix mat34; mat34.setRandom(); - Transform iso3(mat34); - Transform aff3(mat34); - Transform caff3(mat34); - Transform proj3(mat34); - Quaternion quat;quat.setIdentity(); - ToRotationMatrixWrapper > quatmat(quat); - Matrix mat33; mat33.setRandom(); - - cout.precision(4); - std::cout - << "N "; - for(int i=0;i -#include -#include -#include -#include "eigen_src/Eigen/Core" -#include "../BenchTimer.h" -using namespace Eigen; - -#ifndef SCALAR -#error SCALAR must be defined -#endif - -typedef SCALAR Scalar; - -typedef Matrix Mat; - -template -EIGEN_DONT_INLINE -double bench(long m, long n, long k, const Func& f) -{ - Mat A(m,k); - Mat B(k,n); - Mat C(m,n); - A.setRandom(); - B.setRandom(); - C.setZero(); - - BenchTimer t; - - double up = 1e8*4/sizeof(Scalar); - double tm0 = 4, tm1 = 10; - if(NumTraits::IsComplex) - { - up /= 4; - tm0 = 2; - tm1 = 4; - } - - double flops = 2. * m * n * k; - long rep = std::max(1., std::min(100., up/flops) ); - long tries = std::max(tm0, std::min(tm1, up/flops) ); - - BENCH(t, tries, rep, f(A,B,C)); - - return 1e-9 * rep * flops / t.best(); -} - -template -int main_gemm(int argc, char **argv, const Func& f) -{ - std::vector results; - - std::string filename = std::string("gemm_settings.txt"); - if(argc>1) - filename = std::string(argv[1]); - std::ifstream settings(filename); - long m, n, k; - while(settings >> m >> n >> k) - { - //std::cerr << " Testing " << m << " " << n << " " << k << std::endl; - results.push_back( bench(m, n, k, f) ); - } - - std::cout << RowVectorXd::Map(results.data(), results.size()); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemm_settings.txt b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemm_settings.txt deleted file mode 100644 index 5c43e1c7..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemm_settings.txt +++ /dev/null @@ -1,15 +0,0 @@ -8 8 8 -9 9 9 -24 24 24 -239 239 239 -240 240 240 -2400 24 24 -24 2400 24 -24 24 2400 -24 2400 2400 -2400 24 2400 -2400 2400 24 -2400 2400 64 -4800 23 160 -23 4800 160 -2400 2400 2400 diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemm_square_settings.txt b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemm_square_settings.txt deleted file mode 100644 index 98474d17..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemm_square_settings.txt +++ /dev/null @@ -1,11 +0,0 @@ -8 8 8 -9 9 9 -12 12 12 -15 15 15 -16 16 16 -24 24 24 -102 102 102 -239 239 239 -240 240 240 -2400 2400 2400 -2463 2463 2463 diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv.cpp b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv.cpp deleted file mode 100644 index 82e5ab96..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "gemv_common.h" - -EIGEN_DONT_INLINE -void gemv(const Mat &A, const Vec &B, Vec &C) -{ - C.noalias() += A * B; -} - -int main(int argc, char **argv) -{ - return main_gemv(argc, argv, gemv); -} diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_common.h b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_common.h deleted file mode 100644 index cc325772..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_common.h +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include -#include -#include -#include "eigen_src/Eigen/Core" -#include "../BenchTimer.h" -using namespace Eigen; - -#ifndef SCALAR -#error SCALAR must be defined -#endif - -typedef SCALAR Scalar; - -typedef Matrix Mat; -typedef Matrix Vec; - -template -EIGEN_DONT_INLINE -double bench(long m, long n, Func &f) -{ - Mat A(m,n); - Vec B(n); - Vec C(m); - A.setRandom(); - B.setRandom(); - C.setRandom(); - - BenchTimer t; - - double up = 1e8/sizeof(Scalar); - double tm0 = 4, tm1 = 10; - if(NumTraits::IsComplex) - { - up /= 4; - tm0 = 2; - tm1 = 4; - } - - double flops = 2. * m * n; - long rep = std::max(1., std::min(100., up/flops) ); - long tries = std::max(tm0, std::min(tm1, up/flops) ); - - BENCH(t, tries, rep, f(A,B,C)); - - return 1e-9 * rep * flops / t.best(); -} - -template -int main_gemv(int argc, char **argv, Func& f) -{ - std::vector results; - - std::string filename = std::string("gemv_settings.txt"); - if(argc>1) - filename = std::string(argv[1]); - std::ifstream settings(filename); - long m, n; - while(settings >> m >> n) - { - //std::cerr << " Testing " << m << " " << n << std::endl; - results.push_back( bench(m, n, f) ); - } - - std::cout << RowVectorXd::Map(results.data(), results.size()); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_settings.txt b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_settings.txt deleted file mode 100644 index 21a5ee05..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_settings.txt +++ /dev/null @@ -1,11 +0,0 @@ -8 8 -9 9 -24 24 -239 239 -240 240 -2400 24 -24 2400 -24 240 -2400 2400 -4800 23 -23 4800 diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_square_settings.txt b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_square_settings.txt deleted file mode 100644 index 5165759f..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemv_square_settings.txt +++ /dev/null @@ -1,13 +0,0 @@ -8 8 -9 9 -12 12 -15 15 -16 16 -24 24 -53 53 -74 74 -102 102 -239 239 -240 240 -2400 2400 -2463 2463 diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemvt.cpp b/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemvt.cpp deleted file mode 100644 index fe945767..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/gemvt.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "gemv_common.h" - -EIGEN_DONT_INLINE -void gemv(const Mat &A, Vec &B, const Vec &C) -{ - B.noalias() += A.transpose() * C; -} - -int main(int argc, char **argv) -{ - return main_gemv(argc, argv, gemv); -} diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/lazy_gemm.cpp b/testbed/nanogui/ext/eigen/bench/perf_monitoring/lazy_gemm.cpp deleted file mode 100644 index 77330604..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/lazy_gemm.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -#include -#include "../../BenchTimer.h" -using namespace Eigen; - -#ifndef SCALAR -#error SCALAR must be defined -#endif - -typedef SCALAR Scalar; - -template -EIGEN_DONT_INLINE -void lazy_gemm(const MatA &A, const MatB &B, MatC &C) -{ -// escape((void*)A.data()); -// escape((void*)B.data()); - C.noalias() += A.lazyProduct(B); -// escape((void*)C.data()); -} - -template -EIGEN_DONT_INLINE -double bench() -{ - typedef Matrix MatA; - typedef Matrix MatB; - typedef Matrix MatC; - - MatA A(m,k); - MatB B(k,n); - MatC C(m,n); - A.setRandom(); - B.setRandom(); - C.setZero(); - - BenchTimer t; - - double up = 1e7*4/sizeof(Scalar); - double tm0 = 10, tm1 = 20; - - double flops = 2. * m * n * k; - long rep = std::max(10., std::min(10000., up/flops) ); - long tries = std::max(tm0, std::min(tm1, up/flops) ); - - BENCH(t, tries, rep, lazy_gemm(A,B,C)); - - return 1e-9 * rep * flops / t.best(); -} - -template -double bench_t(int t) -{ - if(t) - return bench(); - else - return bench(); -} - -EIGEN_DONT_INLINE -double bench_mnk(int m, int n, int k, int t) -{ - int id = m*10000 + n*100 + k; - switch(id) { - case 10101 : return bench_t< 1, 1, 1>(t); break; - case 20202 : return bench_t< 2, 2, 2>(t); break; - case 30303 : return bench_t< 3, 3, 3>(t); break; - case 40404 : return bench_t< 4, 4, 4>(t); break; - case 50505 : return bench_t< 5, 5, 5>(t); break; - case 60606 : return bench_t< 6, 6, 6>(t); break; - case 70707 : return bench_t< 7, 7, 7>(t); break; - case 80808 : return bench_t< 8, 8, 8>(t); break; - case 90909 : return bench_t< 9, 9, 9>(t); break; - case 101010 : return bench_t<10,10,10>(t); break; - case 111111 : return bench_t<11,11,11>(t); break; - case 121212 : return bench_t<12,12,12>(t); break; - } - return 0; -} - -int main(int argc, char **argv) -{ - std::vector results; - - std::string filename = std::string("lazy_gemm_settings.txt"); - if(argc>1) - filename = std::string(argv[1]); - std::ifstream settings(filename); - long m, n, k, t; - while(settings >> m >> n >> k >> t) - { - //std::cerr << " Testing " << m << " " << n << " " << k << std::endl; - results.push_back( bench_mnk(m, n, k, t) ); - } - - std::cout << RowVectorXd::Map(results.data(), results.size()); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/lazy_gemm_settings.txt b/testbed/nanogui/ext/eigen/bench/perf_monitoring/lazy_gemm_settings.txt deleted file mode 100644 index 407d5d4f..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/lazy_gemm_settings.txt +++ /dev/null @@ -1,15 +0,0 @@ -1 1 1 0 -2 2 2 0 -3 3 3 0 -4 4 4 0 -4 4 4 1 -5 5 5 0 -6 6 6 0 -7 7 7 0 -7 7 7 1 -8 8 8 0 -9 9 9 0 -10 10 10 0 -11 11 11 0 -12 12 12 0 -12 12 12 1 diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/llt.cpp b/testbed/nanogui/ext/eigen/bench/perf_monitoring/llt.cpp deleted file mode 100644 index d55b7d80..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/llt.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "gemm_common.h" -#include - -EIGEN_DONT_INLINE -void llt(const Mat &A, const Mat &B, Mat &C) -{ - C = A; - C.diagonal().array() += 1000; - Eigen::internal::llt_inplace::blocked(C); -} - -int main(int argc, char **argv) -{ - return main_gemm(argc, argv, llt); -} diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/make_plot.sh b/testbed/nanogui/ext/eigen/bench/perf_monitoring/make_plot.sh deleted file mode 100644 index ca9fa966..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/make_plot.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -# base name of the bench -# it reads $1.out -# and generates $1.pdf -WHAT=$1 -bench=$2 -settings_file=$3 - -header="rev " -while read line -do - if [ ! -z '$line' ]; then - header="$header \"$line\"" - fi -done < $settings_file - -echo $header > $WHAT.out.header -cat $WHAT.out >> $WHAT.out.header - - -echo "set title '$WHAT'" > $WHAT.gnuplot -echo "set key autotitle columnhead outside " >> $WHAT.gnuplot -echo "set xtics rotate 1" >> $WHAT.gnuplot - -echo "set term pdf color rounded enhanced fontscale 0.35 size 7in,5in" >> $WHAT.gnuplot -echo set output "'"$WHAT.pdf"'" >> $WHAT.gnuplot - -col=`cat $settings_file | wc -l` -echo "plot for [col=2:$col+1] '$WHAT.out.header' using 0:col:xticlabels(1) with lines" >> $WHAT.gnuplot -echo " " >> $WHAT.gnuplot - -gnuplot -persist < $WHAT.gnuplot - -# generate a png file (thumbnail) -convert -colors 256 -background white -density 300 -resize 300 -quality 0 $WHAT.pdf -background white -flatten $WHAT.png - -# clean -rm $WHAT.out.header $WHAT.gnuplot - - -# generate html/svg graph - -echo " " > $WHAT.html -cat resources/chart_header.html > $WHAT.html -echo 'var customSettings = {"TITLE":"","SUBTITLE":"","XLABEL":"","YLABEL":""};' >> $WHAT.html -# 'data' is an array of datasets (i.e. curves), each of which is an object of the form -# { -# key: , -# color: , -# values: [{ -# r: , -# v: -# }] -# } -echo 'var data = [' >> $WHAT.html - -col=2 -while read line -do - if [ ! -z '$line' ]; then - header="$header \"$line\"" - echo '{"key":"'$line'","values":[' >> $WHAT.html - i=0 - while read line2 - do - if [ ! -z '$line2' ]; then - echo '{"r":'$i',"v":'`echo $line2 | cut -f $col -d ' '`'},' >> $WHAT.html - fi - ((i++)) - done < $WHAT.out - echo ']},' >> $WHAT.html - fi - ((col++)) -done < $settings_file -echo '];' >> $WHAT.html - -echo 'var changesets = [' >> $WHAT.html -while read line2 -do - if [ ! -z '$line2' ]; then - echo '"'`echo $line2 | cut -f 1 -d ' '`'",' >> $WHAT.html - fi -done < $WHAT.out -echo '];' >> $WHAT.html - -echo 'var changesets_count = [' >> $WHAT.html -i=0 -while read line2 -do - if [ ! -z '$line2' ]; then - echo $i ',' >> $WHAT.html - fi - ((i++)) -done < $WHAT.out -echo '];' >> $WHAT.html - -cat resources/chart_footer.html >> $WHAT.html diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/resources/chart_footer.html b/testbed/nanogui/ext/eigen/bench/perf_monitoring/resources/chart_footer.html deleted file mode 100644 index 8acc69f1..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/resources/chart_footer.html +++ /dev/null @@ -1,37 +0,0 @@ - /* setup the chart and its options */ - var chart = nv.models.lineChart() - .color(d3.scale.category10().range()) - .margin({left: 75, bottom: 100}) - .forceX([0]).forceY([0]); - - chart.x(function(datum){ return datum.r; }) - .xAxis.options({ - axisLabel: customSettings.XLABEL || 'Changeset', - tickFormat: d3.format('.0f') - }); - chart.xAxis - .tickValues(changesets_count) - .tickFormat(function(d){return changesets[d]}) - .rotateLabels(-90); - - chart.y(function(datum){ return datum.v; }) - .yAxis.options({ - axisLabel: customSettings.YLABEL || 'GFlops'/*, - tickFormat: function(val){ return d3.format('.0f')(val) + ' GFlops'; }*/ - }); - - //chart.useInteractiveGuideline(true); - d3.select('#chart').datum(data).call(chart); - var plot = d3.select('#chart > g'); - - /* setup the title */ - plot.append('text') - .style('font-size', '24px') - .attr('text-anchor', 'middle').attr('x', '50%').attr('y', '20px') - .text(customSettings.TITLE || ''); - - /* ensure the chart is responsive */ - nv.utils.windowResize(chart.update); - - - \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/bench/perf_monitoring/resources/chart_header.html b/testbed/nanogui/ext/eigen/bench/perf_monitoring/resources/chart_header.html deleted file mode 100644 index bb9ddffd..00000000 --- a/testbed/nanogui/ext/eigen/bench/perf_monitoring/resources/chart_header.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/testbed/nanogui/ext/eigen/doc/eigendoxy_header.html.in b/testbed/nanogui/ext/eigen/doc/eigendoxy_header.html.in deleted file mode 100644 index 0f3859f4..00000000 --- a/testbed/nanogui/ext/eigen/doc/eigendoxy_header.html.in +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - -$projectname: $title -$title - - - -$treeview -$search -$mathjax - - - - - - - - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - -
-
$projectname -  $projectnumber -
-
$projectbrief
-
-
$projectbrief
-
$searchbox
-
- - - diff --git a/testbed/nanogui/ext/eigen/doc/eigendoxy_layout.xml.in b/testbed/nanogui/ext/eigen/doc/eigendoxy_layout.xml.in deleted file mode 100644 index c14b621e..00000000 --- a/testbed/nanogui/ext/eigen/doc/eigendoxy_layout.xml.in +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/testbed/nanogui/ext/eigen/doc/eigendoxy_tabs.css b/testbed/nanogui/ext/eigen/doc/eigendoxy_tabs.css deleted file mode 100644 index 21920562..00000000 --- a/testbed/nanogui/ext/eigen/doc/eigendoxy_tabs.css +++ /dev/null @@ -1,59 +0,0 @@ -.tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); - width: 100%; - z-index: 101; - font-size: 13px; -} - -.tabs2 { - font-size: 10px; -} -.tabs3 { - font-size: 9px; -} - -.tablist { - margin: 0; - padding: 0; - display: table; -} - -.tablist li { - float: left; - display: table-cell; - background-image: url('tab_b.png'); - line-height: 36px; - list-style: none; -} - -.tablist a { - display: block; - padding: 0 20px; - font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #283A5D; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; - outline: none; -} - -.tabs3 .tablist a { - padding: 0 10px; -} - -.tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; -} - -.tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/.krazy b/testbed/nanogui/ext/eigen/doc/examples/.krazy deleted file mode 100644 index 00b99405..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/.krazy +++ /dev/null @@ -1,2 +0,0 @@ -EXCLUDE copyright -EXCLUDE license diff --git a/testbed/nanogui/ext/eigen/doc/examples/CMakeLists.txt b/testbed/nanogui/ext/eigen/doc/examples/CMakeLists.txt deleted file mode 100644 index f7a19055..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -file(GLOB examples_SRCS "*.cpp") - -foreach(example_src ${examples_SRCS}) - get_filename_component(example ${example_src} NAME_WE) - add_executable(${example} ${example_src}) - if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) - target_link_libraries(${example} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) - endif() - add_custom_command( - TARGET ${example} - POST_BUILD - COMMAND ${example} - ARGS >${CMAKE_CURRENT_BINARY_DIR}/${example}.out - ) - add_dependencies(all_examples ${example}) -endforeach(example_src) - -check_cxx_compiler_flag("-std=c++11" EIGEN_COMPILER_SUPPORT_CPP11) -if(EIGEN_COMPILER_SUPPORT_CPP11) -ei_add_target_property(nullary_indexing COMPILE_FLAGS "-std=c++11") -endif() \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/examples/CustomizingEigen_Inheritance.cpp b/testbed/nanogui/ext/eigen/doc/examples/CustomizingEigen_Inheritance.cpp deleted file mode 100644 index 48df64ee..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/CustomizingEigen_Inheritance.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include - -class MyVectorType : public Eigen::VectorXd -{ -public: - MyVectorType(void):Eigen::VectorXd() {} - - // This constructor allows you to construct MyVectorType from Eigen expressions - template - MyVectorType(const Eigen::MatrixBase& other) - : Eigen::VectorXd(other) - { } - - // This method allows you to assign Eigen expressions to MyVectorType - template - MyVectorType& operator=(const Eigen::MatrixBase & other) - { - this->Eigen::VectorXd::operator=(other); - return *this; - } -}; - -int main() -{ - MyVectorType v = MyVectorType::Ones(4); - v(2) += 10; - v = 2 * v; - std::cout << v.transpose() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Cwise_erf.cpp b/testbed/nanogui/ext/eigen/doc/examples/Cwise_erf.cpp deleted file mode 100644 index e7cd2c1c..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Cwise_erf.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include -using namespace Eigen; -int main() -{ - Array4d v(-0.5,2,0,-7); - std::cout << v.erf() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Cwise_erfc.cpp b/testbed/nanogui/ext/eigen/doc/examples/Cwise_erfc.cpp deleted file mode 100644 index d8bb04c3..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Cwise_erfc.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include -using namespace Eigen; -int main() -{ - Array4d v(-0.5,2,0,-7); - std::cout << v.erfc() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Cwise_lgamma.cpp b/testbed/nanogui/ext/eigen/doc/examples/Cwise_lgamma.cpp deleted file mode 100644 index f1c4f503..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Cwise_lgamma.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include -using namespace Eigen; -int main() -{ - Array4d v(0.5,10,0,-1); - std::cout << v.lgamma() << std::endl; -} \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_middleCols_int.cpp b/testbed/nanogui/ext/eigen/doc/examples/DenseBase_middleCols_int.cpp deleted file mode 100644 index 0ebd955e..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_middleCols_int.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main(void) -{ - int const N = 5; - MatrixXi A(N,N); - A.setRandom(); - cout << "A =\n" << A << '\n' << endl; - cout << "A(1..3,:) =\n" << A.middleCols(1,3) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_middleRows_int.cpp b/testbed/nanogui/ext/eigen/doc/examples/DenseBase_middleRows_int.cpp deleted file mode 100644 index a6fe9e84..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_middleRows_int.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main(void) -{ - int const N = 5; - MatrixXi A(N,N); - A.setRandom(); - cout << "A =\n" << A << '\n' << endl; - cout << "A(2..3,:) =\n" << A.middleRows(2,2) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_template_int_middleCols.cpp b/testbed/nanogui/ext/eigen/doc/examples/DenseBase_template_int_middleCols.cpp deleted file mode 100644 index 6191d79c..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_template_int_middleCols.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main(void) -{ - int const N = 5; - MatrixXi A(N,N); - A.setRandom(); - cout << "A =\n" << A << '\n' << endl; - cout << "A(:,1..3) =\n" << A.middleCols<3>(1) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_template_int_middleRows.cpp b/testbed/nanogui/ext/eigen/doc/examples/DenseBase_template_int_middleRows.cpp deleted file mode 100644 index 7e8b6573..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/DenseBase_template_int_middleRows.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main(void) -{ - int const N = 5; - MatrixXi A(N,N); - A.setRandom(); - cout << "A =\n" << A << '\n' << endl; - cout << "A(1..3,:) =\n" << A.middleRows<3>(1) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example.cpp b/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example.cpp deleted file mode 100644 index 7238c0c4..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -using Eigen::MatrixXd; - -int main() -{ - MatrixXd m(2,2); - m(0,0) = 3; - m(1,0) = 2.5; - m(0,1) = -1; - m(1,1) = m(1,0) + m(0,1); - std::cout << m << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example2_dynamic.cpp b/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example2_dynamic.cpp deleted file mode 100644 index ff6746e2..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example2_dynamic.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - MatrixXd m = MatrixXd::Random(3,3); - m = (m + MatrixXd::Constant(3,3,1.2)) * 50; - cout << "m =" << endl << m << endl; - VectorXd v(3); - v << 1, 2, 3; - cout << "m * v =" << endl << m * v << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example2_fixed.cpp b/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example2_fixed.cpp deleted file mode 100644 index d9117527..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/QuickStart_example2_fixed.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - Matrix3d m = Matrix3d::Random(); - m = (m + Matrix3d::Constant(1.2)) * 50; - cout << "m =" << endl << m << endl; - Vector3d v(1,2,3); - - cout << "m * v =" << endl << m * v << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TemplateKeyword_flexible.cpp b/testbed/nanogui/ext/eigen/doc/examples/TemplateKeyword_flexible.cpp deleted file mode 100644 index 9d85292d..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TemplateKeyword_flexible.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -using namespace Eigen; - -template -void copyUpperTriangularPart(MatrixBase& dst, const MatrixBase& src) -{ - /* Note the 'template' keywords in the following line! */ - dst.template triangularView() = src.template triangularView(); -} - -int main() -{ - MatrixXi m1 = MatrixXi::Ones(5,5); - MatrixXi m2 = MatrixXi::Random(4,4); - std::cout << "m2 before copy:" << std::endl; - std::cout << m2 << std::endl << std::endl; - copyUpperTriangularPart(m2, m1.topLeftCorner(4,4)); - std::cout << "m2 after copy:" << std::endl; - std::cout << m2 << std::endl << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TemplateKeyword_simple.cpp b/testbed/nanogui/ext/eigen/doc/examples/TemplateKeyword_simple.cpp deleted file mode 100644 index 6998c176..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TemplateKeyword_simple.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -using namespace Eigen; - -void copyUpperTriangularPart(MatrixXf& dst, const MatrixXf& src) -{ - dst.triangularView() = src.triangularView(); -} - -int main() -{ - MatrixXf m1 = MatrixXf::Ones(4,4); - MatrixXf m2 = MatrixXf::Random(4,4); - std::cout << "m2 before copy:" << std::endl; - std::cout << m2 << std::endl << std::endl; - copyUpperTriangularPart(m2, m1); - std::cout << "m2 after copy:" << std::endl; - std::cout << m2 << std::endl << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialInplaceLU.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialInplaceLU.cpp deleted file mode 100644 index cb9c59b6..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialInplaceLU.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include -struct init { - init() { std::cout << "[" << "init" << "]" << std::endl; } -}; -init init_obj; -// [init] -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - MatrixXd A(2,2); - A << 2, -1, 1, 3; - cout << "Here is the input matrix A before decomposition:\n" << A << endl; -cout << "[init]" << endl; - -cout << "[declaration]" << endl; - PartialPivLU > lu(A); - cout << "Here is the input matrix A after decomposition:\n" << A << endl; -cout << "[declaration]" << endl; - -cout << "[matrixLU]" << endl; - cout << "Here is the matrix storing the L and U factors:\n" << lu.matrixLU() << endl; -cout << "[matrixLU]" << endl; - -cout << "[solve]" << endl; - MatrixXd A0(2,2); A0 << 2, -1, 1, 3; - VectorXd b(2); b << 1, 2; - VectorXd x = lu.solve(b); - cout << "Residual: " << (A0 * x - b).norm() << endl; -cout << "[solve]" << endl; - -cout << "[modifyA]" << endl; - A << 3, 4, -2, 1; - x = lu.solve(b); - cout << "Residual: " << (A0 * x - b).norm() << endl; -cout << "[modifyA]" << endl; - -cout << "[recompute]" << endl; - A0 = A; // save A - lu.compute(A); - x = lu.solve(b); - cout << "Residual: " << (A0 * x - b).norm() << endl; -cout << "[recompute]" << endl; - -cout << "[recompute_bis0]" << endl; - MatrixXd A1(2,2); - A1 << 5,-2,3,4; - lu.compute(A1); - cout << "Here is the input matrix A1 after decomposition:\n" << A1 << endl; -cout << "[recompute_bis0]" << endl; - -cout << "[recompute_bis1]" << endl; - x = lu.solve(b); - cout << "Residual: " << (A1 * x - b).norm() << endl; -cout << "[recompute_bis1]" << endl; - -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgComputeTwice.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgComputeTwice.cpp deleted file mode 100644 index 06ba6461..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgComputeTwice.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix2f A, b; - LLT llt; - A << 2, -1, -1, 3; - b << 1, 2, 3, 1; - cout << "Here is the matrix A:\n" << A << endl; - cout << "Here is the right hand side b:\n" << b << endl; - cout << "Computing LLT decomposition..." << endl; - llt.compute(A); - cout << "The solution is:\n" << llt.solve(b) << endl; - A(1,1)++; - cout << "The matrix A is now:\n" << A << endl; - cout << "Computing LLT decomposition..." << endl; - llt.compute(A); - cout << "The solution is now:\n" << llt.solve(b) << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExComputeSolveError.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExComputeSolveError.cpp deleted file mode 100644 index f362fb71..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExComputeSolveError.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - MatrixXd A = MatrixXd::Random(100,100); - MatrixXd b = MatrixXd::Random(100,50); - MatrixXd x = A.fullPivLu().solve(b); - double relative_error = (A*x - b).norm() / b.norm(); // norm() is L2 norm - cout << "The relative error is:\n" << relative_error << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExSolveColPivHouseholderQR.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExSolveColPivHouseholderQR.cpp deleted file mode 100644 index 3a99a94d..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExSolveColPivHouseholderQR.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix3f A; - Vector3f b; - A << 1,2,3, 4,5,6, 7,8,10; - b << 3, 3, 4; - cout << "Here is the matrix A:\n" << A << endl; - cout << "Here is the vector b:\n" << b << endl; - Vector3f x = A.colPivHouseholderQr().solve(b); - cout << "The solution is:\n" << x << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExSolveLDLT.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExSolveLDLT.cpp deleted file mode 100644 index f8beacd2..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgExSolveLDLT.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix2f A, b; - A << 2, -1, -1, 3; - b << 1, 2, 3, 1; - cout << "Here is the matrix A:\n" << A << endl; - cout << "Here is the right hand side b:\n" << b << endl; - Matrix2f x = A.ldlt().solve(b); - cout << "The solution is:\n" << x << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgInverseDeterminant.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgInverseDeterminant.cpp deleted file mode 100644 index 14dde5b3..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgInverseDeterminant.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix3f A; - A << 1, 2, 1, - 2, 1, 0, - -1, 1, 2; - cout << "Here is the matrix A:\n" << A << endl; - cout << "The determinant of A is " << A.determinant() << endl; - cout << "The inverse of A is:\n" << A.inverse() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgRankRevealing.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgRankRevealing.cpp deleted file mode 100644 index c5165077..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgRankRevealing.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix3f A; - A << 1, 2, 5, - 2, 1, 4, - 3, 0, 3; - cout << "Here is the matrix A:\n" << A << endl; - FullPivLU lu_decomp(A); - cout << "The rank of A is " << lu_decomp.rank() << endl; - cout << "Here is a matrix whose columns form a basis of the null-space of A:\n" - << lu_decomp.kernel() << endl; - cout << "Here is a matrix whose columns form a basis of the column-space of A:\n" - << lu_decomp.image(A) << endl; // yes, have to pass the original A -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSVDSolve.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSVDSolve.cpp deleted file mode 100644 index 9fbc031d..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSVDSolve.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - MatrixXf A = MatrixXf::Random(3, 2); - cout << "Here is the matrix A:\n" << A << endl; - VectorXf b = VectorXf::Random(3); - cout << "Here is the right hand side b:\n" << b << endl; - cout << "The least-squares solution is:\n" - << A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp deleted file mode 100644 index 8d1d1ed6..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix2f A; - A << 1, 2, 2, 3; - cout << "Here is the matrix A:\n" << A << endl; - SelfAdjointEigenSolver eigensolver(A); - if (eigensolver.info() != Success) abort(); - cout << "The eigenvalues of A are:\n" << eigensolver.eigenvalues() << endl; - cout << "Here's a matrix whose columns are eigenvectors of A \n" - << "corresponding to these eigenvalues:\n" - << eigensolver.eigenvectors() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSetThreshold.cpp b/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSetThreshold.cpp deleted file mode 100644 index 3956b13a..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/TutorialLinAlgSetThreshold.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix2d A; - A << 2, 1, - 2, 0.9999999999; - FullPivLU lu(A); - cout << "By default, the rank of A is found to be " << lu.rank() << endl; - lu.setThreshold(1e-5); - cout << "With threshold 1e-5, the rank of A is found to be " << lu.rank() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_accessors.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_accessors.cpp deleted file mode 100644 index dc720ff5..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_accessors.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - ArrayXXf m(2,2); - - // assign some values coefficient by coefficient - m(0,0) = 1.0; m(0,1) = 2.0; - m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0); - - // print values to standard output - cout << m << endl << endl; - - // using the comma-initializer is also allowed - m << 1.0,2.0, - 3.0,4.0; - - // print values to standard output - cout << m << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_addition.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_addition.cpp deleted file mode 100644 index 480ffb00..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_addition.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - ArrayXXf a(3,3); - ArrayXXf b(3,3); - a << 1,2,3, - 4,5,6, - 7,8,9; - b << 1,2,3, - 1,2,3, - 1,2,3; - - // Adding two arrays - cout << "a + b = " << endl << a + b << endl << endl; - - // Subtracting a scalar from an array - cout << "a - 2 = " << endl << a - 2 << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_cwise_other.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_cwise_other.cpp deleted file mode 100644 index d9046c63..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_cwise_other.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - ArrayXf a = ArrayXf::Random(5); - a *= 2; - cout << "a =" << endl - << a << endl; - cout << "a.abs() =" << endl - << a.abs() << endl; - cout << "a.abs().sqrt() =" << endl - << a.abs().sqrt() << endl; - cout << "a.min(a.abs().sqrt()) =" << endl - << a.min(a.abs().sqrt()) << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_interop.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_interop.cpp deleted file mode 100644 index 371f0706..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_interop.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - MatrixXf m(2,2); - MatrixXf n(2,2); - MatrixXf result(2,2); - - m << 1,2, - 3,4; - n << 5,6, - 7,8; - - result = (m.array() + 4).matrix() * m; - cout << "-- Combination 1: --" << endl << result << endl << endl; - result = (m.array() * n.array()).matrix() * m; - cout << "-- Combination 2: --" << endl << result << endl << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_interop_matrix.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_interop_matrix.cpp deleted file mode 100644 index 10142751..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_interop_matrix.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - MatrixXf m(2,2); - MatrixXf n(2,2); - MatrixXf result(2,2); - - m << 1,2, - 3,4; - n << 5,6, - 7,8; - - result = m * n; - cout << "-- Matrix m*n: --" << endl << result << endl << endl; - result = m.array() * n.array(); - cout << "-- Array m*n: --" << endl << result << endl << endl; - result = m.cwiseProduct(n); - cout << "-- With cwiseProduct: --" << endl << result << endl << endl; - result = m.array() + 4; - cout << "-- Array m + 4: --" << endl << result << endl << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_mult.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_mult.cpp deleted file mode 100644 index 6cb439ff..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ArrayClass_mult.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - ArrayXXf a(2,2); - ArrayXXf b(2,2); - a << 1,2, - 3,4; - b << 5,6, - 7,8; - cout << "a * b = " << endl << a * b << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_block_assignment.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_block_assignment.cpp deleted file mode 100644 index 76f49f2f..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_block_assignment.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Array22f m; - m << 1,2, - 3,4; - Array44f a = Array44f::Constant(0.6); - cout << "Here is the array a:" << endl << a << endl << endl; - a.block<2,2>(1,1) = m; - cout << "Here is now a with m copied into its central 2x2 block:" << endl << a << endl << endl; - a.block(0,0,2,3) = a.block(2,1,2,3); - cout << "Here is now a with bottom-right 2x3 block copied into top-left 2x2 block:" << endl << a << endl << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_colrow.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_colrow.cpp deleted file mode 100644 index 2e7eb009..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_colrow.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -using namespace std; - -int main() -{ - Eigen::MatrixXf m(3,3); - m << 1,2,3, - 4,5,6, - 7,8,9; - cout << "Here is the matrix m:" << endl << m << endl; - cout << "2nd Row: " << m.row(1) << endl; - m.col(2) += 3 * m.col(0); - cout << "After adding 3 times the first column into the third column, the matrix m is:\n"; - cout << m << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_corner.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_corner.cpp deleted file mode 100644 index 3a31507a..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_corner.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -using namespace std; - -int main() -{ - Eigen::Matrix4f m; - m << 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10,11,12, - 13,14,15,16; - cout << "m.leftCols(2) =" << endl << m.leftCols(2) << endl << endl; - cout << "m.bottomRows<2>() =" << endl << m.bottomRows<2>() << endl << endl; - m.topLeftCorner(1,3) = m.bottomRightCorner(3,1).transpose(); - cout << "After assignment, m = " << endl << m << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_print_block.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_print_block.cpp deleted file mode 100644 index edea4aef..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_print_block.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -using namespace std; - -int main() -{ - Eigen::MatrixXf m(4,4); - m << 1, 2, 3, 4, - 5, 6, 7, 8, - 9,10,11,12, - 13,14,15,16; - cout << "Block in the middle" << endl; - cout << m.block<2,2>(1,1) << endl << endl; - for (int i = 1; i <= 3; ++i) - { - cout << "Block of size " << i << "x" << i << endl; - cout << m.block(0,0,i,i) << endl << endl; - } -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_vector.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_vector.cpp deleted file mode 100644 index 4a0b0234..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_BlockOperations_vector.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -using namespace std; - -int main() -{ - Eigen::ArrayXf v(6); - v << 1, 2, 3, 4, 5, 6; - cout << "v.head(3) =" << endl << v.head(3) << endl << endl; - cout << "v.tail<3>() = " << endl << v.tail<3>() << endl << endl; - v.segment(1,4) *= 2; - cout << "after 'v.segment(1,4) *= 2', v =" << endl << v << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_PartialLU_solve.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_PartialLU_solve.cpp deleted file mode 100644 index a5608792..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_PartialLU_solve.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Matrix3f A; - Vector3f b; - A << 1,2,3, 4,5,6, 7,8,10; - b << 3, 3, 4; - cout << "Here is the matrix A:" << endl << A << endl; - cout << "Here is the vector b:" << endl << b << endl; - Vector3f x = A.lu().solve(b); - cout << "The solution is:" << endl << x << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp deleted file mode 100644 index 334b4d85..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Eigen::MatrixXf m(2,4); - Eigen::VectorXf v(2); - - m << 1, 23, 6, 9, - 3, 11, 7, 2; - - v << 2, - 3; - - MatrixXf::Index index; - // find nearest neighbour - (m.colwise() - v).colwise().squaredNorm().minCoeff(&index); - - cout << "Nearest neighbour is column " << index << ":" << endl; - cout << m.col(index) << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp deleted file mode 100644 index e6c87c6a..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -using namespace std; -int main() -{ - Eigen::MatrixXf mat(2,4); - Eigen::VectorXf v(2); - - mat << 1, 2, 6, 9, - 3, 1, 7, 2; - - v << 0, - 1; - - //add v to each column of m - mat.colwise() += v; - - std::cout << "Broadcasting result: " << std::endl; - std::cout << mat << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp deleted file mode 100644 index d87c96ab..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -using namespace std; -int main() -{ - Eigen::MatrixXf mat(2,4); - Eigen::VectorXf v(4); - - mat << 1, 2, 6, 9, - 3, 1, 7, 2; - - v << 0,1,2,3; - - //add v to each row of m - mat.rowwise() += v.transpose(); - - std::cout << "Broadcasting result: " << std::endl; - std::cout << mat << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp deleted file mode 100644 index df682566..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -using namespace std; -int main() -{ - Eigen::MatrixXf mat(2,4); - mat << 1, 2, 6, 9, - 3, 1, 7, 2; - - std::cout << "Column's maximum: " << std::endl - << mat.colwise().maxCoeff() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp deleted file mode 100644 index 049c747b..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; -int main() -{ - MatrixXf mat(2,4); - mat << 1, 2, 6, 9, - 3, 1, 7, 2; - - MatrixXf::Index maxIndex; - float maxNorm = mat.colwise().sum().maxCoeff(&maxIndex); - - std::cout << "Maximum sum at position " << maxIndex << std::endl; - - std::cout << "The corresponding vector is: " << std::endl; - std::cout << mat.col( maxIndex ) << std::endl; - std::cout << "And its sum is is: " << maxNorm << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp deleted file mode 100644 index 0cca37f3..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - ArrayXXf a(2,2); - - a << 1,2, - 3,4; - - cout << "(a > 0).all() = " << (a > 0).all() << endl; - cout << "(a > 0).any() = " << (a > 0).any() << endl; - cout << "(a > 0).count() = " << (a > 0).count() << endl; - cout << endl; - cout << "(a > 2).all() = " << (a > 2).all() << endl; - cout << "(a > 2).any() = " << (a > 2).any() << endl; - cout << "(a > 2).count() = " << (a > 2).count() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp deleted file mode 100644 index 740439fb..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - VectorXf v(2); - MatrixXf m(2,2), n(2,2); - - v << -1, - 2; - - m << 1,-2, - -3,4; - - cout << "v.squaredNorm() = " << v.squaredNorm() << endl; - cout << "v.norm() = " << v.norm() << endl; - cout << "v.lpNorm<1>() = " << v.lpNorm<1>() << endl; - cout << "v.lpNorm() = " << v.lpNorm() << endl; - - cout << endl; - cout << "m.squaredNorm() = " << m.squaredNorm() << endl; - cout << "m.norm() = " << m.norm() << endl; - cout << "m.lpNorm<1>() = " << m.lpNorm<1>() << endl; - cout << "m.lpNorm() = " << m.lpNorm() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_operatornorm.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_operatornorm.cpp deleted file mode 100644 index 62e28fc3..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_operatornorm.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; - -int main() -{ - MatrixXf m(2,2); - m << 1,-2, - -3,4; - - cout << "1-norm(m) = " << m.cwiseAbs().colwise().sum().maxCoeff() - << " == " << m.colwise().lpNorm<1>().maxCoeff() << endl; - - cout << "infty-norm(m) = " << m.cwiseAbs().rowwise().sum().maxCoeff() - << " == " << m.rowwise().lpNorm<1>().maxCoeff() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp deleted file mode 100644 index 80427c9f..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -using namespace std; -int main() -{ - Eigen::MatrixXf mat(2,4); - mat << 1, 2, 6, 9, - 3, 1, 7, 2; - - std::cout << "Row's maximum: " << std::endl - << mat.rowwise().maxCoeff() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp deleted file mode 100644 index b54e9aa3..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include - -using namespace std; -using namespace Eigen; - -int main() -{ - Eigen::MatrixXf m(2,2); - - m << 1, 2, - 3, 4; - - //get location of maximum - MatrixXf::Index maxRow, maxCol; - float max = m.maxCoeff(&maxRow, &maxCol); - - //get location of minimum - MatrixXf::Index minRow, minCol; - float min = m.minCoeff(&minRow, &minCol); - - cout << "Max: " << max << ", at: " << - maxRow << "," << maxCol << endl; - cout << "Min: " << min << ", at: " << - minRow << "," << minCol << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_simple_example_dynamic_size.cpp b/testbed/nanogui/ext/eigen/doc/examples/Tutorial_simple_example_dynamic_size.cpp deleted file mode 100644 index 0f0280e0..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/Tutorial_simple_example_dynamic_size.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -using namespace Eigen; - -int main() -{ - for (int size=1; size<=4; ++size) - { - MatrixXi m(size,size+1); // a (size)x(size+1)-matrix of int's - for (int j=0; j -#include - -using namespace Eigen; - -int main() -{ - Matrix3f m3; - m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9; - Matrix4f m4 = Matrix4f::Identity(); - Vector4i v4(1, 2, 3, 4); - - std::cout << "m3\n" << m3 << "\nm4:\n" - << m4 << "\nv4:\n" << v4 << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_Block.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_Block.cpp deleted file mode 100644 index ace719af..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_Block.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -template -Eigen::Block -topLeftCorner(MatrixBase& m, int rows, int cols) -{ - return Eigen::Block(m.derived(), 0, 0, rows, cols); -} - -template -const Eigen::Block -topLeftCorner(const MatrixBase& m, int rows, int cols) -{ - return Eigen::Block(m.derived(), 0, 0, rows, cols); -} - -int main(int, char**) -{ - Matrix4d m = Matrix4d::Identity(); - cout << topLeftCorner(4*m, 2, 3) << endl; // calls the const version - topLeftCorner(m, 2, 3) *= 5; // calls the non-const version - cout << "Now the matrix m is:" << endl << m << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_CwiseBinaryOp.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_CwiseBinaryOp.cpp deleted file mode 100644 index 682af46d..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_CwiseBinaryOp.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -// define a custom template binary functor -template struct MakeComplexOp { - EIGEN_EMPTY_STRUCT_CTOR(MakeComplexOp) - typedef complex result_type; - complex operator()(const Scalar& a, const Scalar& b) const { return complex(a,b); } -}; - -int main(int, char**) -{ - Matrix4d m1 = Matrix4d::Random(), m2 = Matrix4d::Random(); - cout << m1.binaryExpr(m2, MakeComplexOp()) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_CwiseUnaryOp.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_CwiseUnaryOp.cpp deleted file mode 100644 index a5fcc153..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_CwiseUnaryOp.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -// define a custom template unary functor -template -struct CwiseClampOp { - CwiseClampOp(const Scalar& inf, const Scalar& sup) : m_inf(inf), m_sup(sup) {} - const Scalar operator()(const Scalar& x) const { return xm_sup ? m_sup : x); } - Scalar m_inf, m_sup; -}; - -int main(int, char**) -{ - Matrix4d m1 = Matrix4d::Random(); - cout << m1 << endl << "becomes: " << endl << m1.unaryExpr(CwiseClampOp(-0.5,0.5)) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_CwiseUnaryOp_ptrfun.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_CwiseUnaryOp_ptrfun.cpp deleted file mode 100644 index 36706d8e..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_CwiseUnaryOp_ptrfun.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -// define function to be applied coefficient-wise -double ramp(double x) -{ - if (x > 0) - return x; - else - return 0; -} - -int main(int, char**) -{ - Matrix4d m1 = Matrix4d::Random(); - cout << m1 << endl << "becomes: " << endl << m1.unaryExpr(ptr_fun(ramp)) << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_FixedBlock.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_FixedBlock.cpp deleted file mode 100644 index 9978b32e..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_FixedBlock.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -template -Eigen::Block -topLeft2x2Corner(MatrixBase& m) -{ - return Eigen::Block(m.derived(), 0, 0); -} - -template -const Eigen::Block -topLeft2x2Corner(const MatrixBase& m) -{ - return Eigen::Block(m.derived(), 0, 0); -} - -int main(int, char**) -{ - Matrix3d m = Matrix3d::Identity(); - cout << topLeft2x2Corner(4*m) << endl; // calls the const version - topLeft2x2Corner(m) *= 2; // calls the non-const version - cout << "Now the matrix m is:" << endl << m << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_FixedVectorBlock.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_FixedVectorBlock.cpp deleted file mode 100644 index c88c9fbf..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_FixedVectorBlock.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -template -Eigen::VectorBlock -firstTwo(MatrixBase& v) -{ - return Eigen::VectorBlock(v.derived(), 0); -} - -template -const Eigen::VectorBlock -firstTwo(const MatrixBase& v) -{ - return Eigen::VectorBlock(v.derived(), 0); -} - -int main(int, char**) -{ - Matrix v; v << 1,2,3,4,5,6; - cout << firstTwo(4*v) << endl; // calls the const version - firstTwo(v) *= 2; // calls the non-const version - cout << "Now the vector v is:" << endl << v << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/class_VectorBlock.cpp b/testbed/nanogui/ext/eigen/doc/examples/class_VectorBlock.cpp deleted file mode 100644 index dc213df2..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/class_VectorBlock.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -template -Eigen::VectorBlock -segmentFromRange(MatrixBase& v, int start, int end) -{ - return Eigen::VectorBlock(v.derived(), start, end-start); -} - -template -const Eigen::VectorBlock -segmentFromRange(const MatrixBase& v, int start, int end) -{ - return Eigen::VectorBlock(v.derived(), start, end-start); -} - -int main(int, char**) -{ - Matrix v; v << 1,2,3,4,5,6; - cout << segmentFromRange(2*v, 2, 4) << endl; // calls the const version - segmentFromRange(v, 1, 3) *= 5; // calls the non-const version - cout << "Now the vector v is:" << endl << v << endl; - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/function_taking_eigenbase.cpp b/testbed/nanogui/ext/eigen/doc/examples/function_taking_eigenbase.cpp deleted file mode 100644 index 49d94b3d..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/function_taking_eigenbase.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -using namespace Eigen; - -template -void print_size(const EigenBase& b) -{ - std::cout << "size (rows, cols): " << b.size() << " (" << b.rows() - << ", " << b.cols() << ")" << std::endl; -} - -int main() -{ - Vector3f v; - print_size(v); - // v.asDiagonal() returns a 3x3 diagonal matrix pseudo-expression - print_size(v.asDiagonal()); -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/function_taking_ref.cpp b/testbed/nanogui/ext/eigen/doc/examples/function_taking_ref.cpp deleted file mode 100644 index 162a202e..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/function_taking_ref.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -using namespace Eigen; -using namespace std; - -float inv_cond(const Ref& a) -{ - const VectorXf sing_vals = a.jacobiSvd().singularValues(); - return sing_vals(sing_vals.size()-1) / sing_vals(0); -} - -int main() -{ - Matrix4f m = Matrix4f::Random(); - cout << "matrix m:" << endl << m << endl << endl; - cout << "inv_cond(m): " << inv_cond(m) << endl; - cout << "inv_cond(m(1:3,1:3)): " << inv_cond(m.topLeftCorner(3,3)) << endl; - cout << "inv_cond(m+I): " << inv_cond(m+Matrix4f::Identity()) << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp deleted file mode 100644 index 92e6aaa2..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp +++ /dev/null @@ -1,11 +0,0 @@ -/* -This program is presented in several fragments in the doc page. -Every fragment is in its own file; this file simply combines them. -*/ - -#include "make_circulant.cpp.preamble" -#include "make_circulant.cpp.traits" -#include "make_circulant.cpp.expression" -#include "make_circulant.cpp.evaluator" -#include "make_circulant.cpp.entry" -#include "make_circulant.cpp.main" diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.entry b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.entry deleted file mode 100644 index f9d2eb8a..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.entry +++ /dev/null @@ -1,5 +0,0 @@ -template -Circulant makeCirculant(const Eigen::MatrixBase& arg) -{ - return Circulant(arg.derived()); -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.evaluator b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.evaluator deleted file mode 100644 index 2ba79e78..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.evaluator +++ /dev/null @@ -1,32 +0,0 @@ -namespace Eigen { - namespace internal { - template - struct evaluator > - : evaluator_base > - { - typedef Circulant XprType; - typedef typename nested_eval::type ArgTypeNested; - typedef typename remove_all::type ArgTypeNestedCleaned; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - enum { - CoeffReadCost = evaluator::CoeffReadCost, - Flags = Eigen::ColMajor - }; - - evaluator(const XprType& xpr) - : m_argImpl(xpr.m_arg), m_rows(xpr.rows()) - { } - - CoeffReturnType coeff(Index row, Index col) const - { - Index index = row - col; - if (index < 0) index += m_rows; - return m_argImpl.coeff(index); - } - - evaluator m_argImpl; - const Index m_rows; - }; - } -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.expression b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.expression deleted file mode 100644 index 380cd445..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.expression +++ /dev/null @@ -1,20 +0,0 @@ -template -class Circulant : public Eigen::MatrixBase > -{ -public: - Circulant(const ArgType& arg) - : m_arg(arg) - { - EIGEN_STATIC_ASSERT(ArgType::ColsAtCompileTime == 1, - YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX); - } - - typedef typename Eigen::internal::ref_selector::type Nested; - - typedef Eigen::Index Index; - Index rows() const { return m_arg.rows(); } - Index cols() const { return m_arg.rows(); } - - typedef typename Eigen::internal::ref_selector::type ArgTypeNested; - ArgTypeNested m_arg; -}; diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.main b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.main deleted file mode 100644 index 877f97f6..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.main +++ /dev/null @@ -1,8 +0,0 @@ -int main() -{ - Eigen::VectorXd vec(4); - vec << 1, 2, 4, 8; - Eigen::MatrixXd mat; - mat = makeCirculant(vec); - std::cout << mat << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.preamble b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.preamble deleted file mode 100644 index e575cce1..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.preamble +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -template class Circulant; diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.traits b/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.traits deleted file mode 100644 index 4e04535d..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant.cpp.traits +++ /dev/null @@ -1,19 +0,0 @@ -namespace Eigen { - namespace internal { - template - struct traits > - { - typedef Eigen::Dense StorageKind; - typedef Eigen::MatrixXpr XprKind; - typedef typename ArgType::StorageIndex StorageIndex; - typedef typename ArgType::Scalar Scalar; - enum { - Flags = Eigen::ColMajor, - RowsAtCompileTime = ArgType::RowsAtCompileTime, - ColsAtCompileTime = ArgType::RowsAtCompileTime, - MaxRowsAtCompileTime = ArgType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = ArgType::MaxRowsAtCompileTime - }; - }; - } -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/make_circulant2.cpp b/testbed/nanogui/ext/eigen/doc/examples/make_circulant2.cpp deleted file mode 100644 index 95d3dd31..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/make_circulant2.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -using namespace Eigen; - -// [circulant_func] -template -class circulant_functor { - const ArgType &m_vec; -public: - circulant_functor(const ArgType& arg) : m_vec(arg) {} - - const typename ArgType::Scalar& operator() (Index row, Index col) const { - Index index = row - col; - if (index < 0) index += m_vec.size(); - return m_vec(index); - } -}; -// [circulant_func] - -// [square] -template -struct circulant_helper { - typedef Matrix MatrixType; -}; -// [square] - -// [makeCirculant] -template -CwiseNullaryOp, typename circulant_helper::MatrixType> -makeCirculant(const Eigen::MatrixBase& arg) -{ - typedef typename circulant_helper::MatrixType MatrixType; - return MatrixType::NullaryExpr(arg.size(), arg.size(), circulant_functor(arg.derived())); -} -// [makeCirculant] - -// [main] -int main() -{ - Eigen::VectorXd vec(4); - vec << 1, 2, 4, 8; - Eigen::MatrixXd mat; - mat = makeCirculant(vec); - std::cout << mat << std::endl; -} -// [main] diff --git a/testbed/nanogui/ext/eigen/doc/examples/matrixfree_cg.cpp b/testbed/nanogui/ext/eigen/doc/examples/matrixfree_cg.cpp deleted file mode 100644 index 6a205aea..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/matrixfree_cg.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include -#include -#include -#include - -class MatrixReplacement; -using Eigen::SparseMatrix; - -namespace Eigen { -namespace internal { - // MatrixReplacement looks-like a SparseMatrix, so let's inherits its traits: - template<> - struct traits : public Eigen::internal::traits > - {}; -} -} - -// Example of a matrix-free wrapper from a user type to Eigen's compatible type -// For the sake of simplicity, this example simply wrap a Eigen::SparseMatrix. -class MatrixReplacement : public Eigen::EigenBase { -public: - // Required typedefs, constants, and method: - typedef double Scalar; - typedef double RealScalar; - typedef int StorageIndex; - enum { - ColsAtCompileTime = Eigen::Dynamic, - MaxColsAtCompileTime = Eigen::Dynamic, - IsRowMajor = false - }; - - Index rows() const { return mp_mat->rows(); } - Index cols() const { return mp_mat->cols(); } - - template - Eigen::Product operator*(const Eigen::MatrixBase& x) const { - return Eigen::Product(*this, x.derived()); - } - - // Custom API: - MatrixReplacement() : mp_mat(0) {} - - void attachMyMatrix(const SparseMatrix &mat) { - mp_mat = &mat; - } - const SparseMatrix my_matrix() const { return *mp_mat; } - -private: - const SparseMatrix *mp_mat; -}; - - -// Implementation of MatrixReplacement * Eigen::DenseVector though a specialization of internal::generic_product_impl: -namespace Eigen { -namespace internal { - - template - struct generic_product_impl // GEMV stands for matrix-vector - : generic_product_impl_base > - { - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const MatrixReplacement& lhs, const Rhs& rhs, const Scalar& alpha) - { - // This method should implement "dst += alpha * lhs * rhs" inplace, - // however, for iterative solvers, alpha is always equal to 1, so let's not bother about it. - assert(alpha==Scalar(1) && "scaling is not implemented"); - - // Here we could simply call dst.noalias() += lhs.my_matrix() * rhs, - // but let's do something fancier (and less efficient): - for(Index i=0; i S = Eigen::MatrixXd::Random(n,n).sparseView(0.5,1); - S = S.transpose()*S; - - MatrixReplacement A; - A.attachMyMatrix(S); - - Eigen::VectorXd b(n), x; - b.setRandom(); - - // Solve Ax = b using various iterative solver with matrix-free version: - { - Eigen::ConjugateGradient cg; - cg.compute(A); - x = cg.solve(b); - std::cout << "CG: #iterations: " << cg.iterations() << ", estimated error: " << cg.error() << std::endl; - } - - { - Eigen::BiCGSTAB bicg; - bicg.compute(A); - x = bicg.solve(b); - std::cout << "BiCGSTAB: #iterations: " << bicg.iterations() << ", estimated error: " << bicg.error() << std::endl; - } - - { - Eigen::GMRES gmres; - gmres.compute(A); - x = gmres.solve(b); - std::cout << "GMRES: #iterations: " << gmres.iterations() << ", estimated error: " << gmres.error() << std::endl; - } - - { - Eigen::DGMRES gmres; - gmres.compute(A); - x = gmres.solve(b); - std::cout << "DGMRES: #iterations: " << gmres.iterations() << ", estimated error: " << gmres.error() << std::endl; - } - - { - Eigen::MINRES minres; - minres.compute(A); - x = minres.solve(b); - std::cout << "MINRES: #iterations: " << minres.iterations() << ", estimated error: " << minres.error() << std::endl; - } -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/nullary_indexing.cpp b/testbed/nanogui/ext/eigen/doc/examples/nullary_indexing.cpp deleted file mode 100644 index e27c3585..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/nullary_indexing.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include - -using namespace Eigen; - -// [functor] -template -class indexing_functor { - const ArgType &m_arg; - const RowIndexType &m_rowIndices; - const ColIndexType &m_colIndices; -public: - typedef Matrix MatrixType; - - indexing_functor(const ArgType& arg, const RowIndexType& row_indices, const ColIndexType& col_indices) - : m_arg(arg), m_rowIndices(row_indices), m_colIndices(col_indices) - {} - - const typename ArgType::Scalar& operator() (Index row, Index col) const { - return m_arg(m_rowIndices[row], m_colIndices[col]); - } -}; -// [functor] - -// [function] -template -CwiseNullaryOp, typename indexing_functor::MatrixType> -indexing(const Eigen::MatrixBase& arg, const RowIndexType& row_indices, const ColIndexType& col_indices) -{ - typedef indexing_functor Func; - typedef typename Func::MatrixType MatrixType; - return MatrixType::NullaryExpr(row_indices.size(), col_indices.size(), Func(arg.derived(), row_indices, col_indices)); -} -// [function] - - -int main() -{ - std::cout << "[main1]\n"; - Eigen::MatrixXi A = Eigen::MatrixXi::Random(4,4); - Array3i ri(1,2,1); - ArrayXi ci(6); ci << 3,2,1,0,0,2; - Eigen::MatrixXi B = indexing(A, ri, ci); - std::cout << "A =" << std::endl; - std::cout << A << std::endl << std::endl; - std::cout << "A([" << ri.transpose() << "], [" << ci.transpose() << "]) =" << std::endl; - std::cout << B << std::endl; - std::cout << "[main1]\n"; - - std::cout << "[main2]\n"; - B = indexing(A, ri+1, ci); - std::cout << "A(ri+1,ci) =" << std::endl; - std::cout << B << std::endl << std::endl; -#if __cplusplus >= 201103L - B = indexing(A, ArrayXi::LinSpaced(13,0,12).unaryExpr([](int x){return x%4;}), ArrayXi::LinSpaced(4,0,3)); - std::cout << "A(ArrayXi::LinSpaced(13,0,12).unaryExpr([](int x){return x%4;}), ArrayXi::LinSpaced(4,0,3)) =" << std::endl; - std::cout << B << std::endl << std::endl; -#endif - std::cout << "[main2]\n"; -} - diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_add_sub.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_add_sub.cpp deleted file mode 100644 index e97477b6..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_add_sub.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -using namespace Eigen; - -int main() -{ - Matrix2d a; - a << 1, 2, - 3, 4; - MatrixXd b(2,2); - b << 2, 3, - 1, 4; - std::cout << "a + b =\n" << a + b << std::endl; - std::cout << "a - b =\n" << a - b << std::endl; - std::cout << "Doing a += b;" << std::endl; - a += b; - std::cout << "Now a =\n" << a << std::endl; - Vector3d v(1,2,3); - Vector3d w(1,0,0); - std::cout << "-v + w - v =\n" << -v + w - v << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_dot_cross.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_dot_cross.cpp deleted file mode 100644 index 631c9a5e..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_dot_cross.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Eigen; -using namespace std; -int main() -{ - Vector3d v(1,2,3); - Vector3d w(0,1,2); - - cout << "Dot product: " << v.dot(w) << endl; - double dp = v.adjoint()*w; // automatic conversion of the inner product to a scalar - cout << "Dot product via a matrix product: " << dp << endl; - cout << "Cross product:\n" << v.cross(w) << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_matrix_mul.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_matrix_mul.cpp deleted file mode 100644 index f2139024..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_matrix_mul.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include - -using namespace Eigen; -int main() -{ - Matrix2d mat; - mat << 1, 2, - 3, 4; - Vector2d u(-1,1), v(2,0); - std::cout << "Here is mat*mat:\n" << mat*mat << std::endl; - std::cout << "Here is mat*u:\n" << mat*u << std::endl; - std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl; - std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl; - std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl; - std::cout << "Let's multiply mat by itself" << std::endl; - mat = mat*mat; - std::cout << "Now mat is mat:\n" << mat << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_redux_basic.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_redux_basic.cpp deleted file mode 100644 index 5632fb52..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_redux_basic.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -using namespace std; -int main() -{ - Eigen::Matrix2d mat; - mat << 1, 2, - 3, 4; - cout << "Here is mat.sum(): " << mat.sum() << endl; - cout << "Here is mat.prod(): " << mat.prod() << endl; - cout << "Here is mat.mean(): " << mat.mean() << endl; - cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; - cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; - cout << "Here is mat.trace(): " << mat.trace() << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_scalar_mul_div.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_scalar_mul_div.cpp deleted file mode 100644 index d5f65b53..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_arithmetic_scalar_mul_div.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -using namespace Eigen; - -int main() -{ - Matrix2d a; - a << 1, 2, - 3, 4; - Vector3d v(1,2,3); - std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl; - std::cout << "0.1 * v =\n" << 0.1 * v << std::endl; - std::cout << "Doing v *= 2;" << std::endl; - v *= 2; - std::cout << "Now v =\n" << v << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_coefficient_accessors.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_coefficient_accessors.cpp deleted file mode 100644 index c2da1715..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_coefficient_accessors.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -using namespace Eigen; - -int main() -{ - MatrixXd m(2,2); - m(0,0) = 3; - m(1,0) = 2.5; - m(0,1) = -1; - m(1,1) = m(1,0) + m(0,1); - std::cout << "Here is the matrix m:\n" << m << std::endl; - VectorXd v(2); - v(0) = 4; - v(1) = v(0) - 1; - std::cout << "Here is the vector v:\n" << v << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_resize.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_resize.cpp deleted file mode 100644 index 0392c3aa..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_resize.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -using namespace Eigen; - -int main() -{ - MatrixXd m(2,5); - m.resize(4,3); - std::cout << "The matrix m is of size " - << m.rows() << "x" << m.cols() << std::endl; - std::cout << "It has " << m.size() << " coefficients" << std::endl; - VectorXd v(2); - v.resize(5); - std::cout << "The vector v is of size " << v.size() << std::endl; - std::cout << "As a matrix, v is of size " - << v.rows() << "x" << v.cols() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_resize_fixed_size.cpp b/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_resize_fixed_size.cpp deleted file mode 100644 index dcbdfa78..00000000 --- a/testbed/nanogui/ext/eigen/doc/examples/tut_matrix_resize_fixed_size.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include - -using namespace Eigen; - -int main() -{ - Matrix4d m; - m.resize(4,4); // no operation - std::cout << "The matrix m is of size " - << m.rows() << "x" << m.cols() << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/ftv2node.png b/testbed/nanogui/ext/eigen/doc/ftv2node.png deleted file mode 100644 index 63c605bb..00000000 Binary files a/testbed/nanogui/ext/eigen/doc/ftv2node.png and /dev/null differ diff --git a/testbed/nanogui/ext/eigen/doc/ftv2pnode.png b/testbed/nanogui/ext/eigen/doc/ftv2pnode.png deleted file mode 100644 index c6ee22f9..00000000 Binary files a/testbed/nanogui/ext/eigen/doc/ftv2pnode.png and /dev/null differ diff --git a/testbed/nanogui/ext/eigen/doc/snippets/.krazy b/testbed/nanogui/ext/eigen/doc/snippets/.krazy deleted file mode 100644 index 00b99405..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/.krazy +++ /dev/null @@ -1,2 +0,0 @@ -EXCLUDE copyright -EXCLUDE license diff --git a/testbed/nanogui/ext/eigen/doc/snippets/AngleAxis_mimic_euler.cpp b/testbed/nanogui/ext/eigen/doc/snippets/AngleAxis_mimic_euler.cpp deleted file mode 100644 index 456de7f7..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/AngleAxis_mimic_euler.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3f m; -m = AngleAxisf(0.25*M_PI, Vector3f::UnitX()) - * AngleAxisf(0.5*M_PI, Vector3f::UnitY()) - * AngleAxisf(0.33*M_PI, Vector3f::UnitZ()); -cout << m << endl << "is unitary: " << m.isUnitary() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/BiCGSTAB_simple.cpp b/testbed/nanogui/ext/eigen/doc/snippets/BiCGSTAB_simple.cpp deleted file mode 100644 index 5520f4f1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/BiCGSTAB_simple.cpp +++ /dev/null @@ -1,11 +0,0 @@ - int n = 10000; - VectorXd x(n), b(n); - SparseMatrix A(n,n); - /* ... fill A and b ... */ - BiCGSTAB > solver; - solver.compute(A); - x = solver.solve(b); - std::cout << "#iterations: " << solver.iterations() << std::endl; - std::cout << "estimated error: " << solver.error() << std::endl; - /* ... update b ... */ - x = solver.solve(b); // solve again \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/BiCGSTAB_step_by_step.cpp b/testbed/nanogui/ext/eigen/doc/snippets/BiCGSTAB_step_by_step.cpp deleted file mode 100644 index 06147bb8..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/BiCGSTAB_step_by_step.cpp +++ /dev/null @@ -1,14 +0,0 @@ - int n = 10000; - VectorXd x(n), b(n); - SparseMatrix A(n,n); - /* ... fill A and b ... */ - BiCGSTAB > solver(A); - // start from a random solution - x = VectorXd::Random(n); - solver.setMaxIterations(1); - int i = 0; - do { - x = solver.solveWithGuess(b,x); - std::cout << i << " : " << solver.error() << std::endl; - ++i; - } while (solver.info()!=Success && i<100); \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/CMakeLists.txt b/testbed/nanogui/ext/eigen/doc/snippets/CMakeLists.txt deleted file mode 100644 index 1baf32fb..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -file(GLOB snippets_SRCS "*.cpp") - -add_custom_target(all_snippets) - -foreach(snippet_src ${snippets_SRCS}) - get_filename_component(snippet ${snippet_src} NAME_WE) - set(compile_snippet_target compile_${snippet}) - set(compile_snippet_src ${compile_snippet_target}.cpp) - file(READ ${snippet_src} snippet_source_code) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/compile_snippet.cpp.in - ${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src}) - add_executable(${compile_snippet_target} - ${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src}) - if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) - target_link_libraries(${compile_snippet_target} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) - endif() - add_custom_command( - TARGET ${compile_snippet_target} - POST_BUILD - COMMAND ${compile_snippet_target} - ARGS >${CMAKE_CURRENT_BINARY_DIR}/${snippet}.out - ) - add_dependencies(all_snippets ${compile_snippet_target}) - set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${compile_snippet_src} - PROPERTIES OBJECT_DEPENDS ${snippet_src}) -endforeach(snippet_src) diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ColPivHouseholderQR_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ColPivHouseholderQR_solve.cpp deleted file mode 100644 index b7b204a1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ColPivHouseholderQR_solve.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix3f m = Matrix3f::Random(); -Matrix3f y = Matrix3f::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the matrix y:" << endl << y << endl; -Matrix3f x; -x = m.colPivHouseholderQr().solve(y); -assert(y.isApprox(m*x)); -cout << "Here is a solution x to the equation mx=y:" << endl << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_compute.cpp deleted file mode 100644 index 11d6bd39..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_compute.cpp +++ /dev/null @@ -1,16 +0,0 @@ -MatrixXcf A = MatrixXcf::Random(4,4); -cout << "Here is a random 4x4 matrix, A:" << endl << A << endl << endl; - -ComplexEigenSolver ces; -ces.compute(A); -cout << "The eigenvalues of A are:" << endl << ces.eigenvalues() << endl; -cout << "The matrix of eigenvectors, V, is:" << endl << ces.eigenvectors() << endl << endl; - -complex lambda = ces.eigenvalues()[0]; -cout << "Consider the first eigenvalue, lambda = " << lambda << endl; -VectorXcf v = ces.eigenvectors().col(0); -cout << "If v is the corresponding eigenvector, then lambda * v = " << endl << lambda * v << endl; -cout << "... and A * v = " << endl << A * v << endl << endl; - -cout << "Finally, V * D * V^(-1) = " << endl - << ces.eigenvectors() * ces.eigenvalues().asDiagonal() * ces.eigenvectors().inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_eigenvalues.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_eigenvalues.cpp deleted file mode 100644 index 5509bd89..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_eigenvalues.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXcf ones = MatrixXcf::Ones(3,3); -ComplexEigenSolver ces(ones, /* computeEigenvectors = */ false); -cout << "The eigenvalues of the 3x3 matrix of ones are:" - << endl << ces.eigenvalues() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_eigenvectors.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_eigenvectors.cpp deleted file mode 100644 index bb1c2ccf..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ComplexEigenSolver_eigenvectors.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXcf ones = MatrixXcf::Ones(3,3); -ComplexEigenSolver ces(ones); -cout << "The first eigenvector of the 3x3 matrix of ones is:" - << endl << ces.eigenvectors().col(1) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_compute.cpp deleted file mode 100644 index 3a517010..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_compute.cpp +++ /dev/null @@ -1,6 +0,0 @@ -MatrixXcf A = MatrixXcf::Random(4,4); -ComplexSchur schur(4); -schur.compute(A); -cout << "The matrix T in the decomposition of A is:" << endl << schur.matrixT() << endl; -schur.compute(A.inverse()); -cout << "The matrix T in the decomposition of A^(-1) is:" << endl << schur.matrixT() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_matrixT.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_matrixT.cpp deleted file mode 100644 index 8380571a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_matrixT.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXcf A = MatrixXcf::Random(4,4); -cout << "Here is a random 4x4 matrix, A:" << endl << A << endl << endl; -ComplexSchur schurOfA(A, false); // false means do not compute U -cout << "The triangular matrix T is:" << endl << schurOfA.matrixT() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_matrixU.cpp b/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_matrixU.cpp deleted file mode 100644 index ba3d9c22..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/ComplexSchur_matrixU.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXcf A = MatrixXcf::Random(4,4); -cout << "Here is a random 4x4 matrix, A:" << endl << A << endl << endl; -ComplexSchur schurOfA(A); -cout << "The unitary matrix U is:" << endl << schurOfA.matrixU() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_abs.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_abs.cpp deleted file mode 100644 index 0aeec3a4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_abs.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(1,-2,-3); -cout << v.abs() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_abs2.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_abs2.cpp deleted file mode 100644 index 2c4f9b34..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_abs2.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(1,-2,-3); -cout << v.abs2() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_acos.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_acos.cpp deleted file mode 100644 index 34432cba..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_acos.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(0, sqrt(2.)/2, 1); -cout << v.acos() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_arg.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_arg.cpp deleted file mode 100644 index 3f45133b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_arg.cpp +++ /dev/null @@ -1,3 +0,0 @@ -ArrayXcf v = ArrayXcf::Random(3); -cout << v << endl << endl; -cout << arg(v) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_array_power_array.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_array_power_array.cpp deleted file mode 100644 index 432a76ee..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_array_power_array.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Array x(8,25,3), - e(1./3.,0.5,2.); -cout << "[" << x << "]^[" << e << "] = " << x.pow(e) << endl; // using ArrayBase::pow -cout << "[" << x << "]^[" << e << "] = " << pow(x,e) << endl; // using Eigen::pow diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_asin.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_asin.cpp deleted file mode 100644 index 8dad838f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_asin.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(0, sqrt(2.)/2, 1); -cout << v.asin() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_atan.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_atan.cpp deleted file mode 100644 index 44684472..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_atan.cpp +++ /dev/null @@ -1,2 +0,0 @@ -ArrayXd v = ArrayXd::LinSpaced(5,0,1); -cout << v.atan() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_boolean_and.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_boolean_and.cpp deleted file mode 100644 index df6b60d9..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_boolean_and.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(-1,2,1), w(-3,2,3); -cout << ((vw) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_greater_equal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_greater_equal.cpp deleted file mode 100644 index 6a08f894..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_greater_equal.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(1,2,3), w(3,2,1); -cout << (v>=w) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_inverse.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_inverse.cpp deleted file mode 100644 index 3967a7ec..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_inverse.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(2,3,4); -cout << v.inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isFinite.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isFinite.cpp deleted file mode 100644 index 1da55fd1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isFinite.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Array3d v(1,2,3); -v(1) *= 0.0/0.0; -v(2) /= 0.0; -cout << v << endl << endl; -cout << isfinite(v) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isInf.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isInf.cpp deleted file mode 100644 index be793081..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isInf.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Array3d v(1,2,3); -v(1) *= 0.0/0.0; -v(2) /= 0.0; -cout << v << endl << endl; -cout << isinf(v) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isNaN.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isNaN.cpp deleted file mode 100644 index 7b2a9308..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_isNaN.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Array3d v(1,2,3); -v(1) *= 0.0/0.0; -v(2) /= 0.0; -cout << v << endl << endl; -cout << isnan(v) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_less.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_less.cpp deleted file mode 100644 index cafd3b6e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_less.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(1,2,3), w(3,2,1); -cout << (v e(2,-3,1./3.); -cout << "10^[" << e << "] = " << pow(10,e) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sign.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sign.cpp deleted file mode 100644 index 49920e4f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sign.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(-3,5,0); -cout << v.sign() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sin.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sin.cpp deleted file mode 100644 index 46fa908c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sin.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(M_PI, M_PI/2, M_PI/3); -cout << v.sin() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sinh.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sinh.cpp deleted file mode 100644 index fac9b19a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sinh.cpp +++ /dev/null @@ -1,2 +0,0 @@ -ArrayXd v = ArrayXd::LinSpaced(5,0,1); -cout << sinh(v) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_slash_equal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_slash_equal.cpp deleted file mode 100644 index 2efd32d8..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_slash_equal.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Array3d v(3,2,4), w(5,4,2); -v /= w; -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sqrt.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sqrt.cpp deleted file mode 100644 index 97bafe8b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_sqrt.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(1,2,4); -cout << v.sqrt() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_square.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_square.cpp deleted file mode 100644 index f704c5e0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_square.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(2,3,4); -cout << v.square() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_tan.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_tan.cpp deleted file mode 100644 index b758ef04..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_tan.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Array3d v(M_PI, M_PI/2, M_PI/3); -cout << v.tan() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_tanh.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_tanh.cpp deleted file mode 100644 index 30cd0450..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_tanh.cpp +++ /dev/null @@ -1,2 +0,0 @@ -ArrayXd v = ArrayXd::LinSpaced(5,0,1); -cout << tanh(v) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_times_equal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Cwise_times_equal.cpp deleted file mode 100644 index 147556c7..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Cwise_times_equal.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Array3d v(1,2,3), w(2,3,0); -v *= w; -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpaced.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpaced.cpp deleted file mode 100644 index 8e54b17f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpaced.cpp +++ /dev/null @@ -1,2 +0,0 @@ -cout << VectorXi::LinSpaced(4,7,10).transpose() << endl; -cout << VectorXd::LinSpaced(5,0.0,1.0).transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpacedInt.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpacedInt.cpp deleted file mode 100644 index 0d7ae068..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpacedInt.cpp +++ /dev/null @@ -1,8 +0,0 @@ -cout << "Even spacing inputs:" << endl; -cout << VectorXi::LinSpaced(8,1,4).transpose() << endl; -cout << VectorXi::LinSpaced(8,1,8).transpose() << endl; -cout << VectorXi::LinSpaced(8,1,15).transpose() << endl; -cout << "Uneven spacing inputs:" << endl; -cout << VectorXi::LinSpaced(8,1,7).transpose() << endl; -cout << VectorXi::LinSpaced(8,1,9).transpose() << endl; -cout << VectorXi::LinSpaced(8,1,16).transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpaced_seq.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpaced_seq.cpp deleted file mode 100644 index f55c5085..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_LinSpaced_seq.cpp +++ /dev/null @@ -1,2 +0,0 @@ -cout << VectorXi::LinSpaced(Sequential,4,7,10).transpose() << endl; -cout << VectorXd::LinSpaced(Sequential,5,0.0,1.0).transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_setLinSpaced.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_setLinSpaced.cpp deleted file mode 100644 index 46054f23..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DenseBase_setLinSpaced.cpp +++ /dev/null @@ -1,3 +0,0 @@ -VectorXf v; -v.setLinSpaced(5,0.5f,1.5f); -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_hnormalized.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_hnormalized.cpp deleted file mode 100644 index 3410790a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_hnormalized.cpp +++ /dev/null @@ -1,7 +0,0 @@ -typedef Matrix Matrix4Xd; -Matrix4Xd M = Matrix4Xd::Random(4,5); -Projective3d P(Matrix4d::Random()); -cout << "The matrix M is:" << endl << M << endl << endl; -cout << "M.colwise().hnormalized():" << endl << M.colwise().hnormalized() << endl << endl; -cout << "P*M:" << endl << P*M << endl << endl; -cout << "(P*M).colwise().hnormalized():" << endl << (P*M).colwise().hnormalized() << endl << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_replicate.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_replicate.cpp deleted file mode 100644 index d92d4a35..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_replicate.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXi m = MatrixXi::Random(2,3); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "m.colwise().replicate<3>() = ..." << endl; -cout << m.colwise().replicate<3>() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_replicate_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_replicate_int.cpp deleted file mode 100644 index f9b1b535..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/DirectionWise_replicate_int.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Vector3i v = Vector3i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "v.rowwise().replicate(5) = ..." << endl; -cout << v.rowwise().replicate(5) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_EigenSolver_MatrixType.cpp b/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_EigenSolver_MatrixType.cpp deleted file mode 100644 index c1d9fa87..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_EigenSolver_MatrixType.cpp +++ /dev/null @@ -1,16 +0,0 @@ -MatrixXd A = MatrixXd::Random(6,6); -cout << "Here is a random 6x6 matrix, A:" << endl << A << endl << endl; - -EigenSolver es(A); -cout << "The eigenvalues of A are:" << endl << es.eigenvalues() << endl; -cout << "The matrix of eigenvectors, V, is:" << endl << es.eigenvectors() << endl << endl; - -complex lambda = es.eigenvalues()[0]; -cout << "Consider the first eigenvalue, lambda = " << lambda << endl; -VectorXcd v = es.eigenvectors().col(0); -cout << "If v is the corresponding eigenvector, then lambda * v = " << endl << lambda * v << endl; -cout << "... and A * v = " << endl << A.cast >() * v << endl << endl; - -MatrixXcd D = es.eigenvalues().asDiagonal(); -MatrixXcd V = es.eigenvectors(); -cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_compute.cpp deleted file mode 100644 index a5c96e9b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_compute.cpp +++ /dev/null @@ -1,6 +0,0 @@ -EigenSolver es; -MatrixXf A = MatrixXf::Random(4,4); -es.compute(A, /* computeEigenvectors = */ false); -cout << "The eigenvalues of A are: " << es.eigenvalues().transpose() << endl; -es.compute(A + MatrixXf::Identity(4,4), false); // re-use es to compute eigenvalues of A+I -cout << "The eigenvalues of A+I are: " << es.eigenvalues().transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_eigenvalues.cpp b/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_eigenvalues.cpp deleted file mode 100644 index ed28869a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_eigenvalues.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -EigenSolver es(ones, false); -cout << "The eigenvalues of the 3x3 matrix of ones are:" - << endl << es.eigenvalues() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_eigenvectors.cpp b/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_eigenvectors.cpp deleted file mode 100644 index 8355f76c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_eigenvectors.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -EigenSolver es(ones); -cout << "The first eigenvector of the 3x3 matrix of ones is:" - << endl << es.eigenvectors().col(0) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_pseudoEigenvectors.cpp b/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_pseudoEigenvectors.cpp deleted file mode 100644 index 85e2569d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/EigenSolver_pseudoEigenvectors.cpp +++ /dev/null @@ -1,9 +0,0 @@ -MatrixXd A = MatrixXd::Random(6,6); -cout << "Here is a random 6x6 matrix, A:" << endl << A << endl << endl; - -EigenSolver es(A); -MatrixXd D = es.pseudoEigenvalueMatrix(); -MatrixXd V = es.pseudoEigenvectors(); -cout << "The pseudo-eigenvalue matrix D is:" << endl << D << endl; -cout << "The pseudo-eigenvector matrix V is:" << endl << V << endl; -cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/FullPivHouseholderQR_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/FullPivHouseholderQR_solve.cpp deleted file mode 100644 index 23bc0749..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/FullPivHouseholderQR_solve.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix3f m = Matrix3f::Random(); -Matrix3f y = Matrix3f::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the matrix y:" << endl << y << endl; -Matrix3f x; -x = m.fullPivHouseholderQr().solve(y); -assert(y.isApprox(m*x)); -cout << "Here is a solution x to the equation mx=y:" << endl << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_image.cpp b/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_image.cpp deleted file mode 100644 index 817bc1e2..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_image.cpp +++ /dev/null @@ -1,9 +0,0 @@ -Matrix3d m; -m << 1,1,0, - 1,3,2, - 0,1,1; -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Notice that the middle column is the sum of the two others, so the " - << "columns are linearly dependent." << endl; -cout << "Here is a matrix whose columns have the same span but are linearly independent:" - << endl << m.fullPivLu().image(m) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_kernel.cpp b/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_kernel.cpp deleted file mode 100644 index 7086e01e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_kernel.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXf m = MatrixXf::Random(3,5); -cout << "Here is the matrix m:" << endl << m << endl; -MatrixXf ker = m.fullPivLu().kernel(); -cout << "Here is a matrix whose columns form a basis of the kernel of m:" - << endl << ker << endl; -cout << "By definition of the kernel, m*ker is zero:" - << endl << m*ker << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_solve.cpp deleted file mode 100644 index c1f88235..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/FullPivLU_solve.cpp +++ /dev/null @@ -1,11 +0,0 @@ -Matrix m = Matrix::Random(); -Matrix2f y = Matrix2f::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the matrix y:" << endl << y << endl; -Matrix x = m.fullPivLu().solve(y); -if((m*x).isApprox(y)) -{ - cout << "Here is a solution x to the equation mx=y:" << endl << x << endl; -} -else - cout << "The equation mx=y does not have any solution." << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/GeneralizedEigenSolver.cpp b/testbed/nanogui/ext/eigen/doc/snippets/GeneralizedEigenSolver.cpp deleted file mode 100644 index 2acda45f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/GeneralizedEigenSolver.cpp +++ /dev/null @@ -1,7 +0,0 @@ -GeneralizedEigenSolver ges; -MatrixXf A = MatrixXf::Random(4,4); -MatrixXf B = MatrixXf::Random(4,4); -ges.compute(A, B); -cout << "The (complex) numerators of the generalzied eigenvalues are: " << ges.alphas().transpose() << endl; -cout << "The (real) denominatore of the generalzied eigenvalues are: " << ges.betas().transpose() << endl; -cout << "The (complex) generalzied eigenvalues are (alphas./beta): " << ges.eigenvalues().transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_compute.cpp deleted file mode 100644 index 50e37833..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_compute.cpp +++ /dev/null @@ -1,6 +0,0 @@ -MatrixXcf A = MatrixXcf::Random(4,4); -HessenbergDecomposition hd(4); -hd.compute(A); -cout << "The matrix H in the decomposition of A is:" << endl << hd.matrixH() << endl; -hd.compute(2*A); // re-use hd to compute and store decomposition of 2A -cout << "The matrix H in the decomposition of 2A is:" << endl << hd.matrixH() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_matrixH.cpp b/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_matrixH.cpp deleted file mode 100644 index af013666..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_matrixH.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix4f A = MatrixXf::Random(4,4); -cout << "Here is a random 4x4 matrix:" << endl << A << endl; -HessenbergDecomposition hessOfA(A); -MatrixXf H = hessOfA.matrixH(); -cout << "The Hessenberg matrix H is:" << endl << H << endl; -MatrixXf Q = hessOfA.matrixQ(); -cout << "The orthogonal matrix Q is:" << endl << Q << endl; -cout << "Q H Q^T is:" << endl << Q * H * Q.transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_packedMatrix.cpp b/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_packedMatrix.cpp deleted file mode 100644 index 4fa5957e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/HessenbergDecomposition_packedMatrix.cpp +++ /dev/null @@ -1,9 +0,0 @@ -Matrix4d A = Matrix4d::Random(4,4); -cout << "Here is a random 4x4 matrix:" << endl << A << endl; -HessenbergDecomposition hessOfA(A); -Matrix4d pm = hessOfA.packedMatrix(); -cout << "The packed matrix M is:" << endl << pm << endl; -cout << "The upper Hessenberg part corresponds to the matrix H, which is:" - << endl << hessOfA.matrixH() << endl; -Vector3d hc = hessOfA.householderCoefficients(); -cout << "The vector of Householder coefficients is:" << endl << hc << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/HouseholderQR_householderQ.cpp b/testbed/nanogui/ext/eigen/doc/snippets/HouseholderQR_householderQ.cpp deleted file mode 100644 index e859ce55..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/HouseholderQR_householderQ.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXf A(MatrixXf::Random(5,3)), thinQ(MatrixXf::Identity(5,3)), Q; -A.setRandom(); -HouseholderQR qr(A); -Q = qr.householderQ(); -thinQ = qr.householderQ() * thinQ; -std::cout << "The complete unitary matrix Q is:\n" << Q << "\n\n"; -std::cout << "The thin matrix Q is:\n" << thinQ << "\n\n"; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/HouseholderQR_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/HouseholderQR_solve.cpp deleted file mode 100644 index 8cce6ce6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/HouseholderQR_solve.cpp +++ /dev/null @@ -1,9 +0,0 @@ -typedef Matrix Matrix3x3; -Matrix3x3 m = Matrix3x3::Random(); -Matrix3f y = Matrix3f::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the matrix y:" << endl << y << endl; -Matrix3f x; -x = m.householderQr().solve(y); -assert(y.isApprox(m*x)); -cout << "Here is a solution x to the equation mx=y:" << endl << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/HouseholderSequence_HouseholderSequence.cpp b/testbed/nanogui/ext/eigen/doc/snippets/HouseholderSequence_HouseholderSequence.cpp deleted file mode 100644 index 2632b83b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/HouseholderSequence_HouseholderSequence.cpp +++ /dev/null @@ -1,31 +0,0 @@ -Matrix3d v = Matrix3d::Random(); -cout << "The matrix v is:" << endl; -cout << v << endl; - -Vector3d v0(1, v(1,0), v(2,0)); -cout << "The first Householder vector is: v_0 = " << v0.transpose() << endl; -Vector3d v1(0, 1, v(2,1)); -cout << "The second Householder vector is: v_1 = " << v1.transpose() << endl; -Vector3d v2(0, 0, 1); -cout << "The third Householder vector is: v_2 = " << v2.transpose() << endl; - -Vector3d h = Vector3d::Random(); -cout << "The Householder coefficients are: h = " << h.transpose() << endl; - -Matrix3d H0 = Matrix3d::Identity() - h(0) * v0 * v0.adjoint(); -cout << "The first Householder reflection is represented by H_0 = " << endl; -cout << H0 << endl; -Matrix3d H1 = Matrix3d::Identity() - h(1) * v1 * v1.adjoint(); -cout << "The second Householder reflection is represented by H_1 = " << endl; -cout << H1 << endl; -Matrix3d H2 = Matrix3d::Identity() - h(2) * v2 * v2.adjoint(); -cout << "The third Householder reflection is represented by H_2 = " << endl; -cout << H2 << endl; -cout << "Their product is H_0 H_1 H_2 = " << endl; -cout << H0 * H1 * H2 << endl; - -HouseholderSequence hhSeq(v, h); -Matrix3d hhSeqAsMatrix(hhSeq); -cout << "If we construct a HouseholderSequence from v and h" << endl; -cout << "and convert it to a matrix, we get:" << endl; -cout << hhSeqAsMatrix << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/IOFormat.cpp b/testbed/nanogui/ext/eigen/doc/snippets/IOFormat.cpp deleted file mode 100644 index 735f5dd8..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/IOFormat.cpp +++ /dev/null @@ -1,14 +0,0 @@ -std::string sep = "\n----------------------------------------\n"; -Matrix3d m1; -m1 << 1.111111, 2, 3.33333, 4, 5, 6, 7, 8.888888, 9; - -IOFormat CommaInitFmt(StreamPrecision, DontAlignCols, ", ", ", ", "", "", " << ", ";"); -IOFormat CleanFmt(4, 0, ", ", "\n", "[", "]"); -IOFormat OctaveFmt(StreamPrecision, 0, ", ", ";\n", "", "", "[", "]"); -IOFormat HeavyFmt(FullPrecision, 0, ", ", ";\n", "[", "]", "[", "]"); - -std::cout << m1 << sep; -std::cout << m1.format(CommaInitFmt) << sep; -std::cout << m1.format(CleanFmt) << sep; -std::cout << m1.format(OctaveFmt) << sep; -std::cout << m1.format(HeavyFmt) << sep; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/JacobiSVD_basic.cpp b/testbed/nanogui/ext/eigen/doc/snippets/JacobiSVD_basic.cpp deleted file mode 100644 index ab24b9bc..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/JacobiSVD_basic.cpp +++ /dev/null @@ -1,9 +0,0 @@ -MatrixXf m = MatrixXf::Random(3,2); -cout << "Here is the matrix m:" << endl << m << endl; -JacobiSVD svd(m, ComputeThinU | ComputeThinV); -cout << "Its singular values are:" << endl << svd.singularValues() << endl; -cout << "Its left singular vectors are the columns of the thin U matrix:" << endl << svd.matrixU() << endl; -cout << "Its right singular vectors are the columns of the thin V matrix:" << endl << svd.matrixV() << endl; -Vector3f rhs(1, 0, 0); -cout << "Now consider this rhs vector:" << endl << rhs << endl; -cout << "A least-squares solution of m*x = rhs is:" << endl << svd.solve(rhs) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Jacobi_makeGivens.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Jacobi_makeGivens.cpp deleted file mode 100644 index 4b733c30..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Jacobi_makeGivens.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Vector2f v = Vector2f::Random(); -JacobiRotation G; -G.makeGivens(v.x(), v.y()); -cout << "Here is the vector v:" << endl << v << endl; -v.applyOnTheLeft(0, 1, G.adjoint()); -cout << "Here is the vector J' * v:" << endl << v << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Jacobi_makeJacobi.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Jacobi_makeJacobi.cpp deleted file mode 100644 index 0cc331d9..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Jacobi_makeJacobi.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix2f m = Matrix2f::Random(); -m = (m + m.adjoint()).eval(); -JacobiRotation J; -J.makeJacobi(m, 0, 1); -cout << "Here is the matrix m:" << endl << m << endl; -m.applyOnTheLeft(0, 1, J.adjoint()); -m.applyOnTheRight(0, 1, J); -cout << "Here is the matrix J' * m * J:" << endl << m << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/LLT_example.cpp b/testbed/nanogui/ext/eigen/doc/snippets/LLT_example.cpp deleted file mode 100644 index 46fb4070..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/LLT_example.cpp +++ /dev/null @@ -1,12 +0,0 @@ -MatrixXd A(3,3); -A << 4,-1,2, -1,6,0, 2,0,5; -cout << "The matrix A is" << endl << A << endl; - -LLT lltOfA(A); // compute the Cholesky decomposition of A -MatrixXd L = lltOfA.matrixL(); // retrieve factor L in the decomposition -// The previous two lines can also be written as "L = A.llt().matrixL()" - -cout << "The Cholesky factor L is" << endl << L << endl; -cout << "To check this, let us compute L * L.transpose()" << endl; -cout << L * L.transpose() << endl; -cout << "This should equal the matrix A" << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/LLT_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/LLT_solve.cpp deleted file mode 100644 index 7095d2cc..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/LLT_solve.cpp +++ /dev/null @@ -1,8 +0,0 @@ -typedef Matrix DataMatrix; -// let's generate some samples on the 3D plane of equation z = 2x+3y (with some noise) -DataMatrix samples = DataMatrix::Random(12,2); -VectorXf elevations = 2*samples.col(0) + 3*samples.col(1) + VectorXf::Random(12)*0.1; -// and let's solve samples * [x y]^T = elevations in least square sense: -Matrix xy - = (samples.adjoint() * samples).llt().solve((samples.adjoint()*elevations)); -cout << xy << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/LeastSquaresNormalEquations.cpp b/testbed/nanogui/ext/eigen/doc/snippets/LeastSquaresNormalEquations.cpp deleted file mode 100644 index 997cf171..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/LeastSquaresNormalEquations.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXf A = MatrixXf::Random(3, 2); -VectorXf b = VectorXf::Random(3); -cout << "The solution using normal equations is:\n" - << (A.transpose() * A).ldlt().solve(A.transpose() * b) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/LeastSquaresQR.cpp b/testbed/nanogui/ext/eigen/doc/snippets/LeastSquaresQR.cpp deleted file mode 100644 index 6c970454..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/LeastSquaresQR.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXf A = MatrixXf::Random(3, 2); -VectorXf b = VectorXf::Random(3); -cout << "The solution using the QR decomposition is:\n" - << A.colPivHouseholderQr().solve(b) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Map_general_stride.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Map_general_stride.cpp deleted file mode 100644 index 0657e7f8..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Map_general_stride.cpp +++ /dev/null @@ -1,5 +0,0 @@ -int array[24]; -for(int i = 0; i < 24; ++i) array[i] = i; -cout << Map > - (array, 3, 3, Stride(8, 2)) - << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Map_inner_stride.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Map_inner_stride.cpp deleted file mode 100644 index d95ae9b3..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Map_inner_stride.cpp +++ /dev/null @@ -1,5 +0,0 @@ -int array[12]; -for(int i = 0; i < 12; ++i) array[i] = i; -cout << Map > - (array, 6) // the inner stride has already been passed as template parameter - << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Map_outer_stride.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Map_outer_stride.cpp deleted file mode 100644 index 2f6f052c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Map_outer_stride.cpp +++ /dev/null @@ -1,3 +0,0 @@ -int array[12]; -for(int i = 0; i < 12; ++i) array[i] = i; -cout << Map >(array, 3, 3, OuterStride<>(4)) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Map_placement_new.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Map_placement_new.cpp deleted file mode 100644 index 2e40eca3..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Map_placement_new.cpp +++ /dev/null @@ -1,5 +0,0 @@ -int data[] = {1,2,3,4,5,6,7,8,9}; -Map v(data,4); -cout << "The mapped vector v is: " << v << "\n"; -new (&v) Map(data+4,5); -cout << "Now v is: " << v << "\n"; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Map_simple.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Map_simple.cpp deleted file mode 100644 index 423bb52a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Map_simple.cpp +++ /dev/null @@ -1,3 +0,0 @@ -int array[9]; -for(int i = 0; i < 9; ++i) array[i] = i; -cout << Map(array) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_adjoint.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_adjoint.cpp deleted file mode 100644 index 4680d593..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_adjoint.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix2cf m = Matrix2cf::Random(); -cout << "Here is the 2x2 complex matrix m:" << endl << m << endl; -cout << "Here is the adjoint of m:" << endl << m.adjoint() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_all.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_all.cpp deleted file mode 100644 index 46f26f18..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_all.cpp +++ /dev/null @@ -1,7 +0,0 @@ -Vector3f boxMin(Vector3f::Zero()), boxMax(Vector3f::Ones()); -Vector3f p0 = Vector3f::Random(), p1 = Vector3f::Random().cwiseAbs(); -// let's check if p0 and p1 are inside the axis aligned box defined by the corners boxMin,boxMax: -cout << "Is (" << p0.transpose() << ") inside the box: " - << ((boxMin.array()p0.array()).all()) << endl; -cout << "Is (" << p1.transpose() << ") inside the box: " - << ((boxMin.array()p1.array()).all()) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_applyOnTheLeft.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_applyOnTheLeft.cpp deleted file mode 100644 index 6398c873..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_applyOnTheLeft.cpp +++ /dev/null @@ -1,7 +0,0 @@ -Matrix3f A = Matrix3f::Random(3,3), B; -B << 0,1,0, - 0,0,1, - 1,0,0; -cout << "At start, A = " << endl << A << endl; -A.applyOnTheLeft(B); -cout << "After applyOnTheLeft, A = " << endl << A << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_applyOnTheRight.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_applyOnTheRight.cpp deleted file mode 100644 index e4b71b2d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_applyOnTheRight.cpp +++ /dev/null @@ -1,9 +0,0 @@ -Matrix3f A = Matrix3f::Random(3,3), B; -B << 0,1,0, - 0,0,1, - 1,0,0; -cout << "At start, A = " << endl << A << endl; -A *= B; -cout << "After A *= B, A = " << endl << A << endl; -A.applyOnTheRight(B); // equivalent to A *= B -cout << "After applyOnTheRight, A = " << endl << A << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_array.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_array.cpp deleted file mode 100644 index f215086d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_array.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Vector3d v(1,2,3); -v.array() += 3; -v.array() -= 2; -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_array_const.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_array_const.cpp deleted file mode 100644 index cd3b26a7..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_array_const.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Vector3d v(-1,2,-3); -cout << "the absolute values:" << endl << v.array().abs() << endl; -cout << "the absolute values plus one:" << endl << v.array().abs()+1 << endl; -cout << "sum of the squares: " << v.array().square().sum() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_asDiagonal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_asDiagonal.cpp deleted file mode 100644 index b01082db..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_asDiagonal.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << Matrix3i(Vector3i(2,5,6).asDiagonal()) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_block_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_block_int_int.cpp deleted file mode 100644 index f99b6d4c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_block_int_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.block<2,2>(1,1):" << endl << m.block<2,2>(1,1) << endl; -m.block<2,2>(1,1).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_block_int_int_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_block_int_int_int_int.cpp deleted file mode 100644 index 7238cbbe..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_block_int_int_int_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.block(1, 1, 2, 2):" << endl << m.block(1, 1, 2, 2) << endl; -m.block(1, 1, 2, 2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomLeftCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomLeftCorner_int_int.cpp deleted file mode 100644 index ebae95e1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomLeftCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.bottomLeftCorner(2, 2):" << endl; -cout << m.bottomLeftCorner(2, 2) << endl; -m.bottomLeftCorner(2, 2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomRightCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomRightCorner_int_int.cpp deleted file mode 100644 index bf05093a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomRightCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.bottomRightCorner(2, 2):" << endl; -cout << m.bottomRightCorner(2, 2) << endl; -m.bottomRightCorner(2, 2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomRows_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomRows_int.cpp deleted file mode 100644 index 47ca92ec..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_bottomRows_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.bottomRows(2):" << endl; -cout << a.bottomRows(2) << endl; -a.bottomRows(2).setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cast.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cast.cpp deleted file mode 100644 index 016880b4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cast.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix2d md = Matrix2d::Identity() * 0.45; -Matrix2f mf = Matrix2f::Identity(); -cout << md + mf.cast() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_col.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_col.cpp deleted file mode 100644 index 87c91b12..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_col.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Identity(); -m.col(1) = Vector3d(4,5,6); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_colwise.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_colwise.cpp deleted file mode 100644 index a048beff..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_colwise.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the sum of each column:" << endl << m.colwise().sum() << endl; -cout << "Here is the maximum absolute value of each column:" - << endl << m.cwiseAbs().colwise().maxCoeff() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_computeInverseAndDetWithCheck.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_computeInverseAndDetWithCheck.cpp deleted file mode 100644 index a7b084fd..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_computeInverseAndDetWithCheck.cpp +++ /dev/null @@ -1,13 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -Matrix3d inverse; -bool invertible; -double determinant; -m.computeInverseAndDetWithCheck(inverse,determinant,invertible); -cout << "Its determinant is " << determinant << endl; -if(invertible) { - cout << "It is invertible, and its inverse is:" << endl << inverse << endl; -} -else { - cout << "It is not invertible." << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_computeInverseWithCheck.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_computeInverseWithCheck.cpp deleted file mode 100644 index 873a9f87..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_computeInverseWithCheck.cpp +++ /dev/null @@ -1,11 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -Matrix3d inverse; -bool invertible; -m.computeInverseWithCheck(inverse,invertible); -if(invertible) { - cout << "It is invertible, and its inverse is:" << endl << inverse << endl; -} -else { - cout << "It is not invertible." << endl; -} diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseAbs.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseAbs.cpp deleted file mode 100644 index 28a31600..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseAbs.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd m(2,3); -m << 2, -4, 6, - -5, 1, 0; -cout << m.cwiseAbs() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseAbs2.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseAbs2.cpp deleted file mode 100644 index 889a2e2b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseAbs2.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd m(2,3); -m << 2, -4, 6, - -5, 1, 0; -cout << m.cwiseAbs2() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseEqual.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseEqual.cpp deleted file mode 100644 index eb3656f4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseEqual.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXi m(2,2); -m << 1, 0, - 1, 1; -cout << "Comparing m with identity matrix:" << endl; -cout << m.cwiseEqual(MatrixXi::Identity(2,2)) << endl; -int count = m.cwiseEqual(MatrixXi::Identity(2,2)).count(); -cout << "Number of coefficients that are equal: " << count << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseInverse.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseInverse.cpp deleted file mode 100644 index 23e08f7b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseInverse.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd m(2,3); -m << 2, 0.5, 1, - 3, 0.25, 1; -cout << m.cwiseInverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseMax.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseMax.cpp deleted file mode 100644 index 3c956818..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseMax.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Vector3d v(2,3,4), w(4,2,3); -cout << v.cwiseMax(w) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseMin.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseMin.cpp deleted file mode 100644 index 82fc761e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseMin.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Vector3d v(2,3,4), w(4,2,3); -cout << v.cwiseMin(w) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseNotEqual.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseNotEqual.cpp deleted file mode 100644 index 6a2e4fb6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseNotEqual.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXi m(2,2); -m << 1, 0, - 1, 1; -cout << "Comparing m with identity matrix:" << endl; -cout << m.cwiseNotEqual(MatrixXi::Identity(2,2)) << endl; -int count = m.cwiseNotEqual(MatrixXi::Identity(2,2)).count(); -cout << "Number of coefficients that are not equal: " << count << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseProduct.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseProduct.cpp deleted file mode 100644 index 1db3a113..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseProduct.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Matrix3i a = Matrix3i::Random(), b = Matrix3i::Random(); -Matrix3i c = a.cwiseProduct(b); -cout << "a:\n" << a << "\nb:\n" << b << "\nc:\n" << c << endl; - diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseQuotient.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseQuotient.cpp deleted file mode 100644 index 96912120..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseQuotient.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Vector3d v(2,3,4), w(4,2,3); -cout << v.cwiseQuotient(w) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseSign.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseSign.cpp deleted file mode 100644 index efd71795..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseSign.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd m(2,3); -m << 2, -4, 6, - -5, 1, 0; -cout << m.cwiseSign() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseSqrt.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseSqrt.cpp deleted file mode 100644 index 4bfd75d5..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_cwiseSqrt.cpp +++ /dev/null @@ -1,2 +0,0 @@ -Vector3d v(1,2,4); -cout << v.cwiseSqrt() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal.cpp deleted file mode 100644 index cd63413f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Matrix3i m = Matrix3i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here are the coefficients on the main diagonal of m:" << endl - << m.diagonal() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal_int.cpp deleted file mode 100644 index 7b66abf6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here are the coefficients on the 1st super-diagonal and 2nd sub-diagonal of m:" << endl - << m.diagonal(1).transpose() << endl - << m.diagonal(-2).transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal_template_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal_template_int.cpp deleted file mode 100644 index 0e73d1c1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_diagonal_template_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here are the coefficients on the 1st super-diagonal and 2nd sub-diagonal of m:" << endl - << m.diagonal<1>().transpose() << endl - << m.diagonal<-2>().transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_eigenvalues.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_eigenvalues.cpp deleted file mode 100644 index 039f8870..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_eigenvalues.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -VectorXcd eivals = ones.eigenvalues(); -cout << "The eigenvalues of the 3x3 matrix of ones are:" << endl << eivals << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_end_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_end_int.cpp deleted file mode 100644 index 03c54a93..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_end_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -RowVector4i v = RowVector4i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "Here is v.tail(2):" << endl << v.tail(2) << endl; -v.tail(2).setZero(); -cout << "Now the vector v is:" << endl << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_eval.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_eval.cpp deleted file mode 100644 index 1df3aa01..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_eval.cpp +++ /dev/null @@ -1,12 +0,0 @@ -Matrix2f M = Matrix2f::Random(); -Matrix2f m; -m = M; -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Now we want to copy a column into a row." << endl; -cout << "If we do m.col(1) = m.row(0), then m becomes:" << endl; -m.col(1) = m.row(0); -cout << m << endl << "which is wrong!" << endl; -cout << "Now let us instead do m.col(1) = m.row(0).eval(). Then m becomes" << endl; -m = M; -m.col(1) = m.row(0).eval(); -cout << m << endl << "which is right." << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_fixedBlock_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_fixedBlock_int_int.cpp deleted file mode 100644 index 32011274..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_fixedBlock_int_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix4d m = Vector4d(1,2,3,4).asDiagonal(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.fixed<2, 2>(2, 2):" << endl << m.block<2, 2>(2, 2) << endl; -m.block<2, 2>(2, 0) = m.block<2, 2>(2, 2); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_hnormalized.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_hnormalized.cpp deleted file mode 100644 index 652cd77c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_hnormalized.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Vector4d v = Vector4d::Random(); -Projective3d P(Matrix4d::Random()); -cout << "v = " << v.transpose() << "]^T" << endl; -cout << "v.hnormalized() = " << v.hnormalized().transpose() << "]^T" << endl; -cout << "P*v = " << (P*v).transpose() << "]^T" << endl; -cout << "(P*v).hnormalized() = " << (P*v).hnormalized().transpose() << "]^T" << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_homogeneous.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_homogeneous.cpp deleted file mode 100644 index 457c28f9..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_homogeneous.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Vector3d v = Vector3d::Random(), w; -Projective3d P(Matrix4d::Random()); -cout << "v = [" << v.transpose() << "]^T" << endl; -cout << "h.homogeneous() = [" << v.homogeneous().transpose() << "]^T" << endl; -cout << "(P * v.homogeneous()) = [" << (P * v.homogeneous()).transpose() << "]^T" << endl; -cout << "(P * v.homogeneous()).hnormalized() = [" << (P * v.homogeneous()).eval().hnormalized().transpose() << "]^T" << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_identity.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_identity.cpp deleted file mode 100644 index b5c1e59c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_identity.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << Matrix::Identity() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_identity_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_identity_int_int.cpp deleted file mode 100644 index 918649d6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_identity_int_int.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << MatrixXd::Identity(4, 3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_inverse.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_inverse.cpp deleted file mode 100644 index a56142ee..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_inverse.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Its inverse is:" << endl << m.inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isDiagonal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isDiagonal.cpp deleted file mode 100644 index 5b1d5997..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isDiagonal.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix3d m = 10000 * Matrix3d::Identity(); -m(0,2) = 1; -cout << "Here's the matrix m:" << endl << m << endl; -cout << "m.isDiagonal() returns: " << m.isDiagonal() << endl; -cout << "m.isDiagonal(1e-3) returns: " << m.isDiagonal(1e-3) << endl; - diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isIdentity.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isIdentity.cpp deleted file mode 100644 index 17b756c9..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isIdentity.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Identity(); -m(0,2) = 1e-4; -cout << "Here's the matrix m:" << endl << m << endl; -cout << "m.isIdentity() returns: " << m.isIdentity() << endl; -cout << "m.isIdentity(1e-3) returns: " << m.isIdentity(1e-3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isOnes.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isOnes.cpp deleted file mode 100644 index f82f6280..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isOnes.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Ones(); -m(0,2) += 1e-4; -cout << "Here's the matrix m:" << endl << m << endl; -cout << "m.isOnes() returns: " << m.isOnes() << endl; -cout << "m.isOnes(1e-3) returns: " << m.isOnes(1e-3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isOrthogonal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isOrthogonal.cpp deleted file mode 100644 index b22af066..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isOrthogonal.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Vector3d v(1,0,0); -Vector3d w(1e-4,0,1); -cout << "Here's the vector v:" << endl << v << endl; -cout << "Here's the vector w:" << endl << w << endl; -cout << "v.isOrthogonal(w) returns: " << v.isOrthogonal(w) << endl; -cout << "v.isOrthogonal(w,1e-3) returns: " << v.isOrthogonal(w,1e-3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isUnitary.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isUnitary.cpp deleted file mode 100644 index 3877da34..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isUnitary.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Identity(); -m(0,2) = 1e-4; -cout << "Here's the matrix m:" << endl << m << endl; -cout << "m.isUnitary() returns: " << m.isUnitary() << endl; -cout << "m.isUnitary(1e-3) returns: " << m.isUnitary(1e-3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isZero.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isZero.cpp deleted file mode 100644 index c2cfe220..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_isZero.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Zero(); -m(0,2) = 1e-4; -cout << "Here's the matrix m:" << endl << m << endl; -cout << "m.isZero() returns: " << m.isZero() << endl; -cout << "m.isZero(1e-3) returns: " << m.isZero(1e-3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_leftCols_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_leftCols_int.cpp deleted file mode 100644 index 6ea984e4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_leftCols_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.leftCols(2):" << endl; -cout << a.leftCols(2) << endl; -a.leftCols(2).setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_noalias.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_noalias.cpp deleted file mode 100644 index 3b54a79a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_noalias.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix2d a, b, c; a << 1,2,3,4; b << 5,6,7,8; -c.noalias() = a * b; // this computes the product directly to c -cout << c << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones.cpp deleted file mode 100644 index 02c767c9..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones.cpp +++ /dev/null @@ -1,2 +0,0 @@ -cout << Matrix2d::Ones() << endl; -cout << 6 * RowVector4i::Ones() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones_int.cpp deleted file mode 100644 index 2ef188e7..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones_int.cpp +++ /dev/null @@ -1,2 +0,0 @@ -cout << 6 * RowVectorXi::Ones(4) << endl; -cout << VectorXf::Ones(2) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones_int_int.cpp deleted file mode 100644 index 60f5a31e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_ones_int_int.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << MatrixXi::Ones(2,3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_operatorNorm.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_operatorNorm.cpp deleted file mode 100644 index 355246f0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_operatorNorm.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -cout << "The operator norm of the 3x3 matrix of ones is " - << ones.operatorNorm() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_prod.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_prod.cpp deleted file mode 100644 index d2f27bdc..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_prod.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the product of all the coefficients:" << endl << m.prod() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random.cpp deleted file mode 100644 index 65fc524f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << 100 * Matrix2i::Random() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random_int.cpp deleted file mode 100644 index f161d03c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random_int.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << VectorXi::Random(2) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random_int_int.cpp deleted file mode 100644 index 3f0f7dd5..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_random_int_int.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << MatrixXi::Random(2,3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_replicate.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_replicate.cpp deleted file mode 100644 index 3ce52bcd..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_replicate.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXi m = MatrixXi::Random(2,3); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "m.replicate<3,2>() = ..." << endl; -cout << m.replicate<3,2>() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_replicate_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_replicate_int_int.cpp deleted file mode 100644 index b1dbc70b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_replicate_int_int.cpp +++ /dev/null @@ -1,4 +0,0 @@ -Vector3i v = Vector3i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "v.replicate(2,5) = ..." << endl; -cout << v.replicate(2,5) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_reverse.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_reverse.cpp deleted file mode 100644 index f545a283..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_reverse.cpp +++ /dev/null @@ -1,8 +0,0 @@ -MatrixXi m = MatrixXi::Random(3,4); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the reverse of m:" << endl << m.reverse() << endl; -cout << "Here is the coefficient (1,0) in the reverse of m:" << endl - << m.reverse()(1,0) << endl; -cout << "Let us overwrite this coefficient with the value 4." << endl; -m.reverse()(1,0) = 4; -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_rightCols_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_rightCols_int.cpp deleted file mode 100644 index cb513401..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_rightCols_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.rightCols(2):" << endl; -cout << a.rightCols(2) << endl; -a.rightCols(2).setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_row.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_row.cpp deleted file mode 100644 index b15e6260..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_row.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Identity(); -m.row(1) = Vector3d(4,5,6); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_rowwise.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_rowwise.cpp deleted file mode 100644 index ae93964e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_rowwise.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the sum of each row:" << endl << m.rowwise().sum() << endl; -cout << "Here is the maximum absolute value of each row:" - << endl << m.cwiseAbs().rowwise().maxCoeff() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_segment_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_segment_int_int.cpp deleted file mode 100644 index 70cd6d26..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_segment_int_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -RowVector4i v = RowVector4i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "Here is v.segment(1, 2):" << endl << v.segment(1, 2) << endl; -v.segment(1, 2).setZero(); -cout << "Now the vector v is:" << endl << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_select.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_select.cpp deleted file mode 100644 index ae5477f0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_select.cpp +++ /dev/null @@ -1,6 +0,0 @@ -MatrixXi m(3, 3); -m << 1, 2, 3, - 4, 5, 6, - 7, 8, 9; -m = (m.array() >= 5).select(-m, m); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_selfadjointView.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_selfadjointView.cpp deleted file mode 100644 index 4bd3c7ee..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_selfadjointView.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix3i m = Matrix3i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the symmetric matrix extracted from the upper part of m:" << endl - << Matrix3i(m.selfadjointView()) << endl; -cout << "Here is the symmetric matrix extracted from the lower part of m:" << endl - << Matrix3i(m.selfadjointView()) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_set.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_set.cpp deleted file mode 100644 index 50ecf5fb..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_set.cpp +++ /dev/null @@ -1,13 +0,0 @@ -Matrix3i m1; -m1 << 1, 2, 3, - 4, 5, 6, - 7, 8, 9; -cout << m1 << endl << endl; -Matrix3i m2 = Matrix3i::Identity(); -m2.block(0,0, 2,2) << 10, 11, 12, 13; -cout << m2 << endl << endl; -Vector2i v1; -v1 << 14, 15; -m2 << v1.transpose(), 16, - v1, m1.block(1,1,2,2); -cout << m2 << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setIdentity.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setIdentity.cpp deleted file mode 100644 index 4fd0aa24..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setIdentity.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix4i m = Matrix4i::Zero(); -m.block<3,3>(1,0).setIdentity(); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setOnes.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setOnes.cpp deleted file mode 100644 index 4cef9c1e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setOnes.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -m.row(1).setOnes(); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setRandom.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setRandom.cpp deleted file mode 100644 index e2c257d4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setRandom.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix4i m = Matrix4i::Zero(); -m.col(1).setRandom(); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setZero.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setZero.cpp deleted file mode 100644 index 9b5b9583..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_setZero.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -m.row(1).setZero(); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_start_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_start_int.cpp deleted file mode 100644 index c261d2b4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_start_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -RowVector4i v = RowVector4i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "Here is v.head(2):" << endl << v.head(2) << endl; -v.head(2).setZero(); -cout << "Now the vector v is:" << endl << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_bottomRows.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_bottomRows.cpp deleted file mode 100644 index f9ea892d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_bottomRows.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.bottomRows<2>():" << endl; -cout << a.bottomRows<2>() << endl; -a.bottomRows<2>().setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_end.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_end.cpp deleted file mode 100644 index f5ccb00f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_end.cpp +++ /dev/null @@ -1,5 +0,0 @@ -RowVector4i v = RowVector4i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "Here is v.tail(2):" << endl << v.tail<2>() << endl; -v.tail<2>().setZero(); -cout << "Now the vector v is:" << endl << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_block_int_int_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_block_int_int_int_int.cpp deleted file mode 100644 index 4dced03b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_block_int_int_int_int.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the block:" << endl << m.block<2, Dynamic>(1, 1, 2, 3) << endl; -m.block<2, Dynamic>(1, 1, 2, 3).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner.cpp deleted file mode 100644 index 847892a2..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.bottomLeftCorner<2,2>():" << endl; -cout << m.bottomLeftCorner<2,2>() << endl; -m.bottomLeftCorner<2,2>().setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp deleted file mode 100644 index a1edcc80..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.bottomLeftCorner<2,Dynamic>(2,2):" << endl; -cout << m.bottomLeftCorner<2,Dynamic>(2,2) << endl; -m.bottomLeftCorner<2,Dynamic>(2,2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner.cpp deleted file mode 100644 index abacb014..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.bottomRightCorner<2,2>():" << endl; -cout << m.bottomRightCorner<2,2>() << endl; -m.bottomRightCorner<2,2>().setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner_int_int.cpp deleted file mode 100644 index a65508fd..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.bottomRightCorner<2,Dynamic>(2,2):" << endl; -cout << m.bottomRightCorner<2,Dynamic>(2,2) << endl; -m.bottomRightCorner<2,Dynamic>(2,2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner.cpp deleted file mode 100644 index 1899d902..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.topLeftCorner<2,2>():" << endl; -cout << m.topLeftCorner<2,2>() << endl; -m.topLeftCorner<2,2>().setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner_int_int.cpp deleted file mode 100644 index fac761f6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.topLeftCorner<2,Dynamic>(2,2):" << endl; -cout << m.topLeftCorner<2,Dynamic>(2,2) << endl; -m.topLeftCorner<2,Dynamic>(2,2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner.cpp deleted file mode 100644 index c3a17711..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.topRightCorner<2,2>():" << endl; -cout << m.topRightCorner<2,2>() << endl; -m.topRightCorner<2,2>().setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner_int_int.cpp deleted file mode 100644 index a17acc00..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.topRightCorner<2,Dynamic>(2,2):" << endl; -cout << m.topRightCorner<2,Dynamic>(2,2) << endl; -m.topRightCorner<2,Dynamic>(2,2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_leftCols.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_leftCols.cpp deleted file mode 100644 index 1c425d91..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_leftCols.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.leftCols<2>():" << endl; -cout << a.leftCols<2>() << endl; -a.leftCols<2>().setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_rightCols.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_rightCols.cpp deleted file mode 100644 index fc8c0d93..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_rightCols.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.rightCols<2>():" << endl; -cout << a.rightCols<2>() << endl; -a.rightCols<2>().setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_segment.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_segment.cpp deleted file mode 100644 index e448b402..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_segment.cpp +++ /dev/null @@ -1,5 +0,0 @@ -RowVector4i v = RowVector4i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "Here is v.segment<2>(1):" << endl << v.segment<2>(1) << endl; -v.segment<2>(2).setZero(); -cout << "Now the vector v is:" << endl << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_start.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_start.cpp deleted file mode 100644 index d336b371..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_start.cpp +++ /dev/null @@ -1,5 +0,0 @@ -RowVector4i v = RowVector4i::Random(); -cout << "Here is the vector v:" << endl << v << endl; -cout << "Here is v.head(2):" << endl << v.head<2>() << endl; -v.head<2>().setZero(); -cout << "Now the vector v is:" << endl << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_topRows.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_topRows.cpp deleted file mode 100644 index 0110251a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_template_int_topRows.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.topRows<2>():" << endl; -cout << a.topRows<2>() << endl; -a.topRows<2>().setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topLeftCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topLeftCorner_int_int.cpp deleted file mode 100644 index e52cb3bd..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topLeftCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.topLeftCorner(2, 2):" << endl; -cout << m.topLeftCorner(2, 2) << endl; -m.topLeftCorner(2, 2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topRightCorner_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topRightCorner_int_int.cpp deleted file mode 100644 index 811fa563..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topRightCorner_int_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4i m = Matrix4i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is m.topRightCorner(2, 2):" << endl; -cout << m.topRightCorner(2, 2) << endl; -m.topRightCorner(2, 2).setZero(); -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topRows_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topRows_int.cpp deleted file mode 100644 index f2d75f1c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_topRows_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Array44i a = Array44i::Random(); -cout << "Here is the array a:" << endl << a << endl; -cout << "Here is a.topRows(2):" << endl; -cout << a.topRows(2) << endl; -a.topRows(2).setZero(); -cout << "Now the array a is:" << endl << a << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_transpose.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_transpose.cpp deleted file mode 100644 index 88eea83c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_transpose.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix2i m = Matrix2i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the transpose of m:" << endl << m.transpose() << endl; -cout << "Here is the coefficient (1,0) in the transpose of m:" << endl - << m.transpose()(1,0) << endl; -cout << "Let us overwrite this coefficient with the value 0." << endl; -m.transpose()(1,0) = 0; -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_triangularView.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_triangularView.cpp deleted file mode 100644 index 03aa303f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_triangularView.cpp +++ /dev/null @@ -1,9 +0,0 @@ -Matrix3i m = Matrix3i::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the upper-triangular matrix extracted from m:" << endl - << Matrix3i(m.triangularView()) << endl; -cout << "Here is the strictly-upper-triangular matrix extracted from m:" << endl - << Matrix3i(m.triangularView()) << endl; -cout << "Here is the unit-lower-triangular matrix extracted from m:" << endl - << Matrix3i(m.triangularView()) << endl; -// FIXME need to implement output for triangularViews (Bug 885) diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero.cpp deleted file mode 100644 index 60649367..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero.cpp +++ /dev/null @@ -1,2 +0,0 @@ -cout << Matrix2d::Zero() << endl; -cout << RowVector4i::Zero() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero_int.cpp deleted file mode 100644 index 370a9ba0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero_int.cpp +++ /dev/null @@ -1,2 +0,0 @@ -cout << RowVectorXi::Zero(4) << endl; -cout << VectorXf::Zero(2) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero_int_int.cpp deleted file mode 100644 index 4099c5d4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/MatrixBase_zero_int_int.cpp +++ /dev/null @@ -1 +0,0 @@ -cout << MatrixXi::Zero(2,3) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_NoChange_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_NoChange_int.cpp deleted file mode 100644 index acdf18c4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_NoChange_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXd m(3,4); -m.resize(NoChange, 5); -cout << "m: " << m.rows() << " rows, " << m.cols() << " cols" << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int.cpp deleted file mode 100644 index 044c7898..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int.cpp +++ /dev/null @@ -1,6 +0,0 @@ -VectorXd v(10); -v.resize(3); -RowVector3d w; -w.resize(3); // this is legal, but has no effect -cout << "v: " << v.rows() << " rows, " << v.cols() << " cols" << endl; -cout << "w: " << w.rows() << " rows, " << w.cols() << " cols" << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int_NoChange.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int_NoChange.cpp deleted file mode 100644 index 5c37c906..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int_NoChange.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXd m(3,4); -m.resize(5, NoChange); -cout << "m: " << m.rows() << " rows, " << m.cols() << " cols" << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int_int.cpp deleted file mode 100644 index bfd47415..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_resize_int_int.cpp +++ /dev/null @@ -1,9 +0,0 @@ -MatrixXd m(2,3); -m << 1,2,3,4,5,6; -cout << "here's the 2x3 matrix m:" << endl << m << endl; -cout << "let's resize m to 3x2. This is a conservative resizing because 2*3==3*2." << endl; -m.resize(3,2); -cout << "here's the 3x2 matrix m:" << endl << m << endl; -cout << "now let's resize m to size 2x2. This is NOT a conservative resizing, so it becomes uninitialized:" << endl; -m.resize(2,2); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setConstant_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setConstant_int.cpp deleted file mode 100644 index ff5a86c9..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setConstant_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -VectorXf v; -v.setConstant(3, 5); -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setConstant_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setConstant_int_int.cpp deleted file mode 100644 index 32b950cf..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setConstant_int_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXf m; -m.setConstant(3, 3, 5); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setIdentity_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setIdentity_int_int.cpp deleted file mode 100644 index a6596719..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setIdentity_int_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXf m; -m.setIdentity(3, 3); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setOnes_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setOnes_int.cpp deleted file mode 100644 index 752cb35b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setOnes_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -VectorXf v; -v.setOnes(3); -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setOnes_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setOnes_int_int.cpp deleted file mode 100644 index 1ffb66bb..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setOnes_int_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXf m; -m.setOnes(3, 3); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setRandom_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setRandom_int.cpp deleted file mode 100644 index e160dd7d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setRandom_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -VectorXf v; -v.setRandom(3); -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setRandom_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setRandom_int_int.cpp deleted file mode 100644 index 80cda11d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setRandom_int_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXf m; -m.setRandom(3, 3); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setZero_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setZero_int.cpp deleted file mode 100644 index 0fb16c1f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setZero_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -VectorXf v; -v.setZero(3); -cout << v << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setZero_int_int.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setZero_int_int.cpp deleted file mode 100644 index ad883b91..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Matrix_setZero_int_int.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXf m; -m.setZero(3, 3); -cout << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialPivLU_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialPivLU_solve.cpp deleted file mode 100644 index fa3570ab..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialPivLU_solve.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXd A = MatrixXd::Random(3,3); -MatrixXd B = MatrixXd::Random(3,2); -cout << "Here is the invertible matrix A:" << endl << A << endl; -cout << "Here is the matrix B:" << endl << B << endl; -MatrixXd X = A.lu().solve(B); -cout << "Here is the (unique) solution X to the equation AX=B:" << endl << X << endl; -cout << "Relative error: " << (A*X-B).norm() / B.norm() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_count.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_count.cpp deleted file mode 100644 index 1c3b3a28..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_count.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -Matrix res = (m.array() >= 0.5).rowwise().count(); -cout << "Here is the count of elements larger or equal than 0.5 of each row:" << endl; -cout << res << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_maxCoeff.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_maxCoeff.cpp deleted file mode 100644 index e8fd3820..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_maxCoeff.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the maximum of each column:" << endl << m.colwise().maxCoeff() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_minCoeff.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_minCoeff.cpp deleted file mode 100644 index d717bc0d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_minCoeff.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the minimum of each column:" << endl << m.colwise().minCoeff() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_norm.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_norm.cpp deleted file mode 100644 index dbcf290a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_norm.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the norm of each column:" << endl << m.colwise().norm() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_prod.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_prod.cpp deleted file mode 100644 index aacf09cb..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_prod.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the product of each row:" << endl << m.rowwise().prod() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_squaredNorm.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_squaredNorm.cpp deleted file mode 100644 index 9f3293e6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_squaredNorm.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the square norm of each row:" << endl << m.rowwise().squaredNorm() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_sum.cpp b/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_sum.cpp deleted file mode 100644 index ec82d3e4..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/PartialRedux_sum.cpp +++ /dev/null @@ -1,3 +0,0 @@ -Matrix3d m = Matrix3d::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the sum of each row:" << endl << m.rowwise().sum() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/RealQZ_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/RealQZ_compute.cpp deleted file mode 100644 index a18da42e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/RealQZ_compute.cpp +++ /dev/null @@ -1,17 +0,0 @@ -MatrixXf A = MatrixXf::Random(4,4); -MatrixXf B = MatrixXf::Random(4,4); -RealQZ qz(4); // preallocate space for 4x4 matrices -qz.compute(A,B); // A = Q S Z, B = Q T Z - -// print original matrices and result of decomposition -cout << "A:\n" << A << "\n" << "B:\n" << B << "\n"; -cout << "S:\n" << qz.matrixS() << "\n" << "T:\n" << qz.matrixT() << "\n"; -cout << "Q:\n" << qz.matrixQ() << "\n" << "Z:\n" << qz.matrixZ() << "\n"; - -// verify precision -cout << "\nErrors:" - << "\n|A-QSZ|: " << (A-qz.matrixQ()*qz.matrixS()*qz.matrixZ()).norm() - << ", |B-QTZ|: " << (B-qz.matrixQ()*qz.matrixT()*qz.matrixZ()).norm() - << "\n|QQ* - I|: " << (qz.matrixQ()*qz.matrixQ().adjoint() - MatrixXf::Identity(4,4)).norm() - << ", |ZZ* - I|: " << (qz.matrixZ()*qz.matrixZ().adjoint() - MatrixXf::Identity(4,4)).norm() - << "\n"; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/RealSchur_RealSchur_MatrixType.cpp b/testbed/nanogui/ext/eigen/doc/snippets/RealSchur_RealSchur_MatrixType.cpp deleted file mode 100644 index a5530dcc..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/RealSchur_RealSchur_MatrixType.cpp +++ /dev/null @@ -1,10 +0,0 @@ -MatrixXd A = MatrixXd::Random(6,6); -cout << "Here is a random 6x6 matrix, A:" << endl << A << endl << endl; - -RealSchur schur(A); -cout << "The orthogonal matrix U is:" << endl << schur.matrixU() << endl; -cout << "The quasi-triangular matrix T is:" << endl << schur.matrixT() << endl << endl; - -MatrixXd U = schur.matrixU(); -MatrixXd T = schur.matrixT(); -cout << "U * T * U^T = " << endl << U * T * U.transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/RealSchur_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/RealSchur_compute.cpp deleted file mode 100644 index 20c2611b..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/RealSchur_compute.cpp +++ /dev/null @@ -1,6 +0,0 @@ -MatrixXf A = MatrixXf::Random(4,4); -RealSchur schur(4); -schur.compute(A, /* computeU = */ false); -cout << "The matrix T in the decomposition of A is:" << endl << schur.matrixT() << endl; -schur.compute(A.inverse(), /* computeU = */ false); -cout << "The matrix T in the decomposition of A^(-1) is:" << endl << schur.matrixT() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp deleted file mode 100644 index 73a7f625..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp +++ /dev/null @@ -1,7 +0,0 @@ -SelfAdjointEigenSolver es; -Matrix4f X = Matrix4f::Random(4,4); -Matrix4f A = X + X.transpose(); -es.compute(A); -cout << "The eigenvalues of A are: " << es.eigenvalues().transpose() << endl; -es.compute(A + Matrix4f::Identity(4,4)); // re-use es to compute eigenvalues of A+I -cout << "The eigenvalues of A+I are: " << es.eigenvalues().transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp deleted file mode 100644 index 3599b17a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp +++ /dev/null @@ -1,17 +0,0 @@ -MatrixXd X = MatrixXd::Random(5,5); -MatrixXd A = X + X.transpose(); -cout << "Here is a random symmetric 5x5 matrix, A:" << endl << A << endl << endl; - -SelfAdjointEigenSolver es(A); -cout << "The eigenvalues of A are:" << endl << es.eigenvalues() << endl; -cout << "The matrix of eigenvectors, V, is:" << endl << es.eigenvectors() << endl << endl; - -double lambda = es.eigenvalues()[0]; -cout << "Consider the first eigenvalue, lambda = " << lambda << endl; -VectorXd v = es.eigenvectors().col(0); -cout << "If v is the corresponding eigenvector, then lambda * v = " << endl << lambda * v << endl; -cout << "... and A * v = " << endl << A * v << endl << endl; - -MatrixXd D = es.eigenvalues().asDiagonal(); -MatrixXd V = es.eigenvectors(); -cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp deleted file mode 100644 index bbb821e0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp +++ /dev/null @@ -1,16 +0,0 @@ -MatrixXd X = MatrixXd::Random(5,5); -MatrixXd A = X + X.transpose(); -cout << "Here is a random symmetric matrix, A:" << endl << A << endl; -X = MatrixXd::Random(5,5); -MatrixXd B = X * X.transpose(); -cout << "and a random postive-definite matrix, B:" << endl << B << endl << endl; - -GeneralizedSelfAdjointEigenSolver es(A,B); -cout << "The eigenvalues of the pencil (A,B) are:" << endl << es.eigenvalues() << endl; -cout << "The matrix of eigenvectors, V, is:" << endl << es.eigenvectors() << endl << endl; - -double lambda = es.eigenvalues()[0]; -cout << "Consider the first eigenvalue, lambda = " << lambda << endl; -VectorXd v = es.eigenvectors().col(0); -cout << "If v is the corresponding eigenvector, then A * v = " << endl << A * v << endl; -cout << "... and lambda * B * v = " << endl << lambda * B * v << endl << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType.cpp deleted file mode 100644 index 2975cc3f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType.cpp +++ /dev/null @@ -1,7 +0,0 @@ -SelfAdjointEigenSolver es(4); -MatrixXf X = MatrixXf::Random(4,4); -MatrixXf A = X + X.transpose(); -es.compute(A); -cout << "The eigenvalues of A are: " << es.eigenvalues().transpose() << endl; -es.compute(A + MatrixXf::Identity(4,4)); // re-use es to compute eigenvalues of A+I -cout << "The eigenvalues of A+I are: " << es.eigenvalues().transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType2.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType2.cpp deleted file mode 100644 index 07c92a1e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType2.cpp +++ /dev/null @@ -1,9 +0,0 @@ -MatrixXd X = MatrixXd::Random(5,5); -MatrixXd A = X * X.transpose(); -X = MatrixXd::Random(5,5); -MatrixXd B = X * X.transpose(); - -GeneralizedSelfAdjointEigenSolver es(A,B,EigenvaluesOnly); -cout << "The eigenvalues of the pencil (A,B) are:" << endl << es.eigenvalues() << endl; -es.compute(B,A,false); -cout << "The eigenvalues of the pencil (B,A) are:" << endl << es.eigenvalues() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvalues.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvalues.cpp deleted file mode 100644 index 0ff33c68..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvalues.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -SelfAdjointEigenSolver es(ones); -cout << "The eigenvalues of the 3x3 matrix of ones are:" - << endl << es.eigenvalues() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvectors.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvectors.cpp deleted file mode 100644 index cfc8b0d5..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_eigenvectors.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -SelfAdjointEigenSolver es(ones); -cout << "The first eigenvector of the 3x3 matrix of ones is:" - << endl << es.eigenvectors().col(1) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_operatorInverseSqrt.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_operatorInverseSqrt.cpp deleted file mode 100644 index 114c65fb..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_operatorInverseSqrt.cpp +++ /dev/null @@ -1,9 +0,0 @@ -MatrixXd X = MatrixXd::Random(4,4); -MatrixXd A = X * X.transpose(); -cout << "Here is a random positive-definite matrix, A:" << endl << A << endl << endl; - -SelfAdjointEigenSolver es(A); -cout << "The inverse square root of A is: " << endl; -cout << es.operatorInverseSqrt() << endl; -cout << "We can also compute it with operatorSqrt() and inverse(). That yields: " << endl; -cout << es.operatorSqrt().inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_operatorSqrt.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_operatorSqrt.cpp deleted file mode 100644 index eeacca74..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointEigenSolver_operatorSqrt.cpp +++ /dev/null @@ -1,8 +0,0 @@ -MatrixXd X = MatrixXd::Random(4,4); -MatrixXd A = X * X.transpose(); -cout << "Here is a random positive-definite matrix, A:" << endl << A << endl << endl; - -SelfAdjointEigenSolver es(A); -MatrixXd sqrtA = es.operatorSqrt(); -cout << "The square root of A is: " << endl << sqrtA << endl; -cout << "If we square this, we get: " << endl << sqrtA*sqrtA << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointView_eigenvalues.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointView_eigenvalues.cpp deleted file mode 100644 index be198677..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointView_eigenvalues.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -VectorXd eivals = ones.selfadjointView().eigenvalues(); -cout << "The eigenvalues of the 3x3 matrix of ones are:" << endl << eivals << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointView_operatorNorm.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointView_operatorNorm.cpp deleted file mode 100644 index f380f559..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SelfAdjointView_operatorNorm.cpp +++ /dev/null @@ -1,3 +0,0 @@ -MatrixXd ones = MatrixXd::Ones(3,3); -cout << "The operator norm of the 3x3 matrix of ones is " - << ones.selfadjointView().operatorNorm() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/SparseMatrix_coeffs.cpp b/testbed/nanogui/ext/eigen/doc/snippets/SparseMatrix_coeffs.cpp deleted file mode 100644 index f71a69b0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/SparseMatrix_coeffs.cpp +++ /dev/null @@ -1,9 +0,0 @@ -SparseMatrix A(3,3); -A.insert(1,2) = 0; -A.insert(0,1) = 1; -A.insert(2,0) = 2; -A.makeCompressed(); -cout << "The matrix A is:" << endl << MatrixXd(A) << endl; -cout << "it has " << A.nonZeros() << " stored non zero coefficients that are: " << A.coeffs().transpose() << endl; -A.coeffs() += 10; -cout << "After adding 10 to every stored non zero coefficient, the matrix A is:" << endl << MatrixXd(A) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_block.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_block.cpp deleted file mode 100644 index 03282f4f..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_block.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXi mat(3,3); -mat << 1, 2, 3, 4, 5, 6, 7, 8, 9; -cout << "Here is the matrix mat:\n" << mat << endl; - -// This assignment shows the aliasing problem -mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2); -cout << "After the assignment, mat = \n" << mat << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_block_correct.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_block_correct.cpp deleted file mode 100644 index 6fee5801..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_block_correct.cpp +++ /dev/null @@ -1,7 +0,0 @@ -MatrixXi mat(3,3); -mat << 1, 2, 3, 4, 5, 6, 7, 8, 9; -cout << "Here is the matrix mat:\n" << mat << endl; - -// The eval() solves the aliasing problem -mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2).eval(); -cout << "After the assignment, mat = \n" << mat << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_cwise.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_cwise.cpp deleted file mode 100644 index 7049f6c5..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_cwise.cpp +++ /dev/null @@ -1,20 +0,0 @@ -MatrixXf mat(2,2); -mat << 1, 2, 4, 7; -cout << "Here is the matrix mat:\n" << mat << endl << endl; - -mat = 2 * mat; -cout << "After 'mat = 2 * mat', mat = \n" << mat << endl << endl; - - -mat = mat - MatrixXf::Identity(2,2); -cout << "After the subtraction, it becomes\n" << mat << endl << endl; - - -ArrayXXf arr = mat; -arr = arr.square(); -cout << "After squaring, it becomes\n" << arr << endl << endl; - -// Combining all operations in one statement: -mat << 1, 2, 4, 7; -mat = (2 * mat - MatrixXf::Identity(2,2)).array().square(); -cout << "Doing everything at once yields\n" << mat << endl << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult1.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult1.cpp deleted file mode 100644 index cd7e9004..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult1.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXf matA(2,2); -matA << 2, 0, 0, 2; -matA = matA * matA; -cout << matA; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult2.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult2.cpp deleted file mode 100644 index a3ff5685..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult2.cpp +++ /dev/null @@ -1,10 +0,0 @@ -MatrixXf matA(2,2), matB(2,2); -matA << 2, 0, 0, 2; - -// Simple but not quite as efficient -matB = matA * matA; -cout << matB << endl << endl; - -// More complicated but also more efficient -matB.noalias() = matA * matA; -cout << matB; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult3.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult3.cpp deleted file mode 100644 index 1d12a6c6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult3.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXf matA(2,2); -matA << 2, 0, 0, 2; -matA.noalias() = matA * matA; -cout << matA; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult4.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult4.cpp deleted file mode 100644 index 8a8992f6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult4.cpp +++ /dev/null @@ -1,5 +0,0 @@ -MatrixXf A(2,2), B(3,2); -B << 2, 0, 0, 3, 1, 1; -A << 2, 0, 0, -2; -A = (B * A).cwiseAbs(); -cout << A; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult5.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult5.cpp deleted file mode 100644 index 1a36defd..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicAliasing_mult5.cpp +++ /dev/null @@ -1,5 +0,0 @@ -MatrixXf A(2,2), B(3,2); -B << 2, 0, 0, 3, 1, 1; -A << 2, 0, 0, -2; -A = (B * A).eval().cwiseAbs(); -cout << A; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/TopicStorageOrders_example.cpp b/testbed/nanogui/ext/eigen/doc/snippets/TopicStorageOrders_example.cpp deleted file mode 100644 index 0623ef0c..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/TopicStorageOrders_example.cpp +++ /dev/null @@ -1,18 +0,0 @@ -Matrix Acolmajor; -Acolmajor << 8, 2, 2, 9, - 9, 1, 4, 4, - 3, 5, 4, 5; -cout << "The matrix A:" << endl; -cout << Acolmajor << endl << endl; - -cout << "In memory (column-major):" << endl; -for (int i = 0; i < Acolmajor.size(); i++) - cout << *(Acolmajor.data() + i) << " "; -cout << endl << endl; - -Matrix Arowmajor = Acolmajor; -cout << "In memory (row-major):" << endl; -for (int i = 0; i < Arowmajor.size(); i++) - cout << *(Arowmajor.data() + i) << " "; -cout << endl; - diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Triangular_solve.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Triangular_solve.cpp deleted file mode 100644 index 54844246..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Triangular_solve.cpp +++ /dev/null @@ -1,11 +0,0 @@ -Matrix3d m = Matrix3d::Zero(); -m.triangularView().setOnes(); -cout << "Here is the matrix m:\n" << m << endl; -Matrix3d n = Matrix3d::Ones(); -n.triangularView() *= 2; -cout << "Here is the matrix n:\n" << n << endl; -cout << "And now here is m.inverse()*n, taking advantage of the fact that" - " m is upper-triangular:\n" - << m.triangularView().solve(n) << endl; -cout << "And this is n*m.inverse():\n" - << m.triangularView().solve(n); diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_Tridiagonalization_MatrixType.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_Tridiagonalization_MatrixType.cpp deleted file mode 100644 index a2601243..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_Tridiagonalization_MatrixType.cpp +++ /dev/null @@ -1,9 +0,0 @@ -MatrixXd X = MatrixXd::Random(5,5); -MatrixXd A = X + X.transpose(); -cout << "Here is a random symmetric 5x5 matrix:" << endl << A << endl << endl; -Tridiagonalization triOfA(A); -MatrixXd Q = triOfA.matrixQ(); -cout << "The orthogonal matrix Q is:" << endl << Q << endl; -MatrixXd T = triOfA.matrixT(); -cout << "The tridiagonal matrix T is:" << endl << T << endl << endl; -cout << "Q * T * Q^T = " << endl << Q * T * Q.transpose() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_compute.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_compute.cpp deleted file mode 100644 index 0062a99e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_compute.cpp +++ /dev/null @@ -1,9 +0,0 @@ -Tridiagonalization tri; -MatrixXf X = MatrixXf::Random(4,4); -MatrixXf A = X + X.transpose(); -tri.compute(A); -cout << "The matrix T in the tridiagonal decomposition of A is: " << endl; -cout << tri.matrixT() << endl; -tri.compute(2*A); // re-use tri to compute eigenvalues of 2A -cout << "The matrix T in the tridiagonal decomposition of 2A is: " << endl; -cout << tri.matrixT() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_decomposeInPlace.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_decomposeInPlace.cpp deleted file mode 100644 index 93dcfca1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_decomposeInPlace.cpp +++ /dev/null @@ -1,10 +0,0 @@ -MatrixXd X = MatrixXd::Random(5,5); -MatrixXd A = X + X.transpose(); -cout << "Here is a random symmetric 5x5 matrix:" << endl << A << endl << endl; - -VectorXd diag(5); -VectorXd subdiag(4); -internal::tridiagonalization_inplace(A, diag, subdiag, true); -cout << "The orthogonal matrix Q is:" << endl << A << endl; -cout << "The diagonal of the tridiagonal matrix T is:" << endl << diag << endl; -cout << "The subdiagonal of the tridiagonal matrix T is:" << endl << subdiag << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_diagonal.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_diagonal.cpp deleted file mode 100644 index 6eec8216..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_diagonal.cpp +++ /dev/null @@ -1,13 +0,0 @@ -MatrixXcd X = MatrixXcd::Random(4,4); -MatrixXcd A = X + X.adjoint(); -cout << "Here is a random self-adjoint 4x4 matrix:" << endl << A << endl << endl; - -Tridiagonalization triOfA(A); -MatrixXd T = triOfA.matrixT(); -cout << "The tridiagonal matrix T is:" << endl << T << endl << endl; - -cout << "We can also extract the diagonals of T directly ..." << endl; -VectorXd diag = triOfA.diagonal(); -cout << "The diagonal is:" << endl << diag << endl; -VectorXd subdiag = triOfA.subDiagonal(); -cout << "The subdiagonal is:" << endl << subdiag << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_householderCoefficients.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_householderCoefficients.cpp deleted file mode 100644 index e5d87288..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_householderCoefficients.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix4d X = Matrix4d::Random(4,4); -Matrix4d A = X + X.transpose(); -cout << "Here is a random symmetric 4x4 matrix:" << endl << A << endl; -Tridiagonalization triOfA(A); -Vector3d hc = triOfA.householderCoefficients(); -cout << "The vector of Householder coefficients is:" << endl << hc << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_packedMatrix.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_packedMatrix.cpp deleted file mode 100644 index 0f55d0c2..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tridiagonalization_packedMatrix.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix4d X = Matrix4d::Random(4,4); -Matrix4d A = X + X.transpose(); -cout << "Here is a random symmetric 4x4 matrix:" << endl << A << endl; -Tridiagonalization triOfA(A); -Matrix4d pm = triOfA.packedMatrix(); -cout << "The packed matrix M is:" << endl << pm << endl; -cout << "The diagonal and subdiagonal corresponds to the matrix T, which is:" - << endl << triOfA.matrixT() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Block.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Block.cpp deleted file mode 100644 index 96e40acf..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Block.cpp +++ /dev/null @@ -1,5 +0,0 @@ -MatrixXf matA(2, 2); -matA << 1, 2, 3, 4; -MatrixXf matB(4, 4); -matB << matA, matA/10, matA/10, matA; -std::cout << matB << std::endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_CommaTemporary.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_CommaTemporary.cpp deleted file mode 100644 index 50cff4cb..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_CommaTemporary.cpp +++ /dev/null @@ -1,4 +0,0 @@ -MatrixXf mat = MatrixXf::Random(2, 3); -std::cout << mat << std::endl << std::endl; -mat = (MatrixXf(2,2) << 0, 1, 1, 0).finished() * mat; -std::cout << mat << std::endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Join.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Join.cpp deleted file mode 100644 index 55a21539..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Join.cpp +++ /dev/null @@ -1,11 +0,0 @@ -RowVectorXd vec1(3); -vec1 << 1, 2, 3; -std::cout << "vec1 = " << vec1 << std::endl; - -RowVectorXd vec2(4); -vec2 << 1, 4, 9, 16; -std::cout << "vec2 = " << vec2 << std::endl; - -RowVectorXd joined(7); -joined << vec1, vec2; -std::cout << "joined = " << joined << std::endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_LinSpaced.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_LinSpaced.cpp deleted file mode 100644 index c6a73ab8..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_LinSpaced.cpp +++ /dev/null @@ -1,7 +0,0 @@ -ArrayXXf table(10, 4); -table.col(0) = ArrayXf::LinSpaced(10, 0, 90); -table.col(1) = M_PI / 180 * table.col(0); -table.col(2) = table.col(1).sin(); -table.col(3) = table.col(1).cos(); -std::cout << " Degrees Radians Sine Cosine\n"; -std::cout << table << std::endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_ThreeWays.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_ThreeWays.cpp deleted file mode 100644 index cb745765..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_ThreeWays.cpp +++ /dev/null @@ -1,20 +0,0 @@ -const int size = 6; -MatrixXd mat1(size, size); -mat1.topLeftCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2); -mat1.topRightCorner(size/2, size/2) = MatrixXd::Identity(size/2, size/2); -mat1.bottomLeftCorner(size/2, size/2) = MatrixXd::Identity(size/2, size/2); -mat1.bottomRightCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2); -std::cout << mat1 << std::endl << std::endl; - -MatrixXd mat2(size, size); -mat2.topLeftCorner(size/2, size/2).setZero(); -mat2.topRightCorner(size/2, size/2).setIdentity(); -mat2.bottomLeftCorner(size/2, size/2).setIdentity(); -mat2.bottomRightCorner(size/2, size/2).setZero(); -std::cout << mat2 << std::endl << std::endl; - -MatrixXd mat3(size, size); -mat3 << MatrixXd::Zero(size/2, size/2), MatrixXd::Identity(size/2, size/2), - MatrixXd::Identity(size/2, size/2), MatrixXd::Zero(size/2, size/2); -std::cout << mat3 << std::endl; - diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Zero.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Zero.cpp deleted file mode 100644 index 76a36a31..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_AdvancedInitialization_Zero.cpp +++ /dev/null @@ -1,13 +0,0 @@ -std::cout << "A fixed-size array:\n"; -Array33f a1 = Array33f::Zero(); -std::cout << a1 << "\n\n"; - - -std::cout << "A one-dimensional dynamic-size array:\n"; -ArrayXf a2 = ArrayXf::Zero(3); -std::cout << a2 << "\n\n"; - - -std::cout << "A two-dimensional dynamic-size array:\n"; -ArrayXXf a3 = ArrayXXf::Zero(3, 4); -std::cout << a3 << "\n"; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_Map_rowmajor.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_Map_rowmajor.cpp deleted file mode 100644 index fd45ace0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_Map_rowmajor.cpp +++ /dev/null @@ -1,7 +0,0 @@ -int array[8]; -for(int i = 0; i < 8; ++i) array[i] = i; -cout << "Column-major:\n" << Map >(array) << endl; -cout << "Row-major:\n" << Map >(array) << endl; -cout << "Row-major using stride:\n" << - Map, Unaligned, Stride<1,4> >(array) << endl; - diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_Map_using.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_Map_using.cpp deleted file mode 100644 index e5e499f1..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_Map_using.cpp +++ /dev/null @@ -1,21 +0,0 @@ -typedef Matrix MatrixType; -typedef Map MapType; -typedef Map MapTypeConst; // a read-only map -const int n_dims = 5; - -MatrixType m1(n_dims), m2(n_dims); -m1.setRandom(); -m2.setRandom(); -float *p = &m2(0); // get the address storing the data for m2 -MapType m2map(p,m2.size()); // m2map shares data with m2 -MapTypeConst m2mapconst(p,m2.size()); // a read-only accessor for m2 - -cout << "m1: " << m1 << endl; -cout << "m2: " << m2 << endl; -cout << "Squared euclidean distance: " << (m1-m2).squaredNorm() << endl; -cout << "Squared euclidean distance, using map: " << - (m1-m2map).squaredNorm() << endl; -m2map(3) = 7; // this will change m2, since they share the same array -cout << "Updated m2: " << m2 << endl; -cout << "m2 coefficient 2, constant accessor: " << m2mapconst(2) << endl; -/* m2mapconst(2) = 5; */ // this yields a compile-time error diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_ReshapeMat2Mat.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_ReshapeMat2Mat.cpp deleted file mode 100644 index f84d6e76..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_ReshapeMat2Mat.cpp +++ /dev/null @@ -1,6 +0,0 @@ -MatrixXf M1(2,6); // Column-major storage -M1 << 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12; - -Map M2(M1.data(), 6,2); -cout << "M2:" << endl << M2 << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_ReshapeMat2Vec.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_ReshapeMat2Vec.cpp deleted file mode 100644 index 95bd4e0e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_ReshapeMat2Vec.cpp +++ /dev/null @@ -1,11 +0,0 @@ -MatrixXf M1(3,3); // Column-major storage -M1 << 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - -Map v1(M1.data(), M1.size()); -cout << "v1:" << endl << v1 << endl; - -Matrix M2(M1); -Map v2(M2.data(), M2.size()); -cout << "v2:" << endl << v2 << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_SlicingCol.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_SlicingCol.cpp deleted file mode 100644 index f667ff68..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_SlicingCol.cpp +++ /dev/null @@ -1,11 +0,0 @@ -MatrixXf M1 = MatrixXf::Random(3,8); -cout << "Column major input:" << endl << M1 << "\n"; -Map > M2(M1.data(), M1.rows(), (M1.cols()+2)/3, OuterStride<>(M1.outerStride()*3)); -cout << "1 column over 3:" << endl << M2 << "\n"; - -typedef Matrix RowMajorMatrixXf; -RowMajorMatrixXf M3(M1); -cout << "Row major input:" << endl << M3 << "\n"; -Map > M4(M3.data(), M3.rows(), (M3.cols()+2)/3, - Stride(M3.outerStride(),3)); -cout << "1 column over 3:" << endl << M4 << "\n"; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_SlicingVec.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_SlicingVec.cpp deleted file mode 100644 index 07e10bf6..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_SlicingVec.cpp +++ /dev/null @@ -1,4 +0,0 @@ -RowVectorXf v = RowVectorXf::LinSpaced(20,0,19); -cout << "Input:" << endl << v << endl; -Map > v2(v.data(), v.size()/2); -cout << "Even:" << v2 << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_01.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_01.cpp deleted file mode 100644 index 47ba31dc..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_01.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3f m; -m << 1, 2, 3, - 4, 5, 6, - 7, 8, 9; -std::cout << m; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_01b.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_01b.cpp deleted file mode 100644 index 2adb2e21..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_01b.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix3f m; -m.row(0) << 1, 2, 3; -m.block(1,0,2,2) << 4, 5, 7, 8; -m.col(2).tail(2) << 6, 9; -std::cout << m; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_02.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_02.cpp deleted file mode 100644 index c960d6ab..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_commainit_02.cpp +++ /dev/null @@ -1,7 +0,0 @@ -int rows=5, cols=5; -MatrixXf m(rows,cols); -m << (Matrix3f() << 1, 2, 3, 4, 5, 6, 7, 8, 9).finished(), - MatrixXf::Zero(3,cols-3), - MatrixXf::Zero(rows-3,3), - MatrixXf::Identity(rows-3,cols-3); -cout << m; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_matrix_inverse.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_matrix_inverse.cpp deleted file mode 100644 index fff32444..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_matrix_inverse.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix3f A; -Vector3f b; -A << 1,2,3, 4,5,6, 7,8,10; -b << 3, 3, 4; -Vector3f x = A.inverse() * b; -cout << "The solution is:" << endl << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_multiple_rhs.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_multiple_rhs.cpp deleted file mode 100644 index 5411a44a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_multiple_rhs.cpp +++ /dev/null @@ -1,10 +0,0 @@ -Matrix3f A(3,3); -A << 1,2,3, 4,5,6, 7,8,10; -Matrix B; -B << 3,1, 3,1, 4,1; -Matrix X; -X = A.fullPivLu().solve(B); -cout << "The solution with right-hand side (3,3,4) is:" << endl; -cout << X.col(0) << endl; -cout << "The solution with right-hand side (1,1,1) is:" << endl; -cout << X.col(1) << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_reuse_decomposition.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_reuse_decomposition.cpp deleted file mode 100644 index 3ca06453..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_reuse_decomposition.cpp +++ /dev/null @@ -1,13 +0,0 @@ -Matrix3f A(3,3); -A << 1,2,3, 4,5,6, 7,8,10; -PartialPivLU luOfA(A); // compute LU decomposition of A -Vector3f b; -b << 3,3,4; -Vector3f x; -x = luOfA.solve(b); -cout << "The solution with right-hand side (3,3,4) is:" << endl; -cout << x << endl; -b << 1,1,1; -x = luOfA.solve(b); -cout << "The solution with right-hand side (1,1,1) is:" << endl; -cout << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_singular.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_singular.cpp deleted file mode 100644 index abff1ef7..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_singular.cpp +++ /dev/null @@ -1,9 +0,0 @@ -Matrix3f A; -Vector3f b; -A << 1,2,3, 4,5,6, 7,8,9; -b << 3, 3, 4; -cout << "Here is the matrix A:" << endl << A << endl; -cout << "Here is the vector b:" << endl << b << endl; -Vector3f x; -x = A.lu().solve(b); -cout << "The solution is:" << endl << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_triangular.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_triangular.cpp deleted file mode 100644 index 9d13f22e..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_triangular.cpp +++ /dev/null @@ -1,8 +0,0 @@ -Matrix3f A; -Vector3f b; -A << 1,2,3, 0,5,6, 0,0,10; -b << 3, 3, 4; -cout << "Here is the matrix A:" << endl << A << endl; -cout << "Here is the vector b:" << endl << b << endl; -Vector3f x = A.triangularView().solve(b); -cout << "The solution is:" << endl << x << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_triangular_inplace.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_triangular_inplace.cpp deleted file mode 100644 index 16ae633a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Tutorial_solve_triangular_inplace.cpp +++ /dev/null @@ -1,6 +0,0 @@ -Matrix3f A; -Vector3f b; -A << 1,2,3, 0,5,6, 0,0,10; -b << 3, 3, 4; -A.triangularView().solveInPlace(b); -cout << "The solution is:" << endl << b << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/VectorwiseOp_homogeneous.cpp b/testbed/nanogui/ext/eigen/doc/snippets/VectorwiseOp_homogeneous.cpp deleted file mode 100644 index aba4fed0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/VectorwiseOp_homogeneous.cpp +++ /dev/null @@ -1,7 +0,0 @@ -typedef Matrix Matrix3Xd; -Matrix3Xd M = Matrix3Xd::Random(3,5); -Projective3d P(Matrix4d::Random()); -cout << "The matrix M is:" << endl << M << endl << endl; -cout << "M.colwise().homogeneous():" << endl << M.colwise().homogeneous() << endl << endl; -cout << "P * M.colwise().homogeneous():" << endl << P * M.colwise().homogeneous() << endl << endl; -cout << "P * M.colwise().homogeneous().hnormalized(): " << endl << (P * M.colwise().homogeneous()).colwise().hnormalized() << endl << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/Vectorwise_reverse.cpp b/testbed/nanogui/ext/eigen/doc/snippets/Vectorwise_reverse.cpp deleted file mode 100644 index 2f6a3508..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/Vectorwise_reverse.cpp +++ /dev/null @@ -1,10 +0,0 @@ -MatrixXi m = MatrixXi::Random(3,4); -cout << "Here is the matrix m:" << endl << m << endl; -cout << "Here is the rowwise reverse of m:" << endl << m.rowwise().reverse() << endl; -cout << "Here is the colwise reverse of m:" << endl << m.colwise().reverse() << endl; - -cout << "Here is the coefficient (1,0) in the rowise reverse of m:" << endl -<< m.rowwise().reverse()(1,0) << endl; -cout << "Let us overwrite this coefficient with the value 4." << endl; -//m.colwise().reverse()(1,0) = 4; -cout << "Now the matrix m is:" << endl << m << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/class_FullPivLU.cpp b/testbed/nanogui/ext/eigen/doc/snippets/class_FullPivLU.cpp deleted file mode 100644 index fce7fac0..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/class_FullPivLU.cpp +++ /dev/null @@ -1,16 +0,0 @@ -typedef Matrix Matrix5x3; -typedef Matrix Matrix5x5; -Matrix5x3 m = Matrix5x3::Random(); -cout << "Here is the matrix m:" << endl << m << endl; -Eigen::FullPivLU lu(m); -cout << "Here is, up to permutations, its LU decomposition matrix:" - << endl << lu.matrixLU() << endl; -cout << "Here is the L part:" << endl; -Matrix5x5 l = Matrix5x5::Identity(); -l.block<5,3>(0,0).triangularView() = lu.matrixLU(); -cout << l << endl; -cout << "Here is the U part:" << endl; -Matrix5x3 u = lu.matrixLU().triangularView(); -cout << u << endl; -cout << "Let us now reconstruct the original matrix m:" << endl; -cout << lu.permutationP().inverse() * l * u * lu.permutationQ().inverse() << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/compile_snippet.cpp.in b/testbed/nanogui/ext/eigen/doc/snippets/compile_snippet.cpp.in deleted file mode 100644 index d63f371a..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/compile_snippet.cpp.in +++ /dev/null @@ -1,20 +0,0 @@ -static bool eigen_did_assert = false; -#define eigen_assert(X) if(!eigen_did_assert && !(X)){ std::cout << "### Assertion raised in " << __FILE__ << ":" << __LINE__ << ":\n" #X << "\n### The following would happen without assertions:\n"; eigen_did_assert = true;} - -#include -#include - -#ifndef M_PI -#define M_PI 3.1415926535897932384626433832795 -#endif - - -using namespace Eigen; -using namespace std; - -int main(int, char**) -{ - cout.precision(3); - ${snippet_source_code} - return 0; -} diff --git a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_redux_minmax.cpp b/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_redux_minmax.cpp deleted file mode 100644 index f4ae7f40..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_redux_minmax.cpp +++ /dev/null @@ -1,12 +0,0 @@ - Matrix3f m = Matrix3f::Random(); - std::ptrdiff_t i, j; - float minOfM = m.minCoeff(&i,&j); - cout << "Here is the matrix m:\n" << m << endl; - cout << "Its minimum coefficient (" << minOfM - << ") is at position (" << i << "," << j << ")\n\n"; - - RowVector4i v = RowVector4i::Random(); - int maxOfV = v.maxCoeff(&i); - cout << "Here is the vector v: " << v << endl; - cout << "Its maximum coefficient (" << maxOfV - << ") is at position " << i << endl; diff --git a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_aliasing.cpp b/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_aliasing.cpp deleted file mode 100644 index c8e4746d..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_aliasing.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Matrix2i a; a << 1, 2, 3, 4; -cout << "Here is the matrix a:\n" << a << endl; - -a = a.transpose(); // !!! do NOT do this !!! -cout << "and the result of the aliasing effect:\n" << a << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_conjugate.cpp b/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_conjugate.cpp deleted file mode 100644 index 88496b22..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_conjugate.cpp +++ /dev/null @@ -1,12 +0,0 @@ -MatrixXcf a = MatrixXcf::Random(2,2); -cout << "Here is the matrix a\n" << a << endl; - -cout << "Here is the matrix a^T\n" << a.transpose() << endl; - - -cout << "Here is the conjugate of a\n" << a.conjugate() << endl; - - -cout << "Here is the matrix a^*\n" << a.adjoint() << endl; - - diff --git a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_inplace.cpp b/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_inplace.cpp deleted file mode 100644 index 7a069ff2..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/tut_arithmetic_transpose_inplace.cpp +++ /dev/null @@ -1,6 +0,0 @@ -MatrixXf a(2,3); a << 1, 2, 3, 4, 5, 6; -cout << "Here is the initial matrix a:\n" << a << endl; - - -a.transposeInPlace(); -cout << "and after being transposed:\n" << a << endl; \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/doc/snippets/tut_matrix_assignment_resizing.cpp b/testbed/nanogui/ext/eigen/doc/snippets/tut_matrix_assignment_resizing.cpp deleted file mode 100644 index cf189983..00000000 --- a/testbed/nanogui/ext/eigen/doc/snippets/tut_matrix_assignment_resizing.cpp +++ /dev/null @@ -1,5 +0,0 @@ -MatrixXf a(2,2); -std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl; -MatrixXf b(3,3); -a = b; -std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl; diff --git a/testbed/nanogui/ext/eigen/doc/special_examples/CMakeLists.txt b/testbed/nanogui/ext/eigen/doc/special_examples/CMakeLists.txt deleted file mode 100644 index 101fbc5f..00000000 --- a/testbed/nanogui/ext/eigen/doc/special_examples/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -if(NOT EIGEN_TEST_NOQT) - find_package(Qt4) - if(QT4_FOUND) - include(${QT_USE_FILE}) - endif() -endif(NOT EIGEN_TEST_NOQT) - -if(QT4_FOUND) - add_executable(Tutorial_sparse_example Tutorial_sparse_example.cpp Tutorial_sparse_example_details.cpp) - target_link_libraries(Tutorial_sparse_example ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) - - add_custom_command( - TARGET Tutorial_sparse_example - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/../html/ - COMMAND Tutorial_sparse_example ARGS ${CMAKE_CURRENT_BINARY_DIR}/../html/Tutorial_sparse_example.jpeg - ) - - add_dependencies(all_examples Tutorial_sparse_example) -endif(QT4_FOUND) - -check_cxx_compiler_flag("-std=c++11" EIGEN_COMPILER_SUPPORT_CPP11) -if(EIGEN_COMPILER_SUPPORT_CPP11) - add_executable(random_cpp11 random_cpp11.cpp) - target_link_libraries(random_cpp11 ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) - add_dependencies(all_examples random_cpp11) - ei_add_target_property(random_cpp11 COMPILE_FLAGS "-std=c++11") - - add_custom_command( - TARGET random_cpp11 - POST_BUILD - COMMAND random_cpp11 - ARGS >${CMAKE_CURRENT_BINARY_DIR}/random_cpp11.out - ) -endif() diff --git a/testbed/nanogui/ext/eigen/doc/special_examples/Tutorial_sparse_example.cpp b/testbed/nanogui/ext/eigen/doc/special_examples/Tutorial_sparse_example.cpp deleted file mode 100644 index 830e196e..00000000 --- a/testbed/nanogui/ext/eigen/doc/special_examples/Tutorial_sparse_example.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include - -typedef Eigen::SparseMatrix SpMat; // declares a column-major sparse matrix type of double -typedef Eigen::Triplet T; - -void buildProblem(std::vector& coefficients, Eigen::VectorXd& b, int n); -void saveAsBitmap(const Eigen::VectorXd& x, int n, const char* filename); - -int main(int argc, char** argv) -{ - assert(argc==2); - - int n = 300; // size of the image - int m = n*n; // number of unknows (=number of pixels) - - // Assembly: - std::vector coefficients; // list of non-zeros coefficients - Eigen::VectorXd b(m); // the right hand side-vector resulting from the constraints - buildProblem(coefficients, b, n); - - SpMat A(m,m); - A.setFromTriplets(coefficients.begin(), coefficients.end()); - - // Solving: - Eigen::SimplicialCholesky chol(A); // performs a Cholesky factorization of A - Eigen::VectorXd x = chol.solve(b); // use the factorization to solve for the given right hand side - - // Export the result to a file: - saveAsBitmap(x, n, argv[1]); - - return 0; -} - diff --git a/testbed/nanogui/ext/eigen/doc/special_examples/Tutorial_sparse_example_details.cpp b/testbed/nanogui/ext/eigen/doc/special_examples/Tutorial_sparse_example_details.cpp deleted file mode 100644 index bc18b018..00000000 --- a/testbed/nanogui/ext/eigen/doc/special_examples/Tutorial_sparse_example_details.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include - -typedef Eigen::SparseMatrix SpMat; // declares a column-major sparse matrix type of double -typedef Eigen::Triplet T; - -void insertCoefficient(int id, int i, int j, double w, std::vector& coeffs, - Eigen::VectorXd& b, const Eigen::VectorXd& boundary) -{ - int n = int(boundary.size()); - int id1 = i+j*n; - - if(i==-1 || i==n) b(id) -= w * boundary(j); // constrained coefficient - else if(j==-1 || j==n) b(id) -= w * boundary(i); // constrained coefficient - else coeffs.push_back(T(id,id1,w)); // unknown coefficient -} - -void buildProblem(std::vector& coefficients, Eigen::VectorXd& b, int n) -{ - b.setZero(); - Eigen::ArrayXd boundary = Eigen::ArrayXd::LinSpaced(n, 0,M_PI).sin().pow(2); - for(int j=0; j bits = (x*255).cast(); - QImage img(bits.data(), n,n,QImage::Format_Indexed8); - img.setColorCount(256); - for(int i=0;i<256;i++) img.setColor(i,qRgb(i,i,i)); - img.save(filename); -} diff --git a/testbed/nanogui/ext/eigen/doc/special_examples/random_cpp11.cpp b/testbed/nanogui/ext/eigen/doc/special_examples/random_cpp11.cpp deleted file mode 100644 index 33744c05..00000000 --- a/testbed/nanogui/ext/eigen/doc/special_examples/random_cpp11.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -using namespace Eigen; - -int main() { - std::default_random_engine generator; - std::poisson_distribution distribution(4.1); - auto poisson = [&] () {return distribution(generator);}; - - RowVectorXi v = RowVectorXi::NullaryExpr(10, poisson ); - std::cout << v << "\n"; -} diff --git a/testbed/nanogui/ext/eigen/doc/tutorial.cpp b/testbed/nanogui/ext/eigen/doc/tutorial.cpp deleted file mode 100644 index 62be7c27..00000000 --- a/testbed/nanogui/ext/eigen/doc/tutorial.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include - -int main(int argc, char *argv[]) -{ - std::cout.precision(2); - - // demo static functions - Eigen::Matrix3f m3 = Eigen::Matrix3f::Random(); - Eigen::Matrix4f m4 = Eigen::Matrix4f::Identity(); - - std::cout << "*** Step 1 ***\nm3:\n" << m3 << "\nm4:\n" << m4 << std::endl; - - // demo non-static set... functions - m4.setZero(); - m3.diagonal().setOnes(); - - std::cout << "*** Step 2 ***\nm3:\n" << m3 << "\nm4:\n" << m4 << std::endl; - - // demo fixed-size block() expression as lvalue and as rvalue - m4.block<3,3>(0,1) = m3; - m3.row(2) = m4.block<1,3>(2,0); - - std::cout << "*** Step 3 ***\nm3:\n" << m3 << "\nm4:\n" << m4 << std::endl; - - // demo dynamic-size block() - { - int rows = 3, cols = 3; - m4.block(0,1,3,3).setIdentity(); - std::cout << "*** Step 4 ***\nm4:\n" << m4 << std::endl; - } - - // demo vector blocks - m4.diagonal().block(1,2).setOnes(); - std::cout << "*** Step 5 ***\nm4.diagonal():\n" << m4.diagonal() << std::endl; - std::cout << "m4.diagonal().start(3)\n" << m4.diagonal().start(3) << std::endl; - - // demo coeff-wise operations - m4 = m4.cwise()*m4; - m3 = m3.cwise().cos(); - std::cout << "*** Step 6 ***\nm3:\n" << m3 << "\nm4:\n" << m4 << std::endl; - - // sums of coefficients - std::cout << "*** Step 7 ***\n m4.sum(): " << m4.sum() << std::endl; - std::cout << "m4.col(2).sum(): " << m4.col(2).sum() << std::endl; - std::cout << "m4.colwise().sum():\n" << m4.colwise().sum() << std::endl; - std::cout << "m4.rowwise().sum():\n" << m4.rowwise().sum() << std::endl; - - // demo intelligent auto-evaluation - m4 = m4 * m4; // auto-evaluates so no aliasing problem (performance penalty is low) - Eigen::Matrix4f other = (m4 * m4).lazy(); // forces lazy evaluation - m4 = m4 + m4; // here Eigen goes for lazy evaluation, as with most expressions - m4 = -m4 + m4 + 5 * m4; // same here, Eigen chooses lazy evaluation for all that. - m4 = m4 * (m4 + m4); // here Eigen chooses to first evaluate m4 + m4 into a temporary. - // indeed, here it is an optimization to cache this intermediate result. - m3 = m3 * m4.block<3,3>(1,1); // here Eigen chooses NOT to evaluate block() into a temporary - // because accessing coefficients of that block expression is not more costly than accessing - // coefficients of a plain matrix. - m4 = m4 * m4.transpose(); // same here, lazy evaluation of the transpose. - m4 = m4 * m4.transpose().eval(); // forces immediate evaluation of the transpose - - std::cout << "*** Step 8 ***\nm3:\n" << m3 << "\nm4:\n" << m4 << std::endl; -} diff --git a/testbed/nanogui/ext/eigen/eigen3.pc.in b/testbed/nanogui/ext/eigen/eigen3.pc.in deleted file mode 100644 index 3368a3aa..00000000 --- a/testbed/nanogui/ext/eigen/eigen3.pc.in +++ /dev/null @@ -1,9 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix} - -Name: Eigen3 -Description: A C++ template library for linear algebra: vectors, matrices, and related algorithms -Requires: -Version: @EIGEN_VERSION_NUMBER@ -Libs: -Cflags: -I${prefix}/@INCLUDE_INSTALL_DIR@ diff --git a/testbed/nanogui/ext/eigen/failtest/CMakeLists.txt b/testbed/nanogui/ext/eigen/failtest/CMakeLists.txt deleted file mode 100644 index 1a73f05e..00000000 --- a/testbed/nanogui/ext/eigen/failtest/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -message(STATUS "Running the failtests") - -ei_add_failtest("failtest_sanity_check") - -ei_add_failtest("block_nonconst_ctor_on_const_xpr_0") -ei_add_failtest("block_nonconst_ctor_on_const_xpr_1") -ei_add_failtest("block_nonconst_ctor_on_const_xpr_2") -ei_add_failtest("transpose_nonconst_ctor_on_const_xpr") -ei_add_failtest("diagonal_nonconst_ctor_on_const_xpr") -ei_add_failtest("cwiseunaryview_nonconst_ctor_on_const_xpr") -ei_add_failtest("triangularview_nonconst_ctor_on_const_xpr") -ei_add_failtest("selfadjointview_nonconst_ctor_on_const_xpr") - -ei_add_failtest("const_qualified_block_method_retval_0") -ei_add_failtest("const_qualified_block_method_retval_1") -ei_add_failtest("const_qualified_transpose_method_retval") -ei_add_failtest("const_qualified_diagonal_method_retval") - -ei_add_failtest("map_nonconst_ctor_on_const_ptr_0") -ei_add_failtest("map_nonconst_ctor_on_const_ptr_1") -ei_add_failtest("map_nonconst_ctor_on_const_ptr_2") -ei_add_failtest("map_nonconst_ctor_on_const_ptr_3") -ei_add_failtest("map_nonconst_ctor_on_const_ptr_4") - -ei_add_failtest("map_on_const_type_actually_const_0") -ei_add_failtest("map_on_const_type_actually_const_1") -ei_add_failtest("block_on_const_type_actually_const_0") -ei_add_failtest("block_on_const_type_actually_const_1") -ei_add_failtest("transpose_on_const_type_actually_const") -ei_add_failtest("diagonal_on_const_type_actually_const") -ei_add_failtest("cwiseunaryview_on_const_type_actually_const") -ei_add_failtest("triangularview_on_const_type_actually_const") -ei_add_failtest("selfadjointview_on_const_type_actually_const") - -ei_add_failtest("ref_1") -ei_add_failtest("ref_2") -ei_add_failtest("ref_3") -ei_add_failtest("ref_4") -ei_add_failtest("ref_5") - -ei_add_failtest("swap_1") -ei_add_failtest("swap_2") - -ei_add_failtest("ternary_1") -ei_add_failtest("ternary_2") - -ei_add_failtest("sparse_ref_1") -ei_add_failtest("sparse_ref_2") -ei_add_failtest("sparse_ref_3") -ei_add_failtest("sparse_ref_4") -ei_add_failtest("sparse_ref_5") - -ei_add_failtest("sparse_storage_mismatch") - -ei_add_failtest("partialpivlu_int") -ei_add_failtest("fullpivlu_int") -ei_add_failtest("llt_int") -ei_add_failtest("ldlt_int") -ei_add_failtest("qr_int") -ei_add_failtest("colpivqr_int") -ei_add_failtest("fullpivqr_int") -ei_add_failtest("jacobisvd_int") -ei_add_failtest("bdcsvd_int") -ei_add_failtest("eigensolver_int") -ei_add_failtest("eigensolver_cplx") - -if (EIGEN_FAILTEST_FAILURE_COUNT) - message(FATAL_ERROR - "${EIGEN_FAILTEST_FAILURE_COUNT} out of ${EIGEN_FAILTEST_COUNT} failtests FAILED. " - "To debug these failures, manually compile these programs in ${CMAKE_CURRENT_SOURCE_DIR}, " - "with and without #define EIGEN_SHOULD_FAIL_TO_BUILD.") -else() - message(STATUS "Failtest SUCCESS: all ${EIGEN_FAILTEST_COUNT} failtests passed.") - message(STATUS "") -endif() diff --git a/testbed/nanogui/ext/eigen/failtest/bdcsvd_int.cpp b/testbed/nanogui/ext/eigen/failtest/bdcsvd_int.cpp deleted file mode 100644 index 670752cf..00000000 --- a/testbed/nanogui/ext/eigen/failtest/bdcsvd_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/SVD" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - BDCSVD > qr(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_0.cpp b/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_0.cpp deleted file mode 100644 index 40b82014..00000000 --- a/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_0.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Block b(m,0,0); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_1.cpp b/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_1.cpp deleted file mode 100644 index ef6d5370..00000000 --- a/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_1.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Block b(m,0,0,3,3); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_2.cpp b/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_2.cpp deleted file mode 100644 index 43f18aec..00000000 --- a/testbed/nanogui/ext/eigen/failtest/block_nonconst_ctor_on_const_xpr_2.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - // row/column constructor - Block b(m,0); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/block_on_const_type_actually_const_0.cpp b/testbed/nanogui/ext/eigen/failtest/block_on_const_type_actually_const_0.cpp deleted file mode 100644 index 009bebec..00000000 --- a/testbed/nanogui/ext/eigen/failtest/block_on_const_type_actually_const_0.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - Matrix3f m; - Block(m, 0, 0, 3, 3).coeffRef(0, 0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/block_on_const_type_actually_const_1.cpp b/testbed/nanogui/ext/eigen/failtest/block_on_const_type_actually_const_1.cpp deleted file mode 100644 index 4c3e93ff..00000000 --- a/testbed/nanogui/ext/eigen/failtest/block_on_const_type_actually_const_1.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - MatrixXf m; - Block(m, 0, 0).coeffRef(0, 0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/colpivqr_int.cpp b/testbed/nanogui/ext/eigen/failtest/colpivqr_int.cpp deleted file mode 100644 index db11910d..00000000 --- a/testbed/nanogui/ext/eigen/failtest/colpivqr_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/QR" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - ColPivHouseholderQR > qr(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/const_qualified_block_method_retval_0.cpp b/testbed/nanogui/ext/eigen/failtest/const_qualified_block_method_retval_0.cpp deleted file mode 100644 index a6bd5fee..00000000 --- a/testbed/nanogui/ext/eigen/failtest/const_qualified_block_method_retval_0.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Block b(m.block<3,3>(0,0)); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/const_qualified_block_method_retval_1.cpp b/testbed/nanogui/ext/eigen/failtest/const_qualified_block_method_retval_1.cpp deleted file mode 100644 index ef40c247..00000000 --- a/testbed/nanogui/ext/eigen/failtest/const_qualified_block_method_retval_1.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Block b(m.block(0,0,3,3)); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/const_qualified_diagonal_method_retval.cpp b/testbed/nanogui/ext/eigen/failtest/const_qualified_diagonal_method_retval.cpp deleted file mode 100644 index 809594aa..00000000 --- a/testbed/nanogui/ext/eigen/failtest/const_qualified_diagonal_method_retval.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Diagonal b(m.diagonal()); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/const_qualified_transpose_method_retval.cpp b/testbed/nanogui/ext/eigen/failtest/const_qualified_transpose_method_retval.cpp deleted file mode 100644 index 2d7f19ca..00000000 --- a/testbed/nanogui/ext/eigen/failtest/const_qualified_transpose_method_retval.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Transpose b(m.transpose()); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/cwiseunaryview_nonconst_ctor_on_const_xpr.cpp b/testbed/nanogui/ext/eigen/failtest/cwiseunaryview_nonconst_ctor_on_const_xpr.cpp deleted file mode 100644 index e23cf8fd..00000000 --- a/testbed/nanogui/ext/eigen/failtest/cwiseunaryview_nonconst_ctor_on_const_xpr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - CwiseUnaryView,Matrix3d> t(m); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/cwiseunaryview_on_const_type_actually_const.cpp b/testbed/nanogui/ext/eigen/failtest/cwiseunaryview_on_const_type_actually_const.cpp deleted file mode 100644 index fcd41dfd..00000000 --- a/testbed/nanogui/ext/eigen/failtest/cwiseunaryview_on_const_type_actually_const.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - MatrixXf m; - CwiseUnaryView,CV_QUALIFIER MatrixXf>(m).coeffRef(0, 0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/diagonal_nonconst_ctor_on_const_xpr.cpp b/testbed/nanogui/ext/eigen/failtest/diagonal_nonconst_ctor_on_const_xpr.cpp deleted file mode 100644 index 76398a2c..00000000 --- a/testbed/nanogui/ext/eigen/failtest/diagonal_nonconst_ctor_on_const_xpr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Diagonal d(m); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/diagonal_on_const_type_actually_const.cpp b/testbed/nanogui/ext/eigen/failtest/diagonal_on_const_type_actually_const.cpp deleted file mode 100644 index d4b2fd9b..00000000 --- a/testbed/nanogui/ext/eigen/failtest/diagonal_on_const_type_actually_const.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - MatrixXf m; - Diagonal(m).coeffRef(0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/eigensolver_cplx.cpp b/testbed/nanogui/ext/eigen/failtest/eigensolver_cplx.cpp deleted file mode 100644 index c2e21e18..00000000 --- a/testbed/nanogui/ext/eigen/failtest/eigensolver_cplx.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/Eigenvalues" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR std::complex -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - EigenSolver > eig(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/eigensolver_int.cpp b/testbed/nanogui/ext/eigen/failtest/eigensolver_int.cpp deleted file mode 100644 index eda8dc20..00000000 --- a/testbed/nanogui/ext/eigen/failtest/eigensolver_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/Eigenvalues" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - EigenSolver > eig(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/failtest_sanity_check.cpp b/testbed/nanogui/ext/eigen/failtest/failtest_sanity_check.cpp deleted file mode 100644 index 769fa942..00000000 --- a/testbed/nanogui/ext/eigen/failtest/failtest_sanity_check.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -This is just some text that won't compile as a C++ file, as a basic sanity check for failtest. -#else -int main() {} -#endif diff --git a/testbed/nanogui/ext/eigen/failtest/fullpivlu_int.cpp b/testbed/nanogui/ext/eigen/failtest/fullpivlu_int.cpp deleted file mode 100644 index e9d2c6eb..00000000 --- a/testbed/nanogui/ext/eigen/failtest/fullpivlu_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/LU" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - FullPivLU > lu(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/fullpivqr_int.cpp b/testbed/nanogui/ext/eigen/failtest/fullpivqr_int.cpp deleted file mode 100644 index d182a7b6..00000000 --- a/testbed/nanogui/ext/eigen/failtest/fullpivqr_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/QR" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - FullPivHouseholderQR > qr(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/jacobisvd_int.cpp b/testbed/nanogui/ext/eigen/failtest/jacobisvd_int.cpp deleted file mode 100644 index 12790aef..00000000 --- a/testbed/nanogui/ext/eigen/failtest/jacobisvd_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/SVD" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - JacobiSVD > qr(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/ldlt_int.cpp b/testbed/nanogui/ext/eigen/failtest/ldlt_int.cpp deleted file mode 100644 index 243e4574..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ldlt_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/Cholesky" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - LDLT > ldlt(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/llt_int.cpp b/testbed/nanogui/ext/eigen/failtest/llt_int.cpp deleted file mode 100644 index cb020650..00000000 --- a/testbed/nanogui/ext/eigen/failtest/llt_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/Cholesky" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - LLT > llt(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_0.cpp b/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_0.cpp deleted file mode 100644 index d75686f5..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_0.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER float *ptr){ - Map m(ptr); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_1.cpp b/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_1.cpp deleted file mode 100644 index eda134dc..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_1.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER float *ptr, DenseIndex size){ - Map m(ptr, size); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_2.cpp b/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_2.cpp deleted file mode 100644 index 06b4b627..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_2.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER float *ptr, DenseIndex rows, DenseIndex cols){ - Map m(ptr, rows, cols); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_3.cpp b/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_3.cpp deleted file mode 100644 index 830f6f0c..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_3.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER float *ptr, DenseIndex rows, DenseIndex cols){ - Map > m(ptr, rows, cols, InnerStride<2>()); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_4.cpp b/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_4.cpp deleted file mode 100644 index c3e8c952..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_nonconst_ctor_on_const_ptr_4.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER -#else -#define CV_QUALIFIER const -#endif - -using namespace Eigen; - -void foo(const float *ptr, DenseIndex rows, DenseIndex cols){ - Map > m(ptr, rows, cols, OuterStride<>(2)); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/map_on_const_type_actually_const_0.cpp b/testbed/nanogui/ext/eigen/failtest/map_on_const_type_actually_const_0.cpp deleted file mode 100644 index 8cb6aa0c..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_on_const_type_actually_const_0.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(float *ptr){ - Map(ptr, 1, 1).coeffRef(0,0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/map_on_const_type_actually_const_1.cpp b/testbed/nanogui/ext/eigen/failtest/map_on_const_type_actually_const_1.cpp deleted file mode 100644 index 04e067c3..00000000 --- a/testbed/nanogui/ext/eigen/failtest/map_on_const_type_actually_const_1.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(float *ptr){ - Map(ptr).coeffRef(0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/partialpivlu_int.cpp b/testbed/nanogui/ext/eigen/failtest/partialpivlu_int.cpp deleted file mode 100644 index 98ef282e..00000000 --- a/testbed/nanogui/ext/eigen/failtest/partialpivlu_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/LU" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - PartialPivLU > lu(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/qr_int.cpp b/testbed/nanogui/ext/eigen/failtest/qr_int.cpp deleted file mode 100644 index ce200e81..00000000 --- a/testbed/nanogui/ext/eigen/failtest/qr_int.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/QR" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define SCALAR int -#else -#define SCALAR float -#endif - -using namespace Eigen; - -int main() -{ - HouseholderQR > qr(Matrix::Random(10,10)); -} diff --git a/testbed/nanogui/ext/eigen/failtest/ref_1.cpp b/testbed/nanogui/ext/eigen/failtest/ref_1.cpp deleted file mode 100644 index 8b798d53..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ref_1.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void call_ref(Ref a) { } - -int main() -{ - VectorXf a(10); - CV_QUALIFIER VectorXf& ac(a); - call_ref(ac); -} diff --git a/testbed/nanogui/ext/eigen/failtest/ref_2.cpp b/testbed/nanogui/ext/eigen/failtest/ref_2.cpp deleted file mode 100644 index 0b779ccf..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ref_2.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -void call_ref(Ref a) { } - -int main() -{ - MatrixXf A(10,10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - call_ref(A.row(3)); -#else - call_ref(A.col(3)); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/ref_3.cpp b/testbed/nanogui/ext/eigen/failtest/ref_3.cpp deleted file mode 100644 index f46027d4..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ref_3.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -void call_ref(Ref a) { } -#else -void call_ref(const Ref &a) { } -#endif - -int main() -{ - VectorXf a(10); - call_ref(a+a); -} diff --git a/testbed/nanogui/ext/eigen/failtest/ref_4.cpp b/testbed/nanogui/ext/eigen/failtest/ref_4.cpp deleted file mode 100644 index 6c11fa4c..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ref_4.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -void call_ref(Ref > a) {} - -int main() -{ - MatrixXf A(10,10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - call_ref(A.transpose()); -#else - call_ref(A); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/ref_5.cpp b/testbed/nanogui/ext/eigen/failtest/ref_5.cpp deleted file mode 100644 index 846d5279..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ref_5.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -void call_ref(Ref a) { } - -int main() -{ - VectorXf a(10); - DenseBase &ac(a); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - call_ref(ac); -#else - call_ref(ac.derived()); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/selfadjointview_nonconst_ctor_on_const_xpr.cpp b/testbed/nanogui/ext/eigen/failtest/selfadjointview_nonconst_ctor_on_const_xpr.cpp deleted file mode 100644 index a240f818..00000000 --- a/testbed/nanogui/ext/eigen/failtest/selfadjointview_nonconst_ctor_on_const_xpr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - SelfAdjointView t(m); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/selfadjointview_on_const_type_actually_const.cpp b/testbed/nanogui/ext/eigen/failtest/selfadjointview_on_const_type_actually_const.cpp deleted file mode 100644 index 19aaad6d..00000000 --- a/testbed/nanogui/ext/eigen/failtest/selfadjointview_on_const_type_actually_const.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - MatrixXf m; - SelfAdjointView(m).coeffRef(0, 0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/sparse_ref_1.cpp b/testbed/nanogui/ext/eigen/failtest/sparse_ref_1.cpp deleted file mode 100644 index d78d1f9b..00000000 --- a/testbed/nanogui/ext/eigen/failtest/sparse_ref_1.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "../Eigen/Sparse" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void call_ref(Ref > a) { } - -int main() -{ - SparseMatrix a(10,10); - CV_QUALIFIER SparseMatrix& ac(a); - call_ref(ac); -} diff --git a/testbed/nanogui/ext/eigen/failtest/sparse_ref_2.cpp b/testbed/nanogui/ext/eigen/failtest/sparse_ref_2.cpp deleted file mode 100644 index 46c9440c..00000000 --- a/testbed/nanogui/ext/eigen/failtest/sparse_ref_2.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Sparse" - -using namespace Eigen; - -void call_ref(Ref > a) { } - -int main() -{ - SparseMatrix A(10,10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - call_ref(A.row(3)); -#else - call_ref(A.col(3)); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/sparse_ref_3.cpp b/testbed/nanogui/ext/eigen/failtest/sparse_ref_3.cpp deleted file mode 100644 index a9949b55..00000000 --- a/testbed/nanogui/ext/eigen/failtest/sparse_ref_3.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Sparse" - -using namespace Eigen; - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -void call_ref(Ref > a) { } -#else -void call_ref(const Ref > &a) { } -#endif - -int main() -{ - SparseMatrix a(10,10); - call_ref(a+a); -} diff --git a/testbed/nanogui/ext/eigen/failtest/sparse_ref_4.cpp b/testbed/nanogui/ext/eigen/failtest/sparse_ref_4.cpp deleted file mode 100644 index 57bb6a1f..00000000 --- a/testbed/nanogui/ext/eigen/failtest/sparse_ref_4.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Sparse" - -using namespace Eigen; - -void call_ref(Ref > a) {} - -int main() -{ - SparseMatrix A(10,10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - call_ref(A.transpose()); -#else - call_ref(A); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/sparse_ref_5.cpp b/testbed/nanogui/ext/eigen/failtest/sparse_ref_5.cpp deleted file mode 100644 index 4478f6f2..00000000 --- a/testbed/nanogui/ext/eigen/failtest/sparse_ref_5.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Sparse" - -using namespace Eigen; - -void call_ref(Ref > a) { } - -int main() -{ - SparseMatrix a(10,10); - SparseMatrixBase > &ac(a); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - call_ref(ac); -#else - call_ref(ac.derived()); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/sparse_storage_mismatch.cpp b/testbed/nanogui/ext/eigen/failtest/sparse_storage_mismatch.cpp deleted file mode 100644 index 51840d41..00000000 --- a/testbed/nanogui/ext/eigen/failtest/sparse_storage_mismatch.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Sparse" -using namespace Eigen; - -typedef SparseMatrix Mat1; -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -typedef SparseMatrix Mat2; -#else -typedef SparseMatrix Mat2; -#endif - -int main() -{ - Mat1 a(10,10); - Mat2 b(10,10); - a += b; -} diff --git a/testbed/nanogui/ext/eigen/failtest/swap_1.cpp b/testbed/nanogui/ext/eigen/failtest/swap_1.cpp deleted file mode 100644 index 10637972..00000000 --- a/testbed/nanogui/ext/eigen/failtest/swap_1.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -int main() -{ - VectorXf a(10), b(10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - const DenseBase &ac(a); -#else - DenseBase &ac(a); -#endif - b.swap(ac); -} diff --git a/testbed/nanogui/ext/eigen/failtest/swap_2.cpp b/testbed/nanogui/ext/eigen/failtest/swap_2.cpp deleted file mode 100644 index c130ba6e..00000000 --- a/testbed/nanogui/ext/eigen/failtest/swap_2.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -int main() -{ - VectorXf a(10), b(10); - VectorXf const &ac(a); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - b.swap(ac); -#else - b.swap(ac.const_cast_derived()); -#endif -} \ No newline at end of file diff --git a/testbed/nanogui/ext/eigen/failtest/ternary_1.cpp b/testbed/nanogui/ext/eigen/failtest/ternary_1.cpp deleted file mode 100644 index b40bcb0c..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ternary_1.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -int main(int argc,char **) -{ - VectorXf a(10), b(10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - b = argc>1 ? 2*a : -a; -#else - b = argc>1 ? 2*a : VectorXf(-a); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/ternary_2.cpp b/testbed/nanogui/ext/eigen/failtest/ternary_2.cpp deleted file mode 100644 index a46b12b2..00000000 --- a/testbed/nanogui/ext/eigen/failtest/ternary_2.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "../Eigen/Core" - -using namespace Eigen; - -int main(int argc,char **) -{ - VectorXf a(10), b(10); -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD - b = argc>1 ? 2*a : a+a; -#else - b = argc>1 ? VectorXf(2*a) : VectorXf(a+a); -#endif -} diff --git a/testbed/nanogui/ext/eigen/failtest/transpose_nonconst_ctor_on_const_xpr.cpp b/testbed/nanogui/ext/eigen/failtest/transpose_nonconst_ctor_on_const_xpr.cpp deleted file mode 100644 index 4223e7fd..00000000 --- a/testbed/nanogui/ext/eigen/failtest/transpose_nonconst_ctor_on_const_xpr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - Transpose t(m); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/transpose_on_const_type_actually_const.cpp b/testbed/nanogui/ext/eigen/failtest/transpose_on_const_type_actually_const.cpp deleted file mode 100644 index d0b7d0df..00000000 --- a/testbed/nanogui/ext/eigen/failtest/transpose_on_const_type_actually_const.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - MatrixXf m; - Transpose(m).coeffRef(0, 0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/triangularview_nonconst_ctor_on_const_xpr.cpp b/testbed/nanogui/ext/eigen/failtest/triangularview_nonconst_ctor_on_const_xpr.cpp deleted file mode 100644 index 807447e4..00000000 --- a/testbed/nanogui/ext/eigen/failtest/triangularview_nonconst_ctor_on_const_xpr.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(CV_QUALIFIER Matrix3d &m){ - TriangularView t(m); -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/failtest/triangularview_on_const_type_actually_const.cpp b/testbed/nanogui/ext/eigen/failtest/triangularview_on_const_type_actually_const.cpp deleted file mode 100644 index 0a381a61..00000000 --- a/testbed/nanogui/ext/eigen/failtest/triangularview_on_const_type_actually_const.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../Eigen/Core" - -#ifdef EIGEN_SHOULD_FAIL_TO_BUILD -#define CV_QUALIFIER const -#else -#define CV_QUALIFIER -#endif - -using namespace Eigen; - -void foo(){ - MatrixXf m; - TriangularView(m).coeffRef(0, 0) = 1.0f; -} - -int main() {} diff --git a/testbed/nanogui/ext/eigen/lapack/CMakeLists.txt b/testbed/nanogui/ext/eigen/lapack/CMakeLists.txt deleted file mode 100644 index 9883d4c7..00000000 --- a/testbed/nanogui/ext/eigen/lapack/CMakeLists.txt +++ /dev/null @@ -1,449 +0,0 @@ - -project(EigenLapack CXX) - -include("../cmake/language_support.cmake") - -workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS) - -if(EIGEN_Fortran_COMPILER_WORKS) - enable_language(Fortran OPTIONAL) - if(NOT CMAKE_Fortran_COMPILER) - set(EIGEN_Fortran_COMPILER_WORKS OFF) - endif() -endif() - -add_custom_target(lapack) -include_directories(../blas) - -set(EigenLapack_SRCS -single.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp -) - -if(EIGEN_Fortran_COMPILER_WORKS) - -set(EigenLapack_SRCS ${EigenLapack_SRCS} - slarft.f dlarft.f clarft.f zlarft.f - slarfb.f dlarfb.f clarfb.f zlarfb.f - slarfg.f dlarfg.f clarfg.f zlarfg.f - slarf.f dlarf.f clarf.f zlarf.f - sladiv.f dladiv.f cladiv.f zladiv.f - ilaslr.f iladlr.f ilaclr.f ilazlr.f - ilaslc.f iladlc.f ilaclc.f ilazlc.f - dlapy2.f dlapy3.f slapy2.f slapy3.f - clacgv.f zlacgv.f - slamch.f dlamch.f - second_NONE.f dsecnd_NONE.f -) - -option(EIGEN_ENABLE_LAPACK_TESTS OFF "Enbale the Lapack unit tests") - -if(EIGEN_ENABLE_LAPACK_TESTS) - - get_filename_component(eigen_full_path_to_reference_lapack "./reference/" ABSOLUTE) - if(NOT EXISTS ${eigen_full_path_to_reference_lapack}) - # Download lapack and install sources and testing at the right place - message(STATUS "Download lapack_addons_3.4.1.tgz...") - - file(DOWNLOAD "http://downloads.tuxfamily.org/eigen/lapack_addons_3.4.1.tgz" - "${CMAKE_CURRENT_SOURCE_DIR}/lapack_addons_3.4.1.tgz" - INACTIVITY_TIMEOUT 15 - TIMEOUT 240 - STATUS download_status - EXPECTED_MD5 5758ce55afcf79da98de8b9de1615ad5 - SHOW_PROGRESS) - - message(STATUS ${download_status}) - list(GET download_status 0 download_status_num) - set(download_status_num 0) - if(download_status_num EQUAL 0) - message(STATUS "Setup lapack reference and lapack unit tests") - execute_process(COMMAND tar xzf "lapack_addons_3.4.1.tgz" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - else() - message(STATUS "Download of lapack_addons_3.4.1.tgz failed, LAPACK unit tests wont be enabled") - set(EIGEN_ENABLE_LAPACK_TESTS false) - endif() - - endif() - - get_filename_component(eigen_full_path_to_reference_lapack "./reference/" ABSOLUTE) - if(EXISTS ${eigen_full_path_to_reference_lapack}) - set(EigenLapack_funcfilenames - ssyev.f dsyev.f csyev.f zsyev.f - spotrf.f dpotrf.f cpotrf.f zpotrf.f - spotrs.f dpotrs.f cpotrs.f zpotrs.f - sgetrf.f dgetrf.f cgetrf.f zgetrf.f - sgetrs.f dgetrs.f cgetrs.f zgetrs.f) - - FILE(GLOB ReferenceLapack_SRCS0 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "reference/*.f") - foreach(filename1 IN LISTS ReferenceLapack_SRCS0) - string(REPLACE "reference/" "" filename ${filename1}) - list(FIND EigenLapack_SRCS ${filename} id1) - list(FIND EigenLapack_funcfilenames ${filename} id2) - if((id1 EQUAL -1) AND (id2 EQUAL -1)) - set(ReferenceLapack_SRCS ${ReferenceLapack_SRCS} reference/${filename}) - endif() - endforeach() - endif() - - -endif(EIGEN_ENABLE_LAPACK_TESTS) - -endif(EIGEN_Fortran_COMPILER_WORKS) - -add_library(eigen_lapack_static ${EigenLapack_SRCS} ${ReferenceLapack_SRCS}) -add_library(eigen_lapack SHARED ${EigenLapack_SRCS}) - -target_link_libraries(eigen_lapack eigen_blas) - -if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) - target_link_libraries(eigen_lapack_static ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) - target_link_libraries(eigen_lapack ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) -endif() - -add_dependencies(lapack eigen_lapack eigen_lapack_static) - -install(TARGETS eigen_lapack eigen_lapack_static - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib) - - - -get_filename_component(eigen_full_path_to_testing_lapack "./testing/" ABSOLUTE) -if(EXISTS ${eigen_full_path_to_testing_lapack}) - - # The following comes from lapack/TESTING/CMakeLists.txt - # Get Python - find_package(PythonInterp) - message(STATUS "Looking for Python found - ${PYTHONINTERP_FOUND}") - if (PYTHONINTERP_FOUND) - message(STATUS "Using Python version ${PYTHON_VERSION_STRING}") - endif() - - set(LAPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(LAPACK_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) - set(BUILD_SINGLE true) - set(BUILD_DOUBLE true) - set(BUILD_COMPLEX true) - set(BUILD_COMPLEX16E true) - - if(MSVC_VERSION) -# string(REPLACE "/STACK:10000000" "/STACK:900000000000000000" -# CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - string(REGEX REPLACE "(.*)/STACK:(.*) (.*)" "\\1/STACK:900000000000000000 \\3" - CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") - endif() - add_subdirectory(testing/MATGEN) - add_subdirectory(testing/LIN) - add_subdirectory(testing/EIG) - macro(add_lapack_test output input target) - set(TEST_INPUT "${LAPACK_SOURCE_DIR}/testing/${input}") - set(TEST_OUTPUT "${LAPACK_BINARY_DIR}/testing/${output}") - get_target_property(TEST_LOC ${target} LOCATION) - string(REPLACE "." "_" input_name ${input}) - set(testName "${target}_${input_name}") - if(EXISTS "${TEST_INPUT}") - add_test(LAPACK-${testName} "${CMAKE_COMMAND}" - -DTEST=${TEST_LOC} - -DINPUT=${TEST_INPUT} - -DOUTPUT=${TEST_OUTPUT} - -DINTDIR=${CMAKE_CFG_INTDIR} - -P "${LAPACK_SOURCE_DIR}/testing/runtest.cmake") - endif() - endmacro(add_lapack_test) - - if (BUILD_SINGLE) - add_lapack_test(stest.out stest.in xlintsts) - # - # ======== SINGLE RFP LIN TESTS ======================== - add_lapack_test(stest_rfp.out stest_rfp.in xlintstrfs) - # - # - # ======== SINGLE EIG TESTS =========================== - # - - add_lapack_test(snep.out nep.in xeigtsts) - - - add_lapack_test(ssep.out sep.in xeigtsts) - - - add_lapack_test(ssvd.out svd.in xeigtsts) - - - add_lapack_test(sec.out sec.in xeigtsts) - - - add_lapack_test(sed.out sed.in xeigtsts) - - - add_lapack_test(sgg.out sgg.in xeigtsts) - - - add_lapack_test(sgd.out sgd.in xeigtsts) - - - add_lapack_test(ssb.out ssb.in xeigtsts) - - - add_lapack_test(ssg.out ssg.in xeigtsts) - - - add_lapack_test(sbal.out sbal.in xeigtsts) - - - add_lapack_test(sbak.out sbak.in xeigtsts) - - - add_lapack_test(sgbal.out sgbal.in xeigtsts) - - - add_lapack_test(sgbak.out sgbak.in xeigtsts) - - - add_lapack_test(sbb.out sbb.in xeigtsts) - - - add_lapack_test(sglm.out glm.in xeigtsts) - - - add_lapack_test(sgqr.out gqr.in xeigtsts) - - - add_lapack_test(sgsv.out gsv.in xeigtsts) - - - add_lapack_test(scsd.out csd.in xeigtsts) - - - add_lapack_test(slse.out lse.in xeigtsts) - endif() - - if (BUILD_DOUBLE) - # - # ======== DOUBLE LIN TESTS =========================== - add_lapack_test(dtest.out dtest.in xlintstd) - # - # ======== DOUBLE RFP LIN TESTS ======================== - add_lapack_test(dtest_rfp.out dtest_rfp.in xlintstrfd) - # - # ======== DOUBLE EIG TESTS =========================== - - add_lapack_test(dnep.out nep.in xeigtstd) - - - add_lapack_test(dsep.out sep.in xeigtstd) - - - add_lapack_test(dsvd.out svd.in xeigtstd) - - - add_lapack_test(dec.out dec.in xeigtstd) - - - add_lapack_test(ded.out ded.in xeigtstd) - - - add_lapack_test(dgg.out dgg.in xeigtstd) - - - add_lapack_test(dgd.out dgd.in xeigtstd) - - - add_lapack_test(dsb.out dsb.in xeigtstd) - - - add_lapack_test(dsg.out dsg.in xeigtstd) - - - add_lapack_test(dbal.out dbal.in xeigtstd) - - - add_lapack_test(dbak.out dbak.in xeigtstd) - - - add_lapack_test(dgbal.out dgbal.in xeigtstd) - - - add_lapack_test(dgbak.out dgbak.in xeigtstd) - - - add_lapack_test(dbb.out dbb.in xeigtstd) - - - add_lapack_test(dglm.out glm.in xeigtstd) - - - add_lapack_test(dgqr.out gqr.in xeigtstd) - - - add_lapack_test(dgsv.out gsv.in xeigtstd) - - - add_lapack_test(dcsd.out csd.in xeigtstd) - - - add_lapack_test(dlse.out lse.in xeigtstd) - endif() - - if (BUILD_COMPLEX) - add_lapack_test(ctest.out ctest.in xlintstc) - # - # ======== COMPLEX RFP LIN TESTS ======================== - add_lapack_test(ctest_rfp.out ctest_rfp.in xlintstrfc) - # - # ======== COMPLEX EIG TESTS =========================== - - add_lapack_test(cnep.out nep.in xeigtstc) - - - add_lapack_test(csep.out sep.in xeigtstc) - - - add_lapack_test(csvd.out svd.in xeigtstc) - - - add_lapack_test(cec.out cec.in xeigtstc) - - - add_lapack_test(ced.out ced.in xeigtstc) - - - add_lapack_test(cgg.out cgg.in xeigtstc) - - - add_lapack_test(cgd.out cgd.in xeigtstc) - - - add_lapack_test(csb.out csb.in xeigtstc) - - - add_lapack_test(csg.out csg.in xeigtstc) - - - add_lapack_test(cbal.out cbal.in xeigtstc) - - - add_lapack_test(cbak.out cbak.in xeigtstc) - - - add_lapack_test(cgbal.out cgbal.in xeigtstc) - - - add_lapack_test(cgbak.out cgbak.in xeigtstc) - - - add_lapack_test(cbb.out cbb.in xeigtstc) - - - add_lapack_test(cglm.out glm.in xeigtstc) - - - add_lapack_test(cgqr.out gqr.in xeigtstc) - - - add_lapack_test(cgsv.out gsv.in xeigtstc) - - - add_lapack_test(ccsd.out csd.in xeigtstc) - - - add_lapack_test(clse.out lse.in xeigtstc) - endif() - - if (BUILD_COMPLEX16) - # - # ======== COMPLEX16 LIN TESTS ======================== - add_lapack_test(ztest.out ztest.in xlintstz) - # - # ======== COMPLEX16 RFP LIN TESTS ======================== - add_lapack_test(ztest_rfp.out ztest_rfp.in xlintstrfz) - # - # ======== COMPLEX16 EIG TESTS =========================== - - add_lapack_test(znep.out nep.in xeigtstz) - - - add_lapack_test(zsep.out sep.in xeigtstz) - - - add_lapack_test(zsvd.out svd.in xeigtstz) - - - add_lapack_test(zec.out zec.in xeigtstz) - - - add_lapack_test(zed.out zed.in xeigtstz) - - - add_lapack_test(zgg.out zgg.in xeigtstz) - - - add_lapack_test(zgd.out zgd.in xeigtstz) - - - add_lapack_test(zsb.out zsb.in xeigtstz) - - - add_lapack_test(zsg.out zsg.in xeigtstz) - - - add_lapack_test(zbal.out zbal.in xeigtstz) - - - add_lapack_test(zbak.out zbak.in xeigtstz) - - - add_lapack_test(zgbal.out zgbal.in xeigtstz) - - - add_lapack_test(zgbak.out zgbak.in xeigtstz) - - - add_lapack_test(zbb.out zbb.in xeigtstz) - - - add_lapack_test(zglm.out glm.in xeigtstz) - - - add_lapack_test(zgqr.out gqr.in xeigtstz) - - - add_lapack_test(zgsv.out gsv.in xeigtstz) - - - add_lapack_test(zcsd.out csd.in xeigtstz) - - - add_lapack_test(zlse.out lse.in xeigtstz) - endif() - - - if (BUILD_SIMPLE) - if (BUILD_DOUBLE) - # - # ======== SINGLE-DOUBLE PROTO LIN TESTS ============== - add_lapack_test(dstest.out dstest.in xlintstds) - endif() - endif() - - - if (BUILD_COMPLEX) - if (BUILD_COMPLEX16) - # - # ======== COMPLEX-COMPLEX16 LIN TESTS ======================== - add_lapack_test(zctest.out zctest.in xlintstzc) - endif() - endif() - - # ============================================================================== - - execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${LAPACK_SOURCE_DIR}/testing/lapack_testing.py ${LAPACK_BINARY_DIR}) - add_test( - NAME LAPACK_Test_Summary - WORKING_DIRECTORY ${LAPACK_BINARY_DIR} - COMMAND ${PYTHON_EXECUTABLE} "lapack_testing.py" - ) - -endif() - diff --git a/testbed/nanogui/ext/eigen/lapack/cholesky.cpp b/testbed/nanogui/ext/eigen/lapack/cholesky.cpp deleted file mode 100644 index ea3bc123..00000000 --- a/testbed/nanogui/ext/eigen/lapack/cholesky.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "lapack_common.h" -#include - -// POTRF computes the Cholesky factorization of a real symmetric positive definite matrix A. -EIGEN_LAPACK_FUNC(potrf,(char* uplo, int *n, RealScalar *pa, int *lda, int *info)) -{ - *info = 0; - if(UPLO(*uplo)==INVALID) *info = -1; - else if(*n<0) *info = -2; - else if(*lda(pa); - MatrixType A(a,*n,*n,*lda); - int ret; - if(UPLO(*uplo)==UP) ret = int(internal::llt_inplace::blocked(A)); - else ret = int(internal::llt_inplace::blocked(A)); - - if(ret>=0) - *info = ret+1; - - return 0; -} - -// POTRS solves a system of linear equations A*X = B with a symmetric -// positive definite matrix A using the Cholesky factorization -// A = U**T*U or A = L*L**T computed by DPOTRF. -EIGEN_LAPACK_FUNC(potrs,(char* uplo, int *n, int *nrhs, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, int *info)) -{ - *info = 0; - if(UPLO(*uplo)==INVALID) *info = -1; - else if(*n<0) *info = -2; - else if(*nrhs<0) *info = -3; - else if(*lda(pa); - Scalar* b = reinterpret_cast(pb); - MatrixType A(a,*n,*n,*lda); - MatrixType B(b,*n,*nrhs,*ldb); - - if(UPLO(*uplo)==UP) - { - A.triangularView().adjoint().solveInPlace(B); - A.triangularView().solveInPlace(B); - } - else - { - A.triangularView().solveInPlace(B); - A.triangularView().adjoint().solveInPlace(B); - } - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/lapack/clacgv.f b/testbed/nanogui/ext/eigen/lapack/clacgv.f deleted file mode 100644 index 359eb07f..00000000 --- a/testbed/nanogui/ext/eigen/lapack/clacgv.f +++ /dev/null @@ -1,116 +0,0 @@ -*> \brief \b CLACGV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLACGV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLACGV( N, X, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* .. -* .. Array Arguments .. -* COMPLEX X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLACGV conjugates a complex vector of length N. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of the vector X. N >= 0. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX array, dimension -*> (1+(N-1)*abs(INCX)) -*> On entry, the vector of length N to be conjugated. -*> On exit, X is overwritten with conjg(X). -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The spacing between successive elements of X. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - SUBROUTINE CLACGV( N, X, INCX ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N -* .. -* .. Array Arguments .. - COMPLEX X( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IOFF -* .. -* .. Intrinsic Functions .. - INTRINSIC CONJG -* .. -* .. Executable Statements .. -* - IF( INCX.EQ.1 ) THEN - DO 10 I = 1, N - X( I ) = CONJG( X( I ) ) - 10 CONTINUE - ELSE - IOFF = 1 - IF( INCX.LT.0 ) - $ IOFF = 1 - ( N-1 )*INCX - DO 20 I = 1, N - X( IOFF ) = CONJG( X( IOFF ) ) - IOFF = IOFF + INCX - 20 CONTINUE - END IF - RETURN -* -* End of CLACGV -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/cladiv.f b/testbed/nanogui/ext/eigen/lapack/cladiv.f deleted file mode 100644 index 2807ac5f..00000000 --- a/testbed/nanogui/ext/eigen/lapack/cladiv.f +++ /dev/null @@ -1,97 +0,0 @@ -*> \brief \b CLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLADIV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* COMPLEX FUNCTION CLADIV( X, Y ) -* -* .. Scalar Arguments .. -* COMPLEX X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLADIV := X / Y, where X and Y are complex. The computation of X / Y -*> will not overflow on an intermediary step unless the results -*> overflows. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is COMPLEX -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX -*> The complex scalars X and Y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - COMPLEX FUNCTION CLADIV( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - COMPLEX X, Y -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - REAL ZI, ZR -* .. -* .. External Subroutines .. - EXTERNAL SLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC AIMAG, CMPLX, REAL -* .. -* .. Executable Statements .. -* - CALL SLADIV( REAL( X ), AIMAG( X ), REAL( Y ), AIMAG( Y ), ZR, - $ ZI ) - CLADIV = CMPLX( ZR, ZI ) -* - RETURN -* -* End of CLADIV -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/clarf.f b/testbed/nanogui/ext/eigen/lapack/clarf.f deleted file mode 100644 index ca0328fb..00000000 --- a/testbed/nanogui/ext/eigen/lapack/clarf.f +++ /dev/null @@ -1,232 +0,0 @@ -*> \brief \b CLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* COMPLEX TAU -* .. -* .. Array Arguments .. -* COMPLEX C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARF applies a complex elementary reflector H to a complex M-by-N -*> matrix C, from either the left or the right. H is represented in the -*> form -*> -*> H = I - tau * v * v**H -*> -*> where tau is a complex scalar and v is a complex vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> -*> To apply H**H (the conjugate transpose of H), supply conjg(tau) instead -*> tau. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - SUBROUTINE CLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - COMPLEX TAU -* .. -* .. Array Arguments .. - COMPLEX C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ONE, ZERO - PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ), - $ ZERO = ( 0.0E+0, 0.0E+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL CGEMV, CGERC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILACLR, ILACLC - EXTERNAL LSAME, ILACLR, ILACLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILACLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILACLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) -* - CALL CGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, - $ C, LDC, V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H -* - CALL CGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL CGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H -* - CALL CGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of CLARF -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/clarfb.f b/testbed/nanogui/ext/eigen/lapack/clarfb.f deleted file mode 100644 index 40bbdf48..00000000 --- a/testbed/nanogui/ext/eigen/lapack/clarfb.f +++ /dev/null @@ -1,771 +0,0 @@ -*> \brief \b CLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARFB + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARFB applies a complex block reflector H or its transpose H**H to a -*> complex M-by-N matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**H from the Left -*> = 'R': apply H or H**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'C': apply H**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is COMPLEX array, dimension (LDT,K) -*> The triangular K-by-K matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE CLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ONE - PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILACLR, ILACLC - EXTERNAL LSAME, ILACLR, ILACLC -* .. -* .. External Subroutines .. - EXTERNAL CCOPY, CGEMM, CLACGV, CTRMM -* .. -* .. Intrinsic Functions .. - INTRINSIC CONJG -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'C' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C1**H -* - DO 10 J = 1, K - CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H *V2 -* - CALL CGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, - $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2 * W**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, -ONE, V( K+1, 1 ), LDV, - $ WORK, LDWORK, ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLR( M, K, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C2**H -* - DO 70 J = 1, K - CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H*V1 -* - CALL CGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ CONJG( WORK( I, J ) ) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLR( N, K, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C1**H -* - DO 130 J = 1, K - CALL CCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H*V2**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**H * W**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - CONJG( WORK( I, J ) ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL CCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**H -* - CALL CTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, - $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL CTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILACLC( K, M, V, LDV ) ) - LASTC = ILACLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C2**H -* - DO 190 J = 1, K - CALL CCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL CLACGV( LASTC, WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H * V1**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL CTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**H * W**H -* - CALL CGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ CONJG( WORK( I, J ) ) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILACLC( K, N, V, LDV ) ) - LASTC = ILACLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL CCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**H -* - CALL CTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**H -* - CALL CGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE, - $ WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL CTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL CGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL CTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of CLARFB -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/clarfg.f b/testbed/nanogui/ext/eigen/lapack/clarfg.f deleted file mode 100644 index d64f396c..00000000 --- a/testbed/nanogui/ext/eigen/lapack/clarfg.f +++ /dev/null @@ -1,203 +0,0 @@ -*> \brief \b CLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARFG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* COMPLEX ALPHA, TAU -* .. -* .. Array Arguments .. -* COMPLEX X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARFG generates a complex elementary reflector H of order n, such -*> that -*> -*> H**H * ( alpha ) = ( beta ), H**H * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, with beta real, and x is an -*> (n-1)-element complex vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**H ) , -*> ( v ) -*> -*> where tau is a complex scalar and v is a complex (n-1)-element -*> vector. Note that H is not hermitian. -*> -*> If the elements of x are all zero and alpha is real, then tau = 0 -*> and H is taken to be the unit matrix. -*> -*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is COMPLEX -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - COMPLEX ALPHA, TAU -* .. -* .. Array Arguments .. - COMPLEX X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - REAL ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - REAL SCNRM2, SLAMCH, SLAPY3 - COMPLEX CLADIV - EXTERNAL SCNRM2, SLAMCH, SLAPY3, CLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, AIMAG, CMPLX, REAL, SIGN -* .. -* .. External Subroutines .. - EXTERNAL CSCAL, CSSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = SCNRM2( N-1, X, INCX ) - ALPHR = REAL( ALPHA ) - ALPHI = AIMAG( ALPHA ) -* - IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' ) - RSAFMN = ONE / SAFMIN -* - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - 10 CONTINUE - KNT = KNT + 1 - CALL CSSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHI = ALPHI*RSAFMN - ALPHR = ALPHR*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = SCNRM2( N-1, X, INCX ) - ALPHA = CMPLX( ALPHR, ALPHI ) - BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - END IF - TAU = CMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) - ALPHA = CLADIV( CMPLX( ONE ), ALPHA-BETA ) - CALL CSCAL( N-1, ALPHA, X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of CLARFG -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/clarft.f b/testbed/nanogui/ext/eigen/lapack/clarft.f deleted file mode 100644 index 981447f7..00000000 --- a/testbed/nanogui/ext/eigen/lapack/clarft.f +++ /dev/null @@ -1,328 +0,0 @@ -*> \brief \b CLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download CLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* COMPLEX T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> CLARFT forms the triangular factor T of a complex block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**H -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**H * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is COMPLEX array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complexOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE CLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - COMPLEX T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ONE, ZERO - PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ), - $ ZERO = ( 0.0E+0, 0.0E+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL CGEMV, CLACGV, CTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( PREVLASTV, I ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) -* - CALL CGEMV( 'Conjugate transpose', J-I, I-1, - $ -TAU( I ), V( I+1, 1 ), LDV, - $ V( I+1, I ), 1, - $ ONE, T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H -* - CALL CGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), LDT ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL CTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) -* - CALL CGEMV( 'Conjugate transpose', N-K+I-J, K-I, - $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), - $ 1, ONE, T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H -* - CALL CGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), - $ V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), LDT ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL CTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of CLARFT -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/complex_double.cpp b/testbed/nanogui/ext/eigen/lapack/complex_double.cpp deleted file mode 100644 index c9c57527..00000000 --- a/testbed/nanogui/ext/eigen/lapack/complex_double.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR std::complex -#define SCALAR_SUFFIX z -#define SCALAR_SUFFIX_UP "Z" -#define REAL_SCALAR_SUFFIX d -#define ISCOMPLEX 1 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "svd.cpp" diff --git a/testbed/nanogui/ext/eigen/lapack/complex_single.cpp b/testbed/nanogui/ext/eigen/lapack/complex_single.cpp deleted file mode 100644 index 6d11b26c..00000000 --- a/testbed/nanogui/ext/eigen/lapack/complex_single.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR std::complex -#define SCALAR_SUFFIX c -#define SCALAR_SUFFIX_UP "C" -#define REAL_SCALAR_SUFFIX s -#define ISCOMPLEX 1 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "svd.cpp" diff --git a/testbed/nanogui/ext/eigen/lapack/dladiv.f b/testbed/nanogui/ext/eigen/lapack/dladiv.f deleted file mode 100644 index 090a9065..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dladiv.f +++ /dev/null @@ -1,128 +0,0 @@ -*> \brief \b DLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLADIV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLADIV( A, B, C, D, P, Q ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLADIV performs complex division in real arithmetic -*> -*> a + i*b -*> p + i*q = --------- -*> c + i*d -*> -*> The algorithm is due to Robert L. Smith and can be found -*> in D. Knuth, The art of Computer Programming, Vol.2, p.195 -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION -*> The scalars a, b, c, and d in the above expression. -*> \endverbatim -*> -*> \param[out] P -*> \verbatim -*> P is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is DOUBLE PRECISION -*> The scalars p and q in the above expression. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLADIV( A, B, C, D, P, Q ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION E, F -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS -* .. -* .. Executable Statements .. -* - IF( ABS( D ).LT.ABS( C ) ) THEN - E = D / C - F = C + D*E - P = ( A+B*E ) / F - Q = ( B-A*E ) / F - ELSE - E = C / D - F = D + C*E - P = ( B+A*E ) / F - Q = ( -A+B*E ) / F - END IF -* - RETURN -* -* End of DLADIV -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/dlamch.f b/testbed/nanogui/ext/eigen/lapack/dlamch.f deleted file mode 100644 index eb307e5e..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlamch.f +++ /dev/null @@ -1,189 +0,0 @@ -*> \brief \b DLAMCH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAMCH( CMACH ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAMCH determines double precision machine parameters. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] CMACH -*> \verbatim -*> Specifies the value to be returned by DLAMCH: -*> = 'E' or 'e', DLAMCH := eps -*> = 'S' or 's , DLAMCH := sfmin -*> = 'B' or 'b', DLAMCH := base -*> = 'P' or 'p', DLAMCH := eps*base -*> = 'N' or 'n', DLAMCH := t -*> = 'R' or 'r', DLAMCH := rnd -*> = 'M' or 'm', DLAMCH := emin -*> = 'U' or 'u', DLAMCH := rmin -*> = 'L' or 'l', DLAMCH := emax -*> = 'O' or 'o', DLAMCH := rmax -*> where -*> eps = relative machine precision -*> sfmin = safe minimum, such that 1/sfmin does not overflow -*> base = base of the machine -*> prec = eps*base -*> t = number of (base) digits in the mantissa -*> rnd = 1.0 when rounding occurs in addition, 0.0 otherwise -*> emin = minimum exponent before (gradual) underflow -*> rmin = underflow threshold - base**(emin-1) -*> emax = largest exponent before overflow -*> rmax = overflow threshold - (base**emax)*(1-eps) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAMCH( CMACH ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER CMACH -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION RND, EPS, SFMIN, SMALL, RMACH -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC DIGITS, EPSILON, HUGE, MAXEXPONENT, - $ MINEXPONENT, RADIX, TINY -* .. -* .. Executable Statements .. -* -* -* Assume rounding, not chopping. Always. -* - RND = ONE -* - IF( ONE.EQ.RND ) THEN - EPS = EPSILON(ZERO) * 0.5 - ELSE - EPS = EPSILON(ZERO) - END IF -* - IF( LSAME( CMACH, 'E' ) ) THEN - RMACH = EPS - ELSE IF( LSAME( CMACH, 'S' ) ) THEN - SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN -* -* Use SMALL plus a bit, to avoid the possibility of rounding -* causing overflow when computing 1/sfmin. -* - SFMIN = SMALL*( ONE+EPS ) - END IF - RMACH = SFMIN - ELSE IF( LSAME( CMACH, 'B' ) ) THEN - RMACH = RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'P' ) ) THEN - RMACH = EPS * RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'N' ) ) THEN - RMACH = DIGITS(ZERO) - ELSE IF( LSAME( CMACH, 'R' ) ) THEN - RMACH = RND - ELSE IF( LSAME( CMACH, 'M' ) ) THEN - RMACH = MINEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) - ELSE IF( LSAME( CMACH, 'L' ) ) THEN - RMACH = MAXEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'O' ) ) THEN - RMACH = HUGE(ZERO) - ELSE - RMACH = ZERO - END IF -* - DLAMCH = RMACH - RETURN -* -* End of DLAMCH -* - END -************************************************************************ -*> \brief \b DLAMC3 -*> \details -*> \b Purpose: -*> \verbatim -*> DLAMC3 is intended to force A and B to be stored prior to doing -*> the addition of A and B , for use in situations where optimizers -*> might hold one of these in a register. -*> \endverbatim -*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. -*> \date November 2011 -*> \ingroup auxOTHERauxiliary -*> -*> \param[in] A -*> \verbatim -*> A is a DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is a DOUBLE PRECISION -*> The values A and B. -*> \endverbatim -*> - DOUBLE PRECISION FUNCTION DLAMC3( A, B ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2010 -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B -* .. -* ===================================================================== -* -* .. Executable Statements .. -* - DLAMC3 = A + B -* - RETURN -* -* End of DLAMC3 -* - END -* -************************************************************************ diff --git a/testbed/nanogui/ext/eigen/lapack/dlapy2.f b/testbed/nanogui/ext/eigen/lapack/dlapy2.f deleted file mode 100644 index e6a62bf4..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlapy2.f +++ /dev/null @@ -1,104 +0,0 @@ -*> \brief \b DLAPY2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAPY2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary -*> overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION -*> X and Y specify the values x and y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - DOUBLE PRECISION X, Y -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION W, XABS, YABS, Z -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - W = MAX( XABS, YABS ) - Z = MIN( XABS, YABS ) - IF( Z.EQ.ZERO ) THEN - DLAPY2 = W - ELSE - DLAPY2 = W*SQRT( ONE+( Z / W )**2 ) - END IF - RETURN -* -* End of DLAPY2 -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/dlapy3.f b/testbed/nanogui/ext/eigen/lapack/dlapy3.f deleted file mode 100644 index ae9844f8..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlapy3.f +++ /dev/null @@ -1,111 +0,0 @@ -*> \brief \b DLAPY3 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAPY3 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION X, Y, Z -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause -*> unnecessary overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION -*> X, Y and Z specify the values x, y and z. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - DOUBLE PRECISION X, Y, Z -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION W, XABS, YABS, ZABS -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - ZABS = ABS( Z ) - W = MAX( XABS, YABS, ZABS ) - IF( W.EQ.ZERO ) THEN -* W can be zero for max(0,nan,0) -* adding all three entries together will make sure -* NaN will not disappear. - DLAPY3 = XABS + YABS + ZABS - ELSE - DLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+ - $ ( ZABS / W )**2 ) - END IF - RETURN -* -* End of DLAPY3 -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/dlarf.f b/testbed/nanogui/ext/eigen/lapack/dlarf.f deleted file mode 100644 index 2a82ff43..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlarf.f +++ /dev/null @@ -1,227 +0,0 @@ -*> \brief \b DLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* DOUBLE PRECISION TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARF applies a real elementary reflector H to a real m by n matrix -*> C, from either the left or the right. H is represented in the form -*> -*> H = I - tau * v * v**T -*> -*> where tau is a real scalar and v is a real vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - DOUBLE PRECISION TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DGER -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILADLR, ILADLC - EXTERNAL LSAME, ILADLR, ILADLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILADLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILADLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) -* - CALL DGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV, - $ ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T -* - CALL DGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL DGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T -* - CALL DGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of DLARF -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/dlarfb.f b/testbed/nanogui/ext/eigen/lapack/dlarfb.f deleted file mode 100644 index 206d3b26..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlarfb.f +++ /dev/null @@ -1,762 +0,0 @@ -*> \brief \b DLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFB + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFB applies a real block reflector H or its transpose H**T to a -*> real m by n matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**T from the Left -*> = 'R': apply H or H**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'T': apply H**T (Transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The triangular k by k matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILADLR, ILADLC - EXTERNAL LSAME, ILADLR, ILADLC -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DTRMM -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLR( M, K, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C1**T -* - DO 10 J = 1, K - CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T *V2 -* - CALL DGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2 * W**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLR( N, K, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLR( M, K, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C2**T -* - DO 70 J = 1, K - CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T*V1 -* - CALL DGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLR( N, K, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL DCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLC( K, M, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C1**T -* - DO 130 J = 1, K - CALL DCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T*V2**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**T * W**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLC( K, N, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL DCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILADLC( K, M, V, LDV ) ) - LASTC = ILADLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C2**T -* - DO 190 J = 1, K - CALL DCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T * V1**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**T * W**T -* - CALL DGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILADLC( K, N, V, LDV ) ) - LASTC = ILADLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL DCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**T -* - CALL DGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL DGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of DLARFB -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/dlarfg.f b/testbed/nanogui/ext/eigen/lapack/dlarfg.f deleted file mode 100644 index 458ad2e0..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlarfg.f +++ /dev/null @@ -1,196 +0,0 @@ -*> \brief \b DLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* DOUBLE PRECISION ALPHA, TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFG generates a real elementary reflector H of order n, such -*> that -*> -*> H * ( alpha ) = ( beta ), H**T * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, and x is an (n-1)-element real -*> vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**T ) , -*> ( v ) -*> -*> where tau is a real scalar and v is a real (n-1)-element -*> vector. -*> -*> If the elements of x are all zero, then tau = 0 and H is taken to be -*> the unit matrix. -*> -*> Otherwise 1 <= tau <= 2. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - DOUBLE PRECISION ALPHA, TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - DOUBLE PRECISION BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2 - EXTERNAL DLAMCH, DLAPY2, DNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN -* .. -* .. External Subroutines .. - EXTERNAL DSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.1 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = DNRM2( N-1, X, INCX ) -* - IF( XNORM.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA ) - SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - RSAFMN = ONE / SAFMIN - 10 CONTINUE - KNT = KNT + 1 - CALL DSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHA = ALPHA*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = DNRM2( N-1, X, INCX ) - BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA ) - END IF - TAU = ( BETA-ALPHA ) / BETA - CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of DLARFG -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/dlarft.f b/testbed/nanogui/ext/eigen/lapack/dlarft.f deleted file mode 100644 index 4b755040..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dlarft.f +++ /dev/null @@ -1,326 +0,0 @@ -*> \brief \b DLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFT forms the triangular factor T of a real block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**T -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**T * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( I, PREVLASTV ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( I , J ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) -* - CALL DGEMV( 'Transpose', J-I, I-1, -TAU( I ), - $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, - $ T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T -* - CALL DGEMV( 'No transpose', I-1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, ONE, - $ T( 1, I ), 1 ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( N-K+I , J ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) -* - CALL DGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), - $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, - $ T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T -* - CALL DGEMV( 'No transpose', K-I, N-K+I-J, - $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), 1 ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of DLARFT -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/double.cpp b/testbed/nanogui/ext/eigen/lapack/double.cpp deleted file mode 100644 index ea78bb66..00000000 --- a/testbed/nanogui/ext/eigen/lapack/double.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR double -#define SCALAR_SUFFIX d -#define SCALAR_SUFFIX_UP "D" -#define ISCOMPLEX 0 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "eigenvalues.cpp" -#include "svd.cpp" diff --git a/testbed/nanogui/ext/eigen/lapack/dsecnd_NONE.f b/testbed/nanogui/ext/eigen/lapack/dsecnd_NONE.f deleted file mode 100644 index 61a8dff1..00000000 --- a/testbed/nanogui/ext/eigen/lapack/dsecnd_NONE.f +++ /dev/null @@ -1,52 +0,0 @@ -*> \brief \b DSECND returns nothing -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DSECND( ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSECND returns nothing instead of returning the user time for a process in seconds. -*> If you are using that routine, it means that neither EXTERNAL ETIME, -*> EXTERNAL ETIME_, INTERNAL ETIME, INTERNAL CPU_TIME is available on -*> your machine. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DSECND( ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* ===================================================================== -* - DSECND = 0.0D+0 - RETURN -* -* End of DSECND -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/eigenvalues.cpp b/testbed/nanogui/ext/eigen/lapack/eigenvalues.cpp deleted file mode 100644 index 921c5156..00000000 --- a/testbed/nanogui/ext/eigen/lapack/eigenvalues.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "lapack_common.h" -#include - -// computes eigen values and vectors of a general N-by-N matrix A -EIGEN_LAPACK_FUNC(syev,(char *jobz, char *uplo, int* n, Scalar* a, int *lda, Scalar* w, Scalar* /*work*/, int* lwork, int *info)) -{ - // TODO exploit the work buffer - bool query_size = *lwork==-1; - - *info = 0; - if(*jobz!='N' && *jobz!='V') *info = -1; - else if(UPLO(*uplo)==INVALID) *info = -2; - else if(*n<0) *info = -3; - else if(*lda eig(mat,computeVectors?ComputeEigenvectors:EigenvaluesOnly); - - if(eig.info()==NoConvergence) - { - make_vector(w,*n).setZero(); - if(computeVectors) - matrix(a,*n,*n,*lda).setIdentity(); - //*info = 1; - return 0; - } - - make_vector(w,*n) = eig.eigenvalues(); - if(computeVectors) - matrix(a,*n,*n,*lda) = eig.eigenvectors(); - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/lapack/ilaclc.f b/testbed/nanogui/ext/eigen/lapack/ilaclc.f deleted file mode 100644 index 4ceb61c5..00000000 --- a/testbed/nanogui/ext/eigen/lapack/ilaclc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILACLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILACLC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILACLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILACLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILACLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ZERO - PARAMETER ( ZERO = (0.0E+0, 0.0E+0) ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILACLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILACLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILACLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILACLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/ilaclr.f b/testbed/nanogui/ext/eigen/lapack/ilaclr.f deleted file mode 100644 index d8ab09c5..00000000 --- a/testbed/nanogui/ext/eigen/lapack/ilaclr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILACLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILACLR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILACLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILACLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complexOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILACLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX ZERO - PARAMETER ( ZERO = (0.0E+0, 0.0E+0) ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILACLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILACLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILACLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILACLR = MAX( ILACLR, I ) - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/iladlc.f b/testbed/nanogui/ext/eigen/lapack/iladlc.f deleted file mode 100644 index f84bd833..00000000 --- a/testbed/nanogui/ext/eigen/lapack/iladlc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILADLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILADLC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILADLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILADLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILADLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILADLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILADLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILADLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILADLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/iladlr.f b/testbed/nanogui/ext/eigen/lapack/iladlr.f deleted file mode 100644 index 2114c616..00000000 --- a/testbed/nanogui/ext/eigen/lapack/iladlr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILADLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILADLR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILADLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILADLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILADLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILADLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILADLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILADLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILADLR = MAX( ILADLR, I ) - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/ilaslc.f b/testbed/nanogui/ext/eigen/lapack/ilaslc.f deleted file mode 100644 index e3db0f4a..00000000 --- a/testbed/nanogui/ext/eigen/lapack/ilaslc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILASLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILASLC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILASLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* REAL A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILASLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is REAL array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILASLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - REAL A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILASLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILASLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILASLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILASLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/ilaslr.f b/testbed/nanogui/ext/eigen/lapack/ilaslr.f deleted file mode 100644 index 48b73f44..00000000 --- a/testbed/nanogui/ext/eigen/lapack/ilaslr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILASLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILASLR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILASLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* REAL A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILASLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is REAL array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILASLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - REAL A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILASLR = M - ELSEIF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILASLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILASLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILASLR = MAX( ILASLR, I ) - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/ilazlc.f b/testbed/nanogui/ext/eigen/lapack/ilazlc.f deleted file mode 100644 index 15b14902..00000000 --- a/testbed/nanogui/ext/eigen/lapack/ilazlc.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILAZLC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAZLC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAZLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAZLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILAZLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILAZLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILAZLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILAZLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILAZLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/ilazlr.f b/testbed/nanogui/ext/eigen/lapack/ilazlr.f deleted file mode 100644 index b2ab943c..00000000 --- a/testbed/nanogui/ext/eigen/lapack/ilazlr.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ILAZLR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAZLR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAZLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAZLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILAZLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILAZLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILAZLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILAZLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILAZLR = MAX( ILAZLR, I ) - END DO - END IF - RETURN - END diff --git a/testbed/nanogui/ext/eigen/lapack/lapack_common.h b/testbed/nanogui/ext/eigen/lapack/lapack_common.h deleted file mode 100644 index c872a813..00000000 --- a/testbed/nanogui/ext/eigen/lapack/lapack_common.h +++ /dev/null @@ -1,29 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_LAPACK_COMMON_H -#define EIGEN_LAPACK_COMMON_H - -#include "../blas/common.h" -#include "../Eigen/src/misc/lapack.h" - -#define EIGEN_LAPACK_FUNC(FUNC,ARGLIST) \ - extern "C" { int EIGEN_BLAS_FUNC(FUNC) ARGLIST; } \ - int EIGEN_BLAS_FUNC(FUNC) ARGLIST - -typedef Eigen::Map > PivotsType; - -#if ISCOMPLEX -#define EIGEN_LAPACK_ARG_IF_COMPLEX(X) X, -#else -#define EIGEN_LAPACK_ARG_IF_COMPLEX(X) -#endif - - -#endif // EIGEN_LAPACK_COMMON_H diff --git a/testbed/nanogui/ext/eigen/lapack/lu.cpp b/testbed/nanogui/ext/eigen/lapack/lu.cpp deleted file mode 100644 index 90cebe0f..00000000 --- a/testbed/nanogui/ext/eigen/lapack/lu.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "common.h" -#include - -// computes an LU factorization of a general M-by-N matrix A using partial pivoting with row interchanges -EIGEN_LAPACK_FUNC(getrf,(int *m, int *n, RealScalar *pa, int *lda, int *ipiv, int *info)) -{ - *info = 0; - if(*m<0) *info = -1; - else if(*n<0) *info = -2; - else if(*lda(pa); - int nb_transpositions; - int ret = int(Eigen::internal::partial_lu_impl - ::blocked_lu(*m, *n, a, *lda, ipiv, nb_transpositions)); - - for(int i=0; i=0) - *info = ret+1; - - return 0; -} - -//GETRS solves a system of linear equations -// A * X = B or A' * X = B -// with a general N-by-N matrix A using the LU factorization computed by GETRF -EIGEN_LAPACK_FUNC(getrs,(char *trans, int *n, int *nrhs, RealScalar *pa, int *lda, int *ipiv, RealScalar *pb, int *ldb, int *info)) -{ - *info = 0; - if(OP(*trans)==INVALID) *info = -1; - else if(*n<0) *info = -2; - else if(*nrhs<0) *info = -3; - else if(*lda(pa); - Scalar* b = reinterpret_cast(pb); - MatrixType lu(a,*n,*n,*lda); - MatrixType B(b,*n,*nrhs,*ldb); - - for(int i=0; i<*n; ++i) - ipiv[i]--; - if(OP(*trans)==NOTR) - { - B = PivotsType(ipiv,*n) * B; - lu.triangularView().solveInPlace(B); - lu.triangularView().solveInPlace(B); - } - else if(OP(*trans)==TR) - { - lu.triangularView().transpose().solveInPlace(B); - lu.triangularView().transpose().solveInPlace(B); - B = PivotsType(ipiv,*n).transpose() * B; - } - else if(OP(*trans)==ADJ) - { - lu.triangularView().adjoint().solveInPlace(B); - lu.triangularView().adjoint().solveInPlace(B); - B = PivotsType(ipiv,*n).transpose() * B; - } - for(int i=0; i<*n; ++i) - ipiv[i]++; - - return 0; -} diff --git a/testbed/nanogui/ext/eigen/lapack/second_NONE.f b/testbed/nanogui/ext/eigen/lapack/second_NONE.f deleted file mode 100644 index d3e6d331..00000000 --- a/testbed/nanogui/ext/eigen/lapack/second_NONE.f +++ /dev/null @@ -1,52 +0,0 @@ -*> \brief \b SECOND returns nothing -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* REAL FUNCTION SECOND( ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SECOND returns nothing instead of returning the user time for a process in seconds. -*> If you are using that routine, it means that neither EXTERNAL ETIME, -*> EXTERNAL ETIME_, INTERNAL ETIME, INTERNAL CPU_TIME is available on -*> your machine. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SECOND( ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* ===================================================================== -* - SECOND = 0.0E+0 - RETURN -* -* End of SECOND -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/single.cpp b/testbed/nanogui/ext/eigen/lapack/single.cpp deleted file mode 100644 index c7da3eff..00000000 --- a/testbed/nanogui/ext/eigen/lapack/single.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define SCALAR float -#define SCALAR_SUFFIX s -#define SCALAR_SUFFIX_UP "S" -#define ISCOMPLEX 0 - -#include "cholesky.cpp" -#include "lu.cpp" -#include "eigenvalues.cpp" -#include "svd.cpp" diff --git a/testbed/nanogui/ext/eigen/lapack/sladiv.f b/testbed/nanogui/ext/eigen/lapack/sladiv.f deleted file mode 100644 index da3afa36..00000000 --- a/testbed/nanogui/ext/eigen/lapack/sladiv.f +++ /dev/null @@ -1,128 +0,0 @@ -*> \brief \b SLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLADIV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLADIV( A, B, C, D, P, Q ) -* -* .. Scalar Arguments .. -* REAL A, B, C, D, P, Q -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLADIV performs complex division in real arithmetic -*> -*> a + i*b -*> p + i*q = --------- -*> c + i*d -*> -*> The algorithm is due to Robert L. Smith and can be found -*> in D. Knuth, The art of Computer Programming, Vol.2, p.195 -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is REAL -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is REAL -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is REAL -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is REAL -*> The scalars a, b, c, and d in the above expression. -*> \endverbatim -*> -*> \param[out] P -*> \verbatim -*> P is REAL -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is REAL -*> The scalars p and q in the above expression. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - SUBROUTINE SLADIV( A, B, C, D, P, Q ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - REAL A, B, C, D, P, Q -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - REAL E, F -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS -* .. -* .. Executable Statements .. -* - IF( ABS( D ).LT.ABS( C ) ) THEN - E = D / C - F = C + D*E - P = ( A+B*E ) / F - Q = ( B-A*E ) / F - ELSE - E = C / D - F = D + C*E - P = ( B+A*E ) / F - Q = ( -A+B*E ) / F - END IF -* - RETURN -* -* End of SLADIV -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/slamch.f b/testbed/nanogui/ext/eigen/lapack/slamch.f deleted file mode 100644 index 4bffad0e..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slamch.f +++ /dev/null @@ -1,192 +0,0 @@ -*> \brief \b SLAMCH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* REAL FUNCTION SLAMCH( CMACH ) -* -* .. Scalar Arguments .. -* CHARACTER CMACH -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLAMCH determines single precision machine parameters. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] CMACH -*> \verbatim -*> Specifies the value to be returned by SLAMCH: -*> = 'E' or 'e', SLAMCH := eps -*> = 'S' or 's , SLAMCH := sfmin -*> = 'B' or 'b', SLAMCH := base -*> = 'P' or 'p', SLAMCH := eps*base -*> = 'N' or 'n', SLAMCH := t -*> = 'R' or 'r', SLAMCH := rnd -*> = 'M' or 'm', SLAMCH := emin -*> = 'U' or 'u', SLAMCH := rmin -*> = 'L' or 'l', SLAMCH := emax -*> = 'O' or 'o', SLAMCH := rmax -*> where -*> eps = relative machine precision -*> sfmin = safe minimum, such that 1/sfmin does not overflow -*> base = base of the machine -*> prec = eps*base -*> t = number of (base) digits in the mantissa -*> rnd = 1.0 when rounding occurs in addition, 0.0 otherwise -*> emin = minimum exponent before (gradual) underflow -*> rmin = underflow threshold - base**(emin-1) -*> emax = largest exponent before overflow -*> rmax = overflow threshold - (base**emax)*(1-eps) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SLAMCH( CMACH ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER CMACH -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - REAL RND, EPS, SFMIN, SMALL, RMACH -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC DIGITS, EPSILON, HUGE, MAXEXPONENT, - $ MINEXPONENT, RADIX, TINY -* .. -* .. Executable Statements .. -* -* -* Assume rounding, not chopping. Always. -* - RND = ONE -* - IF( ONE.EQ.RND ) THEN - EPS = EPSILON(ZERO) * 0.5 - ELSE - EPS = EPSILON(ZERO) - END IF -* - IF( LSAME( CMACH, 'E' ) ) THEN - RMACH = EPS - ELSE IF( LSAME( CMACH, 'S' ) ) THEN - SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN -* -* Use SMALL plus a bit, to avoid the possibility of rounding -* causing overflow when computing 1/sfmin. -* - SFMIN = SMALL*( ONE+EPS ) - END IF - RMACH = SFMIN - ELSE IF( LSAME( CMACH, 'B' ) ) THEN - RMACH = RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'P' ) ) THEN - RMACH = EPS * RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'N' ) ) THEN - RMACH = DIGITS(ZERO) - ELSE IF( LSAME( CMACH, 'R' ) ) THEN - RMACH = RND - ELSE IF( LSAME( CMACH, 'M' ) ) THEN - RMACH = MINEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) - ELSE IF( LSAME( CMACH, 'L' ) ) THEN - RMACH = MAXEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'O' ) ) THEN - RMACH = HUGE(ZERO) - ELSE - RMACH = ZERO - END IF -* - SLAMCH = RMACH - RETURN -* -* End of SLAMCH -* - END -************************************************************************ -*> \brief \b SLAMC3 -*> \details -*> \b Purpose: -*> \verbatim -*> SLAMC3 is intended to force A and B to be stored prior to doing -*> the addition of A and B , for use in situations where optimizers -*> might hold one of these in a register. -*> \endverbatim -*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. -*> \date November 2011 -*> \ingroup auxOTHERauxiliary -*> -*> \param[in] A -*> \verbatim -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> The values A and B. -*> \endverbatim -*> -* - REAL FUNCTION SLAMC3( A, B ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2010 -* -* .. Scalar Arguments .. - REAL A, B -* .. -* ===================================================================== -* -* .. Executable Statements .. -* - SLAMC3 = A + B -* - RETURN -* -* End of SLAMC3 -* - END -* -************************************************************************ diff --git a/testbed/nanogui/ext/eigen/lapack/slapy2.f b/testbed/nanogui/ext/eigen/lapack/slapy2.f deleted file mode 100644 index 1f6b1ca4..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slapy2.f +++ /dev/null @@ -1,104 +0,0 @@ -*> \brief \b SLAPY2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLAPY2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* REAL FUNCTION SLAPY2( X, Y ) -* -* .. Scalar Arguments .. -* REAL X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary -*> overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is REAL -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is REAL -*> X and Y specify the values x and y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SLAPY2( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - REAL X, Y -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0E0 ) - REAL ONE - PARAMETER ( ONE = 1.0E0 ) -* .. -* .. Local Scalars .. - REAL W, XABS, YABS, Z -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - W = MAX( XABS, YABS ) - Z = MIN( XABS, YABS ) - IF( Z.EQ.ZERO ) THEN - SLAPY2 = W - ELSE - SLAPY2 = W*SQRT( ONE+( Z / W )**2 ) - END IF - RETURN -* -* End of SLAPY2 -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/slapy3.f b/testbed/nanogui/ext/eigen/lapack/slapy3.f deleted file mode 100644 index aa2f5bfc..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slapy3.f +++ /dev/null @@ -1,111 +0,0 @@ -*> \brief \b SLAPY3 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLAPY3 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* REAL FUNCTION SLAPY3( X, Y, Z ) -* -* .. Scalar Arguments .. -* REAL X, Y, Z -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause -*> unnecessary overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is REAL -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is REAL -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is REAL -*> X, Y and Z specify the values x, y and z. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - REAL FUNCTION SLAPY3( X, Y, Z ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - REAL X, Y, Z -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ZERO - PARAMETER ( ZERO = 0.0E0 ) -* .. -* .. Local Scalars .. - REAL W, XABS, YABS, ZABS -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SQRT -* .. -* .. Executable Statements .. -* - XABS = ABS( X ) - YABS = ABS( Y ) - ZABS = ABS( Z ) - W = MAX( XABS, YABS, ZABS ) - IF( W.EQ.ZERO ) THEN -* W can be zero for max(0,nan,0) -* adding all three entries together will make sure -* NaN will not disappear. - SLAPY3 = XABS + YABS + ZABS - ELSE - SLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+ - $ ( ZABS / W )**2 ) - END IF - RETURN -* -* End of SLAPY3 -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/slarf.f b/testbed/nanogui/ext/eigen/lapack/slarf.f deleted file mode 100644 index 8a8ff308..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slarf.f +++ /dev/null @@ -1,227 +0,0 @@ -*> \brief \b SLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* REAL TAU -* .. -* .. Array Arguments .. -* REAL C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARF applies a real elementary reflector H to a real m by n matrix -*> C, from either the left or the right. H is represented in the form -*> -*> H = I - tau * v * v**T -*> -*> where tau is a real scalar and v is a real vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is REAL array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is REAL -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is REAL array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is REAL array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - SUBROUTINE SLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - REAL TAU -* .. -* .. Array Arguments .. - REAL C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL SGEMV, SGER -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILASLR, ILASLC - EXTERNAL LSAME, ILASLR, ILASLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILASLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILASLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) -* - CALL SGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV, - $ ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T -* - CALL SGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL SGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T -* - CALL SGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of SLARF -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/slarfb.f b/testbed/nanogui/ext/eigen/lapack/slarfb.f deleted file mode 100644 index eb95990b..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slarfb.f +++ /dev/null @@ -1,763 +0,0 @@ -*> \brief \b SLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARFB + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* REAL C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARFB applies a real block reflector H or its transpose H**T to a -*> real m by n matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**T from the Left -*> = 'R': apply H or H**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'T': apply H**T (Transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is REAL array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is REAL array, dimension (LDT,K) -*> The triangular k by k matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is REAL array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is REAL array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE SLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - REAL C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE - PARAMETER ( ONE = 1.0E+0 ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILASLR, ILASLC - EXTERNAL LSAME, ILASLR, ILASLC -* .. -* .. External Subroutines .. - EXTERNAL SCOPY, SGEMM, STRMM -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLR( M, K, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C1**T -* - DO 10 J = 1, K - CALL SCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T *V2 -* - CALL SGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2 * W**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLR( N, K, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL SCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLR( M, K, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C2**T -* - DO 70 J = 1, K - CALL SCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T*V1 -* - CALL SGEMM( 'Transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLR( N, K, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL SCOPY( LASTC, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - WORK(I, J) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLC( K, M, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C1**T -* - DO 130 J = 1, K - CALL SCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**T*V2**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**T * W**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - WORK( I, J ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLC( K, N, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL SCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**T -* - CALL STRMM( 'Right', 'Upper', 'Transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL STRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILASLC( K, M, V, LDV ) ) - LASTC = ILASLC( LASTV, N, C, LDC ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C2**T -* - DO 190 J = 1, K - CALL SCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**T * V1**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL STRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**T * W**T -* - CALL SGEMM( 'Transpose', 'Transpose', - $ LASTV-K, LASTC, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - WORK(I, J) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* - LASTV = MAX( K, ILASLC( K, N, V, LDV ) ) - LASTC = ILASLR( M, LASTV, C, LDC ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL SCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**T -* - CALL STRMM( 'Right', 'Lower', 'Transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**T -* - CALL SGEMM( 'No transpose', 'Transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL STRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL SGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL STRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of SLARFB -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/slarfg.f b/testbed/nanogui/ext/eigen/lapack/slarfg.f deleted file mode 100644 index 4f10ffca..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slarfg.f +++ /dev/null @@ -1,196 +0,0 @@ -*> \brief \b SLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARFG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* REAL ALPHA, TAU -* .. -* .. Array Arguments .. -* REAL X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARFG generates a real elementary reflector H of order n, such -*> that -*> -*> H * ( alpha ) = ( beta ), H**T * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, and x is an (n-1)-element real -*> vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**T ) , -*> ( v ) -*> -*> where tau is a real scalar and v is a real (n-1)-element -*> vector. -*> -*> If the elements of x are all zero, then tau = 0 and H is taken to be -*> the unit matrix. -*> -*> Otherwise 1 <= tau <= 2. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is REAL -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is REAL array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is REAL -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup realOTHERauxiliary -* -* ===================================================================== - SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - REAL ALPHA, TAU -* .. -* .. Array Arguments .. - REAL X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - REAL BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - REAL SLAMCH, SLAPY2, SNRM2 - EXTERNAL SLAMCH, SLAPY2, SNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN -* .. -* .. External Subroutines .. - EXTERNAL SSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.1 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = SNRM2( N-1, X, INCX ) -* - IF( XNORM.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) - SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' ) - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - RSAFMN = ONE / SAFMIN - 10 CONTINUE - KNT = KNT + 1 - CALL SSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHA = ALPHA*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = SNRM2( N-1, X, INCX ) - BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) - END IF - TAU = ( BETA-ALPHA ) / BETA - CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of SLARFG -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/slarft.f b/testbed/nanogui/ext/eigen/lapack/slarft.f deleted file mode 100644 index 30b0668e..00000000 --- a/testbed/nanogui/ext/eigen/lapack/slarft.f +++ /dev/null @@ -1,326 +0,0 @@ -*> \brief \b SLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download SLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* REAL T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> SLARFT forms the triangular factor T of a real block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**T -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**T * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is REAL array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is REAL array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is REAL array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup realOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE SLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - REAL T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - REAL ONE, ZERO - PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL SGEMV, STRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( I, PREVLASTV ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( I , J ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) -* - CALL SGEMV( 'Transpose', J-I, I-1, -TAU( I ), - $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, - $ T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T -* - CALL SGEMV( 'No transpose', I-1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), 1 ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL STRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( N-K+I , J ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) -* - CALL SGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), - $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, - $ T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T -* - CALL SGEMV( 'No transpose', K-I, N-K+I-J, - $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), 1 ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL STRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of SLARFT -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/svd.cpp b/testbed/nanogui/ext/eigen/lapack/svd.cpp deleted file mode 100644 index 77b302b6..00000000 --- a/testbed/nanogui/ext/eigen/lapack/svd.cpp +++ /dev/null @@ -1,138 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "lapack_common.h" -#include - -// computes the singular values/vectors a general M-by-N matrix A using divide-and-conquer -EIGEN_LAPACK_FUNC(gesdd,(char *jobz, int *m, int* n, Scalar* a, int *lda, RealScalar *s, Scalar *u, int *ldu, Scalar *vt, int *ldvt, Scalar* /*work*/, int* lwork, - EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar */*rwork*/) int * /*iwork*/, int *info)) -{ - // TODO exploit the work buffer - bool query_size = *lwork==-1; - int diag_size = (std::min)(*m,*n); - - *info = 0; - if(*jobz!='A' && *jobz!='S' && *jobz!='O' && *jobz!='N') *info = -1; - else if(*m<0) *info = -2; - else if(*n<0) *info = -3; - else if(*lda=*n && *ldvt<*n)) *info = -10; - - if(*info!=0) - { - int e = -*info; - return xerbla_(SCALAR_SUFFIX_UP"GESDD ", &e, 6); - } - - if(query_size) - { - *lwork = 0; - return 0; - } - - if(*n==0 || *m==0) - return 0; - - PlainMatrixType mat(*m,*n); - mat = matrix(a,*m,*n,*lda); - - int option = *jobz=='A' ? ComputeFullU|ComputeFullV - : *jobz=='S' ? ComputeThinU|ComputeThinV - : *jobz=='O' ? ComputeThinU|ComputeThinV - : 0; - - BDCSVD svd(mat,option); - - make_vector(s,diag_size) = svd.singularValues().head(diag_size); - - if(*jobz=='A') - { - matrix(u,*m,*m,*ldu) = svd.matrixU(); - matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint(); - } - else if(*jobz=='S') - { - matrix(u,*m,diag_size,*ldu) = svd.matrixU(); - matrix(vt,diag_size,*n,*ldvt) = svd.matrixV().adjoint(); - } - else if(*jobz=='O' && *m>=*n) - { - matrix(a,*m,*n,*lda) = svd.matrixU(); - matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint(); - } - else if(*jobz=='O') - { - matrix(u,*m,*m,*ldu) = svd.matrixU(); - matrix(a,diag_size,*n,*lda) = svd.matrixV().adjoint(); - } - - return 0; -} - -// computes the singular values/vectors a general M-by-N matrix A using two sided jacobi algorithm -EIGEN_LAPACK_FUNC(gesvd,(char *jobu, char *jobv, int *m, int* n, Scalar* a, int *lda, RealScalar *s, Scalar *u, int *ldu, Scalar *vt, int *ldvt, Scalar* /*work*/, int* lwork, - EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar */*rwork*/) int *info)) -{ - // TODO exploit the work buffer - bool query_size = *lwork==-1; - int diag_size = (std::min)(*m,*n); - - *info = 0; - if( *jobu!='A' && *jobu!='S' && *jobu!='O' && *jobu!='N') *info = -1; - else if((*jobv!='A' && *jobv!='S' && *jobv!='O' && *jobv!='N') - || (*jobu=='O' && *jobv=='O')) *info = -2; - else if(*m<0) *info = -3; - else if(*n<0) *info = -4; - else if(*lda svd(mat,option); - - make_vector(s,diag_size) = svd.singularValues().head(diag_size); - { - if(*jobu=='A') matrix(u,*m,*m,*ldu) = svd.matrixU(); - else if(*jobu=='S') matrix(u,*m,diag_size,*ldu) = svd.matrixU(); - else if(*jobu=='O') matrix(a,*m,diag_size,*lda) = svd.matrixU(); - } - { - if(*jobv=='A') matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint(); - else if(*jobv=='S') matrix(vt,diag_size,*n,*ldvt) = svd.matrixV().adjoint(); - else if(*jobv=='O') matrix(a,diag_size,*n,*lda) = svd.matrixV().adjoint(); - } - return 0; -} diff --git a/testbed/nanogui/ext/eigen/lapack/zlacgv.f b/testbed/nanogui/ext/eigen/lapack/zlacgv.f deleted file mode 100644 index 16c2e2ed..00000000 --- a/testbed/nanogui/ext/eigen/lapack/zlacgv.f +++ /dev/null @@ -1,116 +0,0 @@ -*> \brief \b ZLACGV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLACGV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLACGV( N, X, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLACGV conjugates a complex vector of length N. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of the vector X. N >= 0. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension -*> (1+(N-1)*abs(INCX)) -*> On entry, the vector of length N to be conjugated. -*> On exit, X is overwritten with conjg(X). -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The spacing between successive elements of X. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLACGV( N, X, INCX ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IOFF -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* .. Executable Statements .. -* - IF( INCX.EQ.1 ) THEN - DO 10 I = 1, N - X( I ) = DCONJG( X( I ) ) - 10 CONTINUE - ELSE - IOFF = 1 - IF( INCX.LT.0 ) - $ IOFF = 1 - ( N-1 )*INCX - DO 20 I = 1, N - X( IOFF ) = DCONJG( X( IOFF ) ) - IOFF = IOFF + INCX - 20 CONTINUE - END IF - RETURN -* -* End of ZLACGV -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/zladiv.f b/testbed/nanogui/ext/eigen/lapack/zladiv.f deleted file mode 100644 index aa71db14..00000000 --- a/testbed/nanogui/ext/eigen/lapack/zladiv.f +++ /dev/null @@ -1,97 +0,0 @@ -*> \brief \b ZLADIV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLADIV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* COMPLEX*16 FUNCTION ZLADIV( X, Y ) -* -* .. Scalar Arguments .. -* COMPLEX*16 X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLADIV := X / Y, where X and Y are complex. The computation of X / Y -*> will not overflow on an intermediary step unless the results -*> overflows. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX*16 -*> The complex scalars X and Y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - COMPLEX*16 FUNCTION ZLADIV( X, Y ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - COMPLEX*16 X, Y -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION ZI, ZR -* .. -* .. External Subroutines .. - EXTERNAL DLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, DCMPLX, DIMAG -* .. -* .. Executable Statements .. -* - CALL DLADIV( DBLE( X ), DIMAG( X ), DBLE( Y ), DIMAG( Y ), ZR, - $ ZI ) - ZLADIV = DCMPLX( ZR, ZI ) -* - RETURN -* -* End of ZLADIV -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/zlarf.f b/testbed/nanogui/ext/eigen/lapack/zlarf.f deleted file mode 100644 index 53f314d6..00000000 --- a/testbed/nanogui/ext/eigen/lapack/zlarf.f +++ /dev/null @@ -1,232 +0,0 @@ -*> \brief \b ZLARF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* COMPLEX*16 TAU -* .. -* .. Array Arguments .. -* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARF applies a complex elementary reflector H to a complex M-by-N -*> matrix C, from either the left or the right. H is represented in the -*> form -*> -*> H = I - tau * v * v**H -*> -*> where tau is a complex scalar and v is a complex vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> -*> To apply H**H, supply conjg(tau) instead -*> tau. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - COMPLEX*16 TAU -* .. -* .. Array Arguments .. - COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZGERC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAZLR, ILAZLC - EXTERNAL LSAME, ILAZLR, ILAZLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -* Set up variables for scanning V. LASTV begins pointing to the end -* of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -* Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -* Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILAZLC(LASTV, N, C, LDC) - ELSE -* Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILAZLR(M, LASTV, C, LDC) - END IF - END IF -* Note that lastc.eq.0 renders the BLAS operations null; no special -* case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) -* - CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, - $ C, LDC, V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H -* - CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H -* - CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of ZLARF -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/zlarfb.f b/testbed/nanogui/ext/eigen/lapack/zlarfb.f deleted file mode 100644 index 30fc4b94..00000000 --- a/testbed/nanogui/ext/eigen/lapack/zlarfb.f +++ /dev/null @@ -1,774 +0,0 @@ -*> \brief \b ZLARFB -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFB + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFB applies a complex block reflector H or its transpose H**H to a -*> complex M-by-N matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**H from the Left -*> = 'R': apply H or H**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'C': apply H**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The triangular K-by-K matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J, LASTV, LASTC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAZLR, ILAZLC - EXTERNAL LSAME, ILAZLR, ILAZLC -* .. -* .. External Subroutines .. - EXTERNAL ZCOPY, ZGEMM, ZLACGV, ZTRMM -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'C' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLR( M, K, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C1**H -* - DO 10 J = 1, K - CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H *V2 -* - CALL ZGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, ONE, C( K+1, 1 ), LDC, - $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2 * W**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 30 J = 1, K - DO 20 I = 1, LASTC - C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLR( N, K, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLR( M, K, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C2**H -* - DO 70 J = 1, K - CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H*V1 -* - CALL ZGEMM( 'Conjugate transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1 * W**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTV-K, LASTC, K, - $ -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 90 J = 1, K - DO 80 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ DCONJG( WORK( I, J ) ) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLR( N, K, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( LASTV-K+1, 1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLC( K, M, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C1**H -* - DO 130 J = 1, K - CALL ZCOPY( LASTC, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2**H*V2**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - V2**H * W**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V( 1, K+1 ), LDV, WORK, LDWORK, - $ ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 150 J = 1, K - DO 140 I = 1, LASTC - C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLC( K, N, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL ZCOPY( LASTC, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V, LDV, WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C2 * V2**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C( 1, K+1 ), LDC, - $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, - $ ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', - $ LASTC, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, LASTC - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* - LASTV = MAX( K, ILAZLC( K, M, V, LDV ) ) - LASTC = ILAZLC( LASTV, N, C, LDC ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C2**H -* - DO 190 J = 1, K - CALL ZCOPY( LASTC, C( LASTV-K+J, 1 ), LDC, - $ WORK( 1, J ), 1 ) - CALL ZLACGV( LASTC, WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1**H * V1**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTC, K, LASTV-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - V1**H * W**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', LASTV-K, LASTC, K, - $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 210 J = 1, K - DO 200 I = 1, LASTC - C( LASTV-K+J, I ) = C( LASTV-K+J, I ) - - $ DCONJG( WORK( I, J ) ) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* - LASTV = MAX( K, ILAZLC( K, N, V, LDV ) ) - LASTC = ILAZLR( M, LASTV, C, LDC ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL ZCOPY( LASTC, C( 1, LASTV-K+J ), 1, - $ WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) - IF( LASTV.GT.K ) THEN -* -* W := W + C1 * V1**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ LASTC, K, LASTV-K, ONE, C, LDC, V, LDV, ONE, - $ WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', - $ LASTC, K, ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( LASTV.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL ZGEMM( 'No transpose', 'No transpose', - $ LASTC, LASTV-K, K, -ONE, WORK, LDWORK, V, LDV, - $ ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', - $ LASTC, K, ONE, V( 1, LASTV-K+1 ), LDV, - $ WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, LASTC - C( I, LASTV-K+J ) = C( I, LASTV-K+J ) - $ - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of ZLARFB -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/zlarfg.f b/testbed/nanogui/ext/eigen/lapack/zlarfg.f deleted file mode 100644 index a90ae9f7..00000000 --- a/testbed/nanogui/ext/eigen/lapack/zlarfg.f +++ /dev/null @@ -1,203 +0,0 @@ -*> \brief \b ZLARFG -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* COMPLEX*16 ALPHA, TAU -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFG generates a complex elementary reflector H of order n, such -*> that -*> -*> H**H * ( alpha ) = ( beta ), H**H * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, with beta real, and x is an -*> (n-1)-element complex vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**H ) , -*> ( v ) -*> -*> where tau is a complex scalar and v is a complex (n-1)-element -*> vector. Note that H is not hermitian. -*> -*> If the elements of x are all zero and alpha is real, then tau = 0 -*> and H is taken to be the unit matrix. -*> -*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX*16 -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date November 2011 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine (version 3.4.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2011 -* -* .. Scalar Arguments .. - INTEGER INCX, N - COMPLEX*16 ALPHA, TAU -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - DOUBLE PRECISION ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY3, DZNRM2 - COMPLEX*16 ZLADIV - EXTERNAL DLAMCH, DLAPY3, DZNRM2, ZLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, DCMPLX, DIMAG, SIGN -* .. -* .. External Subroutines .. - EXTERNAL ZDSCAL, ZSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = DZNRM2( N-1, X, INCX ) - ALPHR = DBLE( ALPHA ) - ALPHI = DIMAG( ALPHA ) -* - IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) - RSAFMN = ONE / SAFMIN -* - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - 10 CONTINUE - KNT = KNT + 1 - CALL ZDSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHI = ALPHI*RSAFMN - ALPHR = ALPHR*RSAFMN - IF( ABS( BETA ).LT.SAFMIN ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = DZNRM2( N-1, X, INCX ) - ALPHA = DCMPLX( ALPHR, ALPHI ) - BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - END IF - TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) - ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA ) - CALL ZSCAL( N-1, ALPHA, X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of ZLARFG -* - END diff --git a/testbed/nanogui/ext/eigen/lapack/zlarft.f b/testbed/nanogui/ext/eigen/lapack/zlarft.f deleted file mode 100644 index 6a6151fd..00000000 --- a/testbed/nanogui/ext/eigen/lapack/zlarft.f +++ /dev/null @@ -1,327 +0,0 @@ -*> \brief \b ZLARFT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFT forms the triangular factor T of a complex block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**H -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**H * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date April 2012 -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine (version 3.4.1) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* April 2012 -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZLACGV, ZTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( PREVLASTV, I ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) -* - CALL ZGEMV( 'Conjugate transpose', J-I, I-1, - $ -TAU( I ), V( I+1, 1 ), LDV, - $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H -* - CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), LDT ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) -* - CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, - $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), - $ 1, ONE, T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H -* - CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), - $ V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), LDT ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of ZLARFT -* - END diff --git a/testbed/nanogui/ext/eigen/scripts/CMakeLists.txt b/testbed/nanogui/ext/eigen/scripts/CMakeLists.txt deleted file mode 100644 index 0d9a631a..00000000 --- a/testbed/nanogui/ext/eigen/scripts/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -get_property(EIGEN_TESTS_LIST GLOBAL PROPERTY EIGEN_TESTS_LIST) -configure_file(buildtests.in ${CMAKE_BINARY_DIR}/buildtests.sh @ONLY) - -configure_file(check.in ${CMAKE_BINARY_DIR}/check.sh COPYONLY) -configure_file(debug.in ${CMAKE_BINARY_DIR}/debug.sh COPYONLY) -configure_file(release.in ${CMAKE_BINARY_DIR}/release.sh COPYONLY) diff --git a/testbed/nanogui/ext/eigen/scripts/buildtests.in b/testbed/nanogui/ext/eigen/scripts/buildtests.in deleted file mode 100755 index 526d5b74..00000000 --- a/testbed/nanogui/ext/eigen/scripts/buildtests.in +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -if [[ $# != 1 || $1 == *help ]] -then - echo "usage: $0 regexp" - echo " Builds tests matching the regexp." - echo " The EIGEN_MAKE_ARGS environment variable allows to pass args to 'make'." - echo " For example, to launch 5 concurrent builds, use EIGEN_MAKE_ARGS='-j5'" - exit 0 -fi - -TESTSLIST="@EIGEN_TESTS_LIST@" -targets_to_make=`echo "$TESTSLIST" | egrep "$1" | xargs echo` - -if [ -n "${EIGEN_MAKE_ARGS:+x}" ] -then - @CMAKE_MAKE_PROGRAM@ $targets_to_make ${EIGEN_MAKE_ARGS} -else - @CMAKE_MAKE_PROGRAM@ $targets_to_make @EIGEN_TEST_BUILD_FLAGS@ -fi -exit $? - diff --git a/testbed/nanogui/ext/eigen/scripts/cdashtesting.cmake.in b/testbed/nanogui/ext/eigen/scripts/cdashtesting.cmake.in deleted file mode 100644 index 59cf5332..00000000 --- a/testbed/nanogui/ext/eigen/scripts/cdashtesting.cmake.in +++ /dev/null @@ -1,49 +0,0 @@ - -set(CTEST_SOURCE_DIRECTORY "@CMAKE_SOURCE_DIR@") -set(CTEST_BINARY_DIRECTORY "@CMAKE_BINARY_DIR@") -set(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@") -set(CTEST_BUILD_NAME "@BUILDNAME@") -set(CTEST_SITE "@SITE@") - -set(MODEL Experimental) -if(${CTEST_SCRIPT_ARG} MATCHES Nightly) - set(MODEL Nightly) -elseif(${CTEST_SCRIPT_ARG} MATCHES Continuous) - set(MODEL Continuous) -endif() - -find_program(CTEST_HG_COMMAND NAMES hg) -set(CTEST_UPDATE_COMMAND "${CTEST_HG_COMMAND}") - -ctest_start(${MODEL} ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY}) - -ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}") -ctest_submit(PARTS Update Notes) - -# to get CTEST_PROJECT_SUBPROJECTS definition: -include("${CTEST_SOURCE_DIRECTORY}/CTestConfig.cmake") - -foreach(subproject ${CTEST_PROJECT_SUBPROJECTS}) - message("") - message("Process ${subproject}") - - set_property(GLOBAL PROPERTY SubProject ${subproject}) - set_property(GLOBAL PROPERTY Label ${subproject}) - - ctest_configure(BUILD ${CTEST_BINARY_DIRECTORY} SOURCE ${CTEST_SOURCE_DIRECTORY} ) - ctest_submit(PARTS Configure) - - set(CTEST_BUILD_TARGET "Build${subproject}") - message("Build ${CTEST_BUILD_TARGET}") - ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" APPEND) - # builds target ${CTEST_BUILD_TARGET} - ctest_submit(PARTS Build) - - ctest_test(BUILD "${CTEST_BINARY_DIRECTORY}" INCLUDE_LABEL "${subproject}" ) - # runs only tests that have a LABELS property matching "${subproject}" - - ctest_coverage(BUILD "${CTEST_BINARY_DIRECTORY}" LABELS "${subproject}" ) - - ctest_submit(PARTS Test) - -endforeach() diff --git a/testbed/nanogui/ext/eigen/scripts/check.in b/testbed/nanogui/ext/eigen/scripts/check.in deleted file mode 100755 index 7717e2d9..00000000 --- a/testbed/nanogui/ext/eigen/scripts/check.in +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# check : shorthand for make and ctest -R - -if [[ $# != 1 || $1 == *help ]] -then - echo "usage: $0 regexp" - echo " Builds and runs tests matching the regexp." - echo " The EIGEN_MAKE_ARGS environment variable allows to pass args to 'make'." - echo " For example, to launch 5 concurrent builds, use EIGEN_MAKE_ARGS='-j5'" - echo " The EIGEN_CTEST_ARGS environment variable allows to pass args to 'ctest'." - echo " For example, with CTest 2.8, you can use EIGEN_CTEST_ARGS='-j5'." - exit 0 -fi - -if [ -n "${EIGEN_CTEST_ARGS:+x}" ] -then - ./buildtests.sh "$1" && ctest -R "$1" ${EIGEN_CTEST_ARGS} -else - ./buildtests.sh "$1" && ctest -R "$1" -fi -exit $? diff --git a/testbed/nanogui/ext/eigen/scripts/debug.in b/testbed/nanogui/ext/eigen/scripts/debug.in deleted file mode 100755 index d339d3d1..00000000 --- a/testbed/nanogui/ext/eigen/scripts/debug.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -cmake -DCMAKE_BUILD_TYPE=Debug . diff --git a/testbed/nanogui/ext/eigen/scripts/eigen_gen_credits.cpp b/testbed/nanogui/ext/eigen/scripts/eigen_gen_credits.cpp deleted file mode 100644 index f2e81631..00000000 --- a/testbed/nanogui/ext/eigen/scripts/eigen_gen_credits.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -// this function takes a line that may contain a name and/or email address, -// and returns just the name, while fixing the "bad cases". -std::string contributor_name(const std::string& line) -{ - string result; - - // let's first take care of the case of isolated email addresses, like - // "user@localhost.localdomain" entries - if(line.find("markb@localhost.localdomain") != string::npos) - { - return "Mark Borgerding"; - } - - if(line.find("kayhman@contact.intra.cea.fr") != string::npos) - { - return "Guillaume Saupin"; - } - - // from there on we assume that we have a entry of the form - // either: - // Bla bli Blurp - // or: - // Bla bli Blurp - - size_t position_of_email_address = line.find_first_of('<'); - if(position_of_email_address != string::npos) - { - // there is an e-mail address in <...>. - - // Hauke once committed as "John Smith", fix that. - if(line.find("hauke.heibel") != string::npos) - result = "Hauke Heibel"; - else - { - // just remove the e-mail address - result = line.substr(0, position_of_email_address); - } - } - else - { - // there is no e-mail address in <...>. - - if(line.find("convert-repo") != string::npos) - result = ""; - else - result = line; - } - - // remove trailing spaces - size_t length = result.length(); - while(length >= 1 && result[length-1] == ' ') result.erase(--length); - - return result; -} - -// parses hg churn output to generate a contributors map. -map contributors_map_from_churn_output(const char *filename) -{ - map contributors_map; - - string line; - ifstream churn_out; - churn_out.open(filename, ios::in); - while(!getline(churn_out,line).eof()) - { - // remove the histograms "******" that hg churn may draw at the end of some lines - size_t first_star = line.find_first_of('*'); - if(first_star != string::npos) line.erase(first_star); - - // remove trailing spaces - size_t length = line.length(); - while(length >= 1 && line[length-1] == ' ') line.erase(--length); - - // now the last space indicates where the number starts - size_t last_space = line.find_last_of(' '); - - // get the number (of changesets or of modified lines for each contributor) - int number; - istringstream(line.substr(last_space+1)) >> number; - - // get the name of the contributor - line.erase(last_space); - string name = contributor_name(line); - - map::iterator it = contributors_map.find(name); - // if new contributor, insert - if(it == contributors_map.end()) - contributors_map.insert(pair(name, number)); - // if duplicate, just add the number - else - it->second += number; - } - churn_out.close(); - - return contributors_map; -} - -// find the last name, i.e. the last word. -// for "van den Schbling" types of last names, that's not a problem, that's actually what we want. -string lastname(const string& name) -{ - size_t last_space = name.find_last_of(' '); - if(last_space >= name.length()-1) return name; - else return name.substr(last_space+1); -} - -struct contributor -{ - string name; - int changedlines; - int changesets; - string url; - string misc; - - contributor() : changedlines(0), changesets(0) {} - - bool operator < (const contributor& other) - { - return lastname(name).compare(lastname(other.name)) < 0; - } -}; - -void add_online_info_into_contributors_list(list& contributors_list, const char *filename) -{ - string line; - ifstream online_info; - online_info.open(filename, ios::in); - while(!getline(online_info,line).eof()) - { - string hgname, realname, url, misc; - - size_t last_bar = line.find_last_of('|'); - if(last_bar == string::npos) continue; - if(last_bar < line.length()) - misc = line.substr(last_bar+1); - line.erase(last_bar); - - last_bar = line.find_last_of('|'); - if(last_bar == string::npos) continue; - if(last_bar < line.length()) - url = line.substr(last_bar+1); - line.erase(last_bar); - - last_bar = line.find_last_of('|'); - if(last_bar == string::npos) continue; - if(last_bar < line.length()) - realname = line.substr(last_bar+1); - line.erase(last_bar); - - hgname = line; - - // remove the example line - if(hgname.find("MercurialName") != string::npos) continue; - - list::iterator it; - for(it=contributors_list.begin(); it != contributors_list.end() && it->name != hgname; ++it) - {} - - if(it == contributors_list.end()) - { - contributor c; - c.name = realname; - c.url = url; - c.misc = misc; - contributors_list.push_back(c); - } - else - { - it->name = realname; - it->url = url; - it->misc = misc; - } - } -} - -int main() -{ - // parse the hg churn output files - map contributors_map_for_changedlines = contributors_map_from_churn_output("churn-changedlines.out"); - //map contributors_map_for_changesets = contributors_map_from_churn_output("churn-changesets.out"); - - // merge into the contributors list - list contributors_list; - map::iterator it; - for(it=contributors_map_for_changedlines.begin(); it != contributors_map_for_changedlines.end(); ++it) - { - contributor c; - c.name = it->first; - c.changedlines = it->second; - c.changesets = 0; //contributors_map_for_changesets.find(it->first)->second; - contributors_list.push_back(c); - } - - add_online_info_into_contributors_list(contributors_list, "online-info.out"); - - contributors_list.sort(); - - cout << "{| cellpadding=\"5\"\n"; - cout << "!\n"; - cout << "! Lines changed\n"; - cout << "!\n"; - - list::iterator itc; - int i = 0; - for(itc=contributors_list.begin(); itc != contributors_list.end(); ++itc) - { - if(itc->name.length() == 0) continue; - if(i%2) cout << "|-\n"; - else cout << "|- style=\"background:#FFFFD0\"\n"; - if(itc->url.length()) - cout << "| [" << itc->url << " " << itc->name << "]\n"; - else - cout << "| " << itc->name << "\n"; - if(itc->changedlines) - cout << "| " << itc->changedlines << "\n"; - else - cout << "| (no information)\n"; - cout << "| " << itc->misc << "\n"; - i++; - } - cout << "|}" << endl; -} diff --git a/testbed/nanogui/ext/eigen/scripts/eigen_gen_docs b/testbed/nanogui/ext/eigen/scripts/eigen_gen_docs deleted file mode 100644 index 787dcb32..00000000 --- a/testbed/nanogui/ext/eigen/scripts/eigen_gen_docs +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# configuration -# You should call this script with USER set as you want, else some default -# will be used -USER=${USER:-'orzel'} -UPLOAD_DIR=dox-devel - -#ulimit -v 1024000 - -# step 1 : build -rm build/doc/html -Rf -mkdir build -p -(cd build && cmake .. && make doc) || { echo "make failed"; exit 1; } - -#step 2 : upload -# (the '/' at the end of path is very important, see rsync documentation) -rsync -az --no-p --delete build/doc/html/ $USER@ssh.tuxfamily.org:eigen/eigen.tuxfamily.org-web/htdocs/$UPLOAD_DIR/ || { echo "upload failed"; exit 1; } - -#step 3 : fix the perm -ssh $USER@ssh.tuxfamily.org "chmod -R g+w /home/eigen/eigen.tuxfamily.org-web/htdocs/$UPLOAD_DIR" || { echo "perm failed"; exit 1; } - -echo "Uploaded successfully" - diff --git a/testbed/nanogui/ext/eigen/scripts/eigen_monitor_perf.sh b/testbed/nanogui/ext/eigen/scripts/eigen_monitor_perf.sh deleted file mode 100644 index 39f8e7ec..00000000 --- a/testbed/nanogui/ext/eigen/scripts/eigen_monitor_perf.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# This is a script example to automatically update and upload performance unit tests. -# The following five variables must be adjusted to match your settings. - -USER='ggael' -UPLOAD_DIR=perf_monitoring/ggaelmacbook26 -EIGEN_SOURCE_PATH=$HOME/Eigen/eigen -export PREFIX="haswell-fma" -export CXX_FLAGS="-mfma -w" - -#### - -BENCH_PATH=$EIGEN_SOURCE_PATH/bench/perf_monitoring/$PREFIX -PREVPATH=`pwd` -cd $EIGEN_SOURCE_PATH/bench/perf_monitoring && ./runall.sh "Haswell 2.6GHz, FMA, Apple's clang" $* -cd $PREVPATH - -ALLFILES="$BENCH_PATH/*.png $BENCH_PATH/*.html $BENCH_PATH/index.html $BENCH_PATH/s1.js $BENCH_PATH/s2.js" - -# (the '/' at the end of path is very important, see rsync documentation) -rsync -az --no-p --delete $ALLFILES $USER@ssh.tuxfamily.org:eigen/eigen.tuxfamily.org-web/htdocs/$UPLOAD_DIR/ || { echo "upload failed"; exit 1; } - -# fix the perm -ssh $USER@ssh.tuxfamily.org "chmod -R g+w /home/eigen/eigen.tuxfamily.org-web/htdocs/perf_monitoring" || { echo "perm failed"; exit 1; } diff --git a/testbed/nanogui/ext/eigen/scripts/release.in b/testbed/nanogui/ext/eigen/scripts/release.in deleted file mode 100755 index db2d9d94..00000000 --- a/testbed/nanogui/ext/eigen/scripts/release.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -cmake -DCMAKE_BUILD_TYPE=Release . diff --git a/testbed/nanogui/ext/eigen/scripts/relicense.py b/testbed/nanogui/ext/eigen/scripts/relicense.py deleted file mode 100644 index 8a5265f1..00000000 --- a/testbed/nanogui/ext/eigen/scripts/relicense.py +++ /dev/null @@ -1,69 +0,0 @@ -# This file is part of Eigen, a lightweight C++ template library -# for linear algebra. -# -# Copyright (C) 2012 Keir Mierle -# -# This Source Code Form is subject to the terms of the Mozilla -# Public License v. 2.0. If a copy of the MPL was not distributed -# with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# Author: mierle@gmail.com (Keir Mierle) -# -# Make the long-awaited conversion to MPL. - -lgpl3_header = ''' -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen 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 GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see . -''' - -mpl2_header = """ -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -""" - -import os -import sys - -exclusions = set(['relicense.py']) - -def update(text): - if text.find(lgpl3_header) == -1: - return text, False - return text.replace(lgpl3_header, mpl2_header), True - -rootdir = sys.argv[1] -for root, sub_folders, files in os.walk(rootdir): - for basename in files: - if basename in exclusions: - print 'SKIPPED', filename - continue - filename = os.path.join(root, basename) - fo = file(filename) - text = fo.read() - fo.close() - - text, updated = update(text) - if updated: - fo = file(filename, "w") - fo.write(text) - fo.close() - print 'UPDATED', filename - else: - print ' ', filename diff --git a/testbed/nanogui/ext/eigen/signature_of_eigen3_matrix_library b/testbed/nanogui/ext/eigen/signature_of_eigen3_matrix_library deleted file mode 100644 index 80aaf462..00000000 --- a/testbed/nanogui/ext/eigen/signature_of_eigen3_matrix_library +++ /dev/null @@ -1 +0,0 @@ -This file is just there as a signature to help identify directories containing Eigen3. When writing a script looking for Eigen3, just look for this file. This is especially useful to help disambiguate with Eigen2... diff --git a/testbed/nanogui/ext/eigen/test/CMakeLists.txt b/testbed/nanogui/ext/eigen/test/CMakeLists.txt deleted file mode 100644 index d337594f..00000000 --- a/testbed/nanogui/ext/eigen/test/CMakeLists.txt +++ /dev/null @@ -1,384 +0,0 @@ -# generate split test header file only if it does not yet exist -# in order to prevent a rebuild everytime cmake is configured -if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h) - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h "") - foreach(i RANGE 1 999) - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h - "#ifdef EIGEN_TEST_PART_${i}\n" - "#define CALL_SUBTEST_${i}(FUNC) CALL_SUBTEST(FUNC)\n" - "#else\n" - "#define CALL_SUBTEST_${i}(FUNC)\n" - "#endif\n\n" - ) - endforeach() -endif() - -# check if we have a Fortran compiler -include("../cmake/language_support.cmake") - -workaround_9220(Fortran EIGEN_Fortran_COMPILER_WORKS) - -if(EIGEN_Fortran_COMPILER_WORKS) - enable_language(Fortran OPTIONAL) - if(NOT CMAKE_Fortran_COMPILER) - set(EIGEN_Fortran_COMPILER_WORKS OFF) - endif() -endif() - -if(NOT EIGEN_Fortran_COMPILER_WORKS) - # search for a default Lapack library to complete Eigen's one - find_package(LAPACK) -endif() - -# configure blas/lapack (use Eigen's ones) -set(EIGEN_BLAS_LIBRARIES eigen_blas) -set(EIGEN_LAPACK_LIBRARIES eigen_lapack) - -set(EIGEN_TEST_MATRIX_DIR "" CACHE STRING "Enable testing of realword sparse matrices contained in the specified path") -if(EIGEN_TEST_MATRIX_DIR) - if(NOT WIN32) - message(STATUS "Test realworld sparse matrices: ${EIGEN_TEST_MATRIX_DIR}") - add_definitions( -DTEST_REAL_CASES="${EIGEN_TEST_MATRIX_DIR}" ) - else(NOT WIN32) - message(STATUS "REAL CASES CAN NOT BE CURRENTLY TESTED ON WIN32") - endif(NOT WIN32) -endif(EIGEN_TEST_MATRIX_DIR) - -set(SPARSE_LIBS " ") - -find_package(Cholmod) -if(CHOLMOD_FOUND) - add_definitions("-DEIGEN_CHOLMOD_SUPPORT") - include_directories(${CHOLMOD_INCLUDES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${CHOLMOD_LIBRARIES} ${EIGEN_BLAS_LIBRARIES} ${EIGEN_LAPACK_LIBRARIES}) - set(CHOLMOD_ALL_LIBS ${CHOLMOD_LIBRARIES} ${EIGEN_BLAS_LIBRARIES} ${EIGEN_LAPACK_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "Cholmod, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "Cholmod, ") -endif() - -find_package(Umfpack) -if(UMFPACK_FOUND) - add_definitions("-DEIGEN_UMFPACK_SUPPORT") - include_directories(${UMFPACK_INCLUDES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${UMFPACK_LIBRARIES} ${EIGEN_BLAS_LIBRARIES}) - set(UMFPACK_ALL_LIBS ${UMFPACK_LIBRARIES} ${EIGEN_BLAS_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "UmfPack, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "UmfPack, ") -endif() - -find_package(SuperLU 4.0) -if(SUPERLU_FOUND) - add_definitions("-DEIGEN_SUPERLU_SUPPORT") - include_directories(${SUPERLU_INCLUDES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${SUPERLU_LIBRARIES} ${EIGEN_BLAS_LIBRARIES}) - set(SUPERLU_ALL_LIBS ${SUPERLU_LIBRARIES} ${EIGEN_BLAS_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "SuperLU, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "SuperLU, ") -endif() - - -find_package(Pastix) -find_package(Scotch) -find_package(Metis 5.0 REQUIRED) -if(PASTIX_FOUND) - add_definitions("-DEIGEN_PASTIX_SUPPORT") - include_directories(${PASTIX_INCLUDES}) - if(SCOTCH_FOUND) - include_directories(${SCOTCH_INCLUDES}) - set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${SCOTCH_LIBRARIES}) - elseif(METIS_FOUND) - include_directories(${METIS_INCLUDES}) - set(PASTIX_LIBRARIES ${PASTIX_LIBRARIES} ${METIS_LIBRARIES}) - else(SCOTCH_FOUND) - ei_add_property(EIGEN_MISSING_BACKENDS "PaStiX, ") - endif(SCOTCH_FOUND) - set(SPARSE_LIBS ${SPARSE_LIBS} ${PASTIX_LIBRARIES} ${ORDERING_LIBRARIES} ${EIGEN_BLAS_LIBRARIES}) - set(PASTIX_ALL_LIBS ${PASTIX_LIBRARIES} ${EIGEN_BLAS_LIBRARIES}) - ei_add_property(EIGEN_TESTED_BACKENDS "PaStiX, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "PaStiX, ") -endif() - -if(METIS_FOUND) - add_definitions("-DEIGEN_METIS_SUPPORT") - include_directories(${METIS_INCLUDES}) - ei_add_property(EIGEN_TESTED_BACKENDS "METIS, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "METIS, ") -endif() - -find_package(SPQR) -if(SPQR_FOUND AND CHOLMOD_FOUND AND (EIGEN_Fortran_COMPILER_WORKS OR LAPACK_FOUND) ) - add_definitions("-DEIGEN_SPQR_SUPPORT") - include_directories(${SPQR_INCLUDES}) - set(SPQR_ALL_LIBS ${SPQR_LIBRARIES} ${CHOLMOD_LIBRARIES} ${EIGEN_LAPACK_LIBRARIES} ${EIGEN_BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) - set(SPARSE_LIBS ${SPARSE_LIBS} ${SPQR_ALL_LIBS}) - ei_add_property(EIGEN_TESTED_BACKENDS "SPQR, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "SPQR, ") -endif() - -option(EIGEN_TEST_NOQT "Disable Qt support in unit tests" OFF) -if(NOT EIGEN_TEST_NOQT) - find_package(Qt4) - if(QT4_FOUND) - include(${QT_USE_FILE}) - ei_add_property(EIGEN_TESTED_BACKENDS "Qt4 support, ") - else() - ei_add_property(EIGEN_MISSING_BACKENDS "Qt4 support, ") - endif() -endif(NOT EIGEN_TEST_NOQT) - -if(TEST_LIB) - add_definitions("-DEIGEN_EXTERN_INSTANTIATIONS=1") -endif(TEST_LIB) - -set_property(GLOBAL PROPERTY EIGEN_CURRENT_SUBPROJECT "Official") -add_custom_target(BuildOfficial) - -ei_add_test(rand) -ei_add_test(meta) -ei_add_test(sizeof) -ei_add_test(dynalloc) -ei_add_test(nomalloc) -ei_add_test(first_aligned) -ei_add_test(nullary) -ei_add_test(mixingtypes) -ei_add_test(packetmath "-DEIGEN_FAST_MATH=1") -ei_add_test(unalignedassert) -ei_add_test(vectorization_logic) -ei_add_test(basicstuff) -ei_add_test(constructor) -ei_add_test(linearstructure) -ei_add_test(integer_types) -ei_add_test(unalignedcount) -if(NOT EIGEN_TEST_NO_EXCEPTIONS) - ei_add_test(exceptions) -endif() -ei_add_test(redux) -ei_add_test(visitor) -ei_add_test(block) -ei_add_test(corners) -ei_add_test(symbolic_index) -ei_add_test(indexed_view) -ei_add_test(swap) -ei_add_test(resize) -ei_add_test(conservative_resize) -ei_add_test(product_small) -ei_add_test(product_large) -ei_add_test(product_extra) -ei_add_test(diagonalmatrices) -ei_add_test(adjoint) -ei_add_test(diagonal) -ei_add_test(miscmatrices) -ei_add_test(commainitializer) -ei_add_test(smallvectors) -ei_add_test(mapped_matrix) -ei_add_test(mapstride) -ei_add_test(mapstaticmethods) -ei_add_test(array) -ei_add_test(array_for_matrix) -ei_add_test(array_replicate) -ei_add_test(array_reverse) -ei_add_test(ref) -ei_add_test(is_same_dense) -ei_add_test(triangular) -ei_add_test(selfadjoint) -ei_add_test(product_selfadjoint) -ei_add_test(product_symm) -ei_add_test(product_syrk) -ei_add_test(product_trmv) -ei_add_test(product_trmm) -ei_add_test(product_trsolve) -ei_add_test(product_mmtr) -ei_add_test(product_notemporary) -ei_add_test(stable_norm) -ei_add_test(permutationmatrices) -ei_add_test(bandmatrix) -ei_add_test(cholesky) -ei_add_test(lu) -ei_add_test(determinant) -ei_add_test(inverse) -ei_add_test(qr) -ei_add_test(qr_colpivoting) -ei_add_test(qr_fullpivoting) -ei_add_test(upperbidiagonalization) -ei_add_test(hessenberg) -ei_add_test(schur_real) -ei_add_test(schur_complex) -ei_add_test(eigensolver_selfadjoint) -ei_add_test(eigensolver_generic) -ei_add_test(eigensolver_complex) -ei_add_test(real_qz) -ei_add_test(eigensolver_generalized_real) -ei_add_test(jacobi) -ei_add_test(jacobisvd) -ei_add_test(bdcsvd) -ei_add_test(householder) -ei_add_test(geo_orthomethods) -ei_add_test(geo_quaternion) -ei_add_test(geo_eulerangles) -ei_add_test(geo_parametrizedline) -ei_add_test(geo_alignedbox) -ei_add_test(geo_hyperplane) -ei_add_test(geo_transformations) -ei_add_test(geo_homogeneous) -ei_add_test(stdvector) -ei_add_test(stdvector_overload) -ei_add_test(stdlist) -ei_add_test(stdlist_overload) -ei_add_test(stddeque) -ei_add_test(stddeque_overload) -ei_add_test(sparse_basic) -ei_add_test(sparse_block) -ei_add_test(sparse_vector) -ei_add_test(sparse_product) -ei_add_test(sparse_ref) -ei_add_test(sparse_solvers) -ei_add_test(sparse_permutations) -ei_add_test(simplicial_cholesky) -ei_add_test(conjugate_gradient) -ei_add_test(incomplete_cholesky) -ei_add_test(bicgstab) -ei_add_test(lscg) -ei_add_test(sparselu) -ei_add_test(sparseqr) -ei_add_test(umeyama) -ei_add_test(nesting_ops "${CMAKE_CXX_FLAGS_DEBUG}") -ei_add_test(zerosized) -ei_add_test(dontalign) -ei_add_test(evaluators) -if(NOT EIGEN_TEST_NO_EXCEPTIONS) - ei_add_test(sizeoverflow) -endif() -ei_add_test(prec_inverse_4x4) -ei_add_test(vectorwiseop) -ei_add_test(special_numbers) -ei_add_test(rvalue_types) -ei_add_test(dense_storage) -ei_add_test(ctorleak) -ei_add_test(mpl2only) -ei_add_test(inplace_decomposition) -ei_add_test(half_float) -ei_add_test(array_of_string) - -add_executable(bug1213 bug1213.cpp bug1213_main.cpp) - -check_cxx_compiler_flag("-ffast-math" COMPILER_SUPPORT_FASTMATH) -if(COMPILER_SUPPORT_FASTMATH) - set(EIGEN_FASTMATH_FLAGS "-ffast-math") -else() - check_cxx_compiler_flag("/fp:fast" COMPILER_SUPPORT_FPFAST) - if(COMPILER_SUPPORT_FPFAST) - set(EIGEN_FASTMATH_FLAGS "/fp:fast") - endif() -endif() - -ei_add_test(fastmath " ${EIGEN_FASTMATH_FLAGS} ") - -# # ei_add_test(denseLM) - -if(QT4_FOUND) - ei_add_test(qtvector "" "${QT_QTCORE_LIBRARY}") -endif(QT4_FOUND) - -if(UMFPACK_FOUND) - ei_add_test(umfpack_support "" "${UMFPACK_ALL_LIBS}") -endif() - -if(SUPERLU_FOUND) - ei_add_test(superlu_support "" "${SUPERLU_ALL_LIBS}") -endif() - -if(CHOLMOD_FOUND) - ei_add_test(cholmod_support "" "${CHOLMOD_ALL_LIBS}") -endif() - -if(PARDISO_FOUND) - ei_add_test(pardiso_support "" "${PARDISO_ALL_LIBS}") -endif() - -if(PASTIX_FOUND AND (SCOTCH_FOUND OR METIS_FOUND)) - ei_add_test(pastix_support "" "${PASTIX_ALL_LIBS}") -endif() - -if(SPQR_FOUND AND CHOLMOD_FOUND) - ei_add_test(spqr_support "" "${SPQR_ALL_LIBS}") -endif() - -if(METIS_FOUND) -ei_add_test(metis_support "" "${METIS_LIBRARIES}") -endif() - -string(TOLOWER "${CMAKE_CXX_COMPILER}" cmake_cxx_compiler_tolower) -if(cmake_cxx_compiler_tolower MATCHES "qcc") - set(CXX_IS_QCC "ON") -endif() - -ei_add_property(EIGEN_TESTING_SUMMARY "CXX: ${CMAKE_CXX_COMPILER}\n") -if(CMAKE_COMPILER_IS_GNUCXX AND NOT CXX_IS_QCC) - execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version COMMAND head -n 1 OUTPUT_VARIABLE EIGEN_CXX_VERSION_STRING OUTPUT_STRIP_TRAILING_WHITESPACE) - ei_add_property(EIGEN_TESTING_SUMMARY "CXX_VERSION: ${EIGEN_CXX_VERSION_STRING}\n") -endif() -ei_add_property(EIGEN_TESTING_SUMMARY "CXX_FLAGS: ${CMAKE_CXX_FLAGS}\n") -ei_add_property(EIGEN_TESTING_SUMMARY "Sparse lib flags: ${SPARSE_LIBS}\n") - -option(EIGEN_TEST_EIGEN2 "Run whole Eigen2 test suite against EIGEN2_SUPPORT" OFF) -mark_as_advanced(EIGEN_TEST_EIGEN2) -if(EIGEN_TEST_EIGEN2) - message(WARNING "The Eigen2 test suite has been removed") -endif() - -# boost MP unit test -find_package(Boost) -if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) - ei_add_test(boostmultiprec "" "${Boost_LIBRARIES}") - ei_add_property(EIGEN_TESTED_BACKENDS "Boost.Multiprecision, ") -else() - ei_add_property(EIGEN_MISSING_BACKENDS "Boost.Multiprecision, ") -endif() - - -# CUDA unit tests -option(EIGEN_TEST_CUDA "Enable CUDA support in unit tests" OFF) -option(EIGEN_TEST_CUDA_CLANG "Use clang instead of nvcc to compile the CUDA tests" OFF) - -if(EIGEN_TEST_CUDA_CLANG AND NOT CMAKE_CXX_COMPILER MATCHES "clang") - message(WARNING "EIGEN_TEST_CUDA_CLANG is set, but CMAKE_CXX_COMPILER does not appear to be clang.") -endif() - -if(EIGEN_TEST_CUDA) - -find_package(CUDA 5.0) -if(CUDA_FOUND) - - set(CUDA_PROPAGATE_HOST_FLAGS OFF) - if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(CUDA_NVCC_FLAGS "-ccbin ${CMAKE_C_COMPILER}" CACHE STRING "nvcc flags" FORCE) - endif() - if(EIGEN_TEST_CUDA_CLANG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 --cuda-gpu-arch=sm_30") - endif() - cuda_include_directories(${CMAKE_CURRENT_BINARY_DIR}) - set(EIGEN_ADD_TEST_FILENAME_EXTENSION "cu") - - ei_add_test(cuda_basic) - - unset(EIGEN_ADD_TEST_FILENAME_EXTENSION) - -endif(CUDA_FOUND) - -endif(EIGEN_TEST_CUDA) - - -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/failtests) -add_test(NAME failtests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/failtests COMMAND ${CMAKE_COMMAND} ${Eigen_SOURCE_DIR} -G "${CMAKE_GENERATOR}" -DEIGEN_FAILTEST=ON) - -option(EIGEN_TEST_BUILD_DOCUMENTATION "Test building the doxygen documentation" OFF) -IF(EIGEN_TEST_BUILD_DOCUMENTATION) - add_dependencies(buildtests doc) -ENDIF() diff --git a/testbed/nanogui/ext/eigen/test/adjoint.cpp b/testbed/nanogui/ext/eigen/test/adjoint.cpp deleted file mode 100644 index bdea51c1..00000000 --- a/testbed/nanogui/ext/eigen/test/adjoint.cpp +++ /dev/null @@ -1,200 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT - -#include "main.h" - -template struct adjoint_specific; - -template<> struct adjoint_specific { - template - static void run(const Vec& v1, const Vec& v2, Vec& v3, const Mat& square, Scalar s1, Scalar s2) { - VERIFY(test_isApproxWithRef((s1 * v1 + s2 * v2).dot(v3), numext::conj(s1) * v1.dot(v3) + numext::conj(s2) * v2.dot(v3), 0)); - VERIFY(test_isApproxWithRef(v3.dot(s1 * v1 + s2 * v2), s1*v3.dot(v1)+s2*v3.dot(v2), 0)); - - // check compatibility of dot and adjoint - VERIFY(test_isApproxWithRef(v1.dot(square * v2), (square.adjoint() * v1).dot(v2), 0)); - } -}; - -template<> struct adjoint_specific { - template - static void run(const Vec& v1, const Vec& v2, Vec& v3, const Mat& square, Scalar s1, Scalar s2) { - typedef typename NumTraits::Real RealScalar; - using std::abs; - - RealScalar ref = NumTraits::IsInteger ? RealScalar(0) : (std::max)((s1 * v1 + s2 * v2).norm(),v3.norm()); - VERIFY(test_isApproxWithRef((s1 * v1 + s2 * v2).dot(v3), numext::conj(s1) * v1.dot(v3) + numext::conj(s2) * v2.dot(v3), ref)); - VERIFY(test_isApproxWithRef(v3.dot(s1 * v1 + s2 * v2), s1*v3.dot(v1)+s2*v3.dot(v2), ref)); - - VERIFY_IS_APPROX(v1.squaredNorm(), v1.norm() * v1.norm()); - // check normalized() and normalize() - VERIFY_IS_APPROX(v1, v1.norm() * v1.normalized()); - v3 = v1; - v3.normalize(); - VERIFY_IS_APPROX(v1, v1.norm() * v3); - VERIFY_IS_APPROX(v3, v1.normalized()); - VERIFY_IS_APPROX(v3.norm(), RealScalar(1)); - - // check null inputs - VERIFY_IS_APPROX((v1*0).normalized(), (v1*0)); -#if (!EIGEN_ARCH_i386) || defined(EIGEN_VECTORIZE) - RealScalar very_small = (std::numeric_limits::min)(); - VERIFY( (v1*very_small).norm() == 0 ); - VERIFY_IS_APPROX((v1*very_small).normalized(), (v1*very_small)); - v3 = v1*very_small; - v3.normalize(); - VERIFY_IS_APPROX(v3, (v1*very_small)); -#endif - - // check compatibility of dot and adjoint - ref = NumTraits::IsInteger ? 0 : (std::max)((std::max)(v1.norm(),v2.norm()),(std::max)((square * v2).norm(),(square.adjoint() * v1).norm())); - VERIFY(internal::isMuchSmallerThan(abs(v1.dot(square * v2) - (square.adjoint() * v1).dot(v2)), ref, test_precision())); - - // check that Random().normalized() works: tricky as the random xpr must be evaluated by - // normalized() in order to produce a consistent result. - VERIFY_IS_APPROX(Vec::Random(v1.size()).normalized().norm(), RealScalar(1)); - } -}; - -template void adjoint(const MatrixType& m) -{ - /* this test covers the following files: - Transpose.h Conjugate.h Dot.h - */ - using std::abs; - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - typedef Matrix SquareMatrixType; - const Index PacketSize = internal::packet_traits::size; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - square = SquareMatrixType::Random(rows, rows); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - v3 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); - - Scalar s1 = internal::random(), - s2 = internal::random(); - - // check basic compatibility of adjoint, transpose, conjugate - VERIFY_IS_APPROX(m1.transpose().conjugate().adjoint(), m1); - VERIFY_IS_APPROX(m1.adjoint().conjugate().transpose(), m1); - - // check multiplicative behavior - VERIFY_IS_APPROX((m1.adjoint() * m2).adjoint(), m2.adjoint() * m1); - VERIFY_IS_APPROX((s1 * m1).adjoint(), numext::conj(s1) * m1.adjoint()); - - // check basic properties of dot, squaredNorm - VERIFY_IS_APPROX(numext::conj(v1.dot(v2)), v2.dot(v1)); - VERIFY_IS_APPROX(numext::real(v1.dot(v1)), v1.squaredNorm()); - - adjoint_specific::IsInteger>::run(v1, v2, v3, square, s1, s2); - - VERIFY_IS_MUCH_SMALLER_THAN(abs(vzero.dot(v1)), static_cast(1)); - - // like in testBasicStuff, test operator() to check const-qualification - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - VERIFY_IS_APPROX(m1.conjugate()(r,c), numext::conj(m1(r,c))); - VERIFY_IS_APPROX(m1.adjoint()(c,r), numext::conj(m1(r,c))); - - // check inplace transpose - m3 = m1; - m3.transposeInPlace(); - VERIFY_IS_APPROX(m3,m1.transpose()); - m3.transposeInPlace(); - VERIFY_IS_APPROX(m3,m1); - - if(PacketSize(0,m3.rows()-PacketSize); - Index j = internal::random(0,m3.cols()-PacketSize); - m3.template block(i,j).transposeInPlace(); - VERIFY_IS_APPROX( (m3.template block(i,j)), (m1.template block(i,j).transpose()) ); - m3.template block(i,j).transposeInPlace(); - VERIFY_IS_APPROX(m3,m1); - } - - // check inplace adjoint - m3 = m1; - m3.adjointInPlace(); - VERIFY_IS_APPROX(m3,m1.adjoint()); - m3.transposeInPlace(); - VERIFY_IS_APPROX(m3,m1.conjugate()); - - // check mixed dot product - typedef Matrix RealVectorType; - RealVectorType rv1 = RealVectorType::Random(rows); - VERIFY_IS_APPROX(v1.dot(rv1.template cast()), v1.dot(rv1)); - VERIFY_IS_APPROX(rv1.template cast().dot(v1), rv1.dot(v1)); -} - -void test_adjoint() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( adjoint(Matrix()) ); - CALL_SUBTEST_2( adjoint(Matrix3d()) ); - CALL_SUBTEST_3( adjoint(Matrix4f()) ); - - CALL_SUBTEST_4( adjoint(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_5( adjoint(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( adjoint(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - - // Complement for 128 bits vectorization: - CALL_SUBTEST_8( adjoint(Matrix2d()) ); - CALL_SUBTEST_9( adjoint(Matrix()) ); - - // 256 bits vectorization: - CALL_SUBTEST_10( adjoint(Matrix()) ); - CALL_SUBTEST_11( adjoint(Matrix()) ); - CALL_SUBTEST_12( adjoint(Matrix()) ); - } - // test a large static matrix only once - CALL_SUBTEST_7( adjoint(Matrix()) ); - -#ifdef EIGEN_TEST_PART_13 - { - MatrixXcf a(10,10), b(10,10); - VERIFY_RAISES_ASSERT(a = a.transpose()); - VERIFY_RAISES_ASSERT(a = a.transpose() + b); - VERIFY_RAISES_ASSERT(a = b + a.transpose()); - VERIFY_RAISES_ASSERT(a = a.conjugate().transpose()); - VERIFY_RAISES_ASSERT(a = a.adjoint()); - VERIFY_RAISES_ASSERT(a = a.adjoint() + b); - VERIFY_RAISES_ASSERT(a = b + a.adjoint()); - - // no assertion should be triggered for these cases: - a.transpose() = a.transpose(); - a.transpose() += a.transpose(); - a.transpose() += a.transpose() + b; - a.transpose() = a.adjoint(); - a.transpose() += a.adjoint(); - a.transpose() += a.adjoint() + b; - - // regression tests for check_for_aliasing - MatrixXd c(10,10); - c = 1.0 * MatrixXd::Ones(10,10) + c; - c = MatrixXd::Ones(10,10) * 1.0 + c; - c = c + MatrixXd::Ones(10,10) .cwiseProduct( MatrixXd::Zero(10,10) ); - c = MatrixXd::Ones(10,10) * MatrixXd::Zero(10,10); - } -#endif -} - diff --git a/testbed/nanogui/ext/eigen/test/array.cpp b/testbed/nanogui/ext/eigen/test/array.cpp deleted file mode 100644 index f7f3ba78..00000000 --- a/testbed/nanogui/ext/eigen/test/array.cpp +++ /dev/null @@ -1,498 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void array(const ArrayType& m) -{ - typedef typename ArrayType::Index Index; - typedef typename ArrayType::Scalar Scalar; - typedef typename ArrayType::RealScalar RealScalar; - typedef Array ColVectorType; - typedef Array RowVectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - - ArrayType m1 = ArrayType::Random(rows, cols), - m2 = ArrayType::Random(rows, cols), - m3(rows, cols); - ArrayType m4 = m1; // copy constructor - VERIFY_IS_APPROX(m1, m4); - - ColVectorType cv1 = ColVectorType::Random(rows); - RowVectorType rv1 = RowVectorType::Random(cols); - - Scalar s1 = internal::random(), - s2 = internal::random(); - - // scalar addition - VERIFY_IS_APPROX(m1 + s1, s1 + m1); - VERIFY_IS_APPROX(m1 + s1, ArrayType::Constant(rows,cols,s1) + m1); - VERIFY_IS_APPROX(s1 - m1, (-m1)+s1 ); - VERIFY_IS_APPROX(m1 - s1, m1 - ArrayType::Constant(rows,cols,s1)); - VERIFY_IS_APPROX(s1 - m1, ArrayType::Constant(rows,cols,s1) - m1); - VERIFY_IS_APPROX((m1*Scalar(2)) - s2, (m1+m1) - ArrayType::Constant(rows,cols,s2) ); - m3 = m1; - m3 += s2; - VERIFY_IS_APPROX(m3, m1 + s2); - m3 = m1; - m3 -= s1; - VERIFY_IS_APPROX(m3, m1 - s1); - - // scalar operators via Maps - m3 = m1; - ArrayType::Map(m1.data(), m1.rows(), m1.cols()) -= ArrayType::Map(m2.data(), m2.rows(), m2.cols()); - VERIFY_IS_APPROX(m1, m3 - m2); - - m3 = m1; - ArrayType::Map(m1.data(), m1.rows(), m1.cols()) += ArrayType::Map(m2.data(), m2.rows(), m2.cols()); - VERIFY_IS_APPROX(m1, m3 + m2); - - m3 = m1; - ArrayType::Map(m1.data(), m1.rows(), m1.cols()) *= ArrayType::Map(m2.data(), m2.rows(), m2.cols()); - VERIFY_IS_APPROX(m1, m3 * m2); - - m3 = m1; - m2 = ArrayType::Random(rows,cols); - m2 = (m2==0).select(1,m2); - ArrayType::Map(m1.data(), m1.rows(), m1.cols()) /= ArrayType::Map(m2.data(), m2.rows(), m2.cols()); - VERIFY_IS_APPROX(m1, m3 / m2); - - // reductions - VERIFY_IS_APPROX(m1.abs().colwise().sum().sum(), m1.abs().sum()); - VERIFY_IS_APPROX(m1.abs().rowwise().sum().sum(), m1.abs().sum()); - using std::abs; - VERIFY_IS_MUCH_SMALLER_THAN(abs(m1.colwise().sum().sum() - m1.sum()), m1.abs().sum()); - VERIFY_IS_MUCH_SMALLER_THAN(abs(m1.rowwise().sum().sum() - m1.sum()), m1.abs().sum()); - if (!internal::isMuchSmallerThan(abs(m1.sum() - (m1+m2).sum()), m1.abs().sum(), test_precision())) - VERIFY_IS_NOT_APPROX(((m1+m2).rowwise().sum()).sum(), m1.sum()); - VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op())); - - // vector-wise ops - m3 = m1; - VERIFY_IS_APPROX(m3.colwise() += cv1, m1.colwise() + cv1); - m3 = m1; - VERIFY_IS_APPROX(m3.colwise() -= cv1, m1.colwise() - cv1); - m3 = m1; - VERIFY_IS_APPROX(m3.rowwise() += rv1, m1.rowwise() + rv1); - m3 = m1; - VERIFY_IS_APPROX(m3.rowwise() -= rv1, m1.rowwise() - rv1); - - // Conversion from scalar - VERIFY_IS_APPROX((m3 = s1), ArrayType::Constant(rows,cols,s1)); - VERIFY_IS_APPROX((m3 = 1), ArrayType::Constant(rows,cols,1)); - VERIFY_IS_APPROX((m3.topLeftCorner(rows,cols) = 1), ArrayType::Constant(rows,cols,1)); - typedef Array FixedArrayType; - FixedArrayType f1(s1); - VERIFY_IS_APPROX(f1, FixedArrayType::Constant(s1)); - FixedArrayType f2(numext::real(s1)); - VERIFY_IS_APPROX(f2, FixedArrayType::Constant(numext::real(s1))); - FixedArrayType f3((int)100*numext::real(s1)); - VERIFY_IS_APPROX(f3, FixedArrayType::Constant((int)100*numext::real(s1))); - f1.setRandom(); - FixedArrayType f4(f1.data()); - VERIFY_IS_APPROX(f4, f1); - - // pow - VERIFY_IS_APPROX(m1.pow(2), m1.square()); - VERIFY_IS_APPROX(pow(m1,2), m1.square()); - VERIFY_IS_APPROX(m1.pow(3), m1.cube()); - VERIFY_IS_APPROX(pow(m1,3), m1.cube()); - VERIFY_IS_APPROX((-m1).pow(3), -m1.cube()); - VERIFY_IS_APPROX(pow(2*m1,3), 8*m1.cube()); - ArrayType exponents = ArrayType::Constant(rows, cols, RealScalar(2)); - VERIFY_IS_APPROX(Eigen::pow(m1,exponents), m1.square()); - VERIFY_IS_APPROX(m1.pow(exponents), m1.square()); - VERIFY_IS_APPROX(Eigen::pow(2*m1,exponents), 4*m1.square()); - VERIFY_IS_APPROX((2*m1).pow(exponents), 4*m1.square()); - VERIFY_IS_APPROX(Eigen::pow(m1,2*exponents), m1.square().square()); - VERIFY_IS_APPROX(m1.pow(2*exponents), m1.square().square()); - VERIFY_IS_APPROX(Eigen::pow(m1(0,0), exponents), ArrayType::Constant(rows,cols,m1(0,0)*m1(0,0))); - - // Check possible conflicts with 1D ctor - typedef Array OneDArrayType; - OneDArrayType o1(rows); - VERIFY(o1.size()==rows); - OneDArrayType o4((int)rows); - VERIFY(o4.size()==rows); -} - -template void comparisons(const ArrayType& m) -{ - using std::abs; - typedef typename ArrayType::Index Index; - typedef typename ArrayType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - ArrayType m1 = ArrayType::Random(rows, cols), - m2 = ArrayType::Random(rows, cols), - m3(rows, cols), - m4 = m1; - - m4 = (m4.abs()==Scalar(0)).select(1,m4); - - VERIFY(((m1 + Scalar(1)) > m1).all()); - VERIFY(((m1 - Scalar(1)) < m1).all()); - if (rows*cols>1) - { - m3 = m1; - m3(r,c) += 1; - VERIFY(! (m1 < m3).all() ); - VERIFY(! (m1 > m3).all() ); - } - VERIFY(!(m1 > m2 && m1 < m2).any()); - VERIFY((m1 <= m2 || m1 >= m2).all()); - - // comparisons array to scalar - VERIFY( (m1 != (m1(r,c)+1) ).any() ); - VERIFY( (m1 > (m1(r,c)-1) ).any() ); - VERIFY( (m1 < (m1(r,c)+1) ).any() ); - VERIFY( (m1 == m1(r,c) ).any() ); - - // comparisons scalar to array - VERIFY( ( (m1(r,c)+1) != m1).any() ); - VERIFY( ( (m1(r,c)-1) < m1).any() ); - VERIFY( ( (m1(r,c)+1) > m1).any() ); - VERIFY( ( m1(r,c) == m1).any() ); - - // test Select - VERIFY_IS_APPROX( (m1m2).select(m1,m2), m1.cwiseMax(m2) ); - Scalar mid = (m1.cwiseAbs().minCoeff() + m1.cwiseAbs().maxCoeff())/Scalar(2); - for (int j=0; j=ArrayType::Constant(rows,cols,mid)) - .select(m1,0), m3); - // even shorter version: - VERIFY_IS_APPROX( (m1.abs()RealScalar(0.1)).count() == rows*cols); - - // and/or - VERIFY( (m1RealScalar(0)).count() == 0); - VERIFY( (m1=RealScalar(0)).count() == rows*cols); - RealScalar a = m1.abs().mean(); - VERIFY( (m1<-a || m1>a).count() == (m1.abs()>a).count()); - - typedef Array ArrayOfIndices; - - // TODO allows colwise/rowwise for array - VERIFY_IS_APPROX(((m1.abs()+1)>RealScalar(0.1)).colwise().count(), ArrayOfIndices::Constant(cols,rows).transpose()); - VERIFY_IS_APPROX(((m1.abs()+1)>RealScalar(0.1)).rowwise().count(), ArrayOfIndices::Constant(rows, cols)); -} - -template void array_real(const ArrayType& m) -{ - using std::abs; - using std::sqrt; - typedef typename ArrayType::Index Index; - typedef typename ArrayType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - ArrayType m1 = ArrayType::Random(rows, cols), - m2 = ArrayType::Random(rows, cols), - m3(rows, cols), - m4 = m1; - - m4 = (m4.abs()==Scalar(0)).select(1,m4); - - Scalar s1 = internal::random(); - - // these tests are mostly to check possible compilation issues with free-functions. - VERIFY_IS_APPROX(m1.sin(), sin(m1)); - VERIFY_IS_APPROX(m1.cos(), cos(m1)); - VERIFY_IS_APPROX(m1.tan(), tan(m1)); - VERIFY_IS_APPROX(m1.asin(), asin(m1)); - VERIFY_IS_APPROX(m1.acos(), acos(m1)); - VERIFY_IS_APPROX(m1.atan(), atan(m1)); - VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); - VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); - VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); - - VERIFY_IS_APPROX(m1.arg(), arg(m1)); - VERIFY_IS_APPROX(m1.round(), round(m1)); - VERIFY_IS_APPROX(m1.floor(), floor(m1)); - VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); - VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); - VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); - VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); - VERIFY_IS_APPROX(m1.inverse(), inverse(m1)); - VERIFY_IS_APPROX(m1.abs(), abs(m1)); - VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); - VERIFY_IS_APPROX(m1.square(), square(m1)); - VERIFY_IS_APPROX(m1.cube(), cube(m1)); - VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); - VERIFY_IS_APPROX(m1.sign(), sign(m1)); - - - // avoid NaNs with abs() so verification doesn't fail - m3 = m1.abs(); - VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m1))); - VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m1))); - VERIFY_IS_APPROX(rsqrt(m3), Scalar(1)/sqrt(abs(m1))); - VERIFY_IS_APPROX(m3.log(), log(m3)); - VERIFY_IS_APPROX(m3.log1p(), log1p(m3)); - VERIFY_IS_APPROX(m3.log10(), log10(m3)); - - - VERIFY((!(m1>m2) == (m1<=m2)).all()); - - VERIFY_IS_APPROX(sin(m1.asin()), m1); - VERIFY_IS_APPROX(cos(m1.acos()), m1); - VERIFY_IS_APPROX(tan(m1.atan()), m1); - VERIFY_IS_APPROX(sinh(m1), 0.5*(exp(m1)-exp(-m1))); - VERIFY_IS_APPROX(cosh(m1), 0.5*(exp(m1)+exp(-m1))); - VERIFY_IS_APPROX(tanh(m1), (0.5*(exp(m1)-exp(-m1)))/(0.5*(exp(m1)+exp(-m1)))); - VERIFY_IS_APPROX(arg(m1), ((m1<0).template cast())*std::acos(-1.0)); - VERIFY((round(m1) <= ceil(m1) && round(m1) >= floor(m1)).all()); - VERIFY((Eigen::isnan)((m1*0.0)/0.0).all()); - VERIFY((Eigen::isinf)(m4/0.0).all()); - VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1*0.0/0.0)) && (!(Eigen::isfinite)(m4/0.0))).all()); - VERIFY_IS_APPROX(inverse(inverse(m1)),m1); - VERIFY((abs(m1) == m1 || abs(m1) == -m1).all()); - VERIFY_IS_APPROX(m3, sqrt(abs2(m1))); - VERIFY_IS_APPROX( m1.sign(), -(-m1).sign() ); - VERIFY_IS_APPROX( m1*m1.sign(),m1.abs()); - VERIFY_IS_APPROX(m1.sign() * m1.abs(), m1); - - VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1)); - VERIFY_IS_APPROX(numext::abs2(real(m1)) + numext::abs2(imag(m1)), numext::abs2(m1)); - if(!NumTraits::IsComplex) - VERIFY_IS_APPROX(numext::real(m1), m1); - - // shift argument of logarithm so that it is not zero - Scalar smallNumber = NumTraits::dummy_precision(); - VERIFY_IS_APPROX((m3 + smallNumber).log() , log(abs(m1) + smallNumber)); - VERIFY_IS_APPROX((m3 + smallNumber + 1).log() , log1p(abs(m1) + smallNumber)); - - VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2)); - VERIFY_IS_APPROX(m1.exp(), exp(m1)); - VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp()); - - VERIFY_IS_APPROX(m1.expm1(), expm1(m1)); - VERIFY_IS_APPROX((m3 + smallNumber).exp() - 1, expm1(abs(m3) + smallNumber)); - - VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt()); - VERIFY_IS_APPROX(pow(m3,RealScalar(0.5)), m3.sqrt()); - - VERIFY_IS_APPROX(m3.pow(RealScalar(-0.5)), m3.rsqrt()); - VERIFY_IS_APPROX(pow(m3,RealScalar(-0.5)), m3.rsqrt()); - - VERIFY_IS_APPROX(log10(m3), log(m3)/log(10)); - - // scalar by array division - const RealScalar tiny = sqrt(std::numeric_limits::epsilon()); - s1 += Scalar(tiny); - m1 += ArrayType::Constant(rows,cols,Scalar(tiny)); - VERIFY_IS_APPROX(s1/m1, s1 * m1.inverse()); - - // check inplace transpose - m3 = m1; - m3.transposeInPlace(); - VERIFY_IS_APPROX(m3, m1.transpose()); - m3.transposeInPlace(); - VERIFY_IS_APPROX(m3, m1); -} - -template void array_complex(const ArrayType& m) -{ - typedef typename ArrayType::Index Index; - typedef typename ArrayType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - ArrayType m1 = ArrayType::Random(rows, cols), - m2(rows, cols), - m4 = m1; - - m4.real() = (m4.real().abs()==RealScalar(0)).select(RealScalar(1),m4.real()); - m4.imag() = (m4.imag().abs()==RealScalar(0)).select(RealScalar(1),m4.imag()); - - Array m3(rows, cols); - - for (Index i = 0; i < m.rows(); ++i) - for (Index j = 0; j < m.cols(); ++j) - m2(i,j) = sqrt(m1(i,j)); - - // these tests are mostly to check possible compilation issues with free-functions. - VERIFY_IS_APPROX(m1.sin(), sin(m1)); - VERIFY_IS_APPROX(m1.cos(), cos(m1)); - VERIFY_IS_APPROX(m1.tan(), tan(m1)); - VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); - VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); - VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); - VERIFY_IS_APPROX(m1.arg(), arg(m1)); - VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); - VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); - VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); - VERIFY_IS_APPROX(m1.inverse(), inverse(m1)); - VERIFY_IS_APPROX(m1.log(), log(m1)); - VERIFY_IS_APPROX(m1.log10(), log10(m1)); - VERIFY_IS_APPROX(m1.abs(), abs(m1)); - VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); - VERIFY_IS_APPROX(m1.sqrt(), sqrt(m1)); - VERIFY_IS_APPROX(m1.square(), square(m1)); - VERIFY_IS_APPROX(m1.cube(), cube(m1)); - VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); - VERIFY_IS_APPROX(m1.sign(), sign(m1)); - - - VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2)); - VERIFY_IS_APPROX(m1.exp(), exp(m1)); - VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp()); - - VERIFY_IS_APPROX(sinh(m1), 0.5*(exp(m1)-exp(-m1))); - VERIFY_IS_APPROX(cosh(m1), 0.5*(exp(m1)+exp(-m1))); - VERIFY_IS_APPROX(tanh(m1), (0.5*(exp(m1)-exp(-m1)))/(0.5*(exp(m1)+exp(-m1)))); - - for (Index i = 0; i < m.rows(); ++i) - for (Index j = 0; j < m.cols(); ++j) - m3(i,j) = std::atan2(imag(m1(i,j)), real(m1(i,j))); - VERIFY_IS_APPROX(arg(m1), m3); - - std::complex zero(0.0,0.0); - VERIFY((Eigen::isnan)(m1*zero/zero).all()); -#if EIGEN_COMP_MSVC - // msvc complex division is not robust - VERIFY((Eigen::isinf)(m4/RealScalar(0)).all()); -#else -#if EIGEN_COMP_CLANG - // clang's complex division is notoriously broken too - if((numext::isinf)(m4(0,0)/RealScalar(0))) { -#endif - VERIFY((Eigen::isinf)(m4/zero).all()); -#if EIGEN_COMP_CLANG - } - else - { - VERIFY((Eigen::isinf)(m4.real()/zero.real()).all()); - } -#endif -#endif // MSVC - - VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1*zero/zero)) && (!(Eigen::isfinite)(m1/zero))).all()); - - VERIFY_IS_APPROX(inverse(inverse(m1)),m1); - VERIFY_IS_APPROX(conj(m1.conjugate()), m1); - VERIFY_IS_APPROX(abs(m1), sqrt(square(real(m1))+square(imag(m1)))); - VERIFY_IS_APPROX(abs(m1), sqrt(abs2(m1))); - VERIFY_IS_APPROX(log10(m1), log(m1)/log(10)); - - VERIFY_IS_APPROX( m1.sign(), -(-m1).sign() ); - VERIFY_IS_APPROX( m1.sign() * m1.abs(), m1); - - // scalar by array division - Scalar s1 = internal::random(); - const RealScalar tiny = std::sqrt(std::numeric_limits::epsilon()); - s1 += Scalar(tiny); - m1 += ArrayType::Constant(rows,cols,Scalar(tiny)); - VERIFY_IS_APPROX(s1/m1, s1 * m1.inverse()); - - // check inplace transpose - m2 = m1; - m2.transposeInPlace(); - VERIFY_IS_APPROX(m2, m1.transpose()); - m2.transposeInPlace(); - VERIFY_IS_APPROX(m2, m1); - -} - -template void min_max(const ArrayType& m) -{ - typedef typename ArrayType::Index Index; - typedef typename ArrayType::Scalar Scalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - ArrayType m1 = ArrayType::Random(rows, cols); - - // min/max with array - Scalar maxM1 = m1.maxCoeff(); - Scalar minM1 = m1.minCoeff(); - - VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)(ArrayType::Constant(rows,cols, minM1))); - VERIFY_IS_APPROX(m1, (m1.min)(ArrayType::Constant(rows,cols, maxM1))); - - VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)(ArrayType::Constant(rows,cols, maxM1))); - VERIFY_IS_APPROX(m1, (m1.max)(ArrayType::Constant(rows,cols, minM1))); - - // min/max with scalar input - VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)( minM1)); - VERIFY_IS_APPROX(m1, (m1.min)( maxM1)); - - VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)( maxM1)); - VERIFY_IS_APPROX(m1, (m1.max)( minM1)); - -} - -void test_array() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( array(Array()) ); - CALL_SUBTEST_2( array(Array22f()) ); - CALL_SUBTEST_3( array(Array44d()) ); - CALL_SUBTEST_4( array(ArrayXXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_5( array(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( array(ArrayXXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( comparisons(Array()) ); - CALL_SUBTEST_2( comparisons(Array22f()) ); - CALL_SUBTEST_3( comparisons(Array44d()) ); - CALL_SUBTEST_5( comparisons(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( comparisons(ArrayXXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( min_max(Array()) ); - CALL_SUBTEST_2( min_max(Array22f()) ); - CALL_SUBTEST_3( min_max(Array44d()) ); - CALL_SUBTEST_5( min_max(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( min_max(ArrayXXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( array_real(Array()) ); - CALL_SUBTEST_2( array_real(Array22f()) ); - CALL_SUBTEST_3( array_real(Array44d()) ); - CALL_SUBTEST_5( array_real(ArrayXXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_4( array_complex(ArrayXXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - - VERIFY((internal::is_same< internal::global_math_functions_filtering_base::type, int >::value)); - VERIFY((internal::is_same< internal::global_math_functions_filtering_base::type, float >::value)); - VERIFY((internal::is_same< internal::global_math_functions_filtering_base::type, ArrayBase >::value)); - typedef CwiseUnaryOp, ArrayXd > Xpr; - VERIFY((internal::is_same< internal::global_math_functions_filtering_base::type, - ArrayBase - >::value)); -} diff --git a/testbed/nanogui/ext/eigen/test/array_for_matrix.cpp b/testbed/nanogui/ext/eigen/test/array_for_matrix.cpp deleted file mode 100644 index c1501947..00000000 --- a/testbed/nanogui/ext/eigen/test/array_for_matrix.cpp +++ /dev/null @@ -1,284 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void array_for_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix ColVectorType; - typedef Matrix RowVectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols); - - ColVectorType cv1 = ColVectorType::Random(rows); - RowVectorType rv1 = RowVectorType::Random(cols); - - Scalar s1 = internal::random(), - s2 = internal::random(); - - // scalar addition - VERIFY_IS_APPROX(m1.array() + s1, s1 + m1.array()); - VERIFY_IS_APPROX((m1.array() + s1).matrix(), MatrixType::Constant(rows,cols,s1) + m1); - VERIFY_IS_APPROX(((m1*Scalar(2)).array() - s2).matrix(), (m1+m1) - MatrixType::Constant(rows,cols,s2) ); - m3 = m1; - m3.array() += s2; - VERIFY_IS_APPROX(m3, (m1.array() + s2).matrix()); - m3 = m1; - m3.array() -= s1; - VERIFY_IS_APPROX(m3, (m1.array() - s1).matrix()); - - // reductions - VERIFY_IS_MUCH_SMALLER_THAN(m1.colwise().sum().sum() - m1.sum(), m1.squaredNorm()); - VERIFY_IS_MUCH_SMALLER_THAN(m1.rowwise().sum().sum() - m1.sum(), m1.squaredNorm()); - VERIFY_IS_MUCH_SMALLER_THAN(m1.colwise().sum() + m2.colwise().sum() - (m1+m2).colwise().sum(), (m1+m2).squaredNorm()); - VERIFY_IS_MUCH_SMALLER_THAN(m1.rowwise().sum() - m2.rowwise().sum() - (m1-m2).rowwise().sum(), (m1-m2).squaredNorm()); - VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op())); - - // vector-wise ops - m3 = m1; - VERIFY_IS_APPROX(m3.colwise() += cv1, m1.colwise() + cv1); - m3 = m1; - VERIFY_IS_APPROX(m3.colwise() -= cv1, m1.colwise() - cv1); - m3 = m1; - VERIFY_IS_APPROX(m3.rowwise() += rv1, m1.rowwise() + rv1); - m3 = m1; - VERIFY_IS_APPROX(m3.rowwise() -= rv1, m1.rowwise() - rv1); - - // empty objects - VERIFY_IS_APPROX(m1.block(0,0,0,cols).colwise().sum(), RowVectorType::Zero(cols)); - VERIFY_IS_APPROX(m1.block(0,0,rows,0).rowwise().prod(), ColVectorType::Ones(rows)); - - // verify the const accessors exist - const Scalar& ref_m1 = m.matrix().array().coeffRef(0); - const Scalar& ref_m2 = m.matrix().array().coeffRef(0,0); - const Scalar& ref_a1 = m.array().matrix().coeffRef(0); - const Scalar& ref_a2 = m.array().matrix().coeffRef(0,0); - VERIFY(&ref_a1 == &ref_m1); - VERIFY(&ref_a2 == &ref_m2); - - // Check write accessors: - m1.array().coeffRef(0,0) = 1; - VERIFY_IS_APPROX(m1(0,0),Scalar(1)); - m1.array()(0,0) = 2; - VERIFY_IS_APPROX(m1(0,0),Scalar(2)); - m1.array().matrix().coeffRef(0,0) = 3; - VERIFY_IS_APPROX(m1(0,0),Scalar(3)); - m1.array().matrix()(0,0) = 4; - VERIFY_IS_APPROX(m1(0,0),Scalar(4)); -} - -template void comparisons(const MatrixType& m) -{ - using std::abs; - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols); - - VERIFY(((m1.array() + Scalar(1)) > m1.array()).all()); - VERIFY(((m1.array() - Scalar(1)) < m1.array()).all()); - if (rows*cols>1) - { - m3 = m1; - m3(r,c) += 1; - VERIFY(! (m1.array() < m3.array()).all() ); - VERIFY(! (m1.array() > m3.array()).all() ); - } - - // comparisons to scalar - VERIFY( (m1.array() != (m1(r,c)+1) ).any() ); - VERIFY( (m1.array() > (m1(r,c)-1) ).any() ); - VERIFY( (m1.array() < (m1(r,c)+1) ).any() ); - VERIFY( (m1.array() == m1(r,c) ).any() ); - VERIFY( m1.cwiseEqual(m1(r,c)).any() ); - - // test Select - VERIFY_IS_APPROX( (m1.array()m2.array()).select(m1,m2), m1.cwiseMax(m2) ); - Scalar mid = (m1.cwiseAbs().minCoeff() + m1.cwiseAbs().maxCoeff())/Scalar(2); - for (int j=0; j=MatrixType::Constant(rows,cols,mid).array()) - .select(m1,0), m3); - // even shorter version: - VERIFY_IS_APPROX( (m1.array().abs()RealScalar(0.1)).count() == rows*cols); - - // and/or - VERIFY( ((m1.array()RealScalar(0)).matrix()).count() == 0); - VERIFY( ((m1.array()=RealScalar(0)).matrix()).count() == rows*cols); - RealScalar a = m1.cwiseAbs().mean(); - VERIFY( ((m1.array()<-a).matrix() || (m1.array()>a).matrix()).count() == (m1.cwiseAbs().array()>a).count()); - - typedef Matrix VectorOfIndices; - - // TODO allows colwise/rowwise for array - VERIFY_IS_APPROX(((m1.array().abs()+1)>RealScalar(0.1)).matrix().colwise().count(), VectorOfIndices::Constant(cols,rows).transpose()); - VERIFY_IS_APPROX(((m1.array().abs()+1)>RealScalar(0.1)).matrix().rowwise().count(), VectorOfIndices::Constant(rows, cols)); -} - -template void lpNorm(const VectorType& v) -{ - using std::sqrt; - typedef typename VectorType::RealScalar RealScalar; - VectorType u = VectorType::Random(v.size()); - - if(v.size()==0) - { - VERIFY_IS_APPROX(u.template lpNorm(), RealScalar(0)); - VERIFY_IS_APPROX(u.template lpNorm<1>(), RealScalar(0)); - VERIFY_IS_APPROX(u.template lpNorm<2>(), RealScalar(0)); - VERIFY_IS_APPROX(u.template lpNorm<5>(), RealScalar(0)); - } - else - { - VERIFY_IS_APPROX(u.template lpNorm(), u.cwiseAbs().maxCoeff()); - } - - VERIFY_IS_APPROX(u.template lpNorm<1>(), u.cwiseAbs().sum()); - VERIFY_IS_APPROX(u.template lpNorm<2>(), sqrt(u.array().abs().square().sum())); - VERIFY_IS_APPROX(numext::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum()); -} - -template void cwise_min_max(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols); - - // min/max with array - Scalar maxM1 = m1.maxCoeff(); - Scalar minM1 = m1.minCoeff(); - - VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin(MatrixType::Constant(rows,cols, minM1))); - VERIFY_IS_APPROX(m1, m1.cwiseMin(MatrixType::Constant(rows,cols, maxM1))); - - VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax(MatrixType::Constant(rows,cols, maxM1))); - VERIFY_IS_APPROX(m1, m1.cwiseMax(MatrixType::Constant(rows,cols, minM1))); - - // min/max with scalar input - VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin( minM1)); - VERIFY_IS_APPROX(m1, m1.cwiseMin(maxM1)); - VERIFY_IS_APPROX(-m1, (-m1).cwiseMin(-minM1)); - VERIFY_IS_APPROX(-m1.array(), ((-m1).array().min)( -minM1)); - - VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax( maxM1)); - VERIFY_IS_APPROX(m1, m1.cwiseMax(minM1)); - VERIFY_IS_APPROX(-m1, (-m1).cwiseMax(-maxM1)); - VERIFY_IS_APPROX(-m1.array(), ((-m1).array().max)(-maxM1)); - - VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1).array(), (m1.array().min)( minM1)); - VERIFY_IS_APPROX(m1.array(), (m1.array().min)( maxM1)); - - VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1).array(), (m1.array().max)( maxM1)); - VERIFY_IS_APPROX(m1.array(), (m1.array().max)( minM1)); - -} - -template void resize(const MatrixTraits& t) -{ - typedef typename MatrixTraits::Index Index; - typedef typename MatrixTraits::Scalar Scalar; - typedef Matrix MatrixType; - typedef Array Array2DType; - typedef Matrix VectorType; - typedef Array Array1DType; - - Index rows = t.rows(), cols = t.cols(); - - MatrixType m(rows,cols); - VectorType v(rows); - Array2DType a2(rows,cols); - Array1DType a1(rows); - - m.array().resize(rows+1,cols+1); - VERIFY(m.rows()==rows+1 && m.cols()==cols+1); - a2.matrix().resize(rows+1,cols+1); - VERIFY(a2.rows()==rows+1 && a2.cols()==cols+1); - v.array().resize(cols); - VERIFY(v.size()==cols); - a1.matrix().resize(cols); - VERIFY(a1.size()==cols); -} - -void regression_bug_654() -{ - ArrayXf a = RowVectorXf(3); - VectorXf v = Array(3); -} - -void test_array_for_matrix() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( array_for_matrix(Matrix()) ); - CALL_SUBTEST_2( array_for_matrix(Matrix2f()) ); - CALL_SUBTEST_3( array_for_matrix(Matrix4d()) ); - CALL_SUBTEST_4( array_for_matrix(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_5( array_for_matrix(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( array_for_matrix(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( comparisons(Matrix()) ); - CALL_SUBTEST_2( comparisons(Matrix2f()) ); - CALL_SUBTEST_3( comparisons(Matrix4d()) ); - CALL_SUBTEST_5( comparisons(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( comparisons(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( cwise_min_max(Matrix()) ); - CALL_SUBTEST_2( cwise_min_max(Matrix2f()) ); - CALL_SUBTEST_3( cwise_min_max(Matrix4d()) ); - CALL_SUBTEST_5( cwise_min_max(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( cwise_min_max(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( lpNorm(Matrix()) ); - CALL_SUBTEST_2( lpNorm(Vector2f()) ); - CALL_SUBTEST_7( lpNorm(Vector3d()) ); - CALL_SUBTEST_8( lpNorm(Vector4f()) ); - CALL_SUBTEST_5( lpNorm(VectorXf(internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_4( lpNorm(VectorXcf(internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - CALL_SUBTEST_5( lpNorm(VectorXf(0)) ); - CALL_SUBTEST_4( lpNorm(VectorXcf(0)) ); - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_4( resize(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_5( resize(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( resize(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - CALL_SUBTEST_6( regression_bug_654() ); -} diff --git a/testbed/nanogui/ext/eigen/test/array_of_string.cpp b/testbed/nanogui/ext/eigen/test/array_of_string.cpp deleted file mode 100644 index e23b7c59..00000000 --- a/testbed/nanogui/ext/eigen/test/array_of_string.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -void test_array_of_string() -{ - typedef Array ArrayXs; - ArrayXs a1(3), a2(3), a3(3), a3ref(3); - a1 << "one", "two", "three"; - a2 << "1", "2", "3"; - a3ref << "one (1)", "two (2)", "three (3)"; - std::stringstream s1; - s1 << a1; - VERIFY_IS_EQUAL(s1.str(), std::string(" one two three")); - a3 = a1 + std::string(" (") + a2 + std::string(")"); - VERIFY((a3==a3ref).all()); - - a3 = a1; - a3 += std::string(" (") + a2 + std::string(")"); - VERIFY((a3==a3ref).all()); - - a1.swap(a3); - VERIFY((a1==a3ref).all()); - VERIFY((a3!=a3ref).all()); -} diff --git a/testbed/nanogui/ext/eigen/test/array_replicate.cpp b/testbed/nanogui/ext/eigen/test/array_replicate.cpp deleted file mode 100644 index 779c8fc2..00000000 --- a/testbed/nanogui/ext/eigen/test/array_replicate.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void replicate(const MatrixType& m) -{ - /* this test covers the following files: - Replicate.cpp - */ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - typedef Matrix MatrixX; - typedef Matrix VectorX; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols); - - VectorType v1 = VectorType::Random(rows); - - MatrixX x1, x2; - VectorX vx1; - - int f1 = internal::random(1,10), - f2 = internal::random(1,10); - - x1.resize(rows*f1,cols*f2); - for(int j=0; j())); - - x2.resize(rows,3*cols); - x2 << m2, m2, m2; - VERIFY_IS_APPROX(x2, (m2.template replicate<1,3>())); - - vx1.resize(3*rows,cols); - vx1 << m2, m2, m2; - VERIFY_IS_APPROX(vx1+vx1, vx1+(m2.template replicate<3,1>())); - - vx1=m2+(m2.colwise().replicate(1)); - - if(m2.cols()==1) - VERIFY_IS_APPROX(m2.coeff(0), (m2.template replicate<3,1>().coeff(m2.rows()))); - - x2.resize(rows,f1); - for (int j=0; j()) ); - CALL_SUBTEST_2( replicate(Vector2f()) ); - CALL_SUBTEST_3( replicate(Vector3d()) ); - CALL_SUBTEST_4( replicate(Vector4f()) ); - CALL_SUBTEST_5( replicate(VectorXf(16)) ); - CALL_SUBTEST_6( replicate(VectorXcd(10)) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/array_reverse.cpp b/testbed/nanogui/ext/eigen/test/array_reverse.cpp deleted file mode 100644 index c9d9f90c..00000000 --- a/testbed/nanogui/ext/eigen/test/array_reverse.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2009 Ricard Marxer -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -using namespace std; - -template void reverse(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - - // this test relies a lot on Random.h, and there's not much more that we can do - // to test it, hence I consider that we will have tested Random.h - MatrixType m1 = MatrixType::Random(rows, cols), m2; - VectorType v1 = VectorType::Random(rows); - - MatrixType m1_r = m1.reverse(); - // Verify that MatrixBase::reverse() works - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_r(i, j), m1(rows - 1 - i, cols - 1 - j)); - } - } - - Reverse m1_rd(m1); - // Verify that a Reverse default (in both directions) of an expression works - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_rd(i, j), m1(rows - 1 - i, cols - 1 - j)); - } - } - - Reverse m1_rb(m1); - // Verify that a Reverse in both directions of an expression works - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_rb(i, j), m1(rows - 1 - i, cols - 1 - j)); - } - } - - Reverse m1_rv(m1); - // Verify that a Reverse in the vertical directions of an expression works - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_rv(i, j), m1(rows - 1 - i, j)); - } - } - - Reverse m1_rh(m1); - // Verify that a Reverse in the horizontal directions of an expression works - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_rh(i, j), m1(i, cols - 1 - j)); - } - } - - VectorType v1_r = v1.reverse(); - // Verify that a VectorType::reverse() of an expression works - for ( int i = 0; i < rows; i++ ) { - VERIFY_IS_APPROX(v1_r(i), v1(rows - 1 - i)); - } - - MatrixType m1_cr = m1.colwise().reverse(); - // Verify that PartialRedux::reverse() works (for colwise()) - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_cr(i, j), m1(rows - 1 - i, j)); - } - } - - MatrixType m1_rr = m1.rowwise().reverse(); - // Verify that PartialRedux::reverse() works (for rowwise()) - for ( int i = 0; i < rows; i++ ) { - for ( int j = 0; j < cols; j++ ) { - VERIFY_IS_APPROX(m1_rr(i, j), m1(i, cols - 1 - j)); - } - } - - Scalar x = internal::random(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - m1.reverse()(r, c) = x; - VERIFY_IS_APPROX(x, m1(rows - 1 - r, cols - 1 - c)); - - m2 = m1; - m2.reverseInPlace(); - VERIFY_IS_APPROX(m2,m1.reverse().eval()); - - m2 = m1; - m2.col(0).reverseInPlace(); - VERIFY_IS_APPROX(m2.col(0),m1.col(0).reverse().eval()); - - m2 = m1; - m2.row(0).reverseInPlace(); - VERIFY_IS_APPROX(m2.row(0),m1.row(0).reverse().eval()); - - m2 = m1; - m2.rowwise().reverseInPlace(); - VERIFY_IS_APPROX(m2,m1.rowwise().reverse().eval()); - - m2 = m1; - m2.colwise().reverseInPlace(); - VERIFY_IS_APPROX(m2,m1.colwise().reverse().eval()); - - m1.colwise().reverse()(r, c) = x; - VERIFY_IS_APPROX(x, m1(rows - 1 - r, c)); - - m1.rowwise().reverse()(r, c) = x; - VERIFY_IS_APPROX(x, m1(r, cols - 1 - c)); -} - -void test_array_reverse() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( reverse(Matrix()) ); - CALL_SUBTEST_2( reverse(Matrix2f()) ); - CALL_SUBTEST_3( reverse(Matrix4f()) ); - CALL_SUBTEST_4( reverse(Matrix4d()) ); - CALL_SUBTEST_5( reverse(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( reverse(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_7( reverse(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_8( reverse(Matrix()) ); - CALL_SUBTEST_9( reverse(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } -#ifdef EIGEN_TEST_PART_3 - Vector4f x; x << 1, 2, 3, 4; - Vector4f y; y << 4, 3, 2, 1; - VERIFY(x.reverse()[1] == 3); - VERIFY(x.reverse() == y); -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/bandmatrix.cpp b/testbed/nanogui/ext/eigen/test/bandmatrix.cpp deleted file mode 100644 index f8c38f7c..00000000 --- a/testbed/nanogui/ext/eigen/test/bandmatrix.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// This file is triangularView of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void bandmatrix(const MatrixType& _m) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix DenseMatrixType; - - Index rows = _m.rows(); - Index cols = _m.cols(); - Index supers = _m.supers(); - Index subs = _m.subs(); - - MatrixType m(rows,cols,supers,subs); - - DenseMatrixType dm1(rows,cols); - dm1.setZero(); - - m.diagonal().setConstant(123); - dm1.diagonal().setConstant(123); - for (int i=1; i<=m.supers();++i) - { - m.diagonal(i).setConstant(static_cast(i)); - dm1.diagonal(i).setConstant(static_cast(i)); - } - for (int i=1; i<=m.subs();++i) - { - m.diagonal(-i).setConstant(-static_cast(i)); - dm1.diagonal(-i).setConstant(-static_cast(i)); - } - //std::cerr << m.m_data << "\n\n" << m.toDense() << "\n\n" << dm1 << "\n\n\n\n"; - VERIFY_IS_APPROX(dm1,m.toDenseMatrix()); - - for (int i=0; i(i+1)); - dm1.col(i).setConstant(static_cast(i+1)); - } - Index d = (std::min)(rows,cols); - Index a = std::max(0,cols-d-supers); - Index b = std::max(0,rows-d-subs); - if(a>0) dm1.block(0,d+supers,rows,a).setZero(); - dm1.block(0,supers+1,cols-supers-1-a,cols-supers-1-a).template triangularView().setZero(); - dm1.block(subs+1,0,rows-subs-1-b,rows-subs-1-b).template triangularView().setZero(); - if(b>0) dm1.block(d+subs,0,b,cols).setZero(); - //std::cerr << m.m_data << "\n\n" << m.toDense() << "\n\n" << dm1 << "\n\n"; - VERIFY_IS_APPROX(dm1,m.toDenseMatrix()); - -} - -using Eigen::internal::BandMatrix; - -void test_bandmatrix() -{ - for(int i = 0; i < 10*g_repeat ; i++) { - Index rows = internal::random(1,10); - Index cols = internal::random(1,10); - Index sups = internal::random(0,cols-1); - Index subs = internal::random(0,rows-1); - CALL_SUBTEST(bandmatrix(BandMatrix(rows,cols,sups,subs)) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/basicstuff.cpp b/testbed/nanogui/ext/eigen/test/basicstuff.cpp deleted file mode 100644 index c346ce6c..00000000 --- a/testbed/nanogui/ext/eigen/test/basicstuff.cpp +++ /dev/null @@ -1,296 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT - -#include "main.h" - -template void basicStuff(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - typedef Matrix SquareMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - // this test relies a lot on Random.h, and there's not much more that we can do - // to test it, hence I consider that we will have tested Random.h - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - mzero = MatrixType::Zero(rows, cols), - square = Matrix::Random(rows, rows); - VectorType v1 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); - SquareMatrixType sm1 = SquareMatrixType::Random(rows,rows), sm2(rows,rows); - - Scalar x = 0; - while(x == Scalar(0)) x = internal::random(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - m1.coeffRef(r,c) = x; - VERIFY_IS_APPROX(x, m1.coeff(r,c)); - m1(r,c) = x; - VERIFY_IS_APPROX(x, m1(r,c)); - v1.coeffRef(r) = x; - VERIFY_IS_APPROX(x, v1.coeff(r)); - v1(r) = x; - VERIFY_IS_APPROX(x, v1(r)); - v1[r] = x; - VERIFY_IS_APPROX(x, v1[r]); - - // test fetching with various index types. - Index r1 = internal::random(0, numext::mini(Index(127),rows-1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); -#if EIGEN_HAS_CXX11 - x = v1(static_cast(r1)); - x = v1(static_cast(r1)); -#endif - - VERIFY_IS_APPROX( v1, v1); - VERIFY_IS_NOT_APPROX( v1, 2*v1); - VERIFY_IS_MUCH_SMALLER_THAN( vzero, v1); - VERIFY_IS_MUCH_SMALLER_THAN( vzero, v1.squaredNorm()); - VERIFY_IS_NOT_MUCH_SMALLER_THAN(v1, v1); - VERIFY_IS_APPROX( vzero, v1-v1); - VERIFY_IS_APPROX( m1, m1); - VERIFY_IS_NOT_APPROX( m1, 2*m1); - VERIFY_IS_MUCH_SMALLER_THAN( mzero, m1); - VERIFY_IS_NOT_MUCH_SMALLER_THAN(m1, m1); - VERIFY_IS_APPROX( mzero, m1-m1); - - // always test operator() on each read-only expression class, - // in order to check const-qualifiers. - // indeed, if an expression class (here Zero) is meant to be read-only, - // hence has no _write() method, the corresponding MatrixBase method (here zero()) - // should return a const-qualified object so that it is the const-qualified - // operator() that gets called, which in turn calls _read(). - VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows,cols)(r,c), static_cast(1)); - - // now test copying a row-vector into a (column-)vector and conversely. - square.col(r) = square.row(r).eval(); - Matrix rv(rows); - Matrix cv(rows); - rv = square.row(r); - cv = square.col(r); - - VERIFY_IS_APPROX(rv, cv.transpose()); - - if(cols!=1 && rows!=1 && MatrixType::SizeAtCompileTime!=Dynamic) - { - VERIFY_RAISES_ASSERT(m1 = (m2.block(0,0, rows-1, cols-1))); - } - - if(cols!=1 && rows!=1) - { - VERIFY_RAISES_ASSERT(m1[0]); - VERIFY_RAISES_ASSERT((m1+m1)[0]); - } - - VERIFY_IS_APPROX(m3 = m1,m1); - MatrixType m4; - VERIFY_IS_APPROX(m4 = m1,m1); - - m3.real() = m1.real(); - VERIFY_IS_APPROX(static_cast(m3).real(), static_cast(m1).real()); - VERIFY_IS_APPROX(static_cast(m3).real(), m1.real()); - - // check == / != operators - VERIFY(m1==m1); - VERIFY(m1!=m2); - VERIFY(!(m1==m2)); - VERIFY(!(m1!=m1)); - m1 = m2; - VERIFY(m1==m2); - VERIFY(!(m1!=m2)); - - // check automatic transposition - sm2.setZero(); - for(typename MatrixType::Index i=0;i(0,10)>5; - m3 = b ? m1 : m2; - if(b) VERIFY_IS_APPROX(m3,m1); - else VERIFY_IS_APPROX(m3,m2); - m3 = b ? -m1 : m2; - if(b) VERIFY_IS_APPROX(m3,-m1); - else VERIFY_IS_APPROX(m3,m2); - m3 = b ? m1 : -m2; - if(b) VERIFY_IS_APPROX(m3,m1); - else VERIFY_IS_APPROX(m3,-m2); - } -} - -template void basicStuffComplex(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix RealMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - Scalar s1 = internal::random(), - s2 = internal::random(); - - VERIFY(numext::real(s1)==numext::real_ref(s1)); - VERIFY(numext::imag(s1)==numext::imag_ref(s1)); - numext::real_ref(s1) = numext::real(s2); - numext::imag_ref(s1) = numext::imag(s2); - VERIFY(internal::isApprox(s1, s2, NumTraits::epsilon())); - // extended precision in Intel FPUs means that s1 == s2 in the line above is not guaranteed. - - RealMatrixType rm1 = RealMatrixType::Random(rows,cols), - rm2 = RealMatrixType::Random(rows,cols); - MatrixType cm(rows,cols); - cm.real() = rm1; - cm.imag() = rm2; - VERIFY_IS_APPROX(static_cast(cm).real(), rm1); - VERIFY_IS_APPROX(static_cast(cm).imag(), rm2); - rm1.setZero(); - rm2.setZero(); - rm1 = cm.real(); - rm2 = cm.imag(); - VERIFY_IS_APPROX(static_cast(cm).real(), rm1); - VERIFY_IS_APPROX(static_cast(cm).imag(), rm2); - cm.real().setZero(); - VERIFY(static_cast(cm).real().isZero()); - VERIFY(!static_cast(cm).imag().isZero()); -} - -#ifdef EIGEN_TEST_PART_2 -void casting() -{ - Matrix4f m = Matrix4f::Random(), m2; - Matrix4d n = m.cast(); - VERIFY(m.isApprox(n.cast())); - m2 = m.cast(); // check the specialization when NewType == Type - VERIFY(m.isApprox(m2)); -} -#endif - -template -void fixedSizeMatrixConstruction() -{ - Scalar raw[4]; - for(int k=0; k<4; ++k) - raw[k] = internal::random(); - - { - Matrix m(raw); - Array a(raw); - for(int k=0; k<4; ++k) VERIFY(m(k) == raw[k]); - for(int k=0; k<4; ++k) VERIFY(a(k) == raw[k]); - VERIFY_IS_EQUAL(m,(Matrix(raw[0],raw[1],raw[2],raw[3]))); - VERIFY((a==(Array(raw[0],raw[1],raw[2],raw[3]))).all()); - } - { - Matrix m(raw); - Array a(raw); - for(int k=0; k<3; ++k) VERIFY(m(k) == raw[k]); - for(int k=0; k<3; ++k) VERIFY(a(k) == raw[k]); - VERIFY_IS_EQUAL(m,(Matrix(raw[0],raw[1],raw[2]))); - VERIFY((a==Array(raw[0],raw[1],raw[2])).all()); - } - { - Matrix m(raw), m2( (DenseIndex(raw[0])), (DenseIndex(raw[1])) ); - Array a(raw), a2( (DenseIndex(raw[0])), (DenseIndex(raw[1])) ); - for(int k=0; k<2; ++k) VERIFY(m(k) == raw[k]); - for(int k=0; k<2; ++k) VERIFY(a(k) == raw[k]); - VERIFY_IS_EQUAL(m,(Matrix(raw[0],raw[1]))); - VERIFY((a==Array(raw[0],raw[1])).all()); - for(int k=0; k<2; ++k) VERIFY(m2(k) == DenseIndex(raw[k])); - for(int k=0; k<2; ++k) VERIFY(a2(k) == DenseIndex(raw[k])); - } - { - Matrix m(raw), - m2( (DenseIndex(raw[0])), (DenseIndex(raw[1])) ), - m3( (int(raw[0])), (int(raw[1])) ), - m4( (float(raw[0])), (float(raw[1])) ); - Array a(raw), a2( (DenseIndex(raw[0])), (DenseIndex(raw[1])) ); - for(int k=0; k<2; ++k) VERIFY(m(k) == raw[k]); - for(int k=0; k<2; ++k) VERIFY(a(k) == raw[k]); - VERIFY_IS_EQUAL(m,(Matrix(raw[0],raw[1]))); - VERIFY((a==Array(raw[0],raw[1])).all()); - for(int k=0; k<2; ++k) VERIFY(m2(k) == DenseIndex(raw[k])); - for(int k=0; k<2; ++k) VERIFY(a2(k) == DenseIndex(raw[k])); - for(int k=0; k<2; ++k) VERIFY(m3(k) == int(raw[k])); - for(int k=0; k<2; ++k) VERIFY((m4(k)) == Scalar(float(raw[k]))); - } - { - Matrix m(raw), m1(raw[0]), m2( (DenseIndex(raw[0])) ), m3( (int(raw[0])) ); - Array a(raw), a1(raw[0]), a2( (DenseIndex(raw[0])) ); - VERIFY(m(0) == raw[0]); - VERIFY(a(0) == raw[0]); - VERIFY(m1(0) == raw[0]); - VERIFY(a1(0) == raw[0]); - VERIFY(m2(0) == DenseIndex(raw[0])); - VERIFY(a2(0) == DenseIndex(raw[0])); - VERIFY(m3(0) == int(raw[0])); - VERIFY_IS_EQUAL(m,(Matrix(raw[0]))); - VERIFY((a==Array(raw[0])).all()); - } -} - -void test_basicstuff() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( basicStuff(Matrix()) ); - CALL_SUBTEST_2( basicStuff(Matrix4d()) ); - CALL_SUBTEST_3( basicStuff(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_4( basicStuff(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_5( basicStuff(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( basicStuff(Matrix()) ); - CALL_SUBTEST_7( basicStuff(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - - CALL_SUBTEST_3( basicStuffComplex(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_5( basicStuffComplex(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - - CALL_SUBTEST_1(fixedSizeMatrixConstruction()); - CALL_SUBTEST_1(fixedSizeMatrixConstruction()); - CALL_SUBTEST_1(fixedSizeMatrixConstruction()); - CALL_SUBTEST_1(fixedSizeMatrixConstruction()); - CALL_SUBTEST_1(fixedSizeMatrixConstruction()); - CALL_SUBTEST_1(fixedSizeMatrixConstruction()); - - CALL_SUBTEST_2(casting()); -} diff --git a/testbed/nanogui/ext/eigen/test/bdcsvd.cpp b/testbed/nanogui/ext/eigen/test/bdcsvd.cpp deleted file mode 100644 index f9f687aa..00000000 --- a/testbed/nanogui/ext/eigen/test/bdcsvd.cpp +++ /dev/null @@ -1,111 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2013 Gauthier Brun -// Copyright (C) 2013 Nicolas Carre -// Copyright (C) 2013 Jean Ceccato -// Copyright (C) 2013 Pierre Zoppitelli -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/ - -// discard stack allocation as that too bypasses malloc -#define EIGEN_STACK_ALLOCATION_LIMIT 0 -#define EIGEN_RUNTIME_NO_MALLOC - -#include "main.h" -#include -#include -#include - - -#define SVD_DEFAULT(M) BDCSVD -#define SVD_FOR_MIN_NORM(M) BDCSVD -#include "svd_common.h" - -// Check all variants of JacobiSVD -template -void bdcsvd(const MatrixType& a = MatrixType(), bool pickrandom = true) -{ - MatrixType m = a; - if(pickrandom) - svd_fill_random(m); - - CALL_SUBTEST(( svd_test_all_computation_options >(m, false) )); -} - -template -void bdcsvd_method() -{ - enum { Size = MatrixType::RowsAtCompileTime }; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix RealVecType; - MatrixType m = MatrixType::Identity(); - VERIFY_IS_APPROX(m.bdcSvd().singularValues(), RealVecType::Ones()); - VERIFY_RAISES_ASSERT(m.bdcSvd().matrixU()); - VERIFY_RAISES_ASSERT(m.bdcSvd().matrixV()); - VERIFY_IS_APPROX(m.bdcSvd(ComputeFullU|ComputeFullV).solve(m), m); -} - -// compare the Singular values returned with Jacobi and Bdc -template -void compare_bdc_jacobi(const MatrixType& a = MatrixType(), unsigned int computationOptions = 0) -{ - MatrixType m = MatrixType::Random(a.rows(), a.cols()); - BDCSVD bdc_svd(m); - JacobiSVD jacobi_svd(m); - VERIFY_IS_APPROX(bdc_svd.singularValues(), jacobi_svd.singularValues()); - if(computationOptions & ComputeFullU) VERIFY_IS_APPROX(bdc_svd.matrixU(), jacobi_svd.matrixU()); - if(computationOptions & ComputeThinU) VERIFY_IS_APPROX(bdc_svd.matrixU(), jacobi_svd.matrixU()); - if(computationOptions & ComputeFullV) VERIFY_IS_APPROX(bdc_svd.matrixV(), jacobi_svd.matrixV()); - if(computationOptions & ComputeThinV) VERIFY_IS_APPROX(bdc_svd.matrixV(), jacobi_svd.matrixV()); -} - -void test_bdcsvd() -{ - CALL_SUBTEST_3(( svd_verify_assert >(Matrix3f()) )); - CALL_SUBTEST_4(( svd_verify_assert >(Matrix4d()) )); - CALL_SUBTEST_7(( svd_verify_assert >(MatrixXf(10,12)) )); - CALL_SUBTEST_8(( svd_verify_assert >(MatrixXcd(7,5)) )); - - CALL_SUBTEST_101(( svd_all_trivial_2x2(bdcsvd) )); - CALL_SUBTEST_102(( svd_all_trivial_2x2(bdcsvd) )); - - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_3(( bdcsvd() )); - CALL_SUBTEST_4(( bdcsvd() )); - CALL_SUBTEST_5(( bdcsvd >() )); - - int r = internal::random(1, EIGEN_TEST_MAX_SIZE/2), - c = internal::random(1, EIGEN_TEST_MAX_SIZE/2); - - TEST_SET_BUT_UNUSED_VARIABLE(r) - TEST_SET_BUT_UNUSED_VARIABLE(c) - - CALL_SUBTEST_6(( bdcsvd(Matrix(r,2)) )); - CALL_SUBTEST_7(( bdcsvd(MatrixXf(r,c)) )); - CALL_SUBTEST_7(( compare_bdc_jacobi(MatrixXf(r,c)) )); - CALL_SUBTEST_10(( bdcsvd(MatrixXd(r,c)) )); - CALL_SUBTEST_10(( compare_bdc_jacobi(MatrixXd(r,c)) )); - CALL_SUBTEST_8(( bdcsvd(MatrixXcd(r,c)) )); - CALL_SUBTEST_8(( compare_bdc_jacobi(MatrixXcd(r,c)) )); - - // Test on inf/nan matrix - CALL_SUBTEST_7( (svd_inf_nan, MatrixXf>()) ); - CALL_SUBTEST_10( (svd_inf_nan, MatrixXd>()) ); - } - - // test matrixbase method - CALL_SUBTEST_1(( bdcsvd_method() )); - CALL_SUBTEST_3(( bdcsvd_method() )); - - // Test problem size constructors - CALL_SUBTEST_7( BDCSVD(10,10) ); - - // Check that preallocation avoids subsequent mallocs - CALL_SUBTEST_9( svd_preallocate() ); - - CALL_SUBTEST_2( svd_underoverflow() ); -} - diff --git a/testbed/nanogui/ext/eigen/test/bicgstab.cpp b/testbed/nanogui/ext/eigen/test/bicgstab.cpp deleted file mode 100644 index 4cc0dd31..00000000 --- a/testbed/nanogui/ext/eigen/test/bicgstab.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse_solver.h" -#include - -template void test_bicgstab_T() -{ - BiCGSTAB, DiagonalPreconditioner > bicgstab_colmajor_diag; - BiCGSTAB, IdentityPreconditioner > bicgstab_colmajor_I; - BiCGSTAB, IncompleteLUT > bicgstab_colmajor_ilut; - //BiCGSTAB, SSORPreconditioner > bicgstab_colmajor_ssor; - - bicgstab_colmajor_diag.setTolerance(NumTraits::epsilon()*4); - bicgstab_colmajor_ilut.setTolerance(NumTraits::epsilon()*4); - - CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_diag) ); -// CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_I) ); - CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_ilut) ); - //CALL_SUBTEST( check_sparse_square_solving(bicgstab_colmajor_ssor) ); -} - -void test_bicgstab() -{ - CALL_SUBTEST_1((test_bicgstab_T()) ); - CALL_SUBTEST_2((test_bicgstab_T, int>())); - CALL_SUBTEST_3((test_bicgstab_T())); -} diff --git a/testbed/nanogui/ext/eigen/test/block.cpp b/testbed/nanogui/ext/eigen/test/block.cpp deleted file mode 100644 index d6105987..00000000 --- a/testbed/nanogui/ext/eigen/test/block.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT // otherwise we fail at compile time on unused paths -#include "main.h" - -template -typename Eigen::internal::enable_if::IsComplex,typename MatrixType::Scalar>::type -block_real_only(const MatrixType &m1, Index r1, Index r2, Index c1, Index c2, const Scalar& s1) { - // check cwise-Functions: - VERIFY_IS_APPROX(m1.row(r1).cwiseMax(s1), m1.cwiseMax(s1).row(r1)); - VERIFY_IS_APPROX(m1.col(c1).cwiseMin(s1), m1.cwiseMin(s1).col(c1)); - - VERIFY_IS_APPROX(m1.block(r1,c1,r2-r1+1,c2-c1+1).cwiseMin(s1), m1.cwiseMin(s1).block(r1,c1,r2-r1+1,c2-c1+1)); - VERIFY_IS_APPROX(m1.block(r1,c1,r2-r1+1,c2-c1+1).cwiseMax(s1), m1.cwiseMax(s1).block(r1,c1,r2-r1+1,c2-c1+1)); - - return Scalar(0); -} - -template -typename Eigen::internal::enable_if::IsComplex,typename MatrixType::Scalar>::type -block_real_only(const MatrixType &, Index, Index, Index, Index, const Scalar&) { - return Scalar(0); -} - -// Check at compile-time that T1==T2, and at runtime-time that a==b -template -typename internal::enable_if::value,bool>::type -is_same_block(const T1& a, const T2& b) -{ - return a.isApprox(b); -} - -template void block(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix VectorType; - typedef Matrix RowVectorType; - typedef Matrix DynamicMatrixType; - typedef Matrix DynamicVectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m1_copy = m1, - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - ones = MatrixType::Ones(rows, cols); - VectorType v1 = VectorType::Random(rows); - - Scalar s1 = internal::random(); - - Index r1 = internal::random(0,rows-1); - Index r2 = internal::random(r1,rows-1); - Index c1 = internal::random(0,cols-1); - Index c2 = internal::random(c1,cols-1); - - block_real_only(m1, r1, r2, c1, c1, s1); - - //check row() and col() - VERIFY_IS_EQUAL(m1.col(c1).transpose(), m1.transpose().row(c1)); - //check operator(), both constant and non-constant, on row() and col() - m1 = m1_copy; - m1.row(r1) += s1 * m1_copy.row(r2); - VERIFY_IS_APPROX(m1.row(r1), m1_copy.row(r1) + s1 * m1_copy.row(r2)); - // check nested block xpr on lhs - m1.row(r1).row(0) += s1 * m1_copy.row(r2); - VERIFY_IS_APPROX(m1.row(r1), m1_copy.row(r1) + Scalar(2) * s1 * m1_copy.row(r2)); - m1 = m1_copy; - m1.col(c1) += s1 * m1_copy.col(c2); - VERIFY_IS_APPROX(m1.col(c1), m1_copy.col(c1) + s1 * m1_copy.col(c2)); - m1.col(c1).col(0) += s1 * m1_copy.col(c2); - VERIFY_IS_APPROX(m1.col(c1), m1_copy.col(c1) + Scalar(2) * s1 * m1_copy.col(c2)); - - - //check block() - Matrix b1(1,1); b1(0,0) = m1(r1,c1); - - RowVectorType br1(m1.block(r1,0,1,cols)); - VectorType bc1(m1.block(0,c1,rows,1)); - VERIFY_IS_EQUAL(b1, m1.block(r1,c1,1,1)); - VERIFY_IS_EQUAL(m1.row(r1), br1); - VERIFY_IS_EQUAL(m1.col(c1), bc1); - //check operator(), both constant and non-constant, on block() - m1.block(r1,c1,r2-r1+1,c2-c1+1) = s1 * m2.block(0, 0, r2-r1+1,c2-c1+1); - m1.block(r1,c1,r2-r1+1,c2-c1+1)(r2-r1,c2-c1) = m2.block(0, 0, r2-r1+1,c2-c1+1)(0,0); - - const Index BlockRows = 2; - const Index BlockCols = 5; - - if (rows>=5 && cols>=8) - { - // test fixed block() as lvalue - m1.template block(1,1) *= s1; - // test operator() on fixed block() both as constant and non-constant - m1.template block(1,1)(0, 3) = m1.template block<2,5>(1,1)(1,2); - // check that fixed block() and block() agree - Matrix b = m1.template block(3,3); - VERIFY_IS_EQUAL(b, m1.block(3,3,BlockRows,BlockCols)); - - // same tests with mixed fixed/dynamic size - m1.template block(1,1,BlockRows,BlockCols) *= s1; - m1.template block(1,1,BlockRows,BlockCols)(0,3) = m1.template block<2,5>(1,1)(1,2); - Matrix b2 = m1.template block(3,3,2,5); - VERIFY_IS_EQUAL(b2, m1.block(3,3,BlockRows,BlockCols)); - - VERIFY(is_same_block(m1.block(3,3,BlockRows,BlockCols), m1.block(3,3,fix(BlockRows),fix(BlockCols)))); - VERIFY(is_same_block(m1.template block(1,1,BlockRows,BlockCols), m1.block(1,1,fix,BlockCols))); - VERIFY(is_same_block(m1.template block(1,1,BlockRows,BlockCols), m1.block(1,1,fix(),fix))); - VERIFY(is_same_block(m1.template block(1,1,BlockRows,BlockCols), m1.block(1,1,fix,fix(BlockCols)))); - } - - if (rows>2) - { - // test sub vectors - VERIFY_IS_EQUAL(v1.template head<2>(), v1.block(0,0,2,1)); - VERIFY_IS_EQUAL(v1.template head<2>(), v1.head(2)); - VERIFY_IS_EQUAL(v1.template head<2>(), v1.segment(0,2)); - VERIFY_IS_EQUAL(v1.template head<2>(), v1.template segment<2>(0)); - Index i = rows-2; - VERIFY_IS_EQUAL(v1.template tail<2>(), v1.block(i,0,2,1)); - VERIFY_IS_EQUAL(v1.template tail<2>(), v1.tail(2)); - VERIFY_IS_EQUAL(v1.template tail<2>(), v1.segment(i,2)); - VERIFY_IS_EQUAL(v1.template tail<2>(), v1.template segment<2>(i)); - i = internal::random(0,rows-2); - VERIFY_IS_EQUAL(v1.segment(i,2), v1.template segment<2>(i)); - } - - // stress some basic stuffs with block matrices - VERIFY(numext::real(ones.col(c1).sum()) == RealScalar(rows)); - VERIFY(numext::real(ones.row(r1).sum()) == RealScalar(cols)); - - VERIFY(numext::real(ones.col(c1).dot(ones.col(c2))) == RealScalar(rows)); - VERIFY(numext::real(ones.row(r1).dot(ones.row(r2))) == RealScalar(cols)); - - // chekc that linear acccessors works on blocks - m1 = m1_copy; - if((MatrixType::Flags&RowMajorBit)==0) - VERIFY_IS_EQUAL(m1.leftCols(c1).coeff(r1+c1*rows), m1(r1,c1)); - else - VERIFY_IS_EQUAL(m1.topRows(r1).coeff(c1+r1*cols), m1(r1,c1)); - - - // now test some block-inside-of-block. - - // expressions with direct access - VERIFY_IS_EQUAL( (m1.block(r1,c1,rows-r1,cols-c1).block(r2-r1,c2-c1,rows-r2,cols-c2)) , (m1.block(r2,c2,rows-r2,cols-c2)) ); - VERIFY_IS_EQUAL( (m1.block(r1,c1,r2-r1+1,c2-c1+1).row(0)) , (m1.row(r1).segment(c1,c2-c1+1)) ); - VERIFY_IS_EQUAL( (m1.block(r1,c1,r2-r1+1,c2-c1+1).col(0)) , (m1.col(c1).segment(r1,r2-r1+1)) ); - VERIFY_IS_EQUAL( (m1.block(r1,c1,r2-r1+1,c2-c1+1).transpose().col(0)) , (m1.row(r1).segment(c1,c2-c1+1)).transpose() ); - VERIFY_IS_EQUAL( (m1.transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0)) , (m1.row(r1).segment(c1,c2-c1+1)).transpose() ); - - // expressions without direct access - VERIFY_IS_APPROX( ((m1+m2).block(r1,c1,rows-r1,cols-c1).block(r2-r1,c2-c1,rows-r2,cols-c2)) , ((m1+m2).block(r2,c2,rows-r2,cols-c2)) ); - VERIFY_IS_APPROX( ((m1+m2).block(r1,c1,r2-r1+1,c2-c1+1).row(0)) , ((m1+m2).row(r1).segment(c1,c2-c1+1)) ); - VERIFY_IS_APPROX( ((m1+m2).block(r1,c1,r2-r1+1,c2-c1+1).col(0)) , ((m1+m2).col(c1).segment(r1,r2-r1+1)) ); - VERIFY_IS_APPROX( ((m1+m2).block(r1,c1,r2-r1+1,c2-c1+1).transpose().col(0)) , ((m1+m2).row(r1).segment(c1,c2-c1+1)).transpose() ); - VERIFY_IS_APPROX( ((m1+m2).transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0)) , ((m1+m2).row(r1).segment(c1,c2-c1+1)).transpose() ); - - // evaluation into plain matrices from expressions with direct access (stress MapBase) - DynamicMatrixType dm; - DynamicVectorType dv; - dm.setZero(); - dm = m1.block(r1,c1,rows-r1,cols-c1).block(r2-r1,c2-c1,rows-r2,cols-c2); - VERIFY_IS_EQUAL(dm, (m1.block(r2,c2,rows-r2,cols-c2))); - dm.setZero(); - dv.setZero(); - dm = m1.block(r1,c1,r2-r1+1,c2-c1+1).row(0).transpose(); - dv = m1.row(r1).segment(c1,c2-c1+1); - VERIFY_IS_EQUAL(dv, dm); - dm.setZero(); - dv.setZero(); - dm = m1.col(c1).segment(r1,r2-r1+1); - dv = m1.block(r1,c1,r2-r1+1,c2-c1+1).col(0); - VERIFY_IS_EQUAL(dv, dm); - dm.setZero(); - dv.setZero(); - dm = m1.block(r1,c1,r2-r1+1,c2-c1+1).transpose().col(0); - dv = m1.row(r1).segment(c1,c2-c1+1); - VERIFY_IS_EQUAL(dv, dm); - dm.setZero(); - dv.setZero(); - dm = m1.row(r1).segment(c1,c2-c1+1).transpose(); - dv = m1.transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0); - VERIFY_IS_EQUAL(dv, dm); - - VERIFY_IS_EQUAL( (m1.template block(1,0,0,1)), m1.block(1,0,0,1)); - VERIFY_IS_EQUAL( (m1.template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); - VERIFY_IS_EQUAL( ((m1*1).template block(1,0,0,1)), m1.block(1,0,0,1)); - VERIFY_IS_EQUAL( ((m1*1).template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); - - if (rows>=2 && cols>=2) - { - VERIFY_RAISES_ASSERT( m1 += m1.col(0) ); - VERIFY_RAISES_ASSERT( m1 -= m1.col(0) ); - VERIFY_RAISES_ASSERT( m1.array() *= m1.col(0).array() ); - VERIFY_RAISES_ASSERT( m1.array() /= m1.col(0).array() ); - } -} - - -template -void compare_using_data_and_stride(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - Index size = m.size(); - Index innerStride = m.innerStride(); - Index outerStride = m.outerStride(); - Index rowStride = m.rowStride(); - Index colStride = m.colStride(); - const typename MatrixType::Scalar* data = m.data(); - - for(int j=0;j -void data_and_stride(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - Index r1 = internal::random(0,rows-1); - Index r2 = internal::random(r1,rows-1); - Index c1 = internal::random(0,cols-1); - Index c2 = internal::random(c1,cols-1); - - MatrixType m1 = MatrixType::Random(rows, cols); - compare_using_data_and_stride(m1.block(r1, c1, r2-r1+1, c2-c1+1)); - compare_using_data_and_stride(m1.transpose().block(c1, r1, c2-c1+1, r2-r1+1)); - compare_using_data_and_stride(m1.row(r1)); - compare_using_data_and_stride(m1.col(c1)); - compare_using_data_and_stride(m1.row(r1).transpose()); - compare_using_data_and_stride(m1.col(c1).transpose()); -} - -void test_block() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( block(Matrix()) ); - CALL_SUBTEST_2( block(Matrix4d()) ); - CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); - CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); - CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); - CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); - - CALL_SUBTEST_8( block(Matrix(3, 4)) ); - -#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR - CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); - CALL_SUBTEST_7( data_and_stride(Matrix(internal::random(5,50), internal::random(5,50))) ); -#endif - } -} diff --git a/testbed/nanogui/ext/eigen/test/boostmultiprec.cpp b/testbed/nanogui/ext/eigen/test/boostmultiprec.cpp deleted file mode 100644 index e06e9bda..00000000 --- a/testbed/nanogui/ext/eigen/test/boostmultiprec.cpp +++ /dev/null @@ -1,201 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include - -#ifdef EIGEN_TEST_MAX_SIZE -#undef EIGEN_TEST_MAX_SIZE -#endif - -#define EIGEN_TEST_MAX_SIZE 50 - -#ifdef EIGEN_TEST_PART_1 -#include "cholesky.cpp" -#endif - -#ifdef EIGEN_TEST_PART_2 -#include "lu.cpp" -#endif - -#ifdef EIGEN_TEST_PART_3 -#include "qr.cpp" -#endif - -#ifdef EIGEN_TEST_PART_4 -#include "qr_colpivoting.cpp" -#endif - -#ifdef EIGEN_TEST_PART_5 -#include "qr_fullpivoting.cpp" -#endif - -#ifdef EIGEN_TEST_PART_6 -#include "eigensolver_selfadjoint.cpp" -#endif - -#ifdef EIGEN_TEST_PART_7 -#include "eigensolver_generic.cpp" -#endif - -#ifdef EIGEN_TEST_PART_8 -#include "eigensolver_generalized_real.cpp" -#endif - -#ifdef EIGEN_TEST_PART_9 -#include "jacobisvd.cpp" -#endif - -#ifdef EIGEN_TEST_PART_10 -#include "bdcsvd.cpp" -#endif - -#include - -#undef min -#undef max -#undef isnan -#undef isinf -#undef isfinite - -#include -#include -#include -#include - -namespace mp = boost::multiprecision; -typedef mp::number, mp::et_on> Real; - -namespace Eigen { - template<> struct NumTraits : GenericNumTraits { - static inline Real dummy_precision() { return 1e-50; } - }; - - template - struct NumTraits > : NumTraits {}; - - template<> - Real test_precision() { return 1e-50; } - - // needed in C++93 mode where number does not support explicit cast. - namespace internal { - template - struct cast_impl { - static inline NewType run(const Real& x) { - return x.template convert_to(); - } - }; - - template<> - struct cast_impl > { - static inline std::complex run(const Real& x) { - return std::complex(x); - } - }; - } -} - -namespace boost { -namespace multiprecision { - // to make ADL works as expected: - using boost::math::isfinite; - using boost::math::isnan; - using boost::math::isinf; - using boost::math::copysign; - using boost::math::hypot; - - // The following is needed for std::complex: - Real fabs(const Real& a) { return abs EIGEN_NOT_A_MACRO (a); } - Real fmax(const Real& a, const Real& b) { using std::max; return max(a,b); } - - // some specialization for the unit tests: - inline bool test_isMuchSmallerThan(const Real& a, const Real& b) { - return internal::isMuchSmallerThan(a, b, test_precision()); - } - - inline bool test_isApprox(const Real& a, const Real& b) { - return internal::isApprox(a, b, test_precision()); - } - - inline bool test_isApproxOrLessThan(const Real& a, const Real& b) { - return internal::isApproxOrLessThan(a, b, test_precision()); - } - - Real get_test_precision(const Real&) { - return test_precision(); - } - - Real test_relative_error(const Real &a, const Real &b) { - using Eigen::numext::abs2; - return sqrt(abs2(a-b)/Eigen::numext::mini(abs2(a),abs2(b))); - } -} -} - -namespace Eigen { - -} - -void test_boostmultiprec() -{ - typedef Matrix Mat; - typedef Matrix,Dynamic,Dynamic> MatC; - - std::cout << "NumTraits::epsilon() = " << NumTraits::epsilon() << std::endl; - std::cout << "NumTraits::dummy_precision() = " << NumTraits::dummy_precision() << std::endl; - std::cout << "NumTraits::lowest() = " << NumTraits::lowest() << std::endl; - std::cout << "NumTraits::highest() = " << NumTraits::highest() << std::endl; - std::cout << "NumTraits::digits10() = " << NumTraits::digits10() << std::endl; - - // chekc stream output - { - Mat A(10,10); - A.setRandom(); - std::stringstream ss; - ss << A; - } - { - MatC A(10,10); - A.setRandom(); - std::stringstream ss; - ss << A; - } - - for(int i = 0; i < g_repeat; i++) { - int s = internal::random(1,EIGEN_TEST_MAX_SIZE); - - CALL_SUBTEST_1( cholesky(Mat(s,s)) ); - - CALL_SUBTEST_2( lu_non_invertible() ); - CALL_SUBTEST_2( lu_invertible() ); - CALL_SUBTEST_2( lu_non_invertible() ); - CALL_SUBTEST_2( lu_invertible() ); - - CALL_SUBTEST_3( qr(Mat(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_3( qr_invertible() ); - - CALL_SUBTEST_4( qr() ); - CALL_SUBTEST_4( cod() ); - CALL_SUBTEST_4( qr_invertible() ); - - CALL_SUBTEST_5( qr() ); - CALL_SUBTEST_5( qr_invertible() ); - - CALL_SUBTEST_6( selfadjointeigensolver(Mat(s,s)) ); - - CALL_SUBTEST_7( eigensolver(Mat(s,s)) ); - - CALL_SUBTEST_8( generalized_eigensolver_real(Mat(s,s)) ); - - TEST_SET_BUT_UNUSED_VARIABLE(s) - } - - CALL_SUBTEST_9(( jacobisvd(Mat(internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE), internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) )); - CALL_SUBTEST_10(( bdcsvd(Mat(internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE), internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) )); -} - diff --git a/testbed/nanogui/ext/eigen/test/bug1213.cpp b/testbed/nanogui/ext/eigen/test/bug1213.cpp deleted file mode 100644 index 581760c1..00000000 --- a/testbed/nanogui/ext/eigen/test/bug1213.cpp +++ /dev/null @@ -1,13 +0,0 @@ - -// This anonymous enum is essential to trigger the linking issue -enum { - Foo -}; - -#include "bug1213.h" - -bool bug1213_1(const Eigen::Vector3f& x) -{ - return bug1213_2(x); -} - diff --git a/testbed/nanogui/ext/eigen/test/bug1213.h b/testbed/nanogui/ext/eigen/test/bug1213.h deleted file mode 100644 index 040e5a47..00000000 --- a/testbed/nanogui/ext/eigen/test/bug1213.h +++ /dev/null @@ -1,8 +0,0 @@ - -#include - -template -bool bug1213_2(const Eigen::Matrix& x); - -bool bug1213_1(const Eigen::Vector3f& x); - diff --git a/testbed/nanogui/ext/eigen/test/bug1213_main.cpp b/testbed/nanogui/ext/eigen/test/bug1213_main.cpp deleted file mode 100644 index 4802c000..00000000 --- a/testbed/nanogui/ext/eigen/test/bug1213_main.cpp +++ /dev/null @@ -1,18 +0,0 @@ - -// This is a regression unit regarding a weird linking issue with gcc. - -#include "bug1213.h" - -int main() -{ - return 0; -} - - -template -bool bug1213_2(const Eigen::Matrix& ) -{ - return true; -} - -template bool bug1213_2(const Eigen::Vector3f&); diff --git a/testbed/nanogui/ext/eigen/test/cholesky.cpp b/testbed/nanogui/ext/eigen/test/cholesky.cpp deleted file mode 100644 index 8ad5ac63..00000000 --- a/testbed/nanogui/ext/eigen/test/cholesky.cpp +++ /dev/null @@ -1,509 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NO_ASSERTION_CHECKING -#define EIGEN_NO_ASSERTION_CHECKING -#endif - -#define TEST_ENABLE_TEMPORARY_TRACKING - -#include "main.h" -#include -#include - -template -typename MatrixType::RealScalar matrix_l1_norm(const MatrixType& m) { - MatrixType symm = m.template selfadjointView(); - return symm.cwiseAbs().colwise().sum().maxCoeff(); -} - -template class CholType> void test_chol_update(const MatrixType& symm) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix VectorType; - - MatrixType symmLo = symm.template triangularView(); - MatrixType symmUp = symm.template triangularView(); - MatrixType symmCpy = symm; - - CholType chollo(symmLo); - CholType cholup(symmUp); - - for (int k=0; k<10; ++k) - { - VectorType vec = VectorType::Random(symm.rows()); - RealScalar sigma = internal::random(); - symmCpy += sigma * vec * vec.adjoint(); - - // we are doing some downdates, so it might be the case that the matrix is not SPD anymore - CholType chol(symmCpy); - if(chol.info()!=Success) - break; - - chollo.rankUpdate(vec, sigma); - VERIFY_IS_APPROX(symmCpy, chollo.reconstructedMatrix()); - - cholup.rankUpdate(vec, sigma); - VERIFY_IS_APPROX(symmCpy, cholup.reconstructedMatrix()); - } -} - -template void cholesky(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - /* this test covers the following files: - LLT.h LDLT.h - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix SquareMatrixType; - typedef Matrix VectorType; - - MatrixType a0 = MatrixType::Random(rows,cols); - VectorType vecB = VectorType::Random(rows), vecX(rows); - MatrixType matB = MatrixType::Random(rows,cols), matX(rows,cols); - SquareMatrixType symm = a0 * a0.adjoint(); - // let's make sure the matrix is not singular or near singular - for (int k=0; k<3; ++k) - { - MatrixType a1 = MatrixType::Random(rows,cols); - symm += a1 * a1.adjoint(); - } - - { - SquareMatrixType symmUp = symm.template triangularView(); - SquareMatrixType symmLo = symm.template triangularView(); - - LLT chollo(symmLo); - VERIFY_IS_APPROX(symm, chollo.reconstructedMatrix()); - vecX = chollo.solve(vecB); - VERIFY_IS_APPROX(symm * vecX, vecB); - matX = chollo.solve(matB); - VERIFY_IS_APPROX(symm * matX, matB); - - const MatrixType symmLo_inverse = chollo.solve(MatrixType::Identity(rows,cols)); - RealScalar rcond = (RealScalar(1) / matrix_l1_norm(symmLo)) / - matrix_l1_norm(symmLo_inverse); - RealScalar rcond_est = chollo.rcond(); - // Verify that the estimated condition number is within a factor of 10 of the - // truth. - VERIFY(rcond_est > rcond / 10 && rcond_est < rcond * 10); - - // test the upper mode - LLT cholup(symmUp); - VERIFY_IS_APPROX(symm, cholup.reconstructedMatrix()); - vecX = cholup.solve(vecB); - VERIFY_IS_APPROX(symm * vecX, vecB); - matX = cholup.solve(matB); - VERIFY_IS_APPROX(symm * matX, matB); - - // Verify that the estimated condition number is within a factor of 10 of the - // truth. - const MatrixType symmUp_inverse = cholup.solve(MatrixType::Identity(rows,cols)); - rcond = (RealScalar(1) / matrix_l1_norm(symmUp)) / - matrix_l1_norm(symmUp_inverse); - rcond_est = cholup.rcond(); - VERIFY(rcond_est > rcond / 10 && rcond_est < rcond * 10); - - - MatrixType neg = -symmLo; - chollo.compute(neg); - VERIFY(chollo.info()==NumericalIssue); - - VERIFY_IS_APPROX(MatrixType(chollo.matrixL().transpose().conjugate()), MatrixType(chollo.matrixU())); - VERIFY_IS_APPROX(MatrixType(chollo.matrixU().transpose().conjugate()), MatrixType(chollo.matrixL())); - VERIFY_IS_APPROX(MatrixType(cholup.matrixL().transpose().conjugate()), MatrixType(cholup.matrixU())); - VERIFY_IS_APPROX(MatrixType(cholup.matrixU().transpose().conjugate()), MatrixType(cholup.matrixL())); - - // test some special use cases of SelfCwiseBinaryOp: - MatrixType m1 = MatrixType::Random(rows,cols), m2(rows,cols); - m2 = m1; - m2 += symmLo.template selfadjointView().llt().solve(matB); - VERIFY_IS_APPROX(m2, m1 + symmLo.template selfadjointView().llt().solve(matB)); - m2 = m1; - m2 -= symmLo.template selfadjointView().llt().solve(matB); - VERIFY_IS_APPROX(m2, m1 - symmLo.template selfadjointView().llt().solve(matB)); - m2 = m1; - m2.noalias() += symmLo.template selfadjointView().llt().solve(matB); - VERIFY_IS_APPROX(m2, m1 + symmLo.template selfadjointView().llt().solve(matB)); - m2 = m1; - m2.noalias() -= symmLo.template selfadjointView().llt().solve(matB); - VERIFY_IS_APPROX(m2, m1 - symmLo.template selfadjointView().llt().solve(matB)); - } - - // LDLT - { - int sign = internal::random()%2 ? 1 : -1; - - if(sign == -1) - { - symm = -symm; // test a negative matrix - } - - SquareMatrixType symmUp = symm.template triangularView(); - SquareMatrixType symmLo = symm.template triangularView(); - - LDLT ldltlo(symmLo); - VERIFY(ldltlo.info()==Success); - VERIFY_IS_APPROX(symm, ldltlo.reconstructedMatrix()); - vecX = ldltlo.solve(vecB); - VERIFY_IS_APPROX(symm * vecX, vecB); - matX = ldltlo.solve(matB); - VERIFY_IS_APPROX(symm * matX, matB); - - const MatrixType symmLo_inverse = ldltlo.solve(MatrixType::Identity(rows,cols)); - RealScalar rcond = (RealScalar(1) / matrix_l1_norm(symmLo)) / - matrix_l1_norm(symmLo_inverse); - RealScalar rcond_est = ldltlo.rcond(); - // Verify that the estimated condition number is within a factor of 10 of the - // truth. - VERIFY(rcond_est > rcond / 10 && rcond_est < rcond * 10); - - - LDLT ldltup(symmUp); - VERIFY(ldltup.info()==Success); - VERIFY_IS_APPROX(symm, ldltup.reconstructedMatrix()); - vecX = ldltup.solve(vecB); - VERIFY_IS_APPROX(symm * vecX, vecB); - matX = ldltup.solve(matB); - VERIFY_IS_APPROX(symm * matX, matB); - - // Verify that the estimated condition number is within a factor of 10 of the - // truth. - const MatrixType symmUp_inverse = ldltup.solve(MatrixType::Identity(rows,cols)); - rcond = (RealScalar(1) / matrix_l1_norm(symmUp)) / - matrix_l1_norm(symmUp_inverse); - rcond_est = ldltup.rcond(); - VERIFY(rcond_est > rcond / 10 && rcond_est < rcond * 10); - - VERIFY_IS_APPROX(MatrixType(ldltlo.matrixL().transpose().conjugate()), MatrixType(ldltlo.matrixU())); - VERIFY_IS_APPROX(MatrixType(ldltlo.matrixU().transpose().conjugate()), MatrixType(ldltlo.matrixL())); - VERIFY_IS_APPROX(MatrixType(ldltup.matrixL().transpose().conjugate()), MatrixType(ldltup.matrixU())); - VERIFY_IS_APPROX(MatrixType(ldltup.matrixU().transpose().conjugate()), MatrixType(ldltup.matrixL())); - - if(MatrixType::RowsAtCompileTime==Dynamic) - { - // note : each inplace permutation requires a small temporary vector (mask) - - // check inplace solve - matX = matB; - VERIFY_EVALUATION_COUNT(matX = ldltlo.solve(matX), 0); - VERIFY_IS_APPROX(matX, ldltlo.solve(matB).eval()); - - - matX = matB; - VERIFY_EVALUATION_COUNT(matX = ldltup.solve(matX), 0); - VERIFY_IS_APPROX(matX, ldltup.solve(matB).eval()); - } - - // restore - if(sign == -1) - symm = -symm; - - // check matrices coming from linear constraints with Lagrange multipliers - if(rows>=3) - { - SquareMatrixType A = symm; - Index c = internal::random(0,rows-2); - A.bottomRightCorner(c,c).setZero(); - // Make sure a solution exists: - vecX.setRandom(); - vecB = A * vecX; - vecX.setZero(); - ldltlo.compute(A); - VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix()); - vecX = ldltlo.solve(vecB); - VERIFY_IS_APPROX(A * vecX, vecB); - } - - // check non-full rank matrices - if(rows>=3) - { - Index r = internal::random(1,rows-1); - Matrix a = Matrix::Random(rows,r); - SquareMatrixType A = a * a.adjoint(); - // Make sure a solution exists: - vecX.setRandom(); - vecB = A * vecX; - vecX.setZero(); - ldltlo.compute(A); - VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix()); - vecX = ldltlo.solve(vecB); - VERIFY_IS_APPROX(A * vecX, vecB); - } - - // check matrices with a wide spectrum - if(rows>=3) - { - using std::pow; - using std::sqrt; - RealScalar s = (std::min)(16,std::numeric_limits::max_exponent10/8); - Matrix a = Matrix::Random(rows,rows); - Matrix d = Matrix::Random(rows); - for(Index k=0; k(-s,s)); - SquareMatrixType A = a * d.asDiagonal() * a.adjoint(); - // Make sure a solution exists: - vecX.setRandom(); - vecB = A * vecX; - vecX.setZero(); - ldltlo.compute(A); - VERIFY_IS_APPROX(A, ldltlo.reconstructedMatrix()); - vecX = ldltlo.solve(vecB); - - if(ldltlo.vectorD().real().cwiseAbs().minCoeff()>RealScalar(0)) - { - VERIFY_IS_APPROX(A * vecX,vecB); - } - else - { - RealScalar large_tol = sqrt(test_precision()); - VERIFY((A * vecX).isApprox(vecB, large_tol)); - - ++g_test_level; - VERIFY_IS_APPROX(A * vecX,vecB); - --g_test_level; - } - } - } - - // update/downdate - CALL_SUBTEST(( test_chol_update(symm) )); - CALL_SUBTEST(( test_chol_update(symm) )); -} - -template void cholesky_cplx(const MatrixType& m) -{ - // classic test - cholesky(m); - - // test mixing real/scalar types - - typedef typename MatrixType::Index Index; - - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix RealMatrixType; - typedef Matrix VectorType; - - RealMatrixType a0 = RealMatrixType::Random(rows,cols); - VectorType vecB = VectorType::Random(rows), vecX(rows); - MatrixType matB = MatrixType::Random(rows,cols), matX(rows,cols); - RealMatrixType symm = a0 * a0.adjoint(); - // let's make sure the matrix is not singular or near singular - for (int k=0; k<3; ++k) - { - RealMatrixType a1 = RealMatrixType::Random(rows,cols); - symm += a1 * a1.adjoint(); - } - - { - RealMatrixType symmLo = symm.template triangularView(); - - LLT chollo(symmLo); - VERIFY_IS_APPROX(symm, chollo.reconstructedMatrix()); - vecX = chollo.solve(vecB); - VERIFY_IS_APPROX(symm * vecX, vecB); -// matX = chollo.solve(matB); -// VERIFY_IS_APPROX(symm * matX, matB); - } - - // LDLT - { - int sign = internal::random()%2 ? 1 : -1; - - if(sign == -1) - { - symm = -symm; // test a negative matrix - } - - RealMatrixType symmLo = symm.template triangularView(); - - LDLT ldltlo(symmLo); - VERIFY(ldltlo.info()==Success); - VERIFY_IS_APPROX(symm, ldltlo.reconstructedMatrix()); - vecX = ldltlo.solve(vecB); - VERIFY_IS_APPROX(symm * vecX, vecB); -// matX = ldltlo.solve(matB); -// VERIFY_IS_APPROX(symm * matX, matB); - } -} - -// regression test for bug 241 -template void cholesky_bug241(const MatrixType& m) -{ - eigen_assert(m.rows() == 2 && m.cols() == 2); - - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - - MatrixType matA; - matA << 1, 1, 1, 1; - VectorType vecB; - vecB << 1, 1; - VectorType vecX = matA.ldlt().solve(vecB); - VERIFY_IS_APPROX(matA * vecX, vecB); -} - -// LDLT is not guaranteed to work for indefinite matrices, but happens to work fine if matrix is diagonal. -// This test checks that LDLT reports correctly that matrix is indefinite. -// See http://forum.kde.org/viewtopic.php?f=74&t=106942 and bug 736 -template void cholesky_definiteness(const MatrixType& m) -{ - eigen_assert(m.rows() == 2 && m.cols() == 2); - MatrixType mat; - LDLT ldlt(2); - - { - mat << 1, 0, 0, -1; - ldlt.compute(mat); - VERIFY(ldlt.info()==Success); - VERIFY(!ldlt.isNegative()); - VERIFY(!ldlt.isPositive()); - } - { - mat << 1, 2, 2, 1; - ldlt.compute(mat); - VERIFY(ldlt.info()==Success); - VERIFY(!ldlt.isNegative()); - VERIFY(!ldlt.isPositive()); - } - { - mat << 0, 0, 0, 0; - ldlt.compute(mat); - VERIFY(ldlt.info()==Success); - VERIFY(ldlt.isNegative()); - VERIFY(ldlt.isPositive()); - } - { - mat << 0, 0, 0, 1; - ldlt.compute(mat); - VERIFY(ldlt.info()==Success); - VERIFY(!ldlt.isNegative()); - VERIFY(ldlt.isPositive()); - } - { - mat << -1, 0, 0, 0; - ldlt.compute(mat); - VERIFY(ldlt.info()==Success); - VERIFY(ldlt.isNegative()); - VERIFY(!ldlt.isPositive()); - } -} - -template -void cholesky_faillure_cases() -{ - MatrixXd mat; - LDLT ldlt; - - { - mat.resize(2,2); - mat << 0, 1, 1, 0; - ldlt.compute(mat); - VERIFY_IS_NOT_APPROX(mat,ldlt.reconstructedMatrix()); - VERIFY(ldlt.info()==NumericalIssue); - } -#if (!EIGEN_ARCH_i386) || defined(EIGEN_VECTORIZE_SSE2) - { - mat.resize(3,3); - mat << -1, -3, 3, - -3, -8.9999999999999999999, 1, - 3, 1, 0; - ldlt.compute(mat); - VERIFY(ldlt.info()==NumericalIssue); - VERIFY_IS_NOT_APPROX(mat,ldlt.reconstructedMatrix()); - } -#endif - { - mat.resize(3,3); - mat << 1, 2, 3, - 2, 4, 1, - 3, 1, 0; - ldlt.compute(mat); - VERIFY(ldlt.info()==NumericalIssue); - VERIFY_IS_NOT_APPROX(mat,ldlt.reconstructedMatrix()); - } - - { - mat.resize(8,8); - mat << 0.1, 0, -0.1, 0, 0, 0, 1, 0, - 0, 4.24667, 0, 2.00333, 0, 0, 0, 0, - -0.1, 0, 0.2, 0, -0.1, 0, 0, 0, - 0, 2.00333, 0, 8.49333, 0, 2.00333, 0, 0, - 0, 0, -0.1, 0, 0.1, 0, 0, 1, - 0, 0, 0, 2.00333, 0, 4.24667, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0; - ldlt.compute(mat); - VERIFY(ldlt.info()==NumericalIssue); - VERIFY_IS_NOT_APPROX(mat,ldlt.reconstructedMatrix()); - } -} - -template void cholesky_verify_assert() -{ - MatrixType tmp; - - LLT llt; - VERIFY_RAISES_ASSERT(llt.matrixL()) - VERIFY_RAISES_ASSERT(llt.matrixU()) - VERIFY_RAISES_ASSERT(llt.solve(tmp)) - VERIFY_RAISES_ASSERT(llt.solveInPlace(&tmp)) - - LDLT ldlt; - VERIFY_RAISES_ASSERT(ldlt.matrixL()) - VERIFY_RAISES_ASSERT(ldlt.permutationP()) - VERIFY_RAISES_ASSERT(ldlt.vectorD()) - VERIFY_RAISES_ASSERT(ldlt.isPositive()) - VERIFY_RAISES_ASSERT(ldlt.isNegative()) - VERIFY_RAISES_ASSERT(ldlt.solve(tmp)) - VERIFY_RAISES_ASSERT(ldlt.solveInPlace(&tmp)) -} - -void test_cholesky() -{ - int s = 0; - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( cholesky(Matrix()) ); - CALL_SUBTEST_3( cholesky(Matrix2d()) ); - CALL_SUBTEST_3( cholesky_bug241(Matrix2d()) ); - CALL_SUBTEST_3( cholesky_definiteness(Matrix2d()) ); - CALL_SUBTEST_4( cholesky(Matrix3f()) ); - CALL_SUBTEST_5( cholesky(Matrix4d()) ); - - s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_2( cholesky(MatrixXd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); - CALL_SUBTEST_6( cholesky_cplx(MatrixXcd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } - - CALL_SUBTEST_4( cholesky_verify_assert() ); - CALL_SUBTEST_7( cholesky_verify_assert() ); - CALL_SUBTEST_8( cholesky_verify_assert() ); - CALL_SUBTEST_2( cholesky_verify_assert() ); - - // Test problem size constructors - CALL_SUBTEST_9( LLT(10) ); - CALL_SUBTEST_9( LDLT(10) ); - - CALL_SUBTEST_2( cholesky_faillure_cases() ); - - TEST_SET_BUT_UNUSED_VARIABLE(nb_temporaries) -} diff --git a/testbed/nanogui/ext/eigen/test/cholmod_support.cpp b/testbed/nanogui/ext/eigen/test/cholmod_support.cpp deleted file mode 100644 index 93120733..00000000 --- a/testbed/nanogui/ext/eigen/test/cholmod_support.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_DEBUG_SMALL_PRODUCT_BLOCKS -#include "sparse_solver.h" - -#include - -template void test_cholmod_ST() -{ - CholmodDecomposition g_chol_colmajor_lower; g_chol_colmajor_lower.setMode(CholmodSupernodalLLt); - CholmodDecomposition g_chol_colmajor_upper; g_chol_colmajor_upper.setMode(CholmodSupernodalLLt); - CholmodDecomposition g_llt_colmajor_lower; g_llt_colmajor_lower.setMode(CholmodSimplicialLLt); - CholmodDecomposition g_llt_colmajor_upper; g_llt_colmajor_upper.setMode(CholmodSimplicialLLt); - CholmodDecomposition g_ldlt_colmajor_lower; g_ldlt_colmajor_lower.setMode(CholmodLDLt); - CholmodDecomposition g_ldlt_colmajor_upper; g_ldlt_colmajor_upper.setMode(CholmodLDLt); - - CholmodSupernodalLLT chol_colmajor_lower; - CholmodSupernodalLLT chol_colmajor_upper; - CholmodSimplicialLLT llt_colmajor_lower; - CholmodSimplicialLLT llt_colmajor_upper; - CholmodSimplicialLDLT ldlt_colmajor_lower; - CholmodSimplicialLDLT ldlt_colmajor_upper; - - check_sparse_spd_solving(g_chol_colmajor_lower); - check_sparse_spd_solving(g_chol_colmajor_upper); - check_sparse_spd_solving(g_llt_colmajor_lower); - check_sparse_spd_solving(g_llt_colmajor_upper); - check_sparse_spd_solving(g_ldlt_colmajor_lower); - check_sparse_spd_solving(g_ldlt_colmajor_upper); - - check_sparse_spd_solving(chol_colmajor_lower); - check_sparse_spd_solving(chol_colmajor_upper); - check_sparse_spd_solving(llt_colmajor_lower); - check_sparse_spd_solving(llt_colmajor_upper); - check_sparse_spd_solving(ldlt_colmajor_lower); - check_sparse_spd_solving(ldlt_colmajor_upper); - - check_sparse_spd_determinant(chol_colmajor_lower); - check_sparse_spd_determinant(chol_colmajor_upper); - check_sparse_spd_determinant(llt_colmajor_lower); - check_sparse_spd_determinant(llt_colmajor_upper); - check_sparse_spd_determinant(ldlt_colmajor_lower); - check_sparse_spd_determinant(ldlt_colmajor_upper); -} - -template void test_cholmod_T() -{ - test_cholmod_ST >(); -} - -void test_cholmod_support() -{ - CALL_SUBTEST_11( (test_cholmod_T()) ); - CALL_SUBTEST_12( (test_cholmod_T()) ); - CALL_SUBTEST_13( (test_cholmod_T()) ); - CALL_SUBTEST_14( (test_cholmod_T()) ); - CALL_SUBTEST_21( (test_cholmod_T, ColMajor, int >()) ); - CALL_SUBTEST_22( (test_cholmod_T, ColMajor, long>()) ); - // TODO complex row-major matrices do not work at the moment: - // CALL_SUBTEST_23( (test_cholmod_T, RowMajor, int >()) ); - // CALL_SUBTEST_24( (test_cholmod_T, RowMajor, long>()) ); -} diff --git a/testbed/nanogui/ext/eigen/test/commainitializer.cpp b/testbed/nanogui/ext/eigen/test/commainitializer.cpp deleted file mode 100644 index 9844adbd..00000000 --- a/testbed/nanogui/ext/eigen/test/commainitializer.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - - -template -void test_blocks() -{ - Matrix m_fixed; - MatrixXi m_dynamic(M1+M2, N1+N2); - - Matrix mat11; mat11.setRandom(); - Matrix mat12; mat12.setRandom(); - Matrix mat21; mat21.setRandom(); - Matrix mat22; mat22.setRandom(); - - MatrixXi matx11 = mat11, matx12 = mat12, matx21 = mat21, matx22 = mat22; - - { - VERIFY_IS_EQUAL((m_fixed << mat11, mat12, mat21, matx22).finished(), (m_dynamic << mat11, matx12, mat21, matx22).finished()); - VERIFY_IS_EQUAL((m_fixed.template topLeftCorner()), mat11); - VERIFY_IS_EQUAL((m_fixed.template topRightCorner()), mat12); - VERIFY_IS_EQUAL((m_fixed.template bottomLeftCorner()), mat21); - VERIFY_IS_EQUAL((m_fixed.template bottomRightCorner()), mat22); - VERIFY_IS_EQUAL((m_fixed << mat12, mat11, matx21, mat22).finished(), (m_dynamic << mat12, matx11, matx21, mat22).finished()); - } - - if(N1 > 0) - { - VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat11, mat21, mat22)); - VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat21, mat21, mat22)); - } - else - { - // allow insertion of zero-column blocks: - VERIFY_IS_EQUAL((m_fixed << mat11, mat12, mat11, mat11, mat21, mat21, mat22).finished(), (m_dynamic << mat12, mat22).finished()); - } - if(M1 != M2) - { - VERIFY_RAISES_ASSERT((m_fixed << mat11, mat21, mat12, mat22)); - } -} - - -template -struct test_block_recursion -{ - static void run() - { - test_blocks<(N>>6)&3, (N>>4)&3, (N>>2)&3, N & 3>(); - test_block_recursion::run(); - } -}; - -template<> -struct test_block_recursion<-1> -{ - static void run() { } -}; - -void test_commainitializer() -{ - Matrix3d m3; - Matrix4d m4; - - VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8) ); - - #ifndef _MSC_VER - VERIFY_RAISES_ASSERT( (m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ); - #endif - - double data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; - Matrix3d ref = Map >(data); - - m3 = Matrix3d::Random(); - m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9; - VERIFY_IS_APPROX(m3, ref ); - - Vector3d vec[3]; - vec[0] << 1, 4, 7; - vec[1] << 2, 5, 8; - vec[2] << 3, 6, 9; - m3 = Matrix3d::Random(); - m3 << vec[0], vec[1], vec[2]; - VERIFY_IS_APPROX(m3, ref); - - vec[0] << 1, 2, 3; - vec[1] << 4, 5, 6; - vec[2] << 7, 8, 9; - m3 = Matrix3d::Random(); - m3 << vec[0].transpose(), - 4, 5, 6, - vec[2].transpose(); - VERIFY_IS_APPROX(m3, ref); - - - // recursively test all block-sizes from 0 to 3: - test_block_recursion<(1<<8) - 1>(); -} diff --git a/testbed/nanogui/ext/eigen/test/conjugate_gradient.cpp b/testbed/nanogui/ext/eigen/test/conjugate_gradient.cpp deleted file mode 100644 index 9622fd86..00000000 --- a/testbed/nanogui/ext/eigen/test/conjugate_gradient.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse_solver.h" -#include - -template void test_conjugate_gradient_T() -{ - typedef SparseMatrix SparseMatrixType; - ConjugateGradient cg_colmajor_lower_diag; - ConjugateGradient cg_colmajor_upper_diag; - ConjugateGradient cg_colmajor_loup_diag; - ConjugateGradient cg_colmajor_lower_I; - ConjugateGradient cg_colmajor_upper_I; - - CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_lower_diag) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_upper_diag) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_loup_diag) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_lower_I) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_colmajor_upper_I) ); -} - -void test_conjugate_gradient() -{ - CALL_SUBTEST_1(( test_conjugate_gradient_T() )); - CALL_SUBTEST_2(( test_conjugate_gradient_T, int>() )); - CALL_SUBTEST_3(( test_conjugate_gradient_T() )); -} diff --git a/testbed/nanogui/ext/eigen/test/conservative_resize.cpp b/testbed/nanogui/ext/eigen/test/conservative_resize.cpp deleted file mode 100644 index 498421b4..00000000 --- a/testbed/nanogui/ext/eigen/test/conservative_resize.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include - -using namespace Eigen; - -template -void run_matrix_tests() -{ - typedef Matrix MatrixType; - typedef typename MatrixType::Index Index; - - MatrixType m, n; - - // boundary cases ... - m = n = MatrixType::Random(50,50); - m.conservativeResize(1,50); - VERIFY_IS_APPROX(m, n.block(0,0,1,50)); - - m = n = MatrixType::Random(50,50); - m.conservativeResize(50,1); - VERIFY_IS_APPROX(m, n.block(0,0,50,1)); - - m = n = MatrixType::Random(50,50); - m.conservativeResize(50,50); - VERIFY_IS_APPROX(m, n.block(0,0,50,50)); - - // random shrinking ... - for (int i=0; i<25; ++i) - { - const Index rows = internal::random(1,50); - const Index cols = internal::random(1,50); - m = n = MatrixType::Random(50,50); - m.conservativeResize(rows,cols); - VERIFY_IS_APPROX(m, n.block(0,0,rows,cols)); - } - - // random growing with zeroing ... - for (int i=0; i<25; ++i) - { - const Index rows = internal::random(50,75); - const Index cols = internal::random(50,75); - m = n = MatrixType::Random(50,50); - m.conservativeResizeLike(MatrixType::Zero(rows,cols)); - VERIFY_IS_APPROX(m.block(0,0,n.rows(),n.cols()), n); - VERIFY( rows<=50 || m.block(50,0,rows-50,cols).sum() == Scalar(0) ); - VERIFY( cols<=50 || m.block(0,50,rows,cols-50).sum() == Scalar(0) ); - } -} - -template -void run_vector_tests() -{ - typedef Matrix VectorType; - - VectorType m, n; - - // boundary cases ... - m = n = VectorType::Random(50); - m.conservativeResize(1); - VERIFY_IS_APPROX(m, n.segment(0,1)); - - m = n = VectorType::Random(50); - m.conservativeResize(50); - VERIFY_IS_APPROX(m, n.segment(0,50)); - - m = n = VectorType::Random(50); - m.conservativeResize(m.rows(),1); - VERIFY_IS_APPROX(m, n.segment(0,1)); - - m = n = VectorType::Random(50); - m.conservativeResize(m.rows(),50); - VERIFY_IS_APPROX(m, n.segment(0,50)); - - // random shrinking ... - for (int i=0; i<50; ++i) - { - const int size = internal::random(1,50); - m = n = VectorType::Random(50); - m.conservativeResize(size); - VERIFY_IS_APPROX(m, n.segment(0,size)); - - m = n = VectorType::Random(50); - m.conservativeResize(m.rows(), size); - VERIFY_IS_APPROX(m, n.segment(0,size)); - } - - // random growing with zeroing ... - for (int i=0; i<50; ++i) - { - const int size = internal::random(50,100); - m = n = VectorType::Random(50); - m.conservativeResizeLike(VectorType::Zero(size)); - VERIFY_IS_APPROX(m.segment(0,50), n); - VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) ); - - m = n = VectorType::Random(50); - m.conservativeResizeLike(Matrix::Zero(1,size)); - VERIFY_IS_APPROX(m.segment(0,50), n); - VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) ); - } -} - -void test_conservative_resize() -{ - for(int i=0; i())); - CALL_SUBTEST_1((run_matrix_tests())); - CALL_SUBTEST_2((run_matrix_tests())); - CALL_SUBTEST_2((run_matrix_tests())); - CALL_SUBTEST_3((run_matrix_tests())); - CALL_SUBTEST_3((run_matrix_tests())); - CALL_SUBTEST_4((run_matrix_tests, Eigen::RowMajor>())); - CALL_SUBTEST_4((run_matrix_tests, Eigen::ColMajor>())); - CALL_SUBTEST_5((run_matrix_tests, Eigen::RowMajor>())); - CALL_SUBTEST_6((run_matrix_tests, Eigen::ColMajor>())); - - CALL_SUBTEST_1((run_vector_tests())); - CALL_SUBTEST_2((run_vector_tests())); - CALL_SUBTEST_3((run_vector_tests())); - CALL_SUBTEST_4((run_vector_tests >())); - CALL_SUBTEST_5((run_vector_tests >())); - } -} diff --git a/testbed/nanogui/ext/eigen/test/constructor.cpp b/testbed/nanogui/ext/eigen/test/constructor.cpp deleted file mode 100644 index eec9e219..00000000 --- a/testbed/nanogui/ext/eigen/test/constructor.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -#define TEST_ENABLE_TEMPORARY_TRACKING - -#include "main.h" - -template struct Wrapper -{ - MatrixType m_mat; - inline Wrapper(const MatrixType &x) : m_mat(x) {} - inline operator const MatrixType& () const { return m_mat; } - inline operator MatrixType& () { return m_mat; } -}; - -template void ctor_init1(const MatrixType& m) -{ - // Check logic in PlainObjectBase::_init1 - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m0 = MatrixType::Random(rows,cols); - - VERIFY_EVALUATION_COUNT( MatrixType m1(m0), 1); - VERIFY_EVALUATION_COUNT( MatrixType m2(m0+m0), 1); - VERIFY_EVALUATION_COUNT( MatrixType m2(m0.block(0,0,rows,cols)) , 1); - - Wrapper wrapper(m0); - VERIFY_EVALUATION_COUNT( MatrixType m3(wrapper) , 1); -} - - -void test_constructor() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( ctor_init1(Matrix()) ); - CALL_SUBTEST_1( ctor_init1(Matrix4d()) ); - CALL_SUBTEST_1( ctor_init1(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_1( ctor_init1(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - { - Matrix a(123); - VERIFY_IS_EQUAL(a[0], 123); - } - { - Matrix a(123.0); - VERIFY_IS_EQUAL(a[0], 123); - } - { - Matrix a(123); - VERIFY_IS_EQUAL(a[0], 123.f); - } - { - Array a(123); - VERIFY_IS_EQUAL(a[0], 123); - } - { - Array a(123.0); - VERIFY_IS_EQUAL(a[0], 123); - } - { - Array a(123); - VERIFY_IS_EQUAL(a[0], 123.f); - } - { - Array a(123); - VERIFY_IS_EQUAL(a(4), 123); - } - { - Array a(123.0); - VERIFY_IS_EQUAL(a(4), 123); - } - { - Array a(123); - VERIFY_IS_EQUAL(a(4), 123.f); - } -} diff --git a/testbed/nanogui/ext/eigen/test/corners.cpp b/testbed/nanogui/ext/eigen/test/corners.cpp deleted file mode 100644 index 3c64c32a..00000000 --- a/testbed/nanogui/ext/eigen/test/corners.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#define COMPARE_CORNER(A,B) \ - VERIFY_IS_EQUAL(matrix.A, matrix.B); \ - VERIFY_IS_EQUAL(const_matrix.A, const_matrix.B); - -template void corners(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - Index r = internal::random(1,rows); - Index c = internal::random(1,cols); - - MatrixType matrix = MatrixType::Random(rows,cols); - const MatrixType const_matrix = MatrixType::Random(rows,cols); - - COMPARE_CORNER(topLeftCorner(r,c), block(0,0,r,c)); - COMPARE_CORNER(topRightCorner(r,c), block(0,cols-c,r,c)); - COMPARE_CORNER(bottomLeftCorner(r,c), block(rows-r,0,r,c)); - COMPARE_CORNER(bottomRightCorner(r,c), block(rows-r,cols-c,r,c)); - - Index sr = internal::random(1,rows) - 1; - Index nr = internal::random(1,rows-sr); - Index sc = internal::random(1,cols) - 1; - Index nc = internal::random(1,cols-sc); - - COMPARE_CORNER(topRows(r), block(0,0,r,cols)); - COMPARE_CORNER(middleRows(sr,nr), block(sr,0,nr,cols)); - COMPARE_CORNER(bottomRows(r), block(rows-r,0,r,cols)); - COMPARE_CORNER(leftCols(c), block(0,0,rows,c)); - COMPARE_CORNER(middleCols(sc,nc), block(0,sc,rows,nc)); - COMPARE_CORNER(rightCols(c), block(0,cols-c,rows,c)); -} - -template void corners_fixedsize() -{ - MatrixType matrix = MatrixType::Random(); - const MatrixType const_matrix = MatrixType::Random(); - - enum { - rows = MatrixType::RowsAtCompileTime, - cols = MatrixType::ColsAtCompileTime, - r = CRows, - c = CCols, - sr = SRows, - sc = SCols - }; - - VERIFY_IS_EQUAL((matrix.template topLeftCorner()), (matrix.template block(0,0))); - VERIFY_IS_EQUAL((matrix.template topRightCorner()), (matrix.template block(0,cols-c))); - VERIFY_IS_EQUAL((matrix.template bottomLeftCorner()), (matrix.template block(rows-r,0))); - VERIFY_IS_EQUAL((matrix.template bottomRightCorner()), (matrix.template block(rows-r,cols-c))); - - VERIFY_IS_EQUAL((matrix.template topLeftCorner()), (matrix.template topLeftCorner(r,c))); - VERIFY_IS_EQUAL((matrix.template topRightCorner()), (matrix.template topRightCorner(r,c))); - VERIFY_IS_EQUAL((matrix.template bottomLeftCorner()), (matrix.template bottomLeftCorner(r,c))); - VERIFY_IS_EQUAL((matrix.template bottomRightCorner()), (matrix.template bottomRightCorner(r,c))); - - VERIFY_IS_EQUAL((matrix.template topLeftCorner()), (matrix.template topLeftCorner(r,c))); - VERIFY_IS_EQUAL((matrix.template topRightCorner()), (matrix.template topRightCorner(r,c))); - VERIFY_IS_EQUAL((matrix.template bottomLeftCorner()), (matrix.template bottomLeftCorner(r,c))); - VERIFY_IS_EQUAL((matrix.template bottomRightCorner()), (matrix.template bottomRightCorner(r,c))); - - VERIFY_IS_EQUAL((matrix.template topRows()), (matrix.template block(0,0))); - VERIFY_IS_EQUAL((matrix.template middleRows(sr)), (matrix.template block(sr,0))); - VERIFY_IS_EQUAL((matrix.template bottomRows()), (matrix.template block(rows-r,0))); - VERIFY_IS_EQUAL((matrix.template leftCols()), (matrix.template block(0,0))); - VERIFY_IS_EQUAL((matrix.template middleCols(sc)), (matrix.template block(0,sc))); - VERIFY_IS_EQUAL((matrix.template rightCols()), (matrix.template block(0,cols-c))); - - VERIFY_IS_EQUAL((const_matrix.template topLeftCorner()), (const_matrix.template block(0,0))); - VERIFY_IS_EQUAL((const_matrix.template topRightCorner()), (const_matrix.template block(0,cols-c))); - VERIFY_IS_EQUAL((const_matrix.template bottomLeftCorner()), (const_matrix.template block(rows-r,0))); - VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner()), (const_matrix.template block(rows-r,cols-c))); - - VERIFY_IS_EQUAL((const_matrix.template topLeftCorner()), (const_matrix.template topLeftCorner(r,c))); - VERIFY_IS_EQUAL((const_matrix.template topRightCorner()), (const_matrix.template topRightCorner(r,c))); - VERIFY_IS_EQUAL((const_matrix.template bottomLeftCorner()), (const_matrix.template bottomLeftCorner(r,c))); - VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner()), (const_matrix.template bottomRightCorner(r,c))); - - VERIFY_IS_EQUAL((const_matrix.template topLeftCorner()), (const_matrix.template topLeftCorner(r,c))); - VERIFY_IS_EQUAL((const_matrix.template topRightCorner()), (const_matrix.template topRightCorner(r,c))); - VERIFY_IS_EQUAL((const_matrix.template bottomLeftCorner()), (const_matrix.template bottomLeftCorner(r,c))); - VERIFY_IS_EQUAL((const_matrix.template bottomRightCorner()), (const_matrix.template bottomRightCorner(r,c))); - - VERIFY_IS_EQUAL((const_matrix.template topRows()), (const_matrix.template block(0,0))); - VERIFY_IS_EQUAL((const_matrix.template middleRows(sr)), (const_matrix.template block(sr,0))); - VERIFY_IS_EQUAL((const_matrix.template bottomRows()), (const_matrix.template block(rows-r,0))); - VERIFY_IS_EQUAL((const_matrix.template leftCols()), (const_matrix.template block(0,0))); - VERIFY_IS_EQUAL((const_matrix.template middleCols(sc)), (const_matrix.template block(0,sc))); - VERIFY_IS_EQUAL((const_matrix.template rightCols()), (const_matrix.template block(0,cols-c))); -} - -void test_corners() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( corners(Matrix()) ); - CALL_SUBTEST_2( corners(Matrix4d()) ); - CALL_SUBTEST_3( corners(Matrix()) ); - CALL_SUBTEST_4( corners(MatrixXcf(5, 7)) ); - CALL_SUBTEST_5( corners(MatrixXf(21, 20)) ); - - CALL_SUBTEST_1(( corners_fixedsize, 1, 1, 0, 0>() )); - CALL_SUBTEST_2(( corners_fixedsize() )); - CALL_SUBTEST_3(( corners_fixedsize,4,7,5,2>() )); - } -} diff --git a/testbed/nanogui/ext/eigen/test/ctorleak.cpp b/testbed/nanogui/ext/eigen/test/ctorleak.cpp deleted file mode 100644 index c158f5e4..00000000 --- a/testbed/nanogui/ext/eigen/test/ctorleak.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include "main.h" - -#include // std::exception - -struct Foo -{ - static Index object_count; - static Index object_limit; - int dummy; - - Foo() - { -#ifdef EIGEN_EXCEPTIONS - // TODO: Is this the correct way to handle this? - if (Foo::object_count > Foo::object_limit) { std::cout << "\nThrow!\n"; throw Foo::Fail(); } -#endif - std::cout << '+'; - ++Foo::object_count; - } - - ~Foo() - { - std::cout << '-'; - --Foo::object_count; - } - - class Fail : public std::exception {}; -}; - -Index Foo::object_count = 0; -Index Foo::object_limit = 0; - -#undef EIGEN_TEST_MAX_SIZE -#define EIGEN_TEST_MAX_SIZE 3 - -void test_ctorleak() -{ - typedef Matrix MatrixX; - typedef Matrix VectorX; - Foo::object_count = 0; - for(int i = 0; i < g_repeat; i++) { - Index rows = internal::random(2,EIGEN_TEST_MAX_SIZE), cols = internal::random(2,EIGEN_TEST_MAX_SIZE); - Foo::object_limit = internal::random(0, rows*cols - 2); - std::cout << "object_limit =" << Foo::object_limit << std::endl; -#ifdef EIGEN_EXCEPTIONS - try - { -#endif - std::cout << "\nMatrixX m(" << rows << ", " << cols << ");\n"; - MatrixX m(rows, cols); -#ifdef EIGEN_EXCEPTIONS - VERIFY(false); // not reached if exceptions are enabled - } - catch (const Foo::Fail&) { /* ignore */ } -#endif - VERIFY_IS_EQUAL(Index(0), Foo::object_count); - - { - Foo::object_limit = (rows+1)*(cols+1); - MatrixX A(rows, cols); - VERIFY_IS_EQUAL(Foo::object_count, rows*cols); - VectorX v=A.row(0); - VERIFY_IS_EQUAL(Foo::object_count, (rows+1)*cols); - v = A.col(0); - VERIFY_IS_EQUAL(Foo::object_count, rows*(cols+1)); - } - VERIFY_IS_EQUAL(Index(0), Foo::object_count); - } -} diff --git a/testbed/nanogui/ext/eigen/test/cuda_basic.cu b/testbed/nanogui/ext/eigen/test/cuda_basic.cu deleted file mode 100644 index cb2e4167..00000000 --- a/testbed/nanogui/ext/eigen/test/cuda_basic.cu +++ /dev/null @@ -1,173 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015-2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// workaround issue between gcc >= 4.7 and cuda 5.5 -#if (defined __GNUC__) && (__GNUC__>4 || __GNUC_MINOR__>=7) - #undef _GLIBCXX_ATOMIC_BUILTINS - #undef _GLIBCXX_USE_INT128 -#endif - -#define EIGEN_TEST_NO_LONGDOUBLE -#define EIGEN_TEST_NO_COMPLEX -#define EIGEN_TEST_FUNC cuda_basic -#define EIGEN_DEFAULT_DENSE_INDEX_TYPE int - -#include -#include -#if defined __CUDACC_VER__ && __CUDACC_VER__ >= 70500 -#include -#endif -#include "main.h" -#include "cuda_common.h" - -// Check that dense modules can be properly parsed by nvcc -#include - -// struct Foo{ -// EIGEN_DEVICE_FUNC -// void operator()(int i, const float* mats, float* vecs) const { -// using namespace Eigen; -// // Matrix3f M(data); -// // Vector3f x(data+9); -// // Map(data+9) = M.inverse() * x; -// Matrix3f M(mats+i/16); -// Vector3f x(vecs+i*3); -// // using std::min; -// // using std::sqrt; -// Map(vecs+i*3) << x.minCoeff(), 1, 2;// / x.dot(x);//(M.inverse() * x) / x.x(); -// //x = x*2 + x.y() * x + x * x.maxCoeff() - x / x.sum(); -// } -// }; - -template -struct coeff_wise { - EIGEN_DEVICE_FUNC - void operator()(int i, const typename T::Scalar* in, typename T::Scalar* out) const - { - using namespace Eigen; - T x1(in+i); - T x2(in+i+1); - T x3(in+i+2); - Map res(out+i*T::MaxSizeAtCompileTime); - - res.array() += (in[0] * x1 + x2).array() * x3.array(); - } -}; - -template -struct replicate { - EIGEN_DEVICE_FUNC - void operator()(int i, const typename T::Scalar* in, typename T::Scalar* out) const - { - using namespace Eigen; - T x1(in+i); - int step = x1.size() * 4; - int stride = 3 * step; - - typedef Map > MapType; - MapType(out+i*stride+0*step, x1.rows()*2, x1.cols()*2) = x1.replicate(2,2); - MapType(out+i*stride+1*step, x1.rows()*3, x1.cols()) = in[i] * x1.colwise().replicate(3); - MapType(out+i*stride+2*step, x1.rows(), x1.cols()*3) = in[i] * x1.rowwise().replicate(3); - } -}; - -template -struct redux { - EIGEN_DEVICE_FUNC - void operator()(int i, const typename T::Scalar* in, typename T::Scalar* out) const - { - using namespace Eigen; - int N = 10; - T x1(in+i); - out[i*N+0] = x1.minCoeff(); - out[i*N+1] = x1.maxCoeff(); - out[i*N+2] = x1.sum(); - out[i*N+3] = x1.prod(); - out[i*N+4] = x1.matrix().squaredNorm(); - out[i*N+5] = x1.matrix().norm(); - out[i*N+6] = x1.colwise().sum().maxCoeff(); - out[i*N+7] = x1.rowwise().maxCoeff().sum(); - out[i*N+8] = x1.matrix().colwise().squaredNorm().sum(); - } -}; - -template -struct prod_test { - EIGEN_DEVICE_FUNC - void operator()(int i, const typename T1::Scalar* in, typename T1::Scalar* out) const - { - using namespace Eigen; - typedef Matrix T3; - T1 x1(in+i); - T2 x2(in+i+1); - Map res(out+i*T3::MaxSizeAtCompileTime); - res += in[i] * x1 * x2; - } -}; - -template -struct diagonal { - EIGEN_DEVICE_FUNC - void operator()(int i, const typename T1::Scalar* in, typename T1::Scalar* out) const - { - using namespace Eigen; - T1 x1(in+i); - Map res(out+i*T2::MaxSizeAtCompileTime); - res += x1.diagonal(); - } -}; - -template -struct eigenvalues { - EIGEN_DEVICE_FUNC - void operator()(int i, const typename T::Scalar* in, typename T::Scalar* out) const - { - using namespace Eigen; - typedef Matrix Vec; - T M(in+i); - Map res(out+i*Vec::MaxSizeAtCompileTime); - T A = M*M.adjoint(); - SelfAdjointEigenSolver eig; - eig.computeDirect(M); - res = eig.eigenvalues(); - } -}; - -void test_cuda_basic() -{ - ei_test_init_cuda(); - - int nthreads = 100; - Eigen::VectorXf in, out; - - #ifndef __CUDA_ARCH__ - int data_size = nthreads * 512; - in.setRandom(data_size); - out.setRandom(data_size); - #endif - - CALL_SUBTEST( run_and_compare_to_cuda(coeff_wise(), nthreads, in, out) ); - CALL_SUBTEST( run_and_compare_to_cuda(coeff_wise(), nthreads, in, out) ); - - CALL_SUBTEST( run_and_compare_to_cuda(replicate(), nthreads, in, out) ); - CALL_SUBTEST( run_and_compare_to_cuda(replicate(), nthreads, in, out) ); - - CALL_SUBTEST( run_and_compare_to_cuda(redux(), nthreads, in, out) ); - CALL_SUBTEST( run_and_compare_to_cuda(redux(), nthreads, in, out) ); - - CALL_SUBTEST( run_and_compare_to_cuda(prod_test(), nthreads, in, out) ); - CALL_SUBTEST( run_and_compare_to_cuda(prod_test(), nthreads, in, out) ); - - CALL_SUBTEST( run_and_compare_to_cuda(diagonal(), nthreads, in, out) ); - CALL_SUBTEST( run_and_compare_to_cuda(diagonal(), nthreads, in, out) ); - - CALL_SUBTEST( run_and_compare_to_cuda(eigenvalues(), nthreads, in, out) ); - CALL_SUBTEST( run_and_compare_to_cuda(eigenvalues(), nthreads, in, out) ); - -} diff --git a/testbed/nanogui/ext/eigen/test/cuda_common.h b/testbed/nanogui/ext/eigen/test/cuda_common.h deleted file mode 100644 index 9737693a..00000000 --- a/testbed/nanogui/ext/eigen/test/cuda_common.h +++ /dev/null @@ -1,101 +0,0 @@ - -#ifndef EIGEN_TEST_CUDA_COMMON_H -#define EIGEN_TEST_CUDA_COMMON_H - -#include -#include -#include -#include - -#ifndef __CUDACC__ -dim3 threadIdx, blockDim, blockIdx; -#endif - -template -void run_on_cpu(const Kernel& ker, int n, const Input& in, Output& out) -{ - for(int i=0; i -__global__ -void run_on_cuda_meta_kernel(const Kernel ker, int n, const Input* in, Output* out) -{ - int i = threadIdx.x + blockIdx.x*blockDim.x; - if(i -void run_on_cuda(const Kernel& ker, int n, const Input& in, Output& out) -{ - typename Input::Scalar* d_in; - typename Output::Scalar* d_out; - std::ptrdiff_t in_bytes = in.size() * sizeof(typename Input::Scalar); - std::ptrdiff_t out_bytes = out.size() * sizeof(typename Output::Scalar); - - cudaMalloc((void**)(&d_in), in_bytes); - cudaMalloc((void**)(&d_out), out_bytes); - - cudaMemcpy(d_in, in.data(), in_bytes, cudaMemcpyHostToDevice); - cudaMemcpy(d_out, out.data(), out_bytes, cudaMemcpyHostToDevice); - - // Simple and non-optimal 1D mapping assuming n is not too large - // That's only for unit testing! - dim3 Blocks(128); - dim3 Grids( (n+int(Blocks.x)-1)/int(Blocks.x) ); - - cudaThreadSynchronize(); - run_on_cuda_meta_kernel<<>>(ker, n, d_in, d_out); - cudaThreadSynchronize(); - - // check inputs have not been modified - cudaMemcpy(const_cast(in.data()), d_in, in_bytes, cudaMemcpyDeviceToHost); - cudaMemcpy(out.data(), d_out, out_bytes, cudaMemcpyDeviceToHost); - - cudaFree(d_in); - cudaFree(d_out); -} - - -template -void run_and_compare_to_cuda(const Kernel& ker, int n, const Input& in, Output& out) -{ - Input in_ref, in_cuda; - Output out_ref, out_cuda; - #ifndef __CUDA_ARCH__ - in_ref = in_cuda = in; - out_ref = out_cuda = out; - #endif - run_on_cpu (ker, n, in_ref, out_ref); - run_on_cuda(ker, n, in_cuda, out_cuda); - #ifndef __CUDA_ARCH__ - VERIFY_IS_APPROX(in_ref, in_cuda); - VERIFY_IS_APPROX(out_ref, out_cuda); - #endif -} - - -void ei_test_init_cuda() -{ - int device = 0; - cudaDeviceProp deviceProp; - cudaGetDeviceProperties(&deviceProp, device); - std::cout << "CUDA device info:\n"; - std::cout << " name: " << deviceProp.name << "\n"; - std::cout << " capability: " << deviceProp.major << "." << deviceProp.minor << "\n"; - std::cout << " multiProcessorCount: " << deviceProp.multiProcessorCount << "\n"; - std::cout << " maxThreadsPerMultiProcessor: " << deviceProp.maxThreadsPerMultiProcessor << "\n"; - std::cout << " warpSize: " << deviceProp.warpSize << "\n"; - std::cout << " regsPerBlock: " << deviceProp.regsPerBlock << "\n"; - std::cout << " concurrentKernels: " << deviceProp.concurrentKernels << "\n"; - std::cout << " clockRate: " << deviceProp.clockRate << "\n"; - std::cout << " canMapHostMemory: " << deviceProp.canMapHostMemory << "\n"; - std::cout << " computeMode: " << deviceProp.computeMode << "\n"; -} - -#endif // EIGEN_TEST_CUDA_COMMON_H diff --git a/testbed/nanogui/ext/eigen/test/denseLM.cpp b/testbed/nanogui/ext/eigen/test/denseLM.cpp deleted file mode 100644 index 0aa736ea..00000000 --- a/testbed/nanogui/ext/eigen/test/denseLM.cpp +++ /dev/null @@ -1,190 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Desire Nuentsa -// Copyright (C) 2012 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include -#include -#include - -#include "main.h" -#include -using namespace std; -using namespace Eigen; - -template -struct DenseLM : DenseFunctor -{ - typedef DenseFunctor Base; - typedef typename Base::JacobianType JacobianType; - typedef Matrix VectorType; - - DenseLM(int n, int m) : DenseFunctor(n,m) - { } - - VectorType model(const VectorType& uv, VectorType& x) - { - VectorType y; // Should change to use expression template - int m = Base::values(); - int n = Base::inputs(); - eigen_assert(uv.size()%2 == 0); - eigen_assert(uv.size() == n); - eigen_assert(x.size() == m); - y.setZero(m); - int half = n/2; - VectorBlock u(uv, 0, half); - VectorBlock v(uv, half, half); - for (int j = 0; j < m; j++) - { - for (int i = 0; i < half; i++) - y(j) += u(i)*std::exp(-(x(j)-i)*(x(j)-i)/(v(i)*v(i))); - } - return y; - - } - void initPoints(VectorType& uv_ref, VectorType& x) - { - m_x = x; - m_y = this->model(uv_ref, x); - } - - int operator()(const VectorType& uv, VectorType& fvec) - { - - int m = Base::values(); - int n = Base::inputs(); - eigen_assert(uv.size()%2 == 0); - eigen_assert(uv.size() == n); - eigen_assert(fvec.size() == m); - int half = n/2; - VectorBlock u(uv, 0, half); - VectorBlock v(uv, half, half); - for (int j = 0; j < m; j++) - { - fvec(j) = m_y(j); - for (int i = 0; i < half; i++) - { - fvec(j) -= u(i) *std::exp(-(m_x(j)-i)*(m_x(j)-i)/(v(i)*v(i))); - } - } - - return 0; - } - int df(const VectorType& uv, JacobianType& fjac) - { - int m = Base::values(); - int n = Base::inputs(); - eigen_assert(n == uv.size()); - eigen_assert(fjac.rows() == m); - eigen_assert(fjac.cols() == n); - int half = n/2; - VectorBlock u(uv, 0, half); - VectorBlock v(uv, half, half); - for (int j = 0; j < m; j++) - { - for (int i = 0; i < half; i++) - { - fjac.coeffRef(j,i) = -std::exp(-(m_x(j)-i)*(m_x(j)-i)/(v(i)*v(i))); - fjac.coeffRef(j,i+half) = -2.*u(i)*(m_x(j)-i)*(m_x(j)-i)/(std::pow(v(i),3)) * std::exp(-(m_x(j)-i)*(m_x(j)-i)/(v(i)*v(i))); - } - } - return 0; - } - VectorType m_x, m_y; //Data Points -}; - -template -int test_minimizeLM(FunctorType& functor, VectorType& uv) -{ - LevenbergMarquardt lm(functor); - LevenbergMarquardtSpace::Status info; - - info = lm.minimize(uv); - - VERIFY_IS_EQUAL(info, 1); - //FIXME Check other parameters - return info; -} - -template -int test_lmder(FunctorType& functor, VectorType& uv) -{ - typedef typename VectorType::Scalar Scalar; - LevenbergMarquardtSpace::Status info; - LevenbergMarquardt lm(functor); - info = lm.lmder1(uv); - - VERIFY_IS_EQUAL(info, 1); - //FIXME Check other parameters - return info; -} - -template -int test_minimizeSteps(FunctorType& functor, VectorType& uv) -{ - LevenbergMarquardtSpace::Status info; - LevenbergMarquardt lm(functor); - info = lm.minimizeInit(uv); - if (info==LevenbergMarquardtSpace::ImproperInputParameters) - return info; - do - { - info = lm.minimizeOneStep(uv); - } while (info==LevenbergMarquardtSpace::Running); - - VERIFY_IS_EQUAL(info, 1); - //FIXME Check other parameters - return info; -} - -template -void test_denseLM_T() -{ - typedef Matrix VectorType; - - int inputs = 10; - int values = 1000; - DenseLM dense_gaussian(inputs, values); - VectorType uv(inputs),uv_ref(inputs); - VectorType x(values); - - // Generate the reference solution - uv_ref << -2, 1, 4 ,8, 6, 1.8, 1.2, 1.1, 1.9 , 3; - - //Generate the reference data points - x.setRandom(); - x = 10*x; - x.array() += 10; - dense_gaussian.initPoints(uv_ref, x); - - // Generate the initial parameters - VectorBlock u(uv, 0, inputs/2); - VectorBlock v(uv, inputs/2, inputs/2); - - // Solve the optimization problem - - //Solve in one go - u.setOnes(); v.setOnes(); - test_minimizeLM(dense_gaussian, uv); - - //Solve until the machine precision - u.setOnes(); v.setOnes(); - test_lmder(dense_gaussian, uv); - - // Solve step by step - v.setOnes(); u.setOnes(); - test_minimizeSteps(dense_gaussian, uv); - -} - -void test_denseLM() -{ - CALL_SUBTEST_2(test_denseLM_T()); - - // CALL_SUBTEST_2(test_sparseLM_T()); -} diff --git a/testbed/nanogui/ext/eigen/test/dense_storage.cpp b/testbed/nanogui/ext/eigen/test/dense_storage.cpp deleted file mode 100644 index e63712b1..00000000 --- a/testbed/nanogui/ext/eigen/test/dense_storage.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2013 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include - -template -void dense_storage_copy() -{ - static const int Size = ((Rows==Dynamic || Cols==Dynamic) ? Dynamic : Rows*Cols); - typedef DenseStorage DenseStorageType; - - const int rows = (Rows==Dynamic) ? 4 : Rows; - const int cols = (Cols==Dynamic) ? 3 : Cols; - const int size = rows*cols; - DenseStorageType reference(size, rows, cols); - T* raw_reference = reference.data(); - for (int i=0; i(i); - - DenseStorageType copied_reference(reference); - const T* raw_copied_reference = copied_reference.data(); - for (int i=0; i -void dense_storage_assignment() -{ - static const int Size = ((Rows==Dynamic || Cols==Dynamic) ? Dynamic : Rows*Cols); - typedef DenseStorage DenseStorageType; - - const int rows = (Rows==Dynamic) ? 4 : Rows; - const int cols = (Cols==Dynamic) ? 3 : Cols; - const int size = rows*cols; - DenseStorageType reference(size, rows, cols); - T* raw_reference = reference.data(); - for (int i=0; i(i); - - DenseStorageType copied_reference; - copied_reference = reference; - const T* raw_copied_reference = copied_reference.data(); - for (int i=0; i(); - dense_storage_copy(); - dense_storage_copy(); - dense_storage_copy(); - - dense_storage_copy(); - dense_storage_copy(); - dense_storage_copy(); - dense_storage_copy(); - - dense_storage_assignment(); - dense_storage_assignment(); - dense_storage_assignment(); - dense_storage_assignment(); - - dense_storage_assignment(); - dense_storage_assignment(); - dense_storage_assignment(); - dense_storage_assignment(); -} diff --git a/testbed/nanogui/ext/eigen/test/determinant.cpp b/testbed/nanogui/ext/eigen/test/determinant.cpp deleted file mode 100644 index 758f3afb..00000000 --- a/testbed/nanogui/ext/eigen/test/determinant.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void determinant(const MatrixType& m) -{ - /* this test covers the following files: - Determinant.h - */ - typedef typename MatrixType::Index Index; - Index size = m.rows(); - - MatrixType m1(size, size), m2(size, size); - m1.setRandom(); - m2.setRandom(); - typedef typename MatrixType::Scalar Scalar; - Scalar x = internal::random(); - VERIFY_IS_APPROX(MatrixType::Identity(size, size).determinant(), Scalar(1)); - VERIFY_IS_APPROX((m1*m2).eval().determinant(), m1.determinant() * m2.determinant()); - if(size==1) return; - Index i = internal::random(0, size-1); - Index j; - do { - j = internal::random(0, size-1); - } while(j==i); - m2 = m1; - m2.row(i).swap(m2.row(j)); - VERIFY_IS_APPROX(m2.determinant(), -m1.determinant()); - m2 = m1; - m2.col(i).swap(m2.col(j)); - VERIFY_IS_APPROX(m2.determinant(), -m1.determinant()); - VERIFY_IS_APPROX(m2.determinant(), m2.transpose().determinant()); - VERIFY_IS_APPROX(numext::conj(m2.determinant()), m2.adjoint().determinant()); - m2 = m1; - m2.row(i) += x*m2.row(j); - VERIFY_IS_APPROX(m2.determinant(), m1.determinant()); - m2 = m1; - m2.row(i) *= x; - VERIFY_IS_APPROX(m2.determinant(), m1.determinant() * x); - - // check empty matrix - VERIFY_IS_APPROX(m2.block(0,0,0,0).determinant(), Scalar(1)); -} - -void test_determinant() -{ - for(int i = 0; i < g_repeat; i++) { - int s = 0; - CALL_SUBTEST_1( determinant(Matrix()) ); - CALL_SUBTEST_2( determinant(Matrix()) ); - CALL_SUBTEST_3( determinant(Matrix()) ); - CALL_SUBTEST_4( determinant(Matrix()) ); - CALL_SUBTEST_5( determinant(Matrix, 10, 10>()) ); - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_6( determinant(MatrixXd(s, s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } -} diff --git a/testbed/nanogui/ext/eigen/test/diagonal.cpp b/testbed/nanogui/ext/eigen/test/diagonal.cpp deleted file mode 100644 index c1546e97..00000000 --- a/testbed/nanogui/ext/eigen/test/diagonal.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void diagonal(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols); - - Scalar s1 = internal::random(); - - //check diagonal() - VERIFY_IS_APPROX(m1.diagonal(), m1.transpose().diagonal()); - m2.diagonal() = 2 * m1.diagonal(); - m2.diagonal()[0] *= 3; - - if (rows>2) - { - enum { - N1 = MatrixType::RowsAtCompileTime>2 ? 2 : 0, - N2 = MatrixType::RowsAtCompileTime>1 ? -1 : 0 - }; - - // check sub/super diagonal - if(MatrixType::SizeAtCompileTime!=Dynamic) - { - VERIFY(m1.template diagonal().RowsAtCompileTime == m1.diagonal(N1).size()); - VERIFY(m1.template diagonal().RowsAtCompileTime == m1.diagonal(N2).size()); - } - - m2.template diagonal() = 2 * m1.template diagonal(); - VERIFY_IS_APPROX(m2.template diagonal(), static_cast(2) * m1.diagonal(N1)); - m2.template diagonal()[0] *= 3; - VERIFY_IS_APPROX(m2.template diagonal()[0], static_cast(6) * m1.template diagonal()[0]); - - - m2.template diagonal() = 2 * m1.template diagonal(); - m2.template diagonal()[0] *= 3; - VERIFY_IS_APPROX(m2.template diagonal()[0], static_cast(6) * m1.template diagonal()[0]); - - m2.diagonal(N1) = 2 * m1.diagonal(N1); - VERIFY_IS_APPROX(m2.template diagonal(), static_cast(2) * m1.diagonal(N1)); - m2.diagonal(N1)[0] *= 3; - VERIFY_IS_APPROX(m2.diagonal(N1)[0], static_cast(6) * m1.diagonal(N1)[0]); - - m2.diagonal(N2) = 2 * m1.diagonal(N2); - VERIFY_IS_APPROX(m2.template diagonal(), static_cast(2) * m1.diagonal(N2)); - m2.diagonal(N2)[0] *= 3; - VERIFY_IS_APPROX(m2.diagonal(N2)[0], static_cast(6) * m1.diagonal(N2)[0]); - - m2.diagonal(N2).x() = s1; - VERIFY_IS_APPROX(m2.diagonal(N2).x(), s1); - m2.diagonal(N2).coeffRef(0) = Scalar(2)*s1; - VERIFY_IS_APPROX(m2.diagonal(N2).coeff(0), Scalar(2)*s1); - } -} - -template void diagonal_assert(const MatrixType& m) { - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols); - - if (rows>=2 && cols>=2) - { - VERIFY_RAISES_ASSERT( m1 += m1.diagonal() ); - VERIFY_RAISES_ASSERT( m1 -= m1.diagonal() ); - VERIFY_RAISES_ASSERT( m1.array() *= m1.diagonal().array() ); - VERIFY_RAISES_ASSERT( m1.array() /= m1.diagonal().array() ); - } -} - -void test_diagonal() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( diagonal(Matrix()) ); - CALL_SUBTEST_1( diagonal(Matrix()) ); - CALL_SUBTEST_1( diagonal(Matrix()) ); - CALL_SUBTEST_2( diagonal(Matrix4d()) ); - CALL_SUBTEST_2( diagonal(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_2( diagonal(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_2( diagonal(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_1( diagonal(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_1( diagonal(Matrix(3, 4)) ); - } - - CALL_SUBTEST_1( diagonal_assert(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); -} diff --git a/testbed/nanogui/ext/eigen/test/diagonalmatrices.cpp b/testbed/nanogui/ext/eigen/test/diagonalmatrices.cpp deleted file mode 100644 index cd6dc8cf..00000000 --- a/testbed/nanogui/ext/eigen/test/diagonalmatrices.cpp +++ /dev/null @@ -1,129 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -using namespace std; -template void diagonalmatrices(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; - typedef Matrix VectorType; - typedef Matrix RowVectorType; - typedef Matrix SquareMatrixType; - typedef Matrix DynMatrixType; - typedef DiagonalMatrix LeftDiagonalMatrix; - typedef DiagonalMatrix RightDiagonalMatrix; - typedef Matrix BigMatrix; - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols); - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows); - RowVectorType rv1 = RowVectorType::Random(cols), - rv2 = RowVectorType::Random(cols); - LeftDiagonalMatrix ldm1(v1), ldm2(v2); - RightDiagonalMatrix rdm1(rv1), rdm2(rv2); - - Scalar s1 = internal::random(); - - SquareMatrixType sq_m1 (v1.asDiagonal()); - VERIFY_IS_APPROX(sq_m1, v1.asDiagonal().toDenseMatrix()); - sq_m1 = v1.asDiagonal(); - VERIFY_IS_APPROX(sq_m1, v1.asDiagonal().toDenseMatrix()); - SquareMatrixType sq_m2 = v1.asDiagonal(); - VERIFY_IS_APPROX(sq_m1, sq_m2); - - ldm1 = v1.asDiagonal(); - LeftDiagonalMatrix ldm3(v1); - VERIFY_IS_APPROX(ldm1.diagonal(), ldm3.diagonal()); - LeftDiagonalMatrix ldm4 = v1.asDiagonal(); - VERIFY_IS_APPROX(ldm1.diagonal(), ldm4.diagonal()); - - sq_m1.block(0,0,rows,rows) = ldm1; - VERIFY_IS_APPROX(sq_m1, ldm1.toDenseMatrix()); - sq_m1.transpose() = ldm1; - VERIFY_IS_APPROX(sq_m1, ldm1.toDenseMatrix()); - - Index i = internal::random(0, rows-1); - Index j = internal::random(0, cols-1); - - VERIFY_IS_APPROX( ((ldm1 * m1)(i,j)) , ldm1.diagonal()(i) * m1(i,j) ); - VERIFY_IS_APPROX( ((ldm1 * (m1+m2))(i,j)) , ldm1.diagonal()(i) * (m1+m2)(i,j) ); - VERIFY_IS_APPROX( ((m1 * rdm1)(i,j)) , rdm1.diagonal()(j) * m1(i,j) ); - VERIFY_IS_APPROX( ((v1.asDiagonal() * m1)(i,j)) , v1(i) * m1(i,j) ); - VERIFY_IS_APPROX( ((m1 * rv1.asDiagonal())(i,j)) , rv1(j) * m1(i,j) ); - VERIFY_IS_APPROX( (((v1+v2).asDiagonal() * m1)(i,j)) , (v1+v2)(i) * m1(i,j) ); - VERIFY_IS_APPROX( (((v1+v2).asDiagonal() * (m1+m2))(i,j)) , (v1+v2)(i) * (m1+m2)(i,j) ); - VERIFY_IS_APPROX( ((m1 * (rv1+rv2).asDiagonal())(i,j)) , (rv1+rv2)(j) * m1(i,j) ); - VERIFY_IS_APPROX( (((m1+m2) * (rv1+rv2).asDiagonal())(i,j)) , (rv1+rv2)(j) * (m1+m2)(i,j) ); - - if(rows>1) - { - DynMatrixType tmp = m1.topRows(rows/2), res; - VERIFY_IS_APPROX( (res = m1.topRows(rows/2) * rv1.asDiagonal()), tmp * rv1.asDiagonal() ); - VERIFY_IS_APPROX( (res = v1.head(rows/2).asDiagonal()*m1.topRows(rows/2)), v1.head(rows/2).asDiagonal()*tmp ); - } - - BigMatrix big; - big.setZero(2*rows, 2*cols); - - big.block(i,j,rows,cols) = m1; - big.block(i,j,rows,cols) = v1.asDiagonal() * big.block(i,j,rows,cols); - - VERIFY_IS_APPROX((big.block(i,j,rows,cols)) , v1.asDiagonal() * m1 ); - - big.block(i,j,rows,cols) = m1; - big.block(i,j,rows,cols) = big.block(i,j,rows,cols) * rv1.asDiagonal(); - VERIFY_IS_APPROX((big.block(i,j,rows,cols)) , m1 * rv1.asDiagonal() ); - - - // scalar multiple - VERIFY_IS_APPROX(LeftDiagonalMatrix(ldm1*s1).diagonal(), ldm1.diagonal() * s1); - VERIFY_IS_APPROX(LeftDiagonalMatrix(s1*ldm1).diagonal(), s1 * ldm1.diagonal()); - - VERIFY_IS_APPROX(m1 * (rdm1 * s1), (m1 * rdm1) * s1); - VERIFY_IS_APPROX(m1 * (s1 * rdm1), (m1 * rdm1) * s1); - - // Diagonal to dense - sq_m1.setRandom(); - sq_m2 = sq_m1; - VERIFY_IS_APPROX( (sq_m1 += (s1*v1).asDiagonal()), sq_m2 += (s1*v1).asDiagonal().toDenseMatrix() ); - VERIFY_IS_APPROX( (sq_m1 -= (s1*v1).asDiagonal()), sq_m2 -= (s1*v1).asDiagonal().toDenseMatrix() ); - VERIFY_IS_APPROX( (sq_m1 = (s1*v1).asDiagonal()), (s1*v1).asDiagonal().toDenseMatrix() ); -} - -template -void bug987() -{ - Matrix3Xd points = Matrix3Xd::Random(3, 3); - Vector2d diag = Vector2d::Random(); - Matrix2Xd tmp1 = points.topRows<2>(), res1, res2; - VERIFY_IS_APPROX( res1 = diag.asDiagonal() * points.topRows<2>(), res2 = diag.asDiagonal() * tmp1 ); - Matrix2d tmp2 = points.topLeftCorner<2,2>(); - VERIFY_IS_APPROX(( res1 = points.topLeftCorner<2,2>()*diag.asDiagonal()) , res2 = tmp2*diag.asDiagonal() ); -} - -void test_diagonalmatrices() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( diagonalmatrices(Matrix()) ); - CALL_SUBTEST_2( diagonalmatrices(Matrix3f()) ); - CALL_SUBTEST_3( diagonalmatrices(Matrix()) ); - CALL_SUBTEST_4( diagonalmatrices(Matrix4d()) ); - CALL_SUBTEST_5( diagonalmatrices(Matrix()) ); - CALL_SUBTEST_6( diagonalmatrices(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_7( diagonalmatrices(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_8( diagonalmatrices(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_9( diagonalmatrices(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - CALL_SUBTEST_10( bug987<0>() ); -} diff --git a/testbed/nanogui/ext/eigen/test/dontalign.cpp b/testbed/nanogui/ext/eigen/test/dontalign.cpp deleted file mode 100644 index 4643cfed..00000000 --- a/testbed/nanogui/ext/eigen/test/dontalign.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#if defined EIGEN_TEST_PART_1 || defined EIGEN_TEST_PART_2 || defined EIGEN_TEST_PART_3 || defined EIGEN_TEST_PART_4 -#define EIGEN_DONT_ALIGN -#elif defined EIGEN_TEST_PART_5 || defined EIGEN_TEST_PART_6 || defined EIGEN_TEST_PART_7 || defined EIGEN_TEST_PART_8 -#define EIGEN_DONT_ALIGN_STATICALLY -#endif - -#include "main.h" -#include - -template -void dontalign(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - typedef Matrix SquareMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType a = MatrixType::Random(rows,cols); - SquareMatrixType square = SquareMatrixType::Random(rows,rows); - VectorType v = VectorType::Random(rows); - - VERIFY_IS_APPROX(v, square * square.colPivHouseholderQr().solve(v)); - square = square.inverse().eval(); - a = square * a; - square = square*square; - v = square * v; - v = a.adjoint() * v; - VERIFY(square.determinant() != Scalar(0)); - - // bug 219: MapAligned() was giving an assert with EIGEN_DONT_ALIGN, because Map Flags were miscomputed - Scalar* array = internal::aligned_new(rows); - v = VectorType::MapAligned(array, rows); - internal::aligned_delete(array, rows); -} - -void test_dontalign() -{ -#if defined EIGEN_TEST_PART_1 || defined EIGEN_TEST_PART_5 - dontalign(Matrix3d()); - dontalign(Matrix4f()); -#elif defined EIGEN_TEST_PART_2 || defined EIGEN_TEST_PART_6 - dontalign(Matrix3cd()); - dontalign(Matrix4cf()); -#elif defined EIGEN_TEST_PART_3 || defined EIGEN_TEST_PART_7 - dontalign(Matrix()); - dontalign(Matrix, 32, 32>()); -#elif defined EIGEN_TEST_PART_4 || defined EIGEN_TEST_PART_8 - dontalign(MatrixXd(32, 32)); - dontalign(MatrixXcf(32, 32)); -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/dynalloc.cpp b/testbed/nanogui/ext/eigen/test/dynalloc.cpp deleted file mode 100644 index f1cc70be..00000000 --- a/testbed/nanogui/ext/eigen/test/dynalloc.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#if EIGEN_MAX_ALIGN_BYTES>0 -#define ALIGNMENT EIGEN_MAX_ALIGN_BYTES -#else -#define ALIGNMENT 1 -#endif - -typedef Matrix Vector8f; - -void check_handmade_aligned_malloc() -{ - for(int i = 1; i < 1000; i++) - { - char *p = (char*)internal::handmade_aligned_malloc(i); - VERIFY(internal::UIntPtr(p)%ALIGNMENT==0); - // if the buffer is wrongly allocated this will give a bad write --> check with valgrind - for(int j = 0; j < i; j++) p[j]=0; - internal::handmade_aligned_free(p); - } -} - -void check_aligned_malloc() -{ - for(int i = ALIGNMENT; i < 1000; i++) - { - char *p = (char*)internal::aligned_malloc(i); - VERIFY(internal::UIntPtr(p)%ALIGNMENT==0); - // if the buffer is wrongly allocated this will give a bad write --> check with valgrind - for(int j = 0; j < i; j++) p[j]=0; - internal::aligned_free(p); - } -} - -void check_aligned_new() -{ - for(int i = ALIGNMENT; i < 1000; i++) - { - float *p = internal::aligned_new(i); - VERIFY(internal::UIntPtr(p)%ALIGNMENT==0); - // if the buffer is wrongly allocated this will give a bad write --> check with valgrind - for(int j = 0; j < i; j++) p[j]=0; - internal::aligned_delete(p,i); - } -} - -void check_aligned_stack_alloc() -{ - for(int i = ALIGNMENT; i < 400; i++) - { - ei_declare_aligned_stack_constructed_variable(float,p,i,0); - VERIFY(internal::UIntPtr(p)%ALIGNMENT==0); - // if the buffer is wrongly allocated this will give a bad write --> check with valgrind - for(int j = 0; j < i; j++) p[j]=0; - } -} - - -// test compilation with both a struct and a class... -struct MyStruct -{ - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - char dummychar; - Vector8f avec; -}; - -class MyClassA -{ - public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - char dummychar; - Vector8f avec; -}; - -template void check_dynaligned() -{ - // TODO have to be updated once we support multiple alignment values - if(T::SizeAtCompileTime % ALIGNMENT == 0) - { - T* obj = new T; - VERIFY(T::NeedsToAlign==1); - VERIFY(internal::UIntPtr(obj)%ALIGNMENT==0); - delete obj; - } -} - -template void check_custom_new_delete() -{ - { - T* t = new T; - delete t; - } - - { - std::size_t N = internal::random(1,10); - T* t = new T[N]; - delete[] t; - } - -#if EIGEN_MAX_ALIGN_BYTES>0 - { - T* t = static_cast((T::operator new)(sizeof(T))); - (T::operator delete)(t, sizeof(T)); - } - - { - T* t = static_cast((T::operator new)(sizeof(T))); - (T::operator delete)(t); - } -#endif -} - -void test_dynalloc() -{ - // low level dynamic memory allocation - CALL_SUBTEST(check_handmade_aligned_malloc()); - CALL_SUBTEST(check_aligned_malloc()); - CALL_SUBTEST(check_aligned_new()); - CALL_SUBTEST(check_aligned_stack_alloc()); - - for (int i=0; i() ); - CALL_SUBTEST( check_custom_new_delete() ); - CALL_SUBTEST( check_custom_new_delete() ); - CALL_SUBTEST( check_custom_new_delete() ); - } - - // check static allocation, who knows ? - #if EIGEN_MAX_STATIC_ALIGN_BYTES - for (int i=0; i() ); - CALL_SUBTEST(check_dynaligned() ); - CALL_SUBTEST(check_dynaligned() ); - CALL_SUBTEST(check_dynaligned() ); - CALL_SUBTEST(check_dynaligned() ); - CALL_SUBTEST(check_dynaligned() ); - } - - { - MyStruct foo0; VERIFY(internal::UIntPtr(foo0.avec.data())%ALIGNMENT==0); - MyClassA fooA; VERIFY(internal::UIntPtr(fooA.avec.data())%ALIGNMENT==0); - } - - // dynamic allocation, single object - for (int i=0; iavec.data())%ALIGNMENT==0); - MyClassA *fooA = new MyClassA(); VERIFY(internal::UIntPtr(fooA->avec.data())%ALIGNMENT==0); - delete foo0; - delete fooA; - } - - // dynamic allocation, array - const int N = 10; - for (int i=0; iavec.data())%ALIGNMENT==0); - MyClassA *fooA = new MyClassA[N]; VERIFY(internal::UIntPtr(fooA->avec.data())%ALIGNMENT==0); - delete[] foo0; - delete[] fooA; - } - #endif - -} diff --git a/testbed/nanogui/ext/eigen/test/eigen2support.cpp b/testbed/nanogui/ext/eigen/test/eigen2support.cpp deleted file mode 100644 index ad1d9809..00000000 --- a/testbed/nanogui/ext/eigen/test/eigen2support.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN2_SUPPORT - -#include "main.h" - -template void eigen2support(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m3(rows, cols); - - Scalar s1 = internal::random(), - s2 = internal::random(); - - // scalar addition - VERIFY_IS_APPROX(m1.cwise() + s1, s1 + m1.cwise()); - VERIFY_IS_APPROX(m1.cwise() + s1, MatrixType::Constant(rows,cols,s1) + m1); - VERIFY_IS_APPROX((m1*Scalar(2)).cwise() - s2, (m1+m1) - MatrixType::Constant(rows,cols,s2) ); - m3 = m1; - m3.cwise() += s2; - VERIFY_IS_APPROX(m3, m1.cwise() + s2); - m3 = m1; - m3.cwise() -= s1; - VERIFY_IS_APPROX(m3, m1.cwise() - s1); - - VERIFY_IS_EQUAL((m1.corner(TopLeft,1,1)), (m1.block(0,0,1,1))); - VERIFY_IS_EQUAL((m1.template corner<1,1>(TopLeft)), (m1.template block<1,1>(0,0))); - VERIFY_IS_EQUAL((m1.col(0).start(1)), (m1.col(0).segment(0,1))); - VERIFY_IS_EQUAL((m1.col(0).template start<1>()), (m1.col(0).segment(0,1))); - VERIFY_IS_EQUAL((m1.col(0).end(1)), (m1.col(0).segment(rows-1,1))); - VERIFY_IS_EQUAL((m1.col(0).template end<1>()), (m1.col(0).segment(rows-1,1))); - - using std::cos; - using numext::real; - using numext::abs2; - VERIFY_IS_EQUAL(ei_cos(s1), cos(s1)); - VERIFY_IS_EQUAL(ei_real(s1), real(s1)); - VERIFY_IS_EQUAL(ei_abs2(s1), abs2(s1)); - - m1.minor(0,0); -} - -void test_eigen2support() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( eigen2support(Matrix()) ); - CALL_SUBTEST_2( eigen2support(MatrixXd(1,1)) ); - CALL_SUBTEST_4( eigen2support(Matrix3f()) ); - CALL_SUBTEST_5( eigen2support(Matrix4d()) ); - CALL_SUBTEST_2( eigen2support(MatrixXf(200,200)) ); - CALL_SUBTEST_6( eigen2support(MatrixXcd(100,100)) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/eigensolver_complex.cpp b/testbed/nanogui/ext/eigen/test/eigensolver_complex.cpp deleted file mode 100644 index 293b1b26..00000000 --- a/testbed/nanogui/ext/eigen/test/eigensolver_complex.cpp +++ /dev/null @@ -1,177 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// Copyright (C) 2010 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -template bool find_pivot(typename MatrixType::Scalar tol, MatrixType &diffs, Index col=0) -{ - bool match = diffs.diagonal().sum() <= tol; - if(match || col==diffs.cols()) - { - return match; - } - else - { - Index n = diffs.cols(); - std::vector > transpositions; - for(Index i=col; i tol) - break; - - best_index += col; - - diffs.row(col).swap(diffs.row(best_index)); - if(find_pivot(tol,diffs,col+1)) return true; - diffs.row(col).swap(diffs.row(best_index)); - - // move current pivot to the end - diffs.row(n-(i-col)-1).swap(diffs.row(best_index)); - transpositions.push_back(std::pair(n-(i-col)-1,best_index)); - } - // restore - for(Index k=transpositions.size()-1; k>=0; --k) - diffs.row(transpositions[k].first).swap(diffs.row(transpositions[k].second)); - } - return false; -} - -/* Check that two column vectors are approximately equal upto permutations. - * Initially, this method checked that the k-th power sums are equal for all k = 1, ..., vec1.rows(), - * however this strategy is numerically inacurate because of numerical cancellation issues. - */ -template -void verify_is_approx_upto_permutation(const VectorType& vec1, const VectorType& vec2) -{ - typedef typename VectorType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - VERIFY(vec1.cols() == 1); - VERIFY(vec2.cols() == 1); - VERIFY(vec1.rows() == vec2.rows()); - - Index n = vec1.rows(); - RealScalar tol = test_precision()*test_precision()*numext::maxi(vec1.squaredNorm(),vec2.squaredNorm()); - Matrix diffs = (vec1.rowwise().replicate(n) - vec2.rowwise().replicate(n).transpose()).cwiseAbs2(); - - VERIFY( find_pivot(tol, diffs) ); -} - - -template void eigensolver(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - /* this test covers the following files: - ComplexEigenSolver.h, and indirectly ComplexSchur.h - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - MatrixType a = MatrixType::Random(rows,cols); - MatrixType symmA = a.adjoint() * a; - - ComplexEigenSolver ei0(symmA); - VERIFY_IS_EQUAL(ei0.info(), Success); - VERIFY_IS_APPROX(symmA * ei0.eigenvectors(), ei0.eigenvectors() * ei0.eigenvalues().asDiagonal()); - - ComplexEigenSolver ei1(a); - VERIFY_IS_EQUAL(ei1.info(), Success); - VERIFY_IS_APPROX(a * ei1.eigenvectors(), ei1.eigenvectors() * ei1.eigenvalues().asDiagonal()); - // Note: If MatrixType is real then a.eigenvalues() uses EigenSolver and thus - // another algorithm so results may differ slightly - verify_is_approx_upto_permutation(a.eigenvalues(), ei1.eigenvalues()); - - ComplexEigenSolver ei2; - ei2.setMaxIterations(ComplexSchur::m_maxIterationsPerRow * rows).compute(a); - VERIFY_IS_EQUAL(ei2.info(), Success); - VERIFY_IS_EQUAL(ei2.eigenvectors(), ei1.eigenvectors()); - VERIFY_IS_EQUAL(ei2.eigenvalues(), ei1.eigenvalues()); - if (rows > 2) { - ei2.setMaxIterations(1).compute(a); - VERIFY_IS_EQUAL(ei2.info(), NoConvergence); - VERIFY_IS_EQUAL(ei2.getMaxIterations(), 1); - } - - ComplexEigenSolver eiNoEivecs(a, false); - VERIFY_IS_EQUAL(eiNoEivecs.info(), Success); - VERIFY_IS_APPROX(ei1.eigenvalues(), eiNoEivecs.eigenvalues()); - - // Regression test for issue #66 - MatrixType z = MatrixType::Zero(rows,cols); - ComplexEigenSolver eiz(z); - VERIFY((eiz.eigenvalues().cwiseEqual(0)).all()); - - MatrixType id = MatrixType::Identity(rows, cols); - VERIFY_IS_APPROX(id.operatorNorm(), RealScalar(1)); - - if (rows > 1 && rows < 20) - { - // Test matrix with NaN - a(0,0) = std::numeric_limits::quiet_NaN(); - ComplexEigenSolver eiNaN(a); - VERIFY_IS_EQUAL(eiNaN.info(), NoConvergence); - } - - // regression test for bug 1098 - { - ComplexEigenSolver eig(a.adjoint() * a); - eig.compute(a.adjoint() * a); - } - - // regression test for bug 478 - { - a.setZero(); - ComplexEigenSolver ei3(a); - VERIFY_IS_EQUAL(ei3.info(), Success); - VERIFY_IS_MUCH_SMALLER_THAN(ei3.eigenvalues().norm(),RealScalar(1)); - VERIFY((ei3.eigenvectors().transpose()*ei3.eigenvectors().transpose()).eval().isIdentity()); - } -} - -template void eigensolver_verify_assert(const MatrixType& m) -{ - ComplexEigenSolver eig; - VERIFY_RAISES_ASSERT(eig.eigenvectors()); - VERIFY_RAISES_ASSERT(eig.eigenvalues()); - - MatrixType a = MatrixType::Random(m.rows(),m.cols()); - eig.compute(a, false); - VERIFY_RAISES_ASSERT(eig.eigenvectors()); -} - -void test_eigensolver_complex() -{ - int s = 0; - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( eigensolver(Matrix4cf()) ); - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_2( eigensolver(MatrixXcd(s,s)) ); - CALL_SUBTEST_3( eigensolver(Matrix, 1, 1>()) ); - CALL_SUBTEST_4( eigensolver(Matrix3f()) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } - CALL_SUBTEST_1( eigensolver_verify_assert(Matrix4cf()) ); - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXcd(s,s)) ); - CALL_SUBTEST_3( eigensolver_verify_assert(Matrix, 1, 1>()) ); - CALL_SUBTEST_4( eigensolver_verify_assert(Matrix3f()) ); - - // Test problem size constructors - CALL_SUBTEST_5(ComplexEigenSolver tmp(s)); - - TEST_SET_BUT_UNUSED_VARIABLE(s) -} diff --git a/testbed/nanogui/ext/eigen/test/eigensolver_generalized_real.cpp b/testbed/nanogui/ext/eigen/test/eigensolver_generalized_real.cpp deleted file mode 100644 index 9c0838ba..00000000 --- a/testbed/nanogui/ext/eigen/test/eigensolver_generalized_real.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012-2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_RUNTIME_NO_MALLOC -#include "main.h" -#include -#include -#include - -template void generalized_eigensolver_real(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - /* this test covers the following files: - GeneralizedEigenSolver.h - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef std::complex ComplexScalar; - typedef Matrix VectorType; - - MatrixType a = MatrixType::Random(rows,cols); - MatrixType b = MatrixType::Random(rows,cols); - MatrixType a1 = MatrixType::Random(rows,cols); - MatrixType b1 = MatrixType::Random(rows,cols); - MatrixType spdA = a.adjoint() * a + a1.adjoint() * a1; - MatrixType spdB = b.adjoint() * b + b1.adjoint() * b1; - - // lets compare to GeneralizedSelfAdjointEigenSolver - { - GeneralizedSelfAdjointEigenSolver symmEig(spdA, spdB); - GeneralizedEigenSolver eig(spdA, spdB); - - VERIFY_IS_EQUAL(eig.eigenvalues().imag().cwiseAbs().maxCoeff(), 0); - - VectorType realEigenvalues = eig.eigenvalues().real(); - std::sort(realEigenvalues.data(), realEigenvalues.data()+realEigenvalues.size()); - VERIFY_IS_APPROX(realEigenvalues, symmEig.eigenvalues()); - - // check eigenvectors - typename GeneralizedEigenSolver::EigenvectorsType D = eig.eigenvalues().asDiagonal(); - typename GeneralizedEigenSolver::EigenvectorsType V = eig.eigenvectors(); - VERIFY_IS_APPROX(spdA*V, spdB*V*D); - } - - // non symmetric case: - { - GeneralizedEigenSolver eig(rows); - // TODO enable full-prealocation of required memory, this probably requires an in-place mode for HessenbergDecomposition - //Eigen::internal::set_is_malloc_allowed(false); - eig.compute(a,b); - //Eigen::internal::set_is_malloc_allowed(true); - for(Index k=0; k tmp = (eig.betas()(k)*a).template cast() - eig.alphas()(k)*b; - if(tmp.size()>1 && tmp.norm()>(std::numeric_limits::min)()) - tmp /= tmp.norm(); - VERIFY_IS_MUCH_SMALLER_THAN( std::abs(tmp.determinant()), Scalar(1) ); - } - // check eigenvectors - typename GeneralizedEigenSolver::EigenvectorsType D = eig.eigenvalues().asDiagonal(); - typename GeneralizedEigenSolver::EigenvectorsType V = eig.eigenvectors(); - VERIFY_IS_APPROX(a*V, b*V*D); - } - - // regression test for bug 1098 - { - GeneralizedSelfAdjointEigenSolver eig1(a.adjoint() * a,b.adjoint() * b); - eig1.compute(a.adjoint() * a,b.adjoint() * b); - GeneralizedEigenSolver eig2(a.adjoint() * a,b.adjoint() * b); - eig2.compute(a.adjoint() * a,b.adjoint() * b); - } -} - -void test_eigensolver_generalized_real() -{ - for(int i = 0; i < g_repeat; i++) { - int s = 0; - CALL_SUBTEST_1( generalized_eigensolver_real(Matrix4f()) ); - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_2( generalized_eigensolver_real(MatrixXd(s,s)) ); - - // some trivial but implementation-wise special cases - CALL_SUBTEST_2( generalized_eigensolver_real(MatrixXd(1,1)) ); - CALL_SUBTEST_2( generalized_eigensolver_real(MatrixXd(2,2)) ); - CALL_SUBTEST_3( generalized_eigensolver_real(Matrix()) ); - CALL_SUBTEST_4( generalized_eigensolver_real(Matrix2d()) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } -} diff --git a/testbed/nanogui/ext/eigen/test/eigensolver_generic.cpp b/testbed/nanogui/ext/eigen/test/eigensolver_generic.cpp deleted file mode 100644 index d0e644d4..00000000 --- a/testbed/nanogui/ext/eigen/test/eigensolver_generic.cpp +++ /dev/null @@ -1,166 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2010,2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template void eigensolver(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - /* this test covers the following files: - EigenSolver.h - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix RealVectorType; - typedef typename std::complex::Real> Complex; - - MatrixType a = MatrixType::Random(rows,cols); - MatrixType a1 = MatrixType::Random(rows,cols); - MatrixType symmA = a.adjoint() * a + a1.adjoint() * a1; - - EigenSolver ei0(symmA); - VERIFY_IS_EQUAL(ei0.info(), Success); - VERIFY_IS_APPROX(symmA * ei0.pseudoEigenvectors(), ei0.pseudoEigenvectors() * ei0.pseudoEigenvalueMatrix()); - VERIFY_IS_APPROX((symmA.template cast()) * (ei0.pseudoEigenvectors().template cast()), - (ei0.pseudoEigenvectors().template cast()) * (ei0.eigenvalues().asDiagonal())); - - EigenSolver ei1(a); - VERIFY_IS_EQUAL(ei1.info(), Success); - VERIFY_IS_APPROX(a * ei1.pseudoEigenvectors(), ei1.pseudoEigenvectors() * ei1.pseudoEigenvalueMatrix()); - VERIFY_IS_APPROX(a.template cast() * ei1.eigenvectors(), - ei1.eigenvectors() * ei1.eigenvalues().asDiagonal()); - VERIFY_IS_APPROX(ei1.eigenvectors().colwise().norm(), RealVectorType::Ones(rows).transpose()); - VERIFY_IS_APPROX(a.eigenvalues(), ei1.eigenvalues()); - - EigenSolver ei2; - ei2.setMaxIterations(RealSchur::m_maxIterationsPerRow * rows).compute(a); - VERIFY_IS_EQUAL(ei2.info(), Success); - VERIFY_IS_EQUAL(ei2.eigenvectors(), ei1.eigenvectors()); - VERIFY_IS_EQUAL(ei2.eigenvalues(), ei1.eigenvalues()); - if (rows > 2) { - ei2.setMaxIterations(1).compute(a); - VERIFY_IS_EQUAL(ei2.info(), NoConvergence); - VERIFY_IS_EQUAL(ei2.getMaxIterations(), 1); - } - - EigenSolver eiNoEivecs(a, false); - VERIFY_IS_EQUAL(eiNoEivecs.info(), Success); - VERIFY_IS_APPROX(ei1.eigenvalues(), eiNoEivecs.eigenvalues()); - VERIFY_IS_APPROX(ei1.pseudoEigenvalueMatrix(), eiNoEivecs.pseudoEigenvalueMatrix()); - - MatrixType id = MatrixType::Identity(rows, cols); - VERIFY_IS_APPROX(id.operatorNorm(), RealScalar(1)); - - if (rows > 2 && rows < 20) - { - // Test matrix with NaN - a(0,0) = std::numeric_limits::quiet_NaN(); - EigenSolver eiNaN(a); - VERIFY_IS_EQUAL(eiNaN.info(), NoConvergence); - } - - // regression test for bug 1098 - { - EigenSolver eig(a.adjoint() * a); - eig.compute(a.adjoint() * a); - } - - // regression test for bug 478 - { - a.setZero(); - EigenSolver ei3(a); - VERIFY_IS_EQUAL(ei3.info(), Success); - VERIFY_IS_MUCH_SMALLER_THAN(ei3.eigenvalues().norm(),RealScalar(1)); - VERIFY((ei3.eigenvectors().transpose()*ei3.eigenvectors().transpose()).eval().isIdentity()); - } -} - -template void eigensolver_verify_assert(const MatrixType& m) -{ - EigenSolver eig; - VERIFY_RAISES_ASSERT(eig.eigenvectors()); - VERIFY_RAISES_ASSERT(eig.pseudoEigenvectors()); - VERIFY_RAISES_ASSERT(eig.pseudoEigenvalueMatrix()); - VERIFY_RAISES_ASSERT(eig.eigenvalues()); - - MatrixType a = MatrixType::Random(m.rows(),m.cols()); - eig.compute(a, false); - VERIFY_RAISES_ASSERT(eig.eigenvectors()); - VERIFY_RAISES_ASSERT(eig.pseudoEigenvectors()); -} - -void test_eigensolver_generic() -{ - int s = 0; - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( eigensolver(Matrix4f()) ); - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_2( eigensolver(MatrixXd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - // some trivial but implementation-wise tricky cases - CALL_SUBTEST_2( eigensolver(MatrixXd(1,1)) ); - CALL_SUBTEST_2( eigensolver(MatrixXd(2,2)) ); - CALL_SUBTEST_3( eigensolver(Matrix()) ); - CALL_SUBTEST_4( eigensolver(Matrix2d()) ); - } - - CALL_SUBTEST_1( eigensolver_verify_assert(Matrix4f()) ); - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_2( eigensolver_verify_assert(MatrixXd(s,s)) ); - CALL_SUBTEST_3( eigensolver_verify_assert(Matrix()) ); - CALL_SUBTEST_4( eigensolver_verify_assert(Matrix2d()) ); - - // Test problem size constructors - CALL_SUBTEST_5(EigenSolver tmp(s)); - - // regression test for bug 410 - CALL_SUBTEST_2( - { - MatrixXd A(1,1); - A(0,0) = std::sqrt(-1.); // is Not-a-Number - Eigen::EigenSolver solver(A); - VERIFY_IS_EQUAL(solver.info(), NumericalIssue); - } - ); - -#ifdef EIGEN_TEST_PART_2 - { - // regression test for bug 793 - MatrixXd a(3,3); - a << 0, 0, 1, - 1, 1, 1, - 1, 1e+200, 1; - Eigen::EigenSolver eig(a); - double scale = 1e-200; // scale to avoid overflow during the comparisons - VERIFY_IS_APPROX(a * eig.pseudoEigenvectors()*scale, eig.pseudoEigenvectors() * eig.pseudoEigenvalueMatrix()*scale); - VERIFY_IS_APPROX(a * eig.eigenvectors()*scale, eig.eigenvectors() * eig.eigenvalues().asDiagonal()*scale); - } - { - // check a case where all eigenvalues are null. - MatrixXd a(2,2); - a << 1, 1, - -1, -1; - Eigen::EigenSolver eig(a); - VERIFY_IS_APPROX(eig.pseudoEigenvectors().squaredNorm(), 2.); - VERIFY_IS_APPROX((a * eig.pseudoEigenvectors()).norm()+1., 1.); - VERIFY_IS_APPROX((eig.pseudoEigenvectors() * eig.pseudoEigenvalueMatrix()).norm()+1., 1.); - VERIFY_IS_APPROX((a * eig.eigenvectors()).norm()+1., 1.); - VERIFY_IS_APPROX((eig.eigenvectors() * eig.eigenvalues().asDiagonal()).norm()+1., 1.); - } -#endif - - TEST_SET_BUT_UNUSED_VARIABLE(s) -} diff --git a/testbed/nanogui/ext/eigen/test/eigensolver_selfadjoint.cpp b/testbed/nanogui/ext/eigen/test/eigensolver_selfadjoint.cpp deleted file mode 100644 index 39ad4130..00000000 --- a/testbed/nanogui/ext/eigen/test/eigensolver_selfadjoint.cpp +++ /dev/null @@ -1,274 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2010 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include "svd_fill.h" -#include -#include -#include - - -template void selfadjointeigensolver_essential_check(const MatrixType& m) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - RealScalar eival_eps = numext::mini(test_precision(), NumTraits::dummy_precision()*20000); - - SelfAdjointEigenSolver eiSymm(m); - VERIFY_IS_EQUAL(eiSymm.info(), Success); - - RealScalar scaling = m.cwiseAbs().maxCoeff(); - - if(scaling<(std::numeric_limits::min)()) - { - VERIFY(eiSymm.eigenvalues().cwiseAbs().maxCoeff() <= (std::numeric_limits::min)()); - } - else - { - VERIFY_IS_APPROX((m.template selfadjointView() * eiSymm.eigenvectors())/scaling, - (eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal())/scaling); - } - VERIFY_IS_APPROX(m.template selfadjointView().eigenvalues(), eiSymm.eigenvalues()); - VERIFY_IS_UNITARY(eiSymm.eigenvectors()); - - if(m.cols()<=4) - { - SelfAdjointEigenSolver eiDirect; - eiDirect.computeDirect(m); - VERIFY_IS_EQUAL(eiDirect.info(), Success); - if(! eiSymm.eigenvalues().isApprox(eiDirect.eigenvalues(), eival_eps) ) - { - std::cerr << "reference eigenvalues: " << eiSymm.eigenvalues().transpose() << "\n" - << "obtained eigenvalues: " << eiDirect.eigenvalues().transpose() << "\n" - << "diff: " << (eiSymm.eigenvalues()-eiDirect.eigenvalues()).transpose() << "\n" - << "error (eps): " << (eiSymm.eigenvalues()-eiDirect.eigenvalues()).norm() / eiSymm.eigenvalues().norm() << " (" << eival_eps << ")\n"; - } - if(scaling<(std::numeric_limits::min)()) - { - VERIFY(eiDirect.eigenvalues().cwiseAbs().maxCoeff() <= (std::numeric_limits::min)()); - } - else - { - VERIFY_IS_APPROX(eiSymm.eigenvalues()/scaling, eiDirect.eigenvalues()/scaling); - VERIFY_IS_APPROX((m.template selfadjointView() * eiDirect.eigenvectors())/scaling, - (eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal())/scaling); - VERIFY_IS_APPROX(m.template selfadjointView().eigenvalues()/scaling, eiDirect.eigenvalues()/scaling); - } - - VERIFY_IS_UNITARY(eiDirect.eigenvectors()); - } -} - -template void selfadjointeigensolver(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - /* this test covers the following files: - EigenSolver.h, SelfAdjointEigenSolver.h (and indirectly: Tridiagonalization.h) - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - RealScalar largerEps = 10*test_precision(); - - MatrixType a = MatrixType::Random(rows,cols); - MatrixType a1 = MatrixType::Random(rows,cols); - MatrixType symmA = a.adjoint() * a + a1.adjoint() * a1; - MatrixType symmC = symmA; - - svd_fill_random(symmA,Symmetric); - - symmA.template triangularView().setZero(); - symmC.template triangularView().setZero(); - - MatrixType b = MatrixType::Random(rows,cols); - MatrixType b1 = MatrixType::Random(rows,cols); - MatrixType symmB = b.adjoint() * b + b1.adjoint() * b1; - symmB.template triangularView().setZero(); - - CALL_SUBTEST( selfadjointeigensolver_essential_check(symmA) ); - - SelfAdjointEigenSolver eiSymm(symmA); - // generalized eigen pb - GeneralizedSelfAdjointEigenSolver eiSymmGen(symmC, symmB); - - SelfAdjointEigenSolver eiSymmNoEivecs(symmA, false); - VERIFY_IS_EQUAL(eiSymmNoEivecs.info(), Success); - VERIFY_IS_APPROX(eiSymm.eigenvalues(), eiSymmNoEivecs.eigenvalues()); - - // generalized eigen problem Ax = lBx - eiSymmGen.compute(symmC, symmB,Ax_lBx); - VERIFY_IS_EQUAL(eiSymmGen.info(), Success); - VERIFY((symmC.template selfadjointView() * eiSymmGen.eigenvectors()).isApprox( - symmB.template selfadjointView() * (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps)); - - // generalized eigen problem BAx = lx - eiSymmGen.compute(symmC, symmB,BAx_lx); - VERIFY_IS_EQUAL(eiSymmGen.info(), Success); - VERIFY((symmB.template selfadjointView() * (symmC.template selfadjointView() * eiSymmGen.eigenvectors())).isApprox( - (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps)); - - // generalized eigen problem ABx = lx - eiSymmGen.compute(symmC, symmB,ABx_lx); - VERIFY_IS_EQUAL(eiSymmGen.info(), Success); - VERIFY((symmC.template selfadjointView() * (symmB.template selfadjointView() * eiSymmGen.eigenvectors())).isApprox( - (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal()), largerEps)); - - - eiSymm.compute(symmC); - MatrixType sqrtSymmA = eiSymm.operatorSqrt(); - VERIFY_IS_APPROX(MatrixType(symmC.template selfadjointView()), sqrtSymmA*sqrtSymmA); - VERIFY_IS_APPROX(sqrtSymmA, symmC.template selfadjointView()*eiSymm.operatorInverseSqrt()); - - MatrixType id = MatrixType::Identity(rows, cols); - VERIFY_IS_APPROX(id.template selfadjointView().operatorNorm(), RealScalar(1)); - - SelfAdjointEigenSolver eiSymmUninitialized; - VERIFY_RAISES_ASSERT(eiSymmUninitialized.info()); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvalues()); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvectors()); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorSqrt()); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorInverseSqrt()); - - eiSymmUninitialized.compute(symmA, false); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvectors()); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorSqrt()); - VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorInverseSqrt()); - - // test Tridiagonalization's methods - Tridiagonalization tridiag(symmC); - VERIFY_IS_APPROX(tridiag.diagonal(), tridiag.matrixT().diagonal()); - VERIFY_IS_APPROX(tridiag.subDiagonal(), tridiag.matrixT().template diagonal<-1>()); - Matrix T = tridiag.matrixT(); - if(rows>1 && cols>1) { - // FIXME check that upper and lower part are 0: - //VERIFY(T.topRightCorner(rows-2, cols-2).template triangularView().isZero()); - } - VERIFY_IS_APPROX(tridiag.diagonal(), T.diagonal()); - VERIFY_IS_APPROX(tridiag.subDiagonal(), T.template diagonal<1>()); - VERIFY_IS_APPROX(MatrixType(symmC.template selfadjointView()), tridiag.matrixQ() * tridiag.matrixT().eval() * MatrixType(tridiag.matrixQ()).adjoint()); - VERIFY_IS_APPROX(MatrixType(symmC.template selfadjointView()), tridiag.matrixQ() * tridiag.matrixT() * tridiag.matrixQ().adjoint()); - - // Test computation of eigenvalues from tridiagonal matrix - if(rows > 1) - { - SelfAdjointEigenSolver eiSymmTridiag; - eiSymmTridiag.computeFromTridiagonal(tridiag.matrixT().diagonal(), tridiag.matrixT().diagonal(-1), ComputeEigenvectors); - VERIFY_IS_APPROX(eiSymm.eigenvalues(), eiSymmTridiag.eigenvalues()); - VERIFY_IS_APPROX(tridiag.matrixT(), eiSymmTridiag.eigenvectors().real() * eiSymmTridiag.eigenvalues().asDiagonal() * eiSymmTridiag.eigenvectors().real().transpose()); - } - - if (rows > 1 && rows < 20) - { - // Test matrix with NaN - symmC(0,0) = std::numeric_limits::quiet_NaN(); - SelfAdjointEigenSolver eiSymmNaN(symmC); - VERIFY_IS_EQUAL(eiSymmNaN.info(), NoConvergence); - } - - // regression test for bug 1098 - { - SelfAdjointEigenSolver eig(a.adjoint() * a); - eig.compute(a.adjoint() * a); - } - - // regression test for bug 478 - { - a.setZero(); - SelfAdjointEigenSolver ei3(a); - VERIFY_IS_EQUAL(ei3.info(), Success); - VERIFY_IS_MUCH_SMALLER_THAN(ei3.eigenvalues().norm(),RealScalar(1)); - VERIFY((ei3.eigenvectors().transpose()*ei3.eigenvectors().transpose()).eval().isIdentity()); - } -} - -template -void bug_854() -{ - Matrix3d m; - m << 850.961, 51.966, 0, - 51.966, 254.841, 0, - 0, 0, 0; - selfadjointeigensolver_essential_check(m); -} - -template -void bug_1014() -{ - Matrix3d m; - m << 0.11111111111111114658, 0, 0, - 0, 0.11111111111111109107, 0, - 0, 0, 0.11111111111111107719; - selfadjointeigensolver_essential_check(m); -} - -template -void bug_1225() -{ - Matrix3d m1, m2; - m1.setRandom(); - m1 = m1*m1.transpose(); - m2 = m1.triangularView(); - SelfAdjointEigenSolver eig1(m1); - SelfAdjointEigenSolver eig2(m2.selfadjointView()); - VERIFY_IS_APPROX(eig1.eigenvalues(), eig2.eigenvalues()); -} - -template -void bug_1204() -{ - SparseMatrix A(2,2); - A.setIdentity(); - SelfAdjointEigenSolver > eig(A); -} - -void test_eigensolver_selfadjoint() -{ - int s = 0; - for(int i = 0; i < g_repeat; i++) { - // trivial test for 1x1 matrices: - CALL_SUBTEST_1( selfadjointeigensolver(Matrix())); - CALL_SUBTEST_1( selfadjointeigensolver(Matrix())); - // very important to test 3x3 and 2x2 matrices since we provide special paths for them - CALL_SUBTEST_12( selfadjointeigensolver(Matrix2f()) ); - CALL_SUBTEST_12( selfadjointeigensolver(Matrix2d()) ); - CALL_SUBTEST_13( selfadjointeigensolver(Matrix3f()) ); - CALL_SUBTEST_13( selfadjointeigensolver(Matrix3d()) ); - CALL_SUBTEST_2( selfadjointeigensolver(Matrix4d()) ); - - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_3( selfadjointeigensolver(MatrixXf(s,s)) ); - CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(s,s)) ); - CALL_SUBTEST_5( selfadjointeigensolver(MatrixXcd(s,s)) ); - CALL_SUBTEST_9( selfadjointeigensolver(Matrix,Dynamic,Dynamic,RowMajor>(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - // some trivial but implementation-wise tricky cases - CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(1,1)) ); - CALL_SUBTEST_4( selfadjointeigensolver(MatrixXd(2,2)) ); - CALL_SUBTEST_6( selfadjointeigensolver(Matrix()) ); - CALL_SUBTEST_7( selfadjointeigensolver(Matrix()) ); - } - - CALL_SUBTEST_13( bug_854<0>() ); - CALL_SUBTEST_13( bug_1014<0>() ); - CALL_SUBTEST_13( bug_1204<0>() ); - CALL_SUBTEST_13( bug_1225<0>() ); - - // Test problem size constructors - s = internal::random(1,EIGEN_TEST_MAX_SIZE/4); - CALL_SUBTEST_8(SelfAdjointEigenSolver tmp1(s)); - CALL_SUBTEST_8(Tridiagonalization tmp2(s)); - - TEST_SET_BUT_UNUSED_VARIABLE(s) -} - diff --git a/testbed/nanogui/ext/eigen/test/evaluator_common.h b/testbed/nanogui/ext/eigen/test/evaluator_common.h deleted file mode 100644 index e69de29b..00000000 diff --git a/testbed/nanogui/ext/eigen/test/evaluators.cpp b/testbed/nanogui/ext/eigen/test/evaluators.cpp deleted file mode 100644 index aed5a05a..00000000 --- a/testbed/nanogui/ext/eigen/test/evaluators.cpp +++ /dev/null @@ -1,499 +0,0 @@ - -#include "main.h" - -namespace Eigen { - - template - const Product - prod(const Lhs& lhs, const Rhs& rhs) - { - return Product(lhs,rhs); - } - - template - const Product - lazyprod(const Lhs& lhs, const Rhs& rhs) - { - return Product(lhs,rhs); - } - - template - EIGEN_STRONG_INLINE - DstXprType& copy_using_evaluator(const EigenBase &dst, const SrcXprType &src) - { - call_assignment(dst.const_cast_derived(), src.derived(), internal::assign_op()); - return dst.const_cast_derived(); - } - - template class StorageBase, typename SrcXprType> - EIGEN_STRONG_INLINE - const DstXprType& copy_using_evaluator(const NoAlias& dst, const SrcXprType &src) - { - call_assignment(dst, src.derived(), internal::assign_op()); - return dst.expression(); - } - - template - EIGEN_STRONG_INLINE - DstXprType& copy_using_evaluator(const PlainObjectBase &dst, const SrcXprType &src) - { - #ifdef EIGEN_NO_AUTOMATIC_RESIZING - eigen_assert((dst.size()==0 || (IsVectorAtCompileTime ? (dst.size() == src.size()) - : (dst.rows() == src.rows() && dst.cols() == src.cols()))) - && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined"); - #else - dst.const_cast_derived().resizeLike(src.derived()); - #endif - - call_assignment(dst.const_cast_derived(), src.derived(), internal::assign_op()); - return dst.const_cast_derived(); - } - - template - void add_assign_using_evaluator(const DstXprType& dst, const SrcXprType& src) - { - typedef typename DstXprType::Scalar Scalar; - call_assignment(const_cast(dst), src.derived(), internal::add_assign_op()); - } - - template - void subtract_assign_using_evaluator(const DstXprType& dst, const SrcXprType& src) - { - typedef typename DstXprType::Scalar Scalar; - call_assignment(const_cast(dst), src.derived(), internal::sub_assign_op()); - } - - template - void multiply_assign_using_evaluator(const DstXprType& dst, const SrcXprType& src) - { - typedef typename DstXprType::Scalar Scalar; - call_assignment(dst.const_cast_derived(), src.derived(), internal::mul_assign_op()); - } - - template - void divide_assign_using_evaluator(const DstXprType& dst, const SrcXprType& src) - { - typedef typename DstXprType::Scalar Scalar; - call_assignment(dst.const_cast_derived(), src.derived(), internal::div_assign_op()); - } - - template - void swap_using_evaluator(const DstXprType& dst, const SrcXprType& src) - { - typedef typename DstXprType::Scalar Scalar; - call_assignment(dst.const_cast_derived(), src.const_cast_derived(), internal::swap_assign_op()); - } - - namespace internal { - template class StorageBase, typename Src, typename Func> - EIGEN_DEVICE_FUNC void call_assignment(const NoAlias& dst, const Src& src, const Func& func) - { - call_assignment_no_alias(dst.expression(), src, func); - } - } - -} - -template long get_cost(const XprType& ) { return Eigen::internal::evaluator::CoeffReadCost; } - -using namespace std; - -#define VERIFY_IS_APPROX_EVALUATOR(DEST,EXPR) VERIFY_IS_APPROX(copy_using_evaluator(DEST,(EXPR)), (EXPR).eval()); -#define VERIFY_IS_APPROX_EVALUATOR2(DEST,EXPR,REF) VERIFY_IS_APPROX(copy_using_evaluator(DEST,(EXPR)), (REF).eval()); - -void test_evaluators() -{ - // Testing Matrix evaluator and Transpose - Vector2d v = Vector2d::Random(); - const Vector2d v_const(v); - Vector2d v2; - RowVector2d w; - - VERIFY_IS_APPROX_EVALUATOR(v2, v); - VERIFY_IS_APPROX_EVALUATOR(v2, v_const); - - // Testing Transpose - VERIFY_IS_APPROX_EVALUATOR(w, v.transpose()); // Transpose as rvalue - VERIFY_IS_APPROX_EVALUATOR(w, v_const.transpose()); - - copy_using_evaluator(w.transpose(), v); // Transpose as lvalue - VERIFY_IS_APPROX(w,v.transpose().eval()); - - copy_using_evaluator(w.transpose(), v_const); - VERIFY_IS_APPROX(w,v_const.transpose().eval()); - - // Testing Array evaluator - { - ArrayXXf a(2,3); - ArrayXXf b(3,2); - a << 1,2,3, 4,5,6; - const ArrayXXf a_const(a); - - VERIFY_IS_APPROX_EVALUATOR(b, a.transpose()); - - VERIFY_IS_APPROX_EVALUATOR(b, a_const.transpose()); - - // Testing CwiseNullaryOp evaluator - copy_using_evaluator(w, RowVector2d::Random()); - VERIFY((w.array() >= -1).all() && (w.array() <= 1).all()); // not easy to test ... - - VERIFY_IS_APPROX_EVALUATOR(w, RowVector2d::Zero()); - - VERIFY_IS_APPROX_EVALUATOR(w, RowVector2d::Constant(3)); - - // mix CwiseNullaryOp and transpose - VERIFY_IS_APPROX_EVALUATOR(w, Vector2d::Zero().transpose()); - } - - { - // test product expressions - int s = internal::random(1,100); - MatrixXf a(s,s), b(s,s), c(s,s), d(s,s); - a.setRandom(); - b.setRandom(); - c.setRandom(); - d.setRandom(); - VERIFY_IS_APPROX_EVALUATOR(d, (a + b)); - VERIFY_IS_APPROX_EVALUATOR(d, (a + b).transpose()); - VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b), a*b); - VERIFY_IS_APPROX_EVALUATOR2(d.noalias(), prod(a,b), a*b); - VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b) + c, a*b + c); - VERIFY_IS_APPROX_EVALUATOR2(d, s * prod(a,b), s * a*b); - VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b).transpose(), (a*b).transpose()); - VERIFY_IS_APPROX_EVALUATOR2(d, prod(a,b) + prod(b,c), a*b + b*c); - - // check that prod works even with aliasing present - c = a*a; - copy_using_evaluator(a, prod(a,a)); - VERIFY_IS_APPROX(a,c); - - // check compound assignment of products - d = c; - add_assign_using_evaluator(c.noalias(), prod(a,b)); - d.noalias() += a*b; - VERIFY_IS_APPROX(c, d); - - d = c; - subtract_assign_using_evaluator(c.noalias(), prod(a,b)); - d.noalias() -= a*b; - VERIFY_IS_APPROX(c, d); - } - - { - // test product with all possible sizes - int s = internal::random(1,100); - Matrix m11, res11; m11.setRandom(1,1); - Matrix m14, res14; m14.setRandom(1,4); - Matrix m1X, res1X; m1X.setRandom(1,s); - Matrix m41, res41; m41.setRandom(4,1); - Matrix m44, res44; m44.setRandom(4,4); - Matrix m4X, res4X; m4X.setRandom(4,s); - Matrix mX1, resX1; mX1.setRandom(s,1); - Matrix mX4, resX4; mX4.setRandom(s,4); - Matrix mXX, resXX; mXX.setRandom(s,s); - - VERIFY_IS_APPROX_EVALUATOR2(res11, prod(m11,m11), m11*m11); - VERIFY_IS_APPROX_EVALUATOR2(res11, prod(m14,m41), m14*m41); - VERIFY_IS_APPROX_EVALUATOR2(res11, prod(m1X,mX1), m1X*mX1); - VERIFY_IS_APPROX_EVALUATOR2(res14, prod(m11,m14), m11*m14); - VERIFY_IS_APPROX_EVALUATOR2(res14, prod(m14,m44), m14*m44); - VERIFY_IS_APPROX_EVALUATOR2(res14, prod(m1X,mX4), m1X*mX4); - VERIFY_IS_APPROX_EVALUATOR2(res1X, prod(m11,m1X), m11*m1X); - VERIFY_IS_APPROX_EVALUATOR2(res1X, prod(m14,m4X), m14*m4X); - VERIFY_IS_APPROX_EVALUATOR2(res1X, prod(m1X,mXX), m1X*mXX); - VERIFY_IS_APPROX_EVALUATOR2(res41, prod(m41,m11), m41*m11); - VERIFY_IS_APPROX_EVALUATOR2(res41, prod(m44,m41), m44*m41); - VERIFY_IS_APPROX_EVALUATOR2(res41, prod(m4X,mX1), m4X*mX1); - VERIFY_IS_APPROX_EVALUATOR2(res44, prod(m41,m14), m41*m14); - VERIFY_IS_APPROX_EVALUATOR2(res44, prod(m44,m44), m44*m44); - VERIFY_IS_APPROX_EVALUATOR2(res44, prod(m4X,mX4), m4X*mX4); - VERIFY_IS_APPROX_EVALUATOR2(res4X, prod(m41,m1X), m41*m1X); - VERIFY_IS_APPROX_EVALUATOR2(res4X, prod(m44,m4X), m44*m4X); - VERIFY_IS_APPROX_EVALUATOR2(res4X, prod(m4X,mXX), m4X*mXX); - VERIFY_IS_APPROX_EVALUATOR2(resX1, prod(mX1,m11), mX1*m11); - VERIFY_IS_APPROX_EVALUATOR2(resX1, prod(mX4,m41), mX4*m41); - VERIFY_IS_APPROX_EVALUATOR2(resX1, prod(mXX,mX1), mXX*mX1); - VERIFY_IS_APPROX_EVALUATOR2(resX4, prod(mX1,m14), mX1*m14); - VERIFY_IS_APPROX_EVALUATOR2(resX4, prod(mX4,m44), mX4*m44); - VERIFY_IS_APPROX_EVALUATOR2(resX4, prod(mXX,mX4), mXX*mX4); - VERIFY_IS_APPROX_EVALUATOR2(resXX, prod(mX1,m1X), mX1*m1X); - VERIFY_IS_APPROX_EVALUATOR2(resXX, prod(mX4,m4X), mX4*m4X); - VERIFY_IS_APPROX_EVALUATOR2(resXX, prod(mXX,mXX), mXX*mXX); - } - - { - ArrayXXf a(2,3); - ArrayXXf b(3,2); - a << 1,2,3, 4,5,6; - const ArrayXXf a_const(a); - - // this does not work because Random is eval-before-nested: - // copy_using_evaluator(w, Vector2d::Random().transpose()); - - // test CwiseUnaryOp - VERIFY_IS_APPROX_EVALUATOR(v2, 3 * v); - VERIFY_IS_APPROX_EVALUATOR(w, (3 * v).transpose()); - VERIFY_IS_APPROX_EVALUATOR(b, (a + 3).transpose()); - VERIFY_IS_APPROX_EVALUATOR(b, (2 * a_const + 3).transpose()); - - // test CwiseBinaryOp - VERIFY_IS_APPROX_EVALUATOR(v2, v + Vector2d::Ones()); - VERIFY_IS_APPROX_EVALUATOR(w, (v + Vector2d::Ones()).transpose().cwiseProduct(RowVector2d::Constant(3))); - - // dynamic matrices and arrays - MatrixXd mat1(6,6), mat2(6,6); - VERIFY_IS_APPROX_EVALUATOR(mat1, MatrixXd::Identity(6,6)); - VERIFY_IS_APPROX_EVALUATOR(mat2, mat1); - copy_using_evaluator(mat2.transpose(), mat1); - VERIFY_IS_APPROX(mat2.transpose(), mat1); - - ArrayXXd arr1(6,6), arr2(6,6); - VERIFY_IS_APPROX_EVALUATOR(arr1, ArrayXXd::Constant(6,6, 3.0)); - VERIFY_IS_APPROX_EVALUATOR(arr2, arr1); - - // test automatic resizing - mat2.resize(3,3); - VERIFY_IS_APPROX_EVALUATOR(mat2, mat1); - arr2.resize(9,9); - VERIFY_IS_APPROX_EVALUATOR(arr2, arr1); - - // test direct traversal - Matrix3f m3; - Array33f a3; - VERIFY_IS_APPROX_EVALUATOR(m3, Matrix3f::Identity()); // matrix, nullary - // TODO: find a way to test direct traversal with array - VERIFY_IS_APPROX_EVALUATOR(m3.transpose(), Matrix3f::Identity().transpose()); // transpose - VERIFY_IS_APPROX_EVALUATOR(m3, 2 * Matrix3f::Identity()); // unary - VERIFY_IS_APPROX_EVALUATOR(m3, Matrix3f::Identity() + Matrix3f::Zero()); // binary - VERIFY_IS_APPROX_EVALUATOR(m3.block(0,0,2,2), Matrix3f::Identity().block(1,1,2,2)); // block - - // test linear traversal - VERIFY_IS_APPROX_EVALUATOR(m3, Matrix3f::Zero()); // matrix, nullary - VERIFY_IS_APPROX_EVALUATOR(a3, Array33f::Zero()); // array - VERIFY_IS_APPROX_EVALUATOR(m3.transpose(), Matrix3f::Zero().transpose()); // transpose - VERIFY_IS_APPROX_EVALUATOR(m3, 2 * Matrix3f::Zero()); // unary - VERIFY_IS_APPROX_EVALUATOR(m3, Matrix3f::Zero() + m3); // binary - - // test inner vectorization - Matrix4f m4, m4src = Matrix4f::Random(); - Array44f a4, a4src = Matrix4f::Random(); - VERIFY_IS_APPROX_EVALUATOR(m4, m4src); // matrix - VERIFY_IS_APPROX_EVALUATOR(a4, a4src); // array - VERIFY_IS_APPROX_EVALUATOR(m4.transpose(), m4src.transpose()); // transpose - // TODO: find out why Matrix4f::Zero() does not allow inner vectorization - VERIFY_IS_APPROX_EVALUATOR(m4, 2 * m4src); // unary - VERIFY_IS_APPROX_EVALUATOR(m4, m4src + m4src); // binary - - // test linear vectorization - MatrixXf mX(6,6), mXsrc = MatrixXf::Random(6,6); - ArrayXXf aX(6,6), aXsrc = ArrayXXf::Random(6,6); - VERIFY_IS_APPROX_EVALUATOR(mX, mXsrc); // matrix - VERIFY_IS_APPROX_EVALUATOR(aX, aXsrc); // array - VERIFY_IS_APPROX_EVALUATOR(mX.transpose(), mXsrc.transpose()); // transpose - VERIFY_IS_APPROX_EVALUATOR(mX, MatrixXf::Zero(6,6)); // nullary - VERIFY_IS_APPROX_EVALUATOR(mX, 2 * mXsrc); // unary - VERIFY_IS_APPROX_EVALUATOR(mX, mXsrc + mXsrc); // binary - - // test blocks and slice vectorization - VERIFY_IS_APPROX_EVALUATOR(m4, (mXsrc.block<4,4>(1,0))); - VERIFY_IS_APPROX_EVALUATOR(aX, ArrayXXf::Constant(10, 10, 3.0).block(2, 3, 6, 6)); - - Matrix4f m4ref = m4; - copy_using_evaluator(m4.block(1, 1, 2, 3), m3.bottomRows(2)); - m4ref.block(1, 1, 2, 3) = m3.bottomRows(2); - VERIFY_IS_APPROX(m4, m4ref); - - mX.setIdentity(20,20); - MatrixXf mXref = MatrixXf::Identity(20,20); - mXsrc = MatrixXf::Random(9,12); - copy_using_evaluator(mX.block(4, 4, 9, 12), mXsrc); - mXref.block(4, 4, 9, 12) = mXsrc; - VERIFY_IS_APPROX(mX, mXref); - - // test Map - const float raw[3] = {1,2,3}; - float buffer[3] = {0,0,0}; - Vector3f v3; - Array3f a3f; - VERIFY_IS_APPROX_EVALUATOR(v3, Map(raw)); - VERIFY_IS_APPROX_EVALUATOR(a3f, Map(raw)); - Vector3f::Map(buffer) = 2*v3; - VERIFY(buffer[0] == 2); - VERIFY(buffer[1] == 4); - VERIFY(buffer[2] == 6); - - // test CwiseUnaryView - mat1.setRandom(); - mat2.setIdentity(); - MatrixXcd matXcd(6,6), matXcd_ref(6,6); - copy_using_evaluator(matXcd.real(), mat1); - copy_using_evaluator(matXcd.imag(), mat2); - matXcd_ref.real() = mat1; - matXcd_ref.imag() = mat2; - VERIFY_IS_APPROX(matXcd, matXcd_ref); - - // test Select - VERIFY_IS_APPROX_EVALUATOR(aX, (aXsrc > 0).select(aXsrc, -aXsrc)); - - // test Replicate - mXsrc = MatrixXf::Random(6, 6); - VectorXf vX = VectorXf::Random(6); - mX.resize(6, 6); - VERIFY_IS_APPROX_EVALUATOR(mX, mXsrc.colwise() + vX); - matXcd.resize(12, 12); - VERIFY_IS_APPROX_EVALUATOR(matXcd, matXcd_ref.replicate(2,2)); - VERIFY_IS_APPROX_EVALUATOR(matXcd, (matXcd_ref.replicate<2,2>())); - - // test partial reductions - VectorXd vec1(6); - VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.rowwise().sum()); - VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.colwise().sum().transpose()); - - // test MatrixWrapper and ArrayWrapper - mat1.setRandom(6,6); - arr1.setRandom(6,6); - VERIFY_IS_APPROX_EVALUATOR(mat2, arr1.matrix()); - VERIFY_IS_APPROX_EVALUATOR(arr2, mat1.array()); - VERIFY_IS_APPROX_EVALUATOR(mat2, (arr1 + 2).matrix()); - VERIFY_IS_APPROX_EVALUATOR(arr2, mat1.array() + 2); - mat2.array() = arr1 * arr1; - VERIFY_IS_APPROX(mat2, (arr1 * arr1).matrix()); - arr2.matrix() = MatrixXd::Identity(6,6); - VERIFY_IS_APPROX(arr2, MatrixXd::Identity(6,6).array()); - - // test Reverse - VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.reverse()); - VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.colwise().reverse()); - VERIFY_IS_APPROX_EVALUATOR(arr2, arr1.rowwise().reverse()); - arr2.reverse() = arr1; - VERIFY_IS_APPROX(arr2, arr1.reverse()); - mat2.array() = mat1.array().reverse(); - VERIFY_IS_APPROX(mat2.array(), mat1.array().reverse()); - - // test Diagonal - VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.diagonal()); - vec1.resize(5); - VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.diagonal(1)); - VERIFY_IS_APPROX_EVALUATOR(vec1, mat1.diagonal<-1>()); - vec1.setRandom(); - - mat2 = mat1; - copy_using_evaluator(mat1.diagonal(1), vec1); - mat2.diagonal(1) = vec1; - VERIFY_IS_APPROX(mat1, mat2); - - copy_using_evaluator(mat1.diagonal<-1>(), mat1.diagonal(1)); - mat2.diagonal<-1>() = mat2.diagonal(1); - VERIFY_IS_APPROX(mat1, mat2); - } - - { - // test swapping - MatrixXd mat1, mat2, mat1ref, mat2ref; - mat1ref = mat1 = MatrixXd::Random(6, 6); - mat2ref = mat2 = 2 * mat1 + MatrixXd::Identity(6, 6); - swap_using_evaluator(mat1, mat2); - mat1ref.swap(mat2ref); - VERIFY_IS_APPROX(mat1, mat1ref); - VERIFY_IS_APPROX(mat2, mat2ref); - - swap_using_evaluator(mat1.block(0, 0, 3, 3), mat2.block(3, 3, 3, 3)); - mat1ref.block(0, 0, 3, 3).swap(mat2ref.block(3, 3, 3, 3)); - VERIFY_IS_APPROX(mat1, mat1ref); - VERIFY_IS_APPROX(mat2, mat2ref); - - swap_using_evaluator(mat1.row(2), mat2.col(3).transpose()); - mat1.row(2).swap(mat2.col(3).transpose()); - VERIFY_IS_APPROX(mat1, mat1ref); - VERIFY_IS_APPROX(mat2, mat2ref); - } - - { - // test compound assignment - const Matrix4d mat_const = Matrix4d::Random(); - Matrix4d mat, mat_ref; - mat = mat_ref = Matrix4d::Identity(); - add_assign_using_evaluator(mat, mat_const); - mat_ref += mat_const; - VERIFY_IS_APPROX(mat, mat_ref); - - subtract_assign_using_evaluator(mat.row(1), 2*mat.row(2)); - mat_ref.row(1) -= 2*mat_ref.row(2); - VERIFY_IS_APPROX(mat, mat_ref); - - const ArrayXXf arr_const = ArrayXXf::Random(5,3); - ArrayXXf arr, arr_ref; - arr = arr_ref = ArrayXXf::Constant(5, 3, 0.5); - multiply_assign_using_evaluator(arr, arr_const); - arr_ref *= arr_const; - VERIFY_IS_APPROX(arr, arr_ref); - - divide_assign_using_evaluator(arr.row(1), arr.row(2) + 1); - arr_ref.row(1) /= (arr_ref.row(2) + 1); - VERIFY_IS_APPROX(arr, arr_ref); - } - - { - // test triangular shapes - MatrixXd A = MatrixXd::Random(6,6), B(6,6), C(6,6), D(6,6); - A.setRandom();B.setRandom(); - VERIFY_IS_APPROX_EVALUATOR2(B, A.triangularView(), MatrixXd(A.triangularView())); - - A.setRandom();B.setRandom(); - VERIFY_IS_APPROX_EVALUATOR2(B, A.triangularView(), MatrixXd(A.triangularView())); - - A.setRandom();B.setRandom(); - VERIFY_IS_APPROX_EVALUATOR2(B, A.triangularView(), MatrixXd(A.triangularView())); - - A.setRandom();B.setRandom(); - C = B; C.triangularView() = A; - copy_using_evaluator(B.triangularView(), A); - VERIFY(B.isApprox(C) && "copy_using_evaluator(B.triangularView(), A)"); - - A.setRandom();B.setRandom(); - C = B; C.triangularView() = A.triangularView(); - copy_using_evaluator(B.triangularView(), A.triangularView()); - VERIFY(B.isApprox(C) && "copy_using_evaluator(B.triangularView(), A.triangularView())"); - - - A.setRandom();B.setRandom(); - C = B; C.triangularView() = A.triangularView().transpose(); - copy_using_evaluator(B.triangularView(), A.triangularView().transpose()); - VERIFY(B.isApprox(C) && "copy_using_evaluator(B.triangularView(), A.triangularView().transpose())"); - - - A.setRandom();B.setRandom(); C = B; D = A; - C.triangularView().swap(D.triangularView()); - swap_using_evaluator(B.triangularView(), A.triangularView()); - VERIFY(B.isApprox(C) && "swap_using_evaluator(B.triangularView(), A.triangularView())"); - - - VERIFY_IS_APPROX_EVALUATOR2(B, prod(A.triangularView(),A), MatrixXd(A.triangularView()*A)); - - VERIFY_IS_APPROX_EVALUATOR2(B, prod(A.selfadjointView(),A), MatrixXd(A.selfadjointView()*A)); - } - - { - // test diagonal shapes - VectorXd d = VectorXd::Random(6); - MatrixXd A = MatrixXd::Random(6,6), B(6,6); - A.setRandom();B.setRandom(); - - VERIFY_IS_APPROX_EVALUATOR2(B, lazyprod(d.asDiagonal(),A), MatrixXd(d.asDiagonal()*A)); - VERIFY_IS_APPROX_EVALUATOR2(B, lazyprod(A,d.asDiagonal()), MatrixXd(A*d.asDiagonal())); - } - - { - // test CoeffReadCost - Matrix4d a, b; - VERIFY_IS_EQUAL( get_cost(a), 1 ); - VERIFY_IS_EQUAL( get_cost(a+b), 3); - VERIFY_IS_EQUAL( get_cost(2*a+b), 4); - VERIFY_IS_EQUAL( get_cost(a*b), 1); - VERIFY_IS_EQUAL( get_cost(a.lazyProduct(b)), 15); - VERIFY_IS_EQUAL( get_cost(a*(a*b)), 1); - VERIFY_IS_EQUAL( get_cost(a.lazyProduct(a*b)), 15); - VERIFY_IS_EQUAL( get_cost(a*(a+b)), 1); - VERIFY_IS_EQUAL( get_cost(a.lazyProduct(a+b)), 15); - } -} diff --git a/testbed/nanogui/ext/eigen/test/exceptions.cpp b/testbed/nanogui/ext/eigen/test/exceptions.cpp deleted file mode 100644 index b83fb82b..00000000 --- a/testbed/nanogui/ext/eigen/test/exceptions.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -// Various sanity tests with exceptions: -// - no memory leak when a custom scalar type trow an exceptions -// - todo: complete the list of tests! - -#define EIGEN_STACK_ALLOCATION_LIMIT 100000000 - -#include "main.h" - -struct my_exception -{ - my_exception() {} - ~my_exception() {} -}; - -class ScalarWithExceptions -{ - public: - ScalarWithExceptions() { init(); } - ScalarWithExceptions(const float& _v) { init(); *v = _v; } - ScalarWithExceptions(const ScalarWithExceptions& other) { init(); *v = *(other.v); } - ~ScalarWithExceptions() { - delete v; - instances--; - } - - void init() { - v = new float; - instances++; - } - - ScalarWithExceptions operator+(const ScalarWithExceptions& other) const - { - countdown--; - if(countdown<=0) - throw my_exception(); - return ScalarWithExceptions(*v+*other.v); - } - - ScalarWithExceptions operator-(const ScalarWithExceptions& other) const - { return ScalarWithExceptions(*v-*other.v); } - - ScalarWithExceptions operator*(const ScalarWithExceptions& other) const - { return ScalarWithExceptions((*v)*(*other.v)); } - - ScalarWithExceptions& operator+=(const ScalarWithExceptions& other) - { *v+=*other.v; return *this; } - ScalarWithExceptions& operator-=(const ScalarWithExceptions& other) - { *v-=*other.v; return *this; } - ScalarWithExceptions& operator=(const ScalarWithExceptions& other) - { *v = *(other.v); return *this; } - - bool operator==(const ScalarWithExceptions& other) const - { return *v==*other.v; } - bool operator!=(const ScalarWithExceptions& other) const - { return *v!=*other.v; } - - float* v; - static int instances; - static int countdown; -}; - -ScalarWithExceptions real(const ScalarWithExceptions &x) { return x; } -ScalarWithExceptions imag(const ScalarWithExceptions & ) { return 0; } -ScalarWithExceptions conj(const ScalarWithExceptions &x) { return x; } - -int ScalarWithExceptions::instances = 0; -int ScalarWithExceptions::countdown = 0; - - -#define CHECK_MEMLEAK(OP) { \ - ScalarWithExceptions::countdown = 100; \ - int before = ScalarWithExceptions::instances; \ - bool exception_thrown = false; \ - try { OP; } \ - catch (my_exception) { \ - exception_thrown = true; \ - VERIFY(ScalarWithExceptions::instances==before && "memory leak detected in " && EIGEN_MAKESTRING(OP)); \ - } \ - VERIFY(exception_thrown && " no exception thrown in " && EIGEN_MAKESTRING(OP)); \ - } - -void memoryleak() -{ - typedef Eigen::Matrix VectorType; - typedef Eigen::Matrix MatrixType; - - { - int n = 50; - VectorType v0(n), v1(n); - MatrixType m0(n,n), m1(n,n), m2(n,n); - v0.setOnes(); v1.setOnes(); - m0.setOnes(); m1.setOnes(); m2.setOnes(); - CHECK_MEMLEAK(v0 = m0 * m1 * v1); - CHECK_MEMLEAK(m2 = m0 * m1 * m2); - CHECK_MEMLEAK((v0+v1).dot(v0+v1)); - } - VERIFY(ScalarWithExceptions::instances==0 && "global memory leak detected in " && EIGEN_MAKESTRING(OP)); \ -} - -void test_exceptions() -{ - CALL_SUBTEST( memoryleak() ); -} diff --git a/testbed/nanogui/ext/eigen/test/fastmath.cpp b/testbed/nanogui/ext/eigen/test/fastmath.cpp deleted file mode 100644 index cc5db074..00000000 --- a/testbed/nanogui/ext/eigen/test/fastmath.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -void check(bool b, bool ref) -{ - std::cout << b; - if(b==ref) - std::cout << " OK "; - else - std::cout << " BAD "; -} - -#if EIGEN_COMP_MSVC && EIGEN_COMP_MSVC < 1800 -namespace std { - template bool (isfinite)(T x) { return _finite(x); } - template bool (isnan)(T x) { return _isnan(x); } - template bool (isinf)(T x) { return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF; } -} -#endif - -template -void check_inf_nan(bool dryrun) { - Matrix m(10); - m.setRandom(); - m(3) = std::numeric_limits::quiet_NaN(); - - if(dryrun) - { - std::cout << "std::isfinite(" << m(3) << ") = "; check((std::isfinite)(m(3)),false); std::cout << " ; numext::isfinite = "; check((numext::isfinite)(m(3)), false); std::cout << "\n"; - std::cout << "std::isinf(" << m(3) << ") = "; check((std::isinf)(m(3)),false); std::cout << " ; numext::isinf = "; check((numext::isinf)(m(3)), false); std::cout << "\n"; - std::cout << "std::isnan(" << m(3) << ") = "; check((std::isnan)(m(3)),true); std::cout << " ; numext::isnan = "; check((numext::isnan)(m(3)), true); std::cout << "\n"; - std::cout << "allFinite: "; check(m.allFinite(), 0); std::cout << "\n"; - std::cout << "hasNaN: "; check(m.hasNaN(), 1); std::cout << "\n"; - std::cout << "\n"; - } - else - { - VERIFY( !(numext::isfinite)(m(3)) ); - VERIFY( !(numext::isinf)(m(3)) ); - VERIFY( (numext::isnan)(m(3)) ); - VERIFY( !m.allFinite() ); - VERIFY( m.hasNaN() ); - } - T hidden_zero = (std::numeric_limits::min)()*(std::numeric_limits::min)(); - m(4) /= hidden_zero; - if(dryrun) - { - std::cout << "std::isfinite(" << m(4) << ") = "; check((std::isfinite)(m(4)),false); std::cout << " ; numext::isfinite = "; check((numext::isfinite)(m(4)), false); std::cout << "\n"; - std::cout << "std::isinf(" << m(4) << ") = "; check((std::isinf)(m(4)),true); std::cout << " ; numext::isinf = "; check((numext::isinf)(m(4)), true); std::cout << "\n"; - std::cout << "std::isnan(" << m(4) << ") = "; check((std::isnan)(m(4)),false); std::cout << " ; numext::isnan = "; check((numext::isnan)(m(4)), false); std::cout << "\n"; - std::cout << "allFinite: "; check(m.allFinite(), 0); std::cout << "\n"; - std::cout << "hasNaN: "; check(m.hasNaN(), 1); std::cout << "\n"; - std::cout << "\n"; - } - else - { - VERIFY( !(numext::isfinite)(m(4)) ); - VERIFY( (numext::isinf)(m(4)) ); - VERIFY( !(numext::isnan)(m(4)) ); - VERIFY( !m.allFinite() ); - VERIFY( m.hasNaN() ); - } - m(3) = 0; - if(dryrun) - { - std::cout << "std::isfinite(" << m(3) << ") = "; check((std::isfinite)(m(3)),true); std::cout << " ; numext::isfinite = "; check((numext::isfinite)(m(3)), true); std::cout << "\n"; - std::cout << "std::isinf(" << m(3) << ") = "; check((std::isinf)(m(3)),false); std::cout << " ; numext::isinf = "; check((numext::isinf)(m(3)), false); std::cout << "\n"; - std::cout << "std::isnan(" << m(3) << ") = "; check((std::isnan)(m(3)),false); std::cout << " ; numext::isnan = "; check((numext::isnan)(m(3)), false); std::cout << "\n"; - std::cout << "allFinite: "; check(m.allFinite(), 0); std::cout << "\n"; - std::cout << "hasNaN: "; check(m.hasNaN(), 0); std::cout << "\n"; - std::cout << "\n\n"; - } - else - { - VERIFY( (numext::isfinite)(m(3)) ); - VERIFY( !(numext::isinf)(m(3)) ); - VERIFY( !(numext::isnan)(m(3)) ); - VERIFY( !m.allFinite() ); - VERIFY( !m.hasNaN() ); - } -} - -void test_fastmath() { - std::cout << "*** float *** \n\n"; check_inf_nan(true); - std::cout << "*** double ***\n\n"; check_inf_nan(true); - std::cout << "*** long double *** \n\n"; check_inf_nan(true); - - check_inf_nan(false); - check_inf_nan(false); - check_inf_nan(false); -} diff --git a/testbed/nanogui/ext/eigen/test/first_aligned.cpp b/testbed/nanogui/ext/eigen/test/first_aligned.cpp deleted file mode 100644 index ae2d4bc4..00000000 --- a/testbed/nanogui/ext/eigen/test/first_aligned.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template -void test_first_aligned_helper(Scalar *array, int size) -{ - const int packet_size = sizeof(Scalar) * internal::packet_traits::size; - VERIFY(((size_t(array) + sizeof(Scalar) * internal::first_default_aligned(array, size)) % packet_size) == 0); -} - -template -void test_none_aligned_helper(Scalar *array, int size) -{ - EIGEN_UNUSED_VARIABLE(array); - EIGEN_UNUSED_VARIABLE(size); - VERIFY(internal::packet_traits::size == 1 || internal::first_default_aligned(array, size) == size); -} - -struct some_non_vectorizable_type { float x; }; - -void test_first_aligned() -{ - EIGEN_ALIGN16 float array_float[100]; - test_first_aligned_helper(array_float, 50); - test_first_aligned_helper(array_float+1, 50); - test_first_aligned_helper(array_float+2, 50); - test_first_aligned_helper(array_float+3, 50); - test_first_aligned_helper(array_float+4, 50); - test_first_aligned_helper(array_float+5, 50); - - EIGEN_ALIGN16 double array_double[100]; - test_first_aligned_helper(array_double, 50); - test_first_aligned_helper(array_double+1, 50); - test_first_aligned_helper(array_double+2, 50); - - double *array_double_plus_4_bytes = (double*)(internal::UIntPtr(array_double)+4); - test_none_aligned_helper(array_double_plus_4_bytes, 50); - test_none_aligned_helper(array_double_plus_4_bytes+1, 50); - - some_non_vectorizable_type array_nonvec[100]; - test_first_aligned_helper(array_nonvec, 100); - test_none_aligned_helper(array_nonvec, 100); -} diff --git a/testbed/nanogui/ext/eigen/test/geo_alignedbox.cpp b/testbed/nanogui/ext/eigen/test/geo_alignedbox.cpp deleted file mode 100644 index 223ff5ee..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_alignedbox.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -#include -using namespace std; - -// NOTE the following workaround was needed on some 32 bits builds to kill extra precision of x87 registers. -// It seems that it os not needed anymore, but let's keep it here, just in case... - -template EIGEN_DONT_INLINE -void kill_extra_precision(T& /* x */) { - // This one worked but triggered a warning: - /* eigen_assert((void*)(&x) != (void*)0); */ - // An alternative could be: - /* volatile T tmp = x; */ - /* x = tmp; */ -} - - -template void alignedbox(const BoxType& _box) -{ - /* this test covers the following files: - AlignedBox.h - */ - typedef typename BoxType::Index Index; - typedef typename BoxType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - - const Index dim = _box.dim(); - - VectorType p0 = VectorType::Random(dim); - VectorType p1 = VectorType::Random(dim); - while( p1 == p0 ){ - p1 = VectorType::Random(dim); } - RealScalar s1 = internal::random(0,1); - - BoxType b0(dim); - BoxType b1(VectorType::Random(dim),VectorType::Random(dim)); - BoxType b2; - - kill_extra_precision(b1); - kill_extra_precision(p0); - kill_extra_precision(p1); - - b0.extend(p0); - b0.extend(p1); - VERIFY(b0.contains(p0*s1+(Scalar(1)-s1)*p1)); - VERIFY(b0.contains(b0.center())); - VERIFY_IS_APPROX(b0.center(),(p0+p1)/Scalar(2)); - - (b2 = b0).extend(b1); - VERIFY(b2.contains(b0)); - VERIFY(b2.contains(b1)); - VERIFY_IS_APPROX(b2.clamp(b0), b0); - - // intersection - BoxType box1(VectorType::Random(dim)); - box1.extend(VectorType::Random(dim)); - BoxType box2(VectorType::Random(dim)); - box2.extend(VectorType::Random(dim)); - - VERIFY(box1.intersects(box2) == !box1.intersection(box2).isEmpty()); - - // alignment -- make sure there is no memory alignment assertion - BoxType *bp0 = new BoxType(dim); - BoxType *bp1 = new BoxType(dim); - bp0->extend(*bp1); - delete bp0; - delete bp1; - - // sampling - for( int i=0; i<10; ++i ) - { - VectorType r = b0.sample(); - VERIFY(b0.contains(r)); - } - -} - - - -template -void alignedboxCastTests(const BoxType& _box) -{ - // casting - typedef typename BoxType::Index Index; - typedef typename BoxType::Scalar Scalar; - typedef Matrix VectorType; - - const Index dim = _box.dim(); - - VectorType p0 = VectorType::Random(dim); - VectorType p1 = VectorType::Random(dim); - - BoxType b0(dim); - - b0.extend(p0); - b0.extend(p1); - - const int Dim = BoxType::AmbientDimAtCompileTime; - typedef typename GetDifferentType::type OtherScalar; - AlignedBox hp1f = b0.template cast(); - VERIFY_IS_APPROX(hp1f.template cast(),b0); - AlignedBox hp1d = b0.template cast(); - VERIFY_IS_APPROX(hp1d.template cast(),b0); -} - - -void specificTest1() -{ - Vector2f m; m << -1.0f, -2.0f; - Vector2f M; M << 1.0f, 5.0f; - - typedef AlignedBox2f BoxType; - BoxType box( m, M ); - - Vector2f sides = M-m; - VERIFY_IS_APPROX(sides, box.sizes() ); - VERIFY_IS_APPROX(sides[1], box.sizes()[1] ); - VERIFY_IS_APPROX(sides[1], box.sizes().maxCoeff() ); - VERIFY_IS_APPROX(sides[0], box.sizes().minCoeff() ); - - VERIFY_IS_APPROX( 14.0f, box.volume() ); - VERIFY_IS_APPROX( 53.0f, box.diagonal().squaredNorm() ); - VERIFY_IS_APPROX( std::sqrt( 53.0f ), box.diagonal().norm() ); - - VERIFY_IS_APPROX( m, box.corner( BoxType::BottomLeft ) ); - VERIFY_IS_APPROX( M, box.corner( BoxType::TopRight ) ); - Vector2f bottomRight; bottomRight << M[0], m[1]; - Vector2f topLeft; topLeft << m[0], M[1]; - VERIFY_IS_APPROX( bottomRight, box.corner( BoxType::BottomRight ) ); - VERIFY_IS_APPROX( topLeft, box.corner( BoxType::TopLeft ) ); -} - - -void specificTest2() -{ - Vector3i m; m << -1, -2, 0; - Vector3i M; M << 1, 5, 3; - - typedef AlignedBox3i BoxType; - BoxType box( m, M ); - - Vector3i sides = M-m; - VERIFY_IS_APPROX(sides, box.sizes() ); - VERIFY_IS_APPROX(sides[1], box.sizes()[1] ); - VERIFY_IS_APPROX(sides[1], box.sizes().maxCoeff() ); - VERIFY_IS_APPROX(sides[0], box.sizes().minCoeff() ); - - VERIFY_IS_APPROX( 42, box.volume() ); - VERIFY_IS_APPROX( 62, box.diagonal().squaredNorm() ); - - VERIFY_IS_APPROX( m, box.corner( BoxType::BottomLeftFloor ) ); - VERIFY_IS_APPROX( M, box.corner( BoxType::TopRightCeil ) ); - Vector3i bottomRightFloor; bottomRightFloor << M[0], m[1], m[2]; - Vector3i topLeftFloor; topLeftFloor << m[0], M[1], m[2]; - VERIFY_IS_APPROX( bottomRightFloor, box.corner( BoxType::BottomRightFloor ) ); - VERIFY_IS_APPROX( topLeftFloor, box.corner( BoxType::TopLeftFloor ) ); -} - - -void test_geo_alignedbox() -{ - for(int i = 0; i < g_repeat; i++) - { - CALL_SUBTEST_1( alignedbox(AlignedBox2f()) ); - CALL_SUBTEST_2( alignedboxCastTests(AlignedBox2f()) ); - - CALL_SUBTEST_3( alignedbox(AlignedBox3f()) ); - CALL_SUBTEST_4( alignedboxCastTests(AlignedBox3f()) ); - - CALL_SUBTEST_5( alignedbox(AlignedBox4d()) ); - CALL_SUBTEST_6( alignedboxCastTests(AlignedBox4d()) ); - - CALL_SUBTEST_7( alignedbox(AlignedBox1d()) ); - CALL_SUBTEST_8( alignedboxCastTests(AlignedBox1d()) ); - - CALL_SUBTEST_9( alignedbox(AlignedBox1i()) ); - CALL_SUBTEST_10( alignedbox(AlignedBox2i()) ); - CALL_SUBTEST_11( alignedbox(AlignedBox3i()) ); - - CALL_SUBTEST_14( alignedbox(AlignedBox(4)) ); - } - CALL_SUBTEST_12( specificTest1() ); - CALL_SUBTEST_13( specificTest2() ); -} diff --git a/testbed/nanogui/ext/eigen/test/geo_eulerangles.cpp b/testbed/nanogui/ext/eigen/test/geo_eulerangles.cpp deleted file mode 100644 index 932ebe77..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_eulerangles.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2012 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - - -template -void verify_euler(const Matrix& ea, int i, int j, int k) -{ - typedef Matrix Matrix3; - typedef Matrix Vector3; - typedef AngleAxis AngleAxisx; - using std::abs; - Matrix3 m(AngleAxisx(ea[0], Vector3::Unit(i)) * AngleAxisx(ea[1], Vector3::Unit(j)) * AngleAxisx(ea[2], Vector3::Unit(k))); - Vector3 eabis = m.eulerAngles(i, j, k); - Matrix3 mbis(AngleAxisx(eabis[0], Vector3::Unit(i)) * AngleAxisx(eabis[1], Vector3::Unit(j)) * AngleAxisx(eabis[2], Vector3::Unit(k))); - VERIFY_IS_APPROX(m, mbis); - /* If I==K, and ea[1]==0, then there no unique solution. */ - /* The remark apply in the case where I!=K, and |ea[1]| is close to pi/2. */ - if( (i!=k || ea[1]!=0) && (i==k || !internal::isApprox(abs(ea[1]),Scalar(EIGEN_PI/2),test_precision())) ) - VERIFY((ea-eabis).norm() <= test_precision()); - - // approx_or_less_than does not work for 0 - VERIFY(0 < eabis[0] || test_isMuchSmallerThan(eabis[0], Scalar(1))); - VERIFY_IS_APPROX_OR_LESS_THAN(eabis[0], Scalar(EIGEN_PI)); - VERIFY_IS_APPROX_OR_LESS_THAN(-Scalar(EIGEN_PI), eabis[1]); - VERIFY_IS_APPROX_OR_LESS_THAN(eabis[1], Scalar(EIGEN_PI)); - VERIFY_IS_APPROX_OR_LESS_THAN(-Scalar(EIGEN_PI), eabis[2]); - VERIFY_IS_APPROX_OR_LESS_THAN(eabis[2], Scalar(EIGEN_PI)); -} - -template void check_all_var(const Matrix& ea) -{ - verify_euler(ea, 0,1,2); - verify_euler(ea, 0,1,0); - verify_euler(ea, 0,2,1); - verify_euler(ea, 0,2,0); - - verify_euler(ea, 1,2,0); - verify_euler(ea, 1,2,1); - verify_euler(ea, 1,0,2); - verify_euler(ea, 1,0,1); - - verify_euler(ea, 2,0,1); - verify_euler(ea, 2,0,2); - verify_euler(ea, 2,1,0); - verify_euler(ea, 2,1,2); -} - -template void eulerangles() -{ - typedef Matrix Matrix3; - typedef Matrix Vector3; - typedef Array Array3; - typedef Quaternion Quaternionx; - typedef AngleAxis AngleAxisx; - - Scalar a = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)); - Quaternionx q1; - q1 = AngleAxisx(a, Vector3::Random().normalized()); - Matrix3 m; - m = q1; - - Vector3 ea = m.eulerAngles(0,1,2); - check_all_var(ea); - ea = m.eulerAngles(0,1,0); - check_all_var(ea); - - // Check with purely random Quaternion: - q1.coeffs() = Quaternionx::Coefficients::Random().normalized(); - m = q1; - ea = m.eulerAngles(0,1,2); - check_all_var(ea); - ea = m.eulerAngles(0,1,0); - check_all_var(ea); - - // Check with random angles in range [0:pi]x[-pi:pi]x[-pi:pi]. - ea = (Array3::Random() + Array3(1,0,0))*Scalar(EIGEN_PI)*Array3(0.5,1,1); - check_all_var(ea); - - ea[2] = ea[0] = internal::random(0,Scalar(EIGEN_PI)); - check_all_var(ea); - - ea[0] = ea[1] = internal::random(0,Scalar(EIGEN_PI)); - check_all_var(ea); - - ea[1] = 0; - check_all_var(ea); - - ea.head(2).setZero(); - check_all_var(ea); - - ea.setZero(); - check_all_var(ea); -} - -void test_geo_eulerangles() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( eulerangles() ); - CALL_SUBTEST_2( eulerangles() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/geo_homogeneous.cpp b/testbed/nanogui/ext/eigen/test/geo_homogeneous.cpp deleted file mode 100644 index 2187c7bf..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_homogeneous.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void homogeneous(void) -{ - /* this test covers the following files: - Homogeneous.h - */ - - typedef Matrix MatrixType; - typedef Matrix VectorType; - - typedef Matrix HMatrixType; - typedef Matrix HVectorType; - - typedef Matrix T1MatrixType; - typedef Matrix T2MatrixType; - typedef Matrix T3MatrixType; - - VectorType v0 = VectorType::Random(), - ones = VectorType::Ones(); - - HVectorType hv0 = HVectorType::Random(); - - MatrixType m0 = MatrixType::Random(); - - HMatrixType hm0 = HMatrixType::Random(); - - hv0 << v0, 1; - VERIFY_IS_APPROX(v0.homogeneous(), hv0); - VERIFY_IS_APPROX(v0, hv0.hnormalized()); - - VERIFY_IS_APPROX(v0.homogeneous().sum(), hv0.sum()); - VERIFY_IS_APPROX(v0.homogeneous().minCoeff(), hv0.minCoeff()); - VERIFY_IS_APPROX(v0.homogeneous().maxCoeff(), hv0.maxCoeff()); - - hm0 << m0, ones.transpose(); - VERIFY_IS_APPROX(m0.colwise().homogeneous(), hm0); - VERIFY_IS_APPROX(m0, hm0.colwise().hnormalized()); - hm0.row(Size-1).setRandom(); - for(int j=0; j aff; - Transform caff; - Transform proj; - Matrix pts; - Matrix pts1, pts2; - - aff.affine().setRandom(); - proj = caff = aff; - pts.setRandom(Size,internal::random(1,20)); - - pts1 = pts.colwise().homogeneous(); - VERIFY_IS_APPROX(aff * pts.colwise().homogeneous(), (aff * pts1).colwise().hnormalized()); - VERIFY_IS_APPROX(caff * pts.colwise().homogeneous(), (caff * pts1).colwise().hnormalized()); - VERIFY_IS_APPROX(proj * pts.colwise().homogeneous(), (proj * pts1)); - - VERIFY_IS_APPROX((aff * pts1).colwise().hnormalized(), aff * pts); - VERIFY_IS_APPROX((caff * pts1).colwise().hnormalized(), caff * pts); - - pts2 = pts1; - pts2.row(Size).setRandom(); - VERIFY_IS_APPROX((aff * pts2).colwise().hnormalized(), aff * pts2.colwise().hnormalized()); - VERIFY_IS_APPROX((caff * pts2).colwise().hnormalized(), caff * pts2.colwise().hnormalized()); - VERIFY_IS_APPROX((proj * pts2).colwise().hnormalized(), (proj * pts2.colwise().hnormalized().colwise().homogeneous()).colwise().hnormalized()); - - // Test combination of homogeneous - - VERIFY_IS_APPROX( (t2 * v0.homogeneous()).hnormalized(), - (t2.template topLeftCorner() * v0 + t2.template topRightCorner()) - / ((t2.template bottomLeftCorner<1,Size>()*v0).value() + t2(Size,Size)) ); - - VERIFY_IS_APPROX( (t2 * pts.colwise().homogeneous()).colwise().hnormalized(), - (Matrix(t2 * pts1).colwise().hnormalized()) ); - - VERIFY_IS_APPROX( (t2 .lazyProduct( v0.homogeneous() )).hnormalized(), (t2 * v0.homogeneous()).hnormalized() ); - VERIFY_IS_APPROX( (t2 .lazyProduct ( pts.colwise().homogeneous() )).colwise().hnormalized(), (t2 * pts1).colwise().hnormalized() ); - - VERIFY_IS_APPROX( (v0.transpose().homogeneous() .lazyProduct( t2 )).hnormalized(), (v0.transpose().homogeneous()*t2).hnormalized() ); - VERIFY_IS_APPROX( (pts.transpose().rowwise().homogeneous() .lazyProduct( t2 )).rowwise().hnormalized(), (pts1.transpose()*t2).rowwise().hnormalized() ); - - VERIFY_IS_APPROX( (t2.template triangularView() * v0.homogeneous()).eval(), (t2.template triangularView()*hv0) ); -} - -void test_geo_homogeneous() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(( homogeneous() )); - CALL_SUBTEST_2(( homogeneous() )); - CALL_SUBTEST_3(( homogeneous() )); - } -} diff --git a/testbed/nanogui/ext/eigen/test/geo_hyperplane.cpp b/testbed/nanogui/ext/eigen/test/geo_hyperplane.cpp deleted file mode 100644 index 27892850..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_hyperplane.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -template void hyperplane(const HyperplaneType& _plane) -{ - /* this test covers the following files: - Hyperplane.h - */ - using std::abs; - typedef typename HyperplaneType::Index Index; - const Index dim = _plane.dim(); - enum { Options = HyperplaneType::Options }; - typedef typename HyperplaneType::Scalar Scalar; - typedef typename HyperplaneType::RealScalar RealScalar; - typedef Matrix VectorType; - typedef Matrix MatrixType; - - VectorType p0 = VectorType::Random(dim); - VectorType p1 = VectorType::Random(dim); - - VectorType n0 = VectorType::Random(dim).normalized(); - VectorType n1 = VectorType::Random(dim).normalized(); - - HyperplaneType pl0(n0, p0); - HyperplaneType pl1(n1, p1); - HyperplaneType pl2 = pl1; - - Scalar s0 = internal::random(); - Scalar s1 = internal::random(); - - VERIFY_IS_APPROX( n1.dot(n1), Scalar(1) ); - - VERIFY_IS_MUCH_SMALLER_THAN( pl0.absDistance(p0), Scalar(1) ); - if(numext::abs2(s0)>RealScalar(1e-6)) - VERIFY_IS_APPROX( pl1.signedDistance(p1 + n1 * s0), s0); - else - VERIFY_IS_MUCH_SMALLER_THAN( abs(pl1.signedDistance(p1 + n1 * s0) - s0), Scalar(1) ); - VERIFY_IS_MUCH_SMALLER_THAN( pl1.signedDistance(pl1.projection(p0)), Scalar(1) ); - VERIFY_IS_MUCH_SMALLER_THAN( pl1.absDistance(p1 + pl1.normal().unitOrthogonal() * s1), Scalar(1) ); - - // transform - if (!NumTraits::IsComplex) - { - MatrixType rot = MatrixType::Random(dim,dim).householderQr().householderQ(); - DiagonalMatrix scaling(VectorType::Random()); - Translation translation(VectorType::Random()); - - while(scaling.diagonal().cwiseAbs().minCoeff()::type OtherScalar; - Hyperplane hp1f = pl1.template cast(); - VERIFY_IS_APPROX(hp1f.template cast(),pl1); - Hyperplane hp1d = pl1.template cast(); - VERIFY_IS_APPROX(hp1d.template cast(),pl1); -} - -template void lines() -{ - using std::abs; - typedef Hyperplane HLine; - typedef ParametrizedLine PLine; - typedef Matrix Vector; - typedef Matrix CoeffsType; - - for(int i = 0; i < 10; i++) - { - Vector center = Vector::Random(); - Vector u = Vector::Random(); - Vector v = Vector::Random(); - Scalar a = internal::random(); - while (abs(a-1) < Scalar(1e-4)) a = internal::random(); - while (u.norm() < Scalar(1e-4)) u = Vector::Random(); - while (v.norm() < Scalar(1e-4)) v = Vector::Random(); - - HLine line_u = HLine::Through(center + u, center + a*u); - HLine line_v = HLine::Through(center + v, center + a*v); - - // the line equations should be normalized so that a^2+b^2=1 - VERIFY_IS_APPROX(line_u.normal().norm(), Scalar(1)); - VERIFY_IS_APPROX(line_v.normal().norm(), Scalar(1)); - - Vector result = line_u.intersection(line_v); - - // the lines should intersect at the point we called "center" - if(abs(a-1) > Scalar(1e-2) && abs(v.normalized().dot(u.normalized())) void planes() -{ - using std::abs; - typedef Hyperplane Plane; - typedef Matrix Vector; - - for(int i = 0; i < 10; i++) - { - Vector v0 = Vector::Random(); - Vector v1(v0), v2(v0); - if(internal::random(0,1)>0.25) - v1 += Vector::Random(); - if(internal::random(0,1)>0.25) - v2 += v1 * std::pow(internal::random(0,1),internal::random(1,16)); - if(internal::random(0,1)>0.25) - v2 += Vector::Random() * std::pow(internal::random(0,1),internal::random(1,16)); - - Plane p0 = Plane::Through(v0, v1, v2); - - VERIFY_IS_APPROX(p0.normal().norm(), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(p0.absDistance(v0), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(p0.absDistance(v1), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(p0.absDistance(v2), Scalar(1)); - } -} - -template void hyperplane_alignment() -{ - typedef Hyperplane Plane3a; - typedef Hyperplane Plane3u; - - EIGEN_ALIGN_MAX Scalar array1[4]; - EIGEN_ALIGN_MAX Scalar array2[4]; - EIGEN_ALIGN_MAX Scalar array3[4+1]; - Scalar* array3u = array3+1; - - Plane3a *p1 = ::new(reinterpret_cast(array1)) Plane3a; - Plane3u *p2 = ::new(reinterpret_cast(array2)) Plane3u; - Plane3u *p3 = ::new(reinterpret_cast(array3u)) Plane3u; - - p1->coeffs().setRandom(); - *p2 = *p1; - *p3 = *p1; - - VERIFY_IS_APPROX(p1->coeffs(), p2->coeffs()); - VERIFY_IS_APPROX(p1->coeffs(), p3->coeffs()); - - #if defined(EIGEN_VECTORIZE) && EIGEN_MAX_STATIC_ALIGN_BYTES > 0 - if(internal::packet_traits::Vectorizable && internal::packet_traits::size<=4) - VERIFY_RAISES_ASSERT((::new(reinterpret_cast(array3u)) Plane3a)); - #endif -} - - -void test_geo_hyperplane() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( hyperplane(Hyperplane()) ); - CALL_SUBTEST_2( hyperplane(Hyperplane()) ); - CALL_SUBTEST_2( hyperplane(Hyperplane()) ); - CALL_SUBTEST_2( hyperplane_alignment() ); - CALL_SUBTEST_3( hyperplane(Hyperplane()) ); - CALL_SUBTEST_4( hyperplane(Hyperplane,5>()) ); - CALL_SUBTEST_1( lines() ); - CALL_SUBTEST_3( lines() ); - CALL_SUBTEST_2( planes() ); - CALL_SUBTEST_5( planes() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/geo_orthomethods.cpp b/testbed/nanogui/ext/eigen/test/geo_orthomethods.cpp deleted file mode 100644 index e178df25..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_orthomethods.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -/* this test covers the following files: - Geometry/OrthoMethods.h -*/ - -template void orthomethods_3() -{ - typedef typename NumTraits::Real RealScalar; - typedef Matrix Matrix3; - typedef Matrix Vector3; - - typedef Matrix Vector4; - - Vector3 v0 = Vector3::Random(), - v1 = Vector3::Random(), - v2 = Vector3::Random(); - - // cross product - VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(v2).dot(v1), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(v1.dot(v1.cross(v2)), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(v2).dot(v2), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(v2.dot(v1.cross(v2)), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(v1.cross(Vector3::Random()).dot(v1), Scalar(1)); - Matrix3 mat3; - mat3 << v0.normalized(), - (v0.cross(v1)).normalized(), - (v0.cross(v1).cross(v0)).normalized(); - VERIFY(mat3.isUnitary()); - - mat3.setRandom(); - VERIFY_IS_APPROX(v0.cross(mat3*v1), -(mat3*v1).cross(v0)); - VERIFY_IS_APPROX(v0.cross(mat3.lazyProduct(v1)), -(mat3.lazyProduct(v1)).cross(v0)); - - // colwise/rowwise cross product - mat3.setRandom(); - Vector3 vec3 = Vector3::Random(); - Matrix3 mcross; - int i = internal::random(0,2); - mcross = mat3.colwise().cross(vec3); - VERIFY_IS_APPROX(mcross.col(i), mat3.col(i).cross(vec3)); - - VERIFY_IS_MUCH_SMALLER_THAN((mat3.adjoint() * mat3.colwise().cross(vec3)).diagonal().cwiseAbs().sum(), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN((mat3.adjoint() * mat3.colwise().cross(Vector3::Random())).diagonal().cwiseAbs().sum(), Scalar(1)); - - VERIFY_IS_MUCH_SMALLER_THAN((vec3.adjoint() * mat3.colwise().cross(vec3)).cwiseAbs().sum(), Scalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN((vec3.adjoint() * Matrix3::Random().colwise().cross(vec3)).cwiseAbs().sum(), Scalar(1)); - - mcross = mat3.rowwise().cross(vec3); - VERIFY_IS_APPROX(mcross.row(i), mat3.row(i).cross(vec3)); - - // cross3 - Vector4 v40 = Vector4::Random(), - v41 = Vector4::Random(), - v42 = Vector4::Random(); - v40.w() = v41.w() = v42.w() = 0; - v42.template head<3>() = v40.template head<3>().cross(v41.template head<3>()); - VERIFY_IS_APPROX(v40.cross3(v41), v42); - VERIFY_IS_MUCH_SMALLER_THAN(v40.cross3(Vector4::Random()).dot(v40), Scalar(1)); - - // check mixed product - typedef Matrix RealVector3; - RealVector3 rv1 = RealVector3::Random(); - VERIFY_IS_APPROX(v1.cross(rv1.template cast()), v1.cross(rv1)); - VERIFY_IS_APPROX(rv1.template cast().cross(v1), rv1.cross(v1)); -} - -template void orthomethods(int size=Size) -{ - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - typedef Matrix Matrix3N; - typedef Matrix MatrixN3; - typedef Matrix Vector3; - - VectorType v0 = VectorType::Random(size); - - // unitOrthogonal - VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().dot(v0), Scalar(1)); - VERIFY_IS_APPROX(v0.unitOrthogonal().norm(), RealScalar(1)); - - if (size>=3) - { - v0.template head<2>().setZero(); - v0.tail(size-2).setRandom(); - - VERIFY_IS_MUCH_SMALLER_THAN(v0.unitOrthogonal().dot(v0), Scalar(1)); - VERIFY_IS_APPROX(v0.unitOrthogonal().norm(), RealScalar(1)); - } - - // colwise/rowwise cross product - Vector3 vec3 = Vector3::Random(); - int i = internal::random(0,size-1); - - Matrix3N mat3N(3,size), mcross3N(3,size); - mat3N.setRandom(); - mcross3N = mat3N.colwise().cross(vec3); - VERIFY_IS_APPROX(mcross3N.col(i), mat3N.col(i).cross(vec3)); - - MatrixN3 matN3(size,3), mcrossN3(size,3); - matN3.setRandom(); - mcrossN3 = matN3.rowwise().cross(vec3); - VERIFY_IS_APPROX(mcrossN3.row(i), matN3.row(i).cross(vec3)); -} - -void test_geo_orthomethods() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( orthomethods_3() ); - CALL_SUBTEST_2( orthomethods_3() ); - CALL_SUBTEST_4( orthomethods_3 >() ); - CALL_SUBTEST_1( (orthomethods()) ); - CALL_SUBTEST_2( (orthomethods()) ); - CALL_SUBTEST_1( (orthomethods()) ); - CALL_SUBTEST_2( (orthomethods()) ); - CALL_SUBTEST_3( (orthomethods()) ); - CALL_SUBTEST_4( (orthomethods,8>()) ); - CALL_SUBTEST_5( (orthomethods(36)) ); - CALL_SUBTEST_6( (orthomethods(35)) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/geo_parametrizedline.cpp b/testbed/nanogui/ext/eigen/test/geo_parametrizedline.cpp deleted file mode 100644 index 29c1b105..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_parametrizedline.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -template void parametrizedline(const LineType& _line) -{ - /* this test covers the following files: - ParametrizedLine.h - */ - using std::abs; - typedef typename LineType::Index Index; - const Index dim = _line.dim(); - typedef typename LineType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - typedef Hyperplane HyperplaneType; - typedef Matrix MatrixType; - - VectorType p0 = VectorType::Random(dim); - VectorType p1 = VectorType::Random(dim); - - VectorType d0 = VectorType::Random(dim).normalized(); - - LineType l0(p0, d0); - - Scalar s0 = internal::random(); - Scalar s1 = abs(internal::random()); - - VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0), RealScalar(1) ); - VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0+s0*d0), RealScalar(1) ); - VERIFY_IS_APPROX( (l0.projection(p1)-p1).norm(), l0.distance(p1) ); - VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(l0.projection(p1)), RealScalar(1) ); - VERIFY_IS_APPROX( Scalar(l0.distance((p0+s0*d0) + d0.unitOrthogonal() * s1)), s1 ); - - // casting - const int Dim = LineType::AmbientDimAtCompileTime; - typedef typename GetDifferentType::type OtherScalar; - ParametrizedLine hp1f = l0.template cast(); - VERIFY_IS_APPROX(hp1f.template cast(),l0); - ParametrizedLine hp1d = l0.template cast(); - VERIFY_IS_APPROX(hp1d.template cast(),l0); - - // intersections - VectorType p2 = VectorType::Random(dim); - VectorType n2 = VectorType::Random(dim).normalized(); - HyperplaneType hp(p2,n2); - Scalar t = l0.intersectionParameter(hp); - VectorType pi = l0.pointAt(t); - VERIFY_IS_MUCH_SMALLER_THAN(hp.signedDistance(pi), RealScalar(1)); - VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(pi), RealScalar(1)); - VERIFY_IS_APPROX(l0.intersectionPoint(hp), pi); - - // transform - if (!NumTraits::IsComplex) - { - MatrixType rot = MatrixType::Random(dim,dim).householderQr().householderQ(); - DiagonalMatrix scaling(VectorType::Random()); - Translation translation(VectorType::Random()); - - while(scaling.diagonal().cwiseAbs().minCoeff() void parametrizedline_alignment() -{ - typedef ParametrizedLine Line4a; - typedef ParametrizedLine Line4u; - - EIGEN_ALIGN_MAX Scalar array1[16]; - EIGEN_ALIGN_MAX Scalar array2[16]; - EIGEN_ALIGN_MAX Scalar array3[16+1]; - Scalar* array3u = array3+1; - - Line4a *p1 = ::new(reinterpret_cast(array1)) Line4a; - Line4u *p2 = ::new(reinterpret_cast(array2)) Line4u; - Line4u *p3 = ::new(reinterpret_cast(array3u)) Line4u; - - p1->origin().setRandom(); - p1->direction().setRandom(); - *p2 = *p1; - *p3 = *p1; - - VERIFY_IS_APPROX(p1->origin(), p2->origin()); - VERIFY_IS_APPROX(p1->origin(), p3->origin()); - VERIFY_IS_APPROX(p1->direction(), p2->direction()); - VERIFY_IS_APPROX(p1->direction(), p3->direction()); - - #if defined(EIGEN_VECTORIZE) && EIGEN_MAX_STATIC_ALIGN_BYTES>0 - if(internal::packet_traits::Vectorizable && internal::packet_traits::size<=4) - VERIFY_RAISES_ASSERT((::new(reinterpret_cast(array3u)) Line4a)); - #endif -} - -void test_geo_parametrizedline() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( parametrizedline(ParametrizedLine()) ); - CALL_SUBTEST_2( parametrizedline(ParametrizedLine()) ); - CALL_SUBTEST_2( parametrizedline_alignment() ); - CALL_SUBTEST_3( parametrizedline(ParametrizedLine()) ); - CALL_SUBTEST_3( parametrizedline_alignment() ); - CALL_SUBTEST_4( parametrizedline(ParametrizedLine,5>()) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/geo_quaternion.cpp b/testbed/nanogui/ext/eigen/test/geo_quaternion.cpp deleted file mode 100644 index 96889e72..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_quaternion.cpp +++ /dev/null @@ -1,289 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// Copyright (C) 2009 Mathieu Gautier -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -template T bounded_acos(T v) -{ - using std::acos; - using std::min; - using std::max; - return acos((max)(T(-1),(min)(v,T(1)))); -} - -template void check_slerp(const QuatType& q0, const QuatType& q1) -{ - using std::abs; - typedef typename QuatType::Scalar Scalar; - typedef AngleAxis AA; - - Scalar largeEps = test_precision(); - - Scalar theta_tot = AA(q1*q0.inverse()).angle(); - if(theta_tot>Scalar(EIGEN_PI)) - theta_tot = Scalar(2.)*Scalar(EIGEN_PI)-theta_tot; - for(Scalar t=0; t<=Scalar(1.001); t+=Scalar(0.1)) - { - QuatType q = q0.slerp(t,q1); - Scalar theta = AA(q*q0.inverse()).angle(); - VERIFY(abs(q.norm() - 1) < largeEps); - if(theta_tot==0) VERIFY(theta_tot==0); - else VERIFY(abs(theta - t * theta_tot) < largeEps); - } -} - -template void quaternion(void) -{ - /* this test covers the following files: - Quaternion.h - */ - using std::abs; - typedef Matrix Vector3; - typedef Matrix Matrix3; - typedef Quaternion Quaternionx; - typedef AngleAxis AngleAxisx; - - Scalar largeEps = test_precision(); - if (internal::is_same::value) - largeEps = Scalar(1e-3); - - Scalar eps = internal::random() * Scalar(1e-2); - - Vector3 v0 = Vector3::Random(), - v1 = Vector3::Random(), - v2 = Vector3::Random(), - v3 = Vector3::Random(); - - Scalar a = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)), - b = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)); - - // Quaternion: Identity(), setIdentity(); - Quaternionx q1, q2; - q2.setIdentity(); - VERIFY_IS_APPROX(Quaternionx(Quaternionx::Identity()).coeffs(), q2.coeffs()); - q1.coeffs().setRandom(); - VERIFY_IS_APPROX(q1.coeffs(), (q1*q2).coeffs()); - - // concatenation - q1 *= q2; - - q1 = AngleAxisx(a, v0.normalized()); - q2 = AngleAxisx(a, v1.normalized()); - - // angular distance - Scalar refangle = abs(AngleAxisx(q1.inverse()*q2).angle()); - if (refangle>Scalar(EIGEN_PI)) - refangle = Scalar(2)*Scalar(EIGEN_PI) - refangle; - - if((q1.coeffs()-q2.coeffs()).norm() > 10*largeEps) - { - VERIFY_IS_MUCH_SMALLER_THAN(abs(q1.angularDistance(q2) - refangle), Scalar(1)); - } - - // rotation matrix conversion - VERIFY_IS_APPROX(q1 * v2, q1.toRotationMatrix() * v2); - VERIFY_IS_APPROX(q1 * q2 * v2, - q1.toRotationMatrix() * q2.toRotationMatrix() * v2); - - VERIFY( (q2*q1).isApprox(q1*q2, largeEps) - || !(q2 * q1 * v2).isApprox(q1.toRotationMatrix() * q2.toRotationMatrix() * v2)); - - q2 = q1.toRotationMatrix(); - VERIFY_IS_APPROX(q1*v1,q2*v1); - - Matrix3 rot1(q1); - VERIFY_IS_APPROX(q1*v1,rot1*v1); - Quaternionx q3(rot1.transpose()*rot1); - VERIFY_IS_APPROX(q3*v1,v1); - - - // angle-axis conversion - AngleAxisx aa = AngleAxisx(q1); - VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1); - - // Do not execute the test if the rotation angle is almost zero, or - // the rotation axis and v1 are almost parallel. - if (abs(aa.angle()) > 5*test_precision() - && (aa.axis() - v1.normalized()).norm() < Scalar(1.99) - && (aa.axis() + v1.normalized()).norm() < Scalar(1.99)) - { - VERIFY_IS_NOT_APPROX(q1 * v1, Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1); - } - - // from two vector creation - VERIFY_IS_APPROX( v2.normalized(),(q2.setFromTwoVectors(v1, v2)*v1).normalized()); - VERIFY_IS_APPROX( v1.normalized(),(q2.setFromTwoVectors(v1, v1)*v1).normalized()); - VERIFY_IS_APPROX(-v1.normalized(),(q2.setFromTwoVectors(v1,-v1)*v1).normalized()); - if (internal::is_same::value) - { - v3 = (v1.array()+eps).matrix(); - VERIFY_IS_APPROX( v3.normalized(),(q2.setFromTwoVectors(v1, v3)*v1).normalized()); - VERIFY_IS_APPROX(-v3.normalized(),(q2.setFromTwoVectors(v1,-v3)*v1).normalized()); - } - - // from two vector creation static function - VERIFY_IS_APPROX( v2.normalized(),(Quaternionx::FromTwoVectors(v1, v2)*v1).normalized()); - VERIFY_IS_APPROX( v1.normalized(),(Quaternionx::FromTwoVectors(v1, v1)*v1).normalized()); - VERIFY_IS_APPROX(-v1.normalized(),(Quaternionx::FromTwoVectors(v1,-v1)*v1).normalized()); - if (internal::is_same::value) - { - v3 = (v1.array()+eps).matrix(); - VERIFY_IS_APPROX( v3.normalized(),(Quaternionx::FromTwoVectors(v1, v3)*v1).normalized()); - VERIFY_IS_APPROX(-v3.normalized(),(Quaternionx::FromTwoVectors(v1,-v3)*v1).normalized()); - } - - // inverse and conjugate - VERIFY_IS_APPROX(q1 * (q1.inverse() * v1), v1); - VERIFY_IS_APPROX(q1 * (q1.conjugate() * v1), v1); - - // test casting - Quaternion q1f = q1.template cast(); - VERIFY_IS_APPROX(q1f.template cast(),q1); - Quaternion q1d = q1.template cast(); - VERIFY_IS_APPROX(q1d.template cast(),q1); - - // test bug 369 - improper alignment. - Quaternionx *q = new Quaternionx; - delete q; - - q1 = Quaternionx::UnitRandom(); - q2 = Quaternionx::UnitRandom(); - check_slerp(q1,q2); - - q1 = AngleAxisx(b, v1.normalized()); - q2 = AngleAxisx(b+Scalar(EIGEN_PI), v1.normalized()); - check_slerp(q1,q2); - - q1 = AngleAxisx(b, v1.normalized()); - q2 = AngleAxisx(-b, -v1.normalized()); - check_slerp(q1,q2); - - q1 = Quaternionx::UnitRandom(); - q2.coeffs() = -q1.coeffs(); - check_slerp(q1,q2); -} - -template void mapQuaternion(void){ - typedef Map, Aligned> MQuaternionA; - typedef Map, Aligned> MCQuaternionA; - typedef Map > MQuaternionUA; - typedef Map > MCQuaternionUA; - typedef Quaternion Quaternionx; - typedef Matrix Vector3; - typedef AngleAxis AngleAxisx; - - Vector3 v0 = Vector3::Random(), - v1 = Vector3::Random(); - Scalar a = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)); - - EIGEN_ALIGN_MAX Scalar array1[4]; - EIGEN_ALIGN_MAX Scalar array2[4]; - EIGEN_ALIGN_MAX Scalar array3[4+1]; - Scalar* array3unaligned = array3+1; - - MQuaternionA mq1(array1); - MCQuaternionA mcq1(array1); - MQuaternionA mq2(array2); - MQuaternionUA mq3(array3unaligned); - MCQuaternionUA mcq3(array3unaligned); - -// std::cerr << array1 << " " << array2 << " " << array3 << "\n"; - mq1 = AngleAxisx(a, v0.normalized()); - mq2 = mq1; - mq3 = mq1; - - Quaternionx q1 = mq1; - Quaternionx q2 = mq2; - Quaternionx q3 = mq3; - Quaternionx q4 = MCQuaternionUA(array3unaligned); - - VERIFY_IS_APPROX(q1.coeffs(), q2.coeffs()); - VERIFY_IS_APPROX(q1.coeffs(), q3.coeffs()); - VERIFY_IS_APPROX(q4.coeffs(), q3.coeffs()); - #ifdef EIGEN_VECTORIZE - if(internal::packet_traits::Vectorizable) - VERIFY_RAISES_ASSERT((MQuaternionA(array3unaligned))); - #endif - - VERIFY_IS_APPROX(mq1 * (mq1.inverse() * v1), v1); - VERIFY_IS_APPROX(mq1 * (mq1.conjugate() * v1), v1); - - VERIFY_IS_APPROX(mcq1 * (mcq1.inverse() * v1), v1); - VERIFY_IS_APPROX(mcq1 * (mcq1.conjugate() * v1), v1); - - VERIFY_IS_APPROX(mq3 * (mq3.inverse() * v1), v1); - VERIFY_IS_APPROX(mq3 * (mq3.conjugate() * v1), v1); - - VERIFY_IS_APPROX(mcq3 * (mcq3.inverse() * v1), v1); - VERIFY_IS_APPROX(mcq3 * (mcq3.conjugate() * v1), v1); - - VERIFY_IS_APPROX(mq1*mq2, q1*q2); - VERIFY_IS_APPROX(mq3*mq2, q3*q2); - VERIFY_IS_APPROX(mcq1*mq2, q1*q2); - VERIFY_IS_APPROX(mcq3*mq2, q3*q2); -} - -template void quaternionAlignment(void){ - typedef Quaternion QuaternionA; - typedef Quaternion QuaternionUA; - - EIGEN_ALIGN_MAX Scalar array1[4]; - EIGEN_ALIGN_MAX Scalar array2[4]; - EIGEN_ALIGN_MAX Scalar array3[4+1]; - Scalar* arrayunaligned = array3+1; - - QuaternionA *q1 = ::new(reinterpret_cast(array1)) QuaternionA; - QuaternionUA *q2 = ::new(reinterpret_cast(array2)) QuaternionUA; - QuaternionUA *q3 = ::new(reinterpret_cast(arrayunaligned)) QuaternionUA; - - q1->coeffs().setRandom(); - *q2 = *q1; - *q3 = *q1; - - VERIFY_IS_APPROX(q1->coeffs(), q2->coeffs()); - VERIFY_IS_APPROX(q1->coeffs(), q3->coeffs()); - #if defined(EIGEN_VECTORIZE) && EIGEN_MAX_STATIC_ALIGN_BYTES>0 - if(internal::packet_traits::Vectorizable && internal::packet_traits::size<=4) - VERIFY_RAISES_ASSERT((::new(reinterpret_cast(arrayunaligned)) QuaternionA)); - #endif -} - -template void check_const_correctness(const PlainObjectType&) -{ - // there's a lot that we can't test here while still having this test compile! - // the only possible approach would be to run a script trying to compile stuff and checking that it fails. - // CMake can help with that. - - // verify that map-to-const don't have LvalueBit - typedef typename internal::add_const::type ConstPlainObjectType; - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(Map::Flags & LvalueBit) ); - VERIFY( !(Map::Flags & LvalueBit) ); -} - -void test_geo_quaternion() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(( quaternion() )); - CALL_SUBTEST_1( check_const_correctness(Quaternionf()) ); - CALL_SUBTEST_2(( quaternion() )); - CALL_SUBTEST_2( check_const_correctness(Quaterniond()) ); - CALL_SUBTEST_3(( quaternion() )); - CALL_SUBTEST_4(( quaternion() )); - CALL_SUBTEST_5(( quaternionAlignment() )); - CALL_SUBTEST_6(( quaternionAlignment() )); - CALL_SUBTEST_1( mapQuaternion() ); - CALL_SUBTEST_2( mapQuaternion() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/geo_transformations.cpp b/testbed/nanogui/ext/eigen/test/geo_transformations.cpp deleted file mode 100644 index 278e527c..00000000 --- a/testbed/nanogui/ext/eigen/test/geo_transformations.cpp +++ /dev/null @@ -1,645 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -template -Matrix angleToVec(T a) -{ - return Matrix(std::cos(a), std::sin(a)); -} - -// This permits to workaround a bug in clang/llvm code generation. -template -EIGEN_DONT_INLINE -void dont_over_optimize(T& x) { volatile typename T::Scalar tmp = x(0); x(0) = tmp; } - -template void non_projective_only() -{ - /* this test covers the following files: - Cross.h Quaternion.h, Transform.cpp - */ - typedef Matrix Vector3; - typedef Quaternion Quaternionx; - typedef AngleAxis AngleAxisx; - typedef Transform Transform3; - typedef DiagonalMatrix AlignedScaling3; - typedef Translation Translation3; - - Vector3 v0 = Vector3::Random(), - v1 = Vector3::Random(); - - Transform3 t0, t1, t2; - - Scalar a = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)); - - Quaternionx q1, q2; - - q1 = AngleAxisx(a, v0.normalized()); - - t0 = Transform3::Identity(); - VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity()); - - t0.linear() = q1.toRotationMatrix(); - - v0 << 50, 2, 1; - t0.scale(v0); - - VERIFY_IS_APPROX( (t0 * Vector3(1,0,0)).template head<3>().norm(), v0.x()); - - t0.setIdentity(); - t1.setIdentity(); - v1 << 1, 2, 3; - t0.linear() = q1.toRotationMatrix(); - t0.pretranslate(v0); - t0.scale(v1); - t1.linear() = q1.conjugate().toRotationMatrix(); - t1.prescale(v1.cwiseInverse()); - t1.translate(-v0); - - VERIFY((t0 * t1).matrix().isIdentity(test_precision())); - - t1.fromPositionOrientationScale(v0, q1, v1); - VERIFY_IS_APPROX(t1.matrix(), t0.matrix()); - VERIFY_IS_APPROX(t1*v1, t0*v1); - - // translation * vector - t0.setIdentity(); - t0.translate(v0); - VERIFY_IS_APPROX((t0 * v1).template head<3>(), Translation3(v0) * v1); - - // AlignedScaling * vector - t0.setIdentity(); - t0.scale(v0); - VERIFY_IS_APPROX((t0 * v1).template head<3>(), AlignedScaling3(v0) * v1); -} - -template void transformations() -{ - /* this test covers the following files: - Cross.h Quaternion.h, Transform.cpp - */ - using std::cos; - using std::abs; - typedef Matrix Matrix3; - typedef Matrix Matrix4; - typedef Matrix Vector2; - typedef Matrix Vector3; - typedef Matrix Vector4; - typedef Quaternion Quaternionx; - typedef AngleAxis AngleAxisx; - typedef Transform Transform2; - typedef Transform Transform3; - typedef typename Transform3::MatrixType MatrixType; - typedef DiagonalMatrix AlignedScaling3; - typedef Translation Translation2; - typedef Translation Translation3; - - Vector3 v0 = Vector3::Random(), - v1 = Vector3::Random(); - Matrix3 matrot1, m; - - Scalar a = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)); - Scalar s0 = internal::random(), s1 = internal::random(); - - while(v0.norm() < test_precision()) v0 = Vector3::Random(); - while(v1.norm() < test_precision()) v1 = Vector3::Random(); - - VERIFY_IS_APPROX(v0, AngleAxisx(a, v0.normalized()) * v0); - VERIFY_IS_APPROX(-v0, AngleAxisx(Scalar(EIGEN_PI), v0.unitOrthogonal()) * v0); - if(abs(cos(a)) > test_precision()) - { - VERIFY_IS_APPROX(cos(a)*v0.squaredNorm(), v0.dot(AngleAxisx(a, v0.unitOrthogonal()) * v0)); - } - m = AngleAxisx(a, v0.normalized()).toRotationMatrix().adjoint(); - VERIFY_IS_APPROX(Matrix3::Identity(), m * AngleAxisx(a, v0.normalized())); - VERIFY_IS_APPROX(Matrix3::Identity(), AngleAxisx(a, v0.normalized()) * m); - - Quaternionx q1, q2; - q1 = AngleAxisx(a, v0.normalized()); - q2 = AngleAxisx(a, v1.normalized()); - - // rotation matrix conversion - matrot1 = AngleAxisx(Scalar(0.1), Vector3::UnitX()) - * AngleAxisx(Scalar(0.2), Vector3::UnitY()) - * AngleAxisx(Scalar(0.3), Vector3::UnitZ()); - VERIFY_IS_APPROX(matrot1 * v1, - AngleAxisx(Scalar(0.1), Vector3(1,0,0)).toRotationMatrix() - * (AngleAxisx(Scalar(0.2), Vector3(0,1,0)).toRotationMatrix() - * (AngleAxisx(Scalar(0.3), Vector3(0,0,1)).toRotationMatrix() * v1))); - - // angle-axis conversion - AngleAxisx aa = AngleAxisx(q1); - VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1); - - // The following test is stable only if 2*angle != angle and v1 is not colinear with axis - if( (abs(aa.angle()) > test_precision()) && (abs(aa.axis().dot(v1.normalized()))<(Scalar(1)-Scalar(4)*test_precision())) ) - { - VERIFY( !(q1 * v1).isApprox(Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1) ); - } - - aa.fromRotationMatrix(aa.toRotationMatrix()); - VERIFY_IS_APPROX(q1 * v1, Quaternionx(aa) * v1); - // The following test is stable only if 2*angle != angle and v1 is not colinear with axis - if( (abs(aa.angle()) > test_precision()) && (abs(aa.axis().dot(v1.normalized()))<(Scalar(1)-Scalar(4)*test_precision())) ) - { - VERIFY( !(q1 * v1).isApprox(Quaternionx(AngleAxisx(aa.angle()*2,aa.axis())) * v1) ); - } - - // AngleAxis - VERIFY_IS_APPROX(AngleAxisx(a,v1.normalized()).toRotationMatrix(), - Quaternionx(AngleAxisx(a,v1.normalized())).toRotationMatrix()); - - AngleAxisx aa1; - m = q1.toRotationMatrix(); - aa1 = m; - VERIFY_IS_APPROX(AngleAxisx(m).toRotationMatrix(), - Quaternionx(m).toRotationMatrix()); - - // Transform - // TODO complete the tests ! - a = 0; - while (abs(a)(-Scalar(0.4)*Scalar(EIGEN_PI), Scalar(0.4)*Scalar(EIGEN_PI)); - q1 = AngleAxisx(a, v0.normalized()); - Transform3 t0, t1, t2; - - // first test setIdentity() and Identity() - t0.setIdentity(); - VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity()); - t0.matrix().setZero(); - t0 = Transform3::Identity(); - VERIFY_IS_APPROX(t0.matrix(), Transform3::MatrixType::Identity()); - - t0.setIdentity(); - t1.setIdentity(); - v1 << 1, 2, 3; - t0.linear() = q1.toRotationMatrix(); - t0.pretranslate(v0); - t0.scale(v1); - t1.linear() = q1.conjugate().toRotationMatrix(); - t1.prescale(v1.cwiseInverse()); - t1.translate(-v0); - - VERIFY((t0 * t1).matrix().isIdentity(test_precision())); - - t1.fromPositionOrientationScale(v0, q1, v1); - VERIFY_IS_APPROX(t1.matrix(), t0.matrix()); - - t0.setIdentity(); t0.scale(v0).rotate(q1.toRotationMatrix()); - t1.setIdentity(); t1.scale(v0).rotate(q1); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - t0.setIdentity(); t0.scale(v0).rotate(AngleAxisx(q1)); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - VERIFY_IS_APPROX(t0.scale(a).matrix(), t1.scale(Vector3::Constant(a)).matrix()); - VERIFY_IS_APPROX(t0.prescale(a).matrix(), t1.prescale(Vector3::Constant(a)).matrix()); - - // More transform constructors, operator=, operator*= - - Matrix3 mat3 = Matrix3::Random(); - Matrix4 mat4; - mat4 << mat3 , Vector3::Zero() , Vector4::Zero().transpose(); - Transform3 tmat3(mat3), tmat4(mat4); - if(Mode!=int(AffineCompact)) - tmat4.matrix()(3,3) = Scalar(1); - VERIFY_IS_APPROX(tmat3.matrix(), tmat4.matrix()); - - Scalar a3 = internal::random(-Scalar(EIGEN_PI), Scalar(EIGEN_PI)); - Vector3 v3 = Vector3::Random().normalized(); - AngleAxisx aa3(a3, v3); - Transform3 t3(aa3); - Transform3 t4; - t4 = aa3; - VERIFY_IS_APPROX(t3.matrix(), t4.matrix()); - t4.rotate(AngleAxisx(-a3,v3)); - VERIFY_IS_APPROX(t4.matrix(), MatrixType::Identity()); - t4 *= aa3; - VERIFY_IS_APPROX(t3.matrix(), t4.matrix()); - - do { - v3 = Vector3::Random(); - dont_over_optimize(v3); - } while (v3.cwiseAbs().minCoeff()::epsilon()); - Translation3 tv3(v3); - Transform3 t5(tv3); - t4 = tv3; - VERIFY_IS_APPROX(t5.matrix(), t4.matrix()); - t4.translate((-v3).eval()); - VERIFY_IS_APPROX(t4.matrix(), MatrixType::Identity()); - t4 *= tv3; - VERIFY_IS_APPROX(t5.matrix(), t4.matrix()); - - AlignedScaling3 sv3(v3); - Transform3 t6(sv3); - t4 = sv3; - VERIFY_IS_APPROX(t6.matrix(), t4.matrix()); - t4.scale(v3.cwiseInverse()); - VERIFY_IS_APPROX(t4.matrix(), MatrixType::Identity()); - t4 *= sv3; - VERIFY_IS_APPROX(t6.matrix(), t4.matrix()); - - // matrix * transform - VERIFY_IS_APPROX((t3.matrix()*t4).matrix(), (t3*t4).matrix()); - - // chained Transform product - VERIFY_IS_APPROX(((t3*t4)*t5).matrix(), (t3*(t4*t5)).matrix()); - - // check that Transform product doesn't have aliasing problems - t5 = t4; - t5 = t5*t5; - VERIFY_IS_APPROX(t5, t4*t4); - - // 2D transformation - Transform2 t20, t21; - Vector2 v20 = Vector2::Random(); - Vector2 v21 = Vector2::Random(); - for (int k=0; k<2; ++k) - if (abs(v21[k])(a).toRotationMatrix(); - VERIFY_IS_APPROX(t20.fromPositionOrientationScale(v20,a,v21).matrix(), - t21.pretranslate(v20).scale(v21).matrix()); - - t21.setIdentity(); - t21.linear() = Rotation2D(-a).toRotationMatrix(); - VERIFY( (t20.fromPositionOrientationScale(v20,a,v21) - * (t21.prescale(v21.cwiseInverse()).translate(-v20))).matrix().isIdentity(test_precision()) ); - - // Transform - new API - // 3D - t0.setIdentity(); - t0.rotate(q1).scale(v0).translate(v0); - // mat * aligned scaling and mat * translation - t1 = (Matrix3(q1) * AlignedScaling3(v0)) * Translation3(v0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t1 = (Matrix3(q1) * Eigen::Scaling(v0)) * Translation3(v0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t1 = (q1 * Eigen::Scaling(v0)) * Translation3(v0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - // mat * transformation and aligned scaling * translation - t1 = Matrix3(q1) * (AlignedScaling3(v0) * Translation3(v0)); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - - t0.setIdentity(); - t0.scale(s0).translate(v0); - t1 = Eigen::Scaling(s0) * Translation3(v0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t0.prescale(s0); - t1 = Eigen::Scaling(s0) * t1; - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - t0 = t3; - t0.scale(s0); - t1 = t3 * Eigen::Scaling(s0,s0,s0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t0.prescale(s0); - t1 = Eigen::Scaling(s0,s0,s0) * t1; - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - t0 = t3; - t0.scale(s0); - t1 = t3 * Eigen::Scaling(s0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t0.prescale(s0); - t1 = Eigen::Scaling(s0) * t1; - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - t0.setIdentity(); - t0.prerotate(q1).prescale(v0).pretranslate(v0); - // translation * aligned scaling and transformation * mat - t1 = (Translation3(v0) * AlignedScaling3(v0)) * Transform3(q1); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - // scaling * mat and translation * mat - t1 = Translation3(v0) * (AlignedScaling3(v0) * Transform3(q1)); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - t0.setIdentity(); - t0.scale(v0).translate(v0).rotate(q1); - // translation * mat and aligned scaling * transformation - t1 = AlignedScaling3(v0) * (Translation3(v0) * Transform3(q1)); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - // transformation * aligned scaling - t0.scale(v0); - t1 *= AlignedScaling3(v0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - t1 = AlignedScaling3(v0) * (Translation3(v0) * Transform3(q1)); - t1 = t1 * v0.asDiagonal(); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - // transformation * translation - t0.translate(v0); - t1 = t1 * Translation3(v0); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - // translation * transformation - t0.pretranslate(v0); - t1 = Translation3(v0) * t1; - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // transform * quaternion - t0.rotate(q1); - t1 = t1 * q1; - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // translation * quaternion - t0.translate(v1).rotate(q1); - t1 = t1 * (Translation3(v1) * q1); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // aligned scaling * quaternion - t0.scale(v1).rotate(q1); - t1 = t1 * (AlignedScaling3(v1) * q1); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // quaternion * transform - t0.prerotate(q1); - t1 = q1 * t1; - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // quaternion * translation - t0.rotate(q1).translate(v1); - t1 = t1 * (q1 * Translation3(v1)); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // quaternion * aligned scaling - t0.rotate(q1).scale(v1); - t1 = t1 * (q1 * AlignedScaling3(v1)); - VERIFY_IS_APPROX(t0.matrix(), t1.matrix()); - - // test transform inversion - t0.setIdentity(); - t0.translate(v0); - do { - t0.linear().setRandom(); - } while(t0.linear().jacobiSvd().singularValues()(2)()); - Matrix4 t044 = Matrix4::Zero(); - t044(3,3) = 1; - t044.block(0,0,t0.matrix().rows(),4) = t0.matrix(); - VERIFY_IS_APPROX(t0.inverse(Affine).matrix(), t044.inverse().block(0,0,t0.matrix().rows(),4)); - t0.setIdentity(); - t0.translate(v0).rotate(q1); - t044 = Matrix4::Zero(); - t044(3,3) = 1; - t044.block(0,0,t0.matrix().rows(),4) = t0.matrix(); - VERIFY_IS_APPROX(t0.inverse(Isometry).matrix(), t044.inverse().block(0,0,t0.matrix().rows(),4)); - - Matrix3 mat_rotation, mat_scaling; - t0.setIdentity(); - t0.translate(v0).rotate(q1).scale(v1); - t0.computeRotationScaling(&mat_rotation, &mat_scaling); - VERIFY_IS_APPROX(t0.linear(), mat_rotation * mat_scaling); - VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity()); - VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1)); - t0.computeScalingRotation(&mat_scaling, &mat_rotation); - VERIFY_IS_APPROX(t0.linear(), mat_scaling * mat_rotation); - VERIFY_IS_APPROX(mat_rotation*mat_rotation.adjoint(), Matrix3::Identity()); - VERIFY_IS_APPROX(mat_rotation.determinant(), Scalar(1)); - - // test casting - Transform t1f = t1.template cast(); - VERIFY_IS_APPROX(t1f.template cast(),t1); - Transform t1d = t1.template cast(); - VERIFY_IS_APPROX(t1d.template cast(),t1); - - Translation3 tr1(v0); - Translation tr1f = tr1.template cast(); - VERIFY_IS_APPROX(tr1f.template cast(),tr1); - Translation tr1d = tr1.template cast(); - VERIFY_IS_APPROX(tr1d.template cast(),tr1); - - AngleAxis aa1f = aa1.template cast(); - VERIFY_IS_APPROX(aa1f.template cast(),aa1); - AngleAxis aa1d = aa1.template cast(); - VERIFY_IS_APPROX(aa1d.template cast(),aa1); - - Rotation2D r2d1(internal::random()); - Rotation2D r2d1f = r2d1.template cast(); - VERIFY_IS_APPROX(r2d1f.template cast(),r2d1); - Rotation2D r2d1d = r2d1.template cast(); - VERIFY_IS_APPROX(r2d1d.template cast(),r2d1); - - for(int k=0; k<100; ++k) - { - Scalar angle = internal::random(-100,100); - Rotation2D rot2(angle); - VERIFY( rot2.smallestPositiveAngle() >= 0 ); - VERIFY( rot2.smallestPositiveAngle() <= Scalar(2)*Scalar(EIGEN_PI) ); - VERIFY_IS_APPROX( angleToVec(rot2.smallestPositiveAngle()), angleToVec(rot2.angle()) ); - - VERIFY( rot2.smallestAngle() >= -Scalar(EIGEN_PI) ); - VERIFY( rot2.smallestAngle() <= Scalar(EIGEN_PI) ); - VERIFY_IS_APPROX( angleToVec(rot2.smallestAngle()), angleToVec(rot2.angle()) ); - - Matrix rot2_as_mat(rot2); - Rotation2D rot3(rot2_as_mat); - VERIFY_IS_APPROX( angleToVec(rot2.smallestAngle()), angleToVec(rot3.angle()) ); - } - - s0 = internal::random(-100,100); - s1 = internal::random(-100,100); - Rotation2D R0(s0), R1(s1); - - t20 = Translation2(v20) * (R0 * Eigen::Scaling(s0)); - t21 = Translation2(v20) * R0 * Eigen::Scaling(s0); - VERIFY_IS_APPROX(t20,t21); - - t20 = Translation2(v20) * (R0 * R0.inverse() * Eigen::Scaling(s0)); - t21 = Translation2(v20) * Eigen::Scaling(s0); - VERIFY_IS_APPROX(t20,t21); - - VERIFY_IS_APPROX(s0, (R0.slerp(0, R1)).angle()); - VERIFY_IS_APPROX( angleToVec(R1.smallestPositiveAngle()), angleToVec((R0.slerp(1, R1)).smallestPositiveAngle()) ); - VERIFY_IS_APPROX(R0.smallestPositiveAngle(), (R0.slerp(0.5, R0)).smallestPositiveAngle()); - - if(std::cos(s0)>0) - VERIFY_IS_MUCH_SMALLER_THAN((R0.slerp(0.5, R0.inverse())).smallestAngle(), Scalar(1)); - else - VERIFY_IS_APPROX(Scalar(EIGEN_PI), (R0.slerp(0.5, R0.inverse())).smallestPositiveAngle()); - - // Check path length - Scalar l = 0; - int path_steps = 100; - for(int k=0; k::epsilon()*Scalar(path_steps/2))); - - // check basic features - { - Rotation2D r1; // default ctor - r1 = Rotation2D(s0); // copy assignment - VERIFY_IS_APPROX(r1.angle(),s0); - Rotation2D r2(r1); // copy ctor - VERIFY_IS_APPROX(r2.angle(),s0); - } - - { - Transform3 t32(Matrix4::Random()), t33, t34; - t34 = t33 = t32; - t32.scale(v0); - t33*=AlignedScaling3(v0); - VERIFY_IS_APPROX(t32.matrix(), t33.matrix()); - t33 = t34 * AlignedScaling3(v0); - VERIFY_IS_APPROX(t32.matrix(), t33.matrix()); - } - -} - -template -void transform_associativity_left(const A1& a1, const A2& a2, const P& p, const Q& q, const V& v, const H& h) -{ - VERIFY_IS_APPROX( q*(a1*v), (q*a1)*v ); - VERIFY_IS_APPROX( q*(a2*v), (q*a2)*v ); - VERIFY_IS_APPROX( q*(p*h).hnormalized(), ((q*p)*h).hnormalized() ); -} - -template -void transform_associativity2(const A1& a1, const A2& a2, const P& p, const Q& q, const V& v, const H& h) -{ - VERIFY_IS_APPROX( a1*(q*v), (a1*q)*v ); - VERIFY_IS_APPROX( a2*(q*v), (a2*q)*v ); - VERIFY_IS_APPROX( p *(q*v).homogeneous(), (p *q)*v.homogeneous() ); - - transform_associativity_left(a1, a2,p, q, v, h); -} - -template -void transform_associativity(const RotationType& R) -{ - typedef Matrix VectorType; - typedef Matrix HVectorType; - typedef Matrix LinearType; - typedef Matrix MatrixType; - typedef Transform AffineCompactType; - typedef Transform AffineType; - typedef Transform ProjectiveType; - typedef DiagonalMatrix ScalingType; - typedef Translation TranslationType; - - AffineCompactType A1c; A1c.matrix().setRandom(); - AffineCompactType A2c; A2c.matrix().setRandom(); - AffineType A1(A1c); - AffineType A2(A2c); - ProjectiveType P1; P1.matrix().setRandom(); - VectorType v1 = VectorType::Random(); - VectorType v2 = VectorType::Random(); - HVectorType h1 = HVectorType::Random(); - Scalar s1 = internal::random(); - LinearType L = LinearType::Random(); - MatrixType M = MatrixType::Random(); - - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, A2, v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, A2c, v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, v1.asDiagonal(), v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, ScalingType(v1), v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, Scaling(v1), v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, Scaling(s1), v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, TranslationType(v1), v2, h1) ); - CALL_SUBTEST( transform_associativity_left(A1c, A1, P1, L, v2, h1) ); - CALL_SUBTEST( transform_associativity2(A1c, A1, P1, R, v2, h1) ); - - VERIFY_IS_APPROX( A1*(M*h1), (A1*M)*h1 ); - VERIFY_IS_APPROX( A1c*(M*h1), (A1c*M)*h1 ); - VERIFY_IS_APPROX( P1*(M*h1), (P1*M)*h1 ); - - VERIFY_IS_APPROX( M*(A1*h1), (M*A1)*h1 ); - VERIFY_IS_APPROX( M*(A1c*h1), (M*A1c)*h1 ); - VERIFY_IS_APPROX( M*(P1*h1), ((M*P1)*h1) ); -} - -template void transform_alignment() -{ - typedef Transform Projective3a; - typedef Transform Projective3u; - - EIGEN_ALIGN_MAX Scalar array1[16]; - EIGEN_ALIGN_MAX Scalar array2[16]; - EIGEN_ALIGN_MAX Scalar array3[16+1]; - Scalar* array3u = array3+1; - - Projective3a *p1 = ::new(reinterpret_cast(array1)) Projective3a; - Projective3u *p2 = ::new(reinterpret_cast(array2)) Projective3u; - Projective3u *p3 = ::new(reinterpret_cast(array3u)) Projective3u; - - p1->matrix().setRandom(); - *p2 = *p1; - *p3 = *p1; - - VERIFY_IS_APPROX(p1->matrix(), p2->matrix()); - VERIFY_IS_APPROX(p1->matrix(), p3->matrix()); - - VERIFY_IS_APPROX( (*p1) * (*p1), (*p2)*(*p3)); - - #if defined(EIGEN_VECTORIZE) && EIGEN_MAX_STATIC_ALIGN_BYTES>0 - if(internal::packet_traits::Vectorizable) - VERIFY_RAISES_ASSERT((::new(reinterpret_cast(array3u)) Projective3a)); - #endif -} - -template void transform_products() -{ - typedef Matrix Mat; - typedef Transform Proj; - typedef Transform Aff; - typedef Transform AffC; - - Proj p; p.matrix().setRandom(); - Aff a; a.linear().setRandom(); a.translation().setRandom(); - AffC ac = a; - - Mat p_m(p.matrix()), a_m(a.matrix()); - - VERIFY_IS_APPROX((p*p).matrix(), p_m*p_m); - VERIFY_IS_APPROX((a*a).matrix(), a_m*a_m); - VERIFY_IS_APPROX((p*a).matrix(), p_m*a_m); - VERIFY_IS_APPROX((a*p).matrix(), a_m*p_m); - VERIFY_IS_APPROX((ac*a).matrix(), a_m*a_m); - VERIFY_IS_APPROX((a*ac).matrix(), a_m*a_m); - VERIFY_IS_APPROX((p*ac).matrix(), p_m*a_m); - VERIFY_IS_APPROX((ac*p).matrix(), a_m*p_m); -} - -void test_geo_transformations() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(( transformations() )); - CALL_SUBTEST_1(( non_projective_only() )); - - CALL_SUBTEST_2(( transformations() )); - CALL_SUBTEST_2(( non_projective_only() )); - CALL_SUBTEST_2(( transform_alignment() )); - - CALL_SUBTEST_3(( transformations() )); - CALL_SUBTEST_3(( transformations() )); - CALL_SUBTEST_3(( transform_alignment() )); - - CALL_SUBTEST_4(( transformations() )); - CALL_SUBTEST_4(( non_projective_only() )); - - CALL_SUBTEST_5(( transformations() )); - CALL_SUBTEST_5(( non_projective_only() )); - - CALL_SUBTEST_6(( transformations() )); - CALL_SUBTEST_6(( transformations() )); - - - CALL_SUBTEST_7(( transform_products() )); - CALL_SUBTEST_7(( transform_products() )); - - CALL_SUBTEST_8(( transform_associativity(Rotation2D(internal::random()*double(EIGEN_PI))) )); - CALL_SUBTEST_8(( transform_associativity(Quaterniond::UnitRandom()) )); - } -} diff --git a/testbed/nanogui/ext/eigen/test/half_float.cpp b/testbed/nanogui/ext/eigen/test/half_float.cpp deleted file mode 100644 index 6f319685..00000000 --- a/testbed/nanogui/ext/eigen/test/half_float.cpp +++ /dev/null @@ -1,257 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include - -#include "main.h" - -#include - -// Make sure it's possible to forward declare Eigen::half -namespace Eigen { -struct half; -} - -using Eigen::half; - -void test_conversion() -{ - using Eigen::half_impl::__half; - - // Conversion from float. - VERIFY_IS_EQUAL(half(1.0f).x, 0x3c00); - VERIFY_IS_EQUAL(half(0.5f).x, 0x3800); - VERIFY_IS_EQUAL(half(0.33333f).x, 0x3555); - VERIFY_IS_EQUAL(half(0.0f).x, 0x0000); - VERIFY_IS_EQUAL(half(-0.0f).x, 0x8000); - VERIFY_IS_EQUAL(half(65504.0f).x, 0x7bff); - VERIFY_IS_EQUAL(half(65536.0f).x, 0x7c00); // Becomes infinity. - - // Denormals. - VERIFY_IS_EQUAL(half(-5.96046e-08f).x, 0x8001); - VERIFY_IS_EQUAL(half(5.96046e-08f).x, 0x0001); - VERIFY_IS_EQUAL(half(1.19209e-07f).x, 0x0002); - - // Verify round-to-nearest-even behavior. - float val1 = float(half(__half(0x3c00))); - float val2 = float(half(__half(0x3c01))); - float val3 = float(half(__half(0x3c02))); - VERIFY_IS_EQUAL(half(0.5f * (val1 + val2)).x, 0x3c00); - VERIFY_IS_EQUAL(half(0.5f * (val2 + val3)).x, 0x3c02); - - // Conversion from int. - VERIFY_IS_EQUAL(half(-1).x, 0xbc00); - VERIFY_IS_EQUAL(half(0).x, 0x0000); - VERIFY_IS_EQUAL(half(1).x, 0x3c00); - VERIFY_IS_EQUAL(half(2).x, 0x4000); - VERIFY_IS_EQUAL(half(3).x, 0x4200); - - // Conversion from bool. - VERIFY_IS_EQUAL(half(false).x, 0x0000); - VERIFY_IS_EQUAL(half(true).x, 0x3c00); - - // Conversion to float. - VERIFY_IS_EQUAL(float(half(__half(0x0000))), 0.0f); - VERIFY_IS_EQUAL(float(half(__half(0x3c00))), 1.0f); - - // Denormals. - VERIFY_IS_APPROX(float(half(__half(0x8001))), -5.96046e-08f); - VERIFY_IS_APPROX(float(half(__half(0x0001))), 5.96046e-08f); - VERIFY_IS_APPROX(float(half(__half(0x0002))), 1.19209e-07f); - - // NaNs and infinities. - VERIFY(!(numext::isinf)(float(half(65504.0f)))); // Largest finite number. - VERIFY(!(numext::isnan)(float(half(0.0f)))); - VERIFY((numext::isinf)(float(half(__half(0xfc00))))); - VERIFY((numext::isnan)(float(half(__half(0xfc01))))); - VERIFY((numext::isinf)(float(half(__half(0x7c00))))); - VERIFY((numext::isnan)(float(half(__half(0x7c01))))); - -#if !EIGEN_COMP_MSVC - // Visual Studio errors out on divisions by 0 - VERIFY((numext::isnan)(float(half(0.0 / 0.0)))); - VERIFY((numext::isinf)(float(half(1.0 / 0.0)))); - VERIFY((numext::isinf)(float(half(-1.0 / 0.0)))); -#endif - - // Exactly same checks as above, just directly on the half representation. - VERIFY(!(numext::isinf)(half(__half(0x7bff)))); - VERIFY(!(numext::isnan)(half(__half(0x0000)))); - VERIFY((numext::isinf)(half(__half(0xfc00)))); - VERIFY((numext::isnan)(half(__half(0xfc01)))); - VERIFY((numext::isinf)(half(__half(0x7c00)))); - VERIFY((numext::isnan)(half(__half(0x7c01)))); - -#if !EIGEN_COMP_MSVC - // Visual Studio errors out on divisions by 0 - VERIFY((numext::isnan)(half(0.0 / 0.0))); - VERIFY((numext::isinf)(half(1.0 / 0.0))); - VERIFY((numext::isinf)(half(-1.0 / 0.0))); -#endif -} - -void test_numtraits() -{ - std::cout << "epsilon = " << NumTraits::epsilon() << std::endl; - std::cout << "highest = " << NumTraits::highest() << std::endl; - std::cout << "lowest = " << NumTraits::lowest() << std::endl; - std::cout << "inifinty = " << NumTraits::infinity() << std::endl; - std::cout << "nan = " << NumTraits::quiet_NaN() << std::endl; - -} - -void test_arithmetic() -{ - VERIFY_IS_EQUAL(float(half(2) + half(2)), 4); - VERIFY_IS_EQUAL(float(half(2) + half(-2)), 0); - VERIFY_IS_APPROX(float(half(0.33333f) + half(0.66667f)), 1.0f); - VERIFY_IS_EQUAL(float(half(2.0f) * half(-5.5f)), -11.0f); - VERIFY_IS_APPROX(float(half(1.0f) / half(3.0f)), 0.33333f); - VERIFY_IS_EQUAL(float(-half(4096.0f)), -4096.0f); - VERIFY_IS_EQUAL(float(-half(-4096.0f)), 4096.0f); -} - -void test_comparison() -{ - VERIFY(half(1.0f) > half(0.5f)); - VERIFY(half(0.5f) < half(1.0f)); - VERIFY(!(half(1.0f) < half(0.5f))); - VERIFY(!(half(0.5f) > half(1.0f))); - - VERIFY(!(half(4.0f) > half(4.0f))); - VERIFY(!(half(4.0f) < half(4.0f))); - - VERIFY(!(half(0.0f) < half(-0.0f))); - VERIFY(!(half(-0.0f) < half(0.0f))); - VERIFY(!(half(0.0f) > half(-0.0f))); - VERIFY(!(half(-0.0f) > half(0.0f))); - - VERIFY(half(0.2f) > half(-1.0f)); - VERIFY(half(-1.0f) < half(0.2f)); - VERIFY(half(-16.0f) < half(-15.0f)); - - VERIFY(half(1.0f) == half(1.0f)); - VERIFY(half(1.0f) != half(2.0f)); - - // Comparisons with NaNs and infinities. -#if !EIGEN_COMP_MSVC - // Visual Studio errors out on divisions by 0 - VERIFY(!(half(0.0 / 0.0) == half(0.0 / 0.0))); - VERIFY(half(0.0 / 0.0) != half(0.0 / 0.0)); - - VERIFY(!(half(1.0) == half(0.0 / 0.0))); - VERIFY(!(half(1.0) < half(0.0 / 0.0))); - VERIFY(!(half(1.0) > half(0.0 / 0.0))); - VERIFY(half(1.0) != half(0.0 / 0.0)); - - VERIFY(half(1.0) < half(1.0 / 0.0)); - VERIFY(half(1.0) > half(-1.0 / 0.0)); -#endif -} - -void test_basic_functions() -{ - VERIFY_IS_EQUAL(float(numext::abs(half(3.5f))), 3.5f); - VERIFY_IS_EQUAL(float(abs(half(3.5f))), 3.5f); - VERIFY_IS_EQUAL(float(numext::abs(half(-3.5f))), 3.5f); - VERIFY_IS_EQUAL(float(abs(half(-3.5f))), 3.5f); - - VERIFY_IS_EQUAL(float(numext::floor(half(3.5f))), 3.0f); - VERIFY_IS_EQUAL(float(floor(half(3.5f))), 3.0f); - VERIFY_IS_EQUAL(float(numext::floor(half(-3.5f))), -4.0f); - VERIFY_IS_EQUAL(float(floor(half(-3.5f))), -4.0f); - - VERIFY_IS_EQUAL(float(numext::ceil(half(3.5f))), 4.0f); - VERIFY_IS_EQUAL(float(ceil(half(3.5f))), 4.0f); - VERIFY_IS_EQUAL(float(numext::ceil(half(-3.5f))), -3.0f); - VERIFY_IS_EQUAL(float(ceil(half(-3.5f))), -3.0f); - - VERIFY_IS_APPROX(float(numext::sqrt(half(0.0f))), 0.0f); - VERIFY_IS_APPROX(float(sqrt(half(0.0f))), 0.0f); - VERIFY_IS_APPROX(float(numext::sqrt(half(4.0f))), 2.0f); - VERIFY_IS_APPROX(float(sqrt(half(4.0f))), 2.0f); - - VERIFY_IS_APPROX(float(numext::pow(half(0.0f), half(1.0f))), 0.0f); - VERIFY_IS_APPROX(float(pow(half(0.0f), half(1.0f))), 0.0f); - VERIFY_IS_APPROX(float(numext::pow(half(2.0f), half(2.0f))), 4.0f); - VERIFY_IS_APPROX(float(pow(half(2.0f), half(2.0f))), 4.0f); - - VERIFY_IS_EQUAL(float(numext::exp(half(0.0f))), 1.0f); - VERIFY_IS_EQUAL(float(exp(half(0.0f))), 1.0f); - VERIFY_IS_APPROX(float(numext::exp(half(EIGEN_PI))), 20.f + float(EIGEN_PI)); - VERIFY_IS_APPROX(float(exp(half(EIGEN_PI))), 20.f + float(EIGEN_PI)); - - VERIFY_IS_EQUAL(float(numext::expm1(half(0.0f))), 0.0f); - VERIFY_IS_EQUAL(float(expm1(half(0.0f))), 0.0f); - VERIFY_IS_APPROX(float(numext::expm1(half(2.0f))), 6.3890561f); - VERIFY_IS_APPROX(float(expm1(half(2.0f))), 6.3890561f); - - VERIFY_IS_EQUAL(float(numext::log(half(1.0f))), 0.0f); - VERIFY_IS_EQUAL(float(log(half(1.0f))), 0.0f); - VERIFY_IS_APPROX(float(numext::log(half(10.0f))), 2.30273f); - VERIFY_IS_APPROX(float(log(half(10.0f))), 2.30273f); - - VERIFY_IS_EQUAL(float(numext::log1p(half(0.0f))), 0.0f); - VERIFY_IS_EQUAL(float(log1p(half(0.0f))), 0.0f); - VERIFY_IS_APPROX(float(numext::log1p(half(10.0f))), 2.3978953f); - VERIFY_IS_APPROX(float(log1p(half(10.0f))), 2.3978953f); -} - -void test_trigonometric_functions() -{ - VERIFY_IS_APPROX(numext::cos(half(0.0f)), half(cosf(0.0f))); - VERIFY_IS_APPROX(cos(half(0.0f)), half(cosf(0.0f))); - VERIFY_IS_APPROX(numext::cos(half(EIGEN_PI)), half(cosf(EIGEN_PI))); - //VERIFY_IS_APPROX(numext::cos(half(EIGEN_PI/2)), half(cosf(EIGEN_PI/2))); - //VERIFY_IS_APPROX(numext::cos(half(3*EIGEN_PI/2)), half(cosf(3*EIGEN_PI/2))); - VERIFY_IS_APPROX(numext::cos(half(3.5f)), half(cosf(3.5f))); - - VERIFY_IS_APPROX(numext::sin(half(0.0f)), half(sinf(0.0f))); - VERIFY_IS_APPROX(sin(half(0.0f)), half(sinf(0.0f))); - // VERIFY_IS_APPROX(numext::sin(half(EIGEN_PI)), half(sinf(EIGEN_PI))); - VERIFY_IS_APPROX(numext::sin(half(EIGEN_PI/2)), half(sinf(EIGEN_PI/2))); - VERIFY_IS_APPROX(numext::sin(half(3*EIGEN_PI/2)), half(sinf(3*EIGEN_PI/2))); - VERIFY_IS_APPROX(numext::sin(half(3.5f)), half(sinf(3.5f))); - - VERIFY_IS_APPROX(numext::tan(half(0.0f)), half(tanf(0.0f))); - VERIFY_IS_APPROX(tan(half(0.0f)), half(tanf(0.0f))); - // VERIFY_IS_APPROX(numext::tan(half(EIGEN_PI)), half(tanf(EIGEN_PI))); - // VERIFY_IS_APPROX(numext::tan(half(EIGEN_PI/2)), half(tanf(EIGEN_PI/2))); - //VERIFY_IS_APPROX(numext::tan(half(3*EIGEN_PI/2)), half(tanf(3*EIGEN_PI/2))); - VERIFY_IS_APPROX(numext::tan(half(3.5f)), half(tanf(3.5f))); -} - -void test_array() -{ - typedef Array ArrayXh; - Index size = internal::random(1,10); - Index i = internal::random(0,size-1); - ArrayXh a1 = ArrayXh::Random(size), a2 = ArrayXh::Random(size); - VERIFY_IS_APPROX( a1+a1, half(2)*a1 ); - VERIFY( (a1.abs() >= half(0)).all() ); - VERIFY_IS_APPROX( (a1*a1).sqrt(), a1.abs() ); - - VERIFY( ((a1.min)(a2) <= (a1.max)(a2)).all() ); - a1(i) = half(-10.); - VERIFY_IS_EQUAL( a1.minCoeff(), half(-10.) ); - a1(i) = half(10.); - VERIFY_IS_EQUAL( a1.maxCoeff(), half(10.) ); - - std::stringstream ss; - ss << a1; -} - -void test_half_float() -{ - CALL_SUBTEST(test_conversion()); - CALL_SUBTEST(test_numtraits()); - CALL_SUBTEST(test_arithmetic()); - CALL_SUBTEST(test_comparison()); - CALL_SUBTEST(test_basic_functions()); - CALL_SUBTEST(test_trigonometric_functions()); - CALL_SUBTEST(test_array()); -} diff --git a/testbed/nanogui/ext/eigen/test/hessenberg.cpp b/testbed/nanogui/ext/eigen/test/hessenberg.cpp deleted file mode 100644 index 96bc19e2..00000000 --- a/testbed/nanogui/ext/eigen/test/hessenberg.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// Copyright (C) 2010 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void hessenberg(int size = Size) -{ - typedef Matrix MatrixType; - - // Test basic functionality: A = U H U* and H is Hessenberg - for(int counter = 0; counter < g_repeat; ++counter) { - MatrixType m = MatrixType::Random(size,size); - HessenbergDecomposition hess(m); - MatrixType Q = hess.matrixQ(); - MatrixType H = hess.matrixH(); - VERIFY_IS_APPROX(m, Q * H * Q.adjoint()); - for(int row = 2; row < size; ++row) { - for(int col = 0; col < row-1; ++col) { - VERIFY(H(row,col) == (typename MatrixType::Scalar)0); - } - } - } - - // Test whether compute() and constructor returns same result - MatrixType A = MatrixType::Random(size, size); - HessenbergDecomposition cs1; - cs1.compute(A); - HessenbergDecomposition cs2(A); - VERIFY_IS_EQUAL(cs1.matrixH().eval(), cs2.matrixH().eval()); - MatrixType cs1Q = cs1.matrixQ(); - MatrixType cs2Q = cs2.matrixQ(); - VERIFY_IS_EQUAL(cs1Q, cs2Q); - - // Test assertions for when used uninitialized - HessenbergDecomposition hessUninitialized; - VERIFY_RAISES_ASSERT( hessUninitialized.matrixH() ); - VERIFY_RAISES_ASSERT( hessUninitialized.matrixQ() ); - VERIFY_RAISES_ASSERT( hessUninitialized.householderCoefficients() ); - VERIFY_RAISES_ASSERT( hessUninitialized.packedMatrix() ); - - // TODO: Add tests for packedMatrix() and householderCoefficients() -} - -void test_hessenberg() -{ - CALL_SUBTEST_1(( hessenberg,1>() )); - CALL_SUBTEST_2(( hessenberg,2>() )); - CALL_SUBTEST_3(( hessenberg,4>() )); - CALL_SUBTEST_4(( hessenberg(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - CALL_SUBTEST_5(( hessenberg,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - - // Test problem size constructors - CALL_SUBTEST_6(HessenbergDecomposition(10)); -} diff --git a/testbed/nanogui/ext/eigen/test/householder.cpp b/testbed/nanogui/ext/eigen/test/householder.cpp deleted file mode 100644 index c5f6b5e4..00000000 --- a/testbed/nanogui/ext/eigen/test/householder.cpp +++ /dev/null @@ -1,138 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void householder(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - static bool even = true; - even = !even; - /* this test covers the following files: - Householder.h - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - typedef Matrix::ret, 1> EssentialVectorType; - typedef Matrix SquareMatrixType; - typedef Matrix HBlockMatrixType; - typedef Matrix HCoeffsVectorType; - - typedef Matrix TMatrixType; - - Matrix _tmp((std::max)(rows,cols)); - Scalar* tmp = &_tmp.coeffRef(0,0); - - Scalar beta; - RealScalar alpha; - EssentialVectorType essential; - - VectorType v1 = VectorType::Random(rows), v2; - v2 = v1; - v1.makeHouseholder(essential, beta, alpha); - v1.applyHouseholderOnTheLeft(essential,beta,tmp); - VERIFY_IS_APPROX(v1.norm(), v2.norm()); - if(rows>=2) VERIFY_IS_MUCH_SMALLER_THAN(v1.tail(rows-1).norm(), v1.norm()); - v1 = VectorType::Random(rows); - v2 = v1; - v1.applyHouseholderOnTheLeft(essential,beta,tmp); - VERIFY_IS_APPROX(v1.norm(), v2.norm()); - - MatrixType m1(rows, cols), - m2(rows, cols); - - v1 = VectorType::Random(rows); - if(even) v1.tail(rows-1).setZero(); - m1.colwise() = v1; - m2 = m1; - m1.col(0).makeHouseholder(essential, beta, alpha); - m1.applyHouseholderOnTheLeft(essential,beta,tmp); - VERIFY_IS_APPROX(m1.norm(), m2.norm()); - if(rows>=2) VERIFY_IS_MUCH_SMALLER_THAN(m1.block(1,0,rows-1,cols).norm(), m1.norm()); - VERIFY_IS_MUCH_SMALLER_THAN(numext::imag(m1(0,0)), numext::real(m1(0,0))); - VERIFY_IS_APPROX(numext::real(m1(0,0)), alpha); - - v1 = VectorType::Random(rows); - if(even) v1.tail(rows-1).setZero(); - SquareMatrixType m3(rows,rows), m4(rows,rows); - m3.rowwise() = v1.transpose(); - m4 = m3; - m3.row(0).makeHouseholder(essential, beta, alpha); - m3.applyHouseholderOnTheRight(essential,beta,tmp); - VERIFY_IS_APPROX(m3.norm(), m4.norm()); - if(rows>=2) VERIFY_IS_MUCH_SMALLER_THAN(m3.block(0,1,rows,rows-1).norm(), m3.norm()); - VERIFY_IS_MUCH_SMALLER_THAN(numext::imag(m3(0,0)), numext::real(m3(0,0))); - VERIFY_IS_APPROX(numext::real(m3(0,0)), alpha); - - // test householder sequence on the left with a shift - - Index shift = internal::random(0, std::max(rows-2,0)); - Index brows = rows - shift; - m1.setRandom(rows, cols); - HBlockMatrixType hbm = m1.block(shift,0,brows,cols); - HouseholderQR qr(hbm); - m2 = m1; - m2.block(shift,0,brows,cols) = qr.matrixQR(); - HCoeffsVectorType hc = qr.hCoeffs().conjugate(); - HouseholderSequence hseq(m2, hc); - hseq.setLength(hc.size()).setShift(shift); - VERIFY(hseq.length() == hc.size()); - VERIFY(hseq.shift() == shift); - - MatrixType m5 = m2; - m5.block(shift,0,brows,cols).template triangularView().setZero(); - VERIFY_IS_APPROX(hseq * m5, m1); // test applying hseq directly - m3 = hseq; - VERIFY_IS_APPROX(m3 * m5, m1); // test evaluating hseq to a dense matrix, then applying - - SquareMatrixType hseq_mat = hseq; - SquareMatrixType hseq_mat_conj = hseq.conjugate(); - SquareMatrixType hseq_mat_adj = hseq.adjoint(); - SquareMatrixType hseq_mat_trans = hseq.transpose(); - SquareMatrixType m6 = SquareMatrixType::Random(rows, rows); - VERIFY_IS_APPROX(hseq_mat.adjoint(), hseq_mat_adj); - VERIFY_IS_APPROX(hseq_mat.conjugate(), hseq_mat_conj); - VERIFY_IS_APPROX(hseq_mat.transpose(), hseq_mat_trans); - VERIFY_IS_APPROX(hseq_mat * m6, hseq_mat * m6); - VERIFY_IS_APPROX(hseq_mat.adjoint() * m6, hseq_mat_adj * m6); - VERIFY_IS_APPROX(hseq_mat.conjugate() * m6, hseq_mat_conj * m6); - VERIFY_IS_APPROX(hseq_mat.transpose() * m6, hseq_mat_trans * m6); - VERIFY_IS_APPROX(m6 * hseq_mat, m6 * hseq_mat); - VERIFY_IS_APPROX(m6 * hseq_mat.adjoint(), m6 * hseq_mat_adj); - VERIFY_IS_APPROX(m6 * hseq_mat.conjugate(), m6 * hseq_mat_conj); - VERIFY_IS_APPROX(m6 * hseq_mat.transpose(), m6 * hseq_mat_trans); - - // test householder sequence on the right with a shift - - TMatrixType tm2 = m2.transpose(); - HouseholderSequence rhseq(tm2, hc); - rhseq.setLength(hc.size()).setShift(shift); - VERIFY_IS_APPROX(rhseq * m5, m1); // test applying rhseq directly - m3 = rhseq; - VERIFY_IS_APPROX(m3 * m5, m1); // test evaluating rhseq to a dense matrix, then applying -} - -void test_householder() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( householder(Matrix()) ); - CALL_SUBTEST_2( householder(Matrix()) ); - CALL_SUBTEST_3( householder(Matrix()) ); - CALL_SUBTEST_4( householder(Matrix()) ); - CALL_SUBTEST_5( householder(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_6( householder(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_7( householder(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_8( householder(Matrix()) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/incomplete_cholesky.cpp b/testbed/nanogui/ext/eigen/test/incomplete_cholesky.cpp deleted file mode 100644 index 59ffe925..00000000 --- a/testbed/nanogui/ext/eigen/test/incomplete_cholesky.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015-2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// #define EIGEN_DONT_VECTORIZE -// #define EIGEN_MAX_ALIGN_BYTES 0 -#include "sparse_solver.h" -#include -#include - -template void test_incomplete_cholesky_T() -{ - typedef SparseMatrix SparseMatrixType; - ConjugateGradient > > cg_illt_lower_amd; - ConjugateGradient > > cg_illt_lower_nat; - ConjugateGradient > > cg_illt_upper_amd; - ConjugateGradient > > cg_illt_upper_nat; - ConjugateGradient > > cg_illt_uplo_amd; - - - CALL_SUBTEST( check_sparse_spd_solving(cg_illt_lower_amd) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_illt_lower_nat) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_illt_upper_amd) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_illt_upper_nat) ); - CALL_SUBTEST( check_sparse_spd_solving(cg_illt_uplo_amd) ); -} - -void test_incomplete_cholesky() -{ - CALL_SUBTEST_1(( test_incomplete_cholesky_T() )); - CALL_SUBTEST_2(( test_incomplete_cholesky_T, int>() )); - CALL_SUBTEST_3(( test_incomplete_cholesky_T() )); - -#ifdef EIGEN_TEST_PART_1 - // regression for bug 1150 - for(int N = 1; N<20; ++N) - { - Eigen::MatrixXd b( N, N ); - b.setOnes(); - - Eigen::SparseMatrix m( N, N ); - m.reserve(Eigen::VectorXi::Constant(N,4)); - for( int i = 0; i < N; ++i ) - { - m.insert( i, i ) = 1; - m.coeffRef( i, i / 2 ) = 2; - m.coeffRef( i, i / 3 ) = 2; - m.coeffRef( i, i / 4 ) = 2; - } - - Eigen::SparseMatrix A; - A = m * m.transpose(); - - Eigen::ConjugateGradient, - Eigen::Lower | Eigen::Upper, - Eigen::IncompleteCholesky > solver( A ); - VERIFY(solver.preconditioner().info() == Eigen::Success); - VERIFY(solver.info() == Eigen::Success); - } -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/indexed_view.cpp b/testbed/nanogui/ext/eigen/test/indexed_view.cpp deleted file mode 100644 index 7245cf37..00000000 --- a/testbed/nanogui/ext/eigen/test/indexed_view.cpp +++ /dev/null @@ -1,378 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifdef EIGEN_TEST_PART_2 -// Make sure we also check c++11 max implementation -#define EIGEN_MAX_CPP_VER 11 -#endif - -#ifdef EIGEN_TEST_PART_3 -// Make sure we also check c++98 max implementation -#define EIGEN_MAX_CPP_VER 03 -#endif - -#include -#include -#include "main.h" - -#if EIGEN_HAS_CXX11 -#include -#endif - -typedef std::pair IndexPair; - -int encode(Index i, Index j) { - return int(i*100 + j); -} - -IndexPair decode(Index ij) { - return IndexPair(ij / 100, ij % 100); -} - -template -bool match(const T& xpr, std::string ref, std::string str_xpr = "") { - EIGEN_UNUSED_VARIABLE(str_xpr); - std::stringstream str; - str << xpr; - if(!(str.str() == ref)) - std::cout << str_xpr << "\n" << xpr << "\n\n"; - return str.str() == ref; -} - -#define MATCH(X,R) match(X, R, #X) - -template -typename internal::enable_if::value,bool>::type -is_same_eq(const T1& a, const T2& b) -{ - return (a == b).all(); -} - -template -bool is_same_seq(const T1& a, const T2& b) -{ - bool ok = a.first()==b.first() && a.size() == b.size() && Index(a.incrObject())==Index(b.incrObject());; - if(!ok) - { - std::cerr << "seqN(" << a.first() << ", " << a.size() << ", " << Index(a.incrObject()) << ") != "; - std::cerr << "seqN(" << b.first() << ", " << b.size() << ", " << Index(b.incrObject()) << ")\n"; - } - return ok; -} - -template -typename internal::enable_if::value,bool>::type -is_same_seq_type(const T1& a, const T2& b) -{ - return is_same_seq(a,b); -} - - - -#define VERIFY_EQ_INT(A,B) VERIFY_IS_APPROX(int(A),int(B)) - -void check_indexed_view() -{ - using Eigen::placeholders::all; - using Eigen::placeholders::last; - using Eigen::placeholders::end; - - Index n = 10; - - ArrayXd a = ArrayXd::LinSpaced(n,0,n-1); - Array b = a.transpose(); - - ArrayXXi A = ArrayXXi::NullaryExpr(n,n, std::ptr_fun(encode)); - - for(Index i=0; i vali(4); Map(&vali[0],4) = eii; - std::vector veci(4); Map(veci.data(),4) = eii; - - VERIFY( MATCH( A(3, seq(9,3,-1)), - "309 308 307 306 305 304 303") - ); - - VERIFY( MATCH( A(seqN(2,5), seq(9,3,-1)), - "209 208 207 206 205 204 203\n" - "309 308 307 306 305 304 303\n" - "409 408 407 406 405 404 403\n" - "509 508 507 506 505 504 503\n" - "609 608 607 606 605 604 603") - ); - - VERIFY( MATCH( A(seqN(2,5), 5), - "205\n" - "305\n" - "405\n" - "505\n" - "605") - ); - - VERIFY( MATCH( A(seqN(last,5,-1), seq(2,last)), - "902 903 904 905 906 907 908 909\n" - "802 803 804 805 806 807 808 809\n" - "702 703 704 705 706 707 708 709\n" - "602 603 604 605 606 607 608 609\n" - "502 503 504 505 506 507 508 509") - ); - - VERIFY( MATCH( A(eii, veci), - "303 301 306 305\n" - "103 101 106 105\n" - "603 601 606 605\n" - "503 501 506 505") - ); - - VERIFY( MATCH( A(eii, all), - "300 301 302 303 304 305 306 307 308 309\n" - "100 101 102 103 104 105 106 107 108 109\n" - "600 601 602 603 604 605 606 607 608 609\n" - "500 501 502 503 504 505 506 507 508 509") - ); - - // takes the row numer 3, and repeat it 5 times - VERIFY( MATCH( A(seqN(3,5,0), all), - "300 301 302 303 304 305 306 307 308 309\n" - "300 301 302 303 304 305 306 307 308 309\n" - "300 301 302 303 304 305 306 307 308 309\n" - "300 301 302 303 304 305 306 307 308 309\n" - "300 301 302 303 304 305 306 307 308 309") - ); - - VERIFY( MATCH( a(seqN(3,3),0), "3\n4\n5" ) ); - VERIFY( MATCH( a(seq(3,5)), "3\n4\n5" ) ); - VERIFY( MATCH( a(seqN(3,3,1)), "3\n4\n5" ) ); - VERIFY( MATCH( a(seqN(5,3,-1)), "5\n4\n3" ) ); - - VERIFY( MATCH( b(0,seqN(3,3)), "3 4 5" ) ); - VERIFY( MATCH( b(seq(3,5)), "3 4 5" ) ); - VERIFY( MATCH( b(seqN(3,3,1)), "3 4 5" ) ); - VERIFY( MATCH( b(seqN(5,3,-1)), "5 4 3" ) ); - - VERIFY( MATCH( b(all), "0 1 2 3 4 5 6 7 8 9" ) ); - VERIFY( MATCH( b(eii), "3 1 6 5" ) ); - - Array44i B; - B.setRandom(); - VERIFY( (A(seqN(2,5), 5)).ColsAtCompileTime == 1); - VERIFY( (A(seqN(2,5), 5)).RowsAtCompileTime == Dynamic); - VERIFY_EQ_INT( (A(seqN(2,5), 5)).InnerStrideAtCompileTime , A.InnerStrideAtCompileTime); - VERIFY_EQ_INT( (A(seqN(2,5), 5)).OuterStrideAtCompileTime , A.col(5).OuterStrideAtCompileTime); - - VERIFY_EQ_INT( (A(5,seqN(2,5))).InnerStrideAtCompileTime , A.row(5).InnerStrideAtCompileTime); - VERIFY_EQ_INT( (A(5,seqN(2,5))).OuterStrideAtCompileTime , A.row(5).OuterStrideAtCompileTime); - VERIFY_EQ_INT( (B(1,seqN(1,2))).InnerStrideAtCompileTime , B.row(1).InnerStrideAtCompileTime); - VERIFY_EQ_INT( (B(1,seqN(1,2))).OuterStrideAtCompileTime , B.row(1).OuterStrideAtCompileTime); - - VERIFY_EQ_INT( (A(seqN(2,5), seq(1,3))).InnerStrideAtCompileTime , A.InnerStrideAtCompileTime); - VERIFY_EQ_INT( (A(seqN(2,5), seq(1,3))).OuterStrideAtCompileTime , A.OuterStrideAtCompileTime); - VERIFY_EQ_INT( (B(seqN(1,2), seq(1,3))).InnerStrideAtCompileTime , B.InnerStrideAtCompileTime); - VERIFY_EQ_INT( (B(seqN(1,2), seq(1,3))).OuterStrideAtCompileTime , B.OuterStrideAtCompileTime); - VERIFY_EQ_INT( (A(seqN(2,5,2), seq(1,3,2))).InnerStrideAtCompileTime , Dynamic); - VERIFY_EQ_INT( (A(seqN(2,5,2), seq(1,3,2))).OuterStrideAtCompileTime , Dynamic); - VERIFY_EQ_INT( (A(seqN(2,5,fix<2>), seq(1,3,fix<3>))).InnerStrideAtCompileTime , 2); - VERIFY_EQ_INT( (A(seqN(2,5,fix<2>), seq(1,3,fix<3>))).OuterStrideAtCompileTime , Dynamic); - VERIFY_EQ_INT( (B(seqN(1,2,fix<2>), seq(1,3,fix<3>))).InnerStrideAtCompileTime , 2); - VERIFY_EQ_INT( (B(seqN(1,2,fix<2>), seq(1,3,fix<3>))).OuterStrideAtCompileTime , 3*4); - - VERIFY_EQ_INT( (A(seqN(2,fix<5>), seqN(1,fix<3>))).RowsAtCompileTime, 5); - VERIFY_EQ_INT( (A(seqN(2,fix<5>), seqN(1,fix<3>))).ColsAtCompileTime, 3); - VERIFY_EQ_INT( (A(seqN(2,fix<5>(5)), seqN(1,fix<3>(3)))).RowsAtCompileTime, 5); - VERIFY_EQ_INT( (A(seqN(2,fix<5>(5)), seqN(1,fix<3>(3)))).ColsAtCompileTime, 3); - VERIFY_EQ_INT( (A(seqN(2,fix(5)), seqN(1,fix(3)))).RowsAtCompileTime, Dynamic); - VERIFY_EQ_INT( (A(seqN(2,fix(5)), seqN(1,fix(3)))).ColsAtCompileTime, Dynamic); - VERIFY_EQ_INT( (A(seqN(2,fix(5)), seqN(1,fix(3)))).rows(), 5); - VERIFY_EQ_INT( (A(seqN(2,fix(5)), seqN(1,fix(3)))).cols(), 3); - - VERIFY( is_same_seq_type( seqN(2,5,fix<-1>), seqN(2,5,fix<-1>(-1)) ) ); - VERIFY( is_same_seq_type( seqN(2,5), seqN(2,5,fix<1>(1)) ) ); - VERIFY( is_same_seq_type( seqN(2,5,3), seqN(2,5,fix(3)) ) ); - VERIFY( is_same_seq_type( seq(2,7,fix<3>), seqN(2,2,fix<3>) ) ); - VERIFY( is_same_seq_type( seqN(2,fix(5),3), seqN(2,5,fix(3)) ) ); - VERIFY( is_same_seq_type( seqN(2,fix<5>(5),fix<-2>), seqN(2,fix<5>,fix<-2>()) ) ); - - VERIFY( is_same_seq_type( seq(2,fix<5>), seqN(2,4) ) ); -#if EIGEN_HAS_CXX11 - VERIFY( is_same_seq_type( seq(fix<2>,fix<5>), seqN(fix<2>,fix<4>) ) ); - VERIFY( is_same_seq( seqN(2,std::integral_constant(),std::integral_constant()), seqN(2,fix<5>,fix<-2>()) ) ); - VERIFY( is_same_seq( seq(std::integral_constant(),std::integral_constant(),std::integral_constant()), - seq(fix<1>,fix<5>,fix<2>()) ) ); - VERIFY( is_same_seq_type( seqN(2,std::integral_constant(),std::integral_constant()), seqN(2,fix<5>,fix<-2>()) ) ); - VERIFY( is_same_seq_type( seq(std::integral_constant(),std::integral_constant(),std::integral_constant()), - seq(fix<1>,fix<5>,fix<2>()) ) ); - - VERIFY( is_same_seq_type( seqN(2,std::integral_constant()), seqN(2,fix<5>) ) ); - VERIFY( is_same_seq_type( seq(std::integral_constant(),std::integral_constant()), seq(fix<1>,fix<5>) ) ); -#else - // sorry, no compile-time size recovery in c++98/03 - VERIFY( is_same_seq( seq(fix<2>,fix<5>), seqN(fix<2>,fix<4>) ) ); -#endif - - VERIFY( (A(seqN(2,fix<5>), 5)).RowsAtCompileTime == 5); - VERIFY( (A(4, all)).ColsAtCompileTime == Dynamic); - VERIFY( (A(4, all)).RowsAtCompileTime == 1); - VERIFY( (B(1, all)).ColsAtCompileTime == 4); - VERIFY( (B(1, all)).RowsAtCompileTime == 1); - VERIFY( (B(all,1)).ColsAtCompileTime == 1); - VERIFY( (B(all,1)).RowsAtCompileTime == 4); - - VERIFY(int( (A(all, eii)).ColsAtCompileTime) == int(eii.SizeAtCompileTime)); - VERIFY_EQ_INT( (A(eii, eii)).Flags&DirectAccessBit, (unsigned int)(0)); - VERIFY_EQ_INT( (A(eii, eii)).InnerStrideAtCompileTime, 0); - VERIFY_EQ_INT( (A(eii, eii)).OuterStrideAtCompileTime, 0); - - VERIFY_IS_APPROX( A(seq(n-1,2,-2), seqN(n-1-6,3,-1)), A(seq(last,2,fix<-2>), seqN(last-6,3,fix<-1>)) ); - - VERIFY_IS_APPROX( A(seq(n-1,2,-2), seqN(n-1-6,4)), A(seq(last,2,-2), seqN(last-6,4)) ); - VERIFY_IS_APPROX( A(seq(n-1-6,n-1-2), seqN(n-1-6,4)), A(seq(last-6,last-2), seqN(6+last-6-6,4)) ); - VERIFY_IS_APPROX( A(seq((n-1)/2,(n)/2+3), seqN(2,4)), A(seq(last/2,(last+1)/2+3), seqN(last+2-last,4)) ); - VERIFY_IS_APPROX( A(seq(n-2,2,-2), seqN(n-8,4)), A(seq(end-2,2,-2), seqN(end-8,4)) ); - - // Check all combinations of seq: - VERIFY_IS_APPROX( A(seq(1,n-1-2,2), seq(1,n-1-2,2)), A(seq(1,last-2,2), seq(1,last-2,fix<2>)) ); - VERIFY_IS_APPROX( A(seq(n-1-5,n-1-2,2), seq(n-1-5,n-1-2,2)), A(seq(last-5,last-2,2), seq(last-5,last-2,fix<2>)) ); - VERIFY_IS_APPROX( A(seq(n-1-5,7,2), seq(n-1-5,7,2)), A(seq(last-5,7,2), seq(last-5,7,fix<2>)) ); - VERIFY_IS_APPROX( A(seq(1,n-1-2), seq(n-1-5,7)), A(seq(1,last-2), seq(last-5,7)) ); - VERIFY_IS_APPROX( A(seq(n-1-5,n-1-2), seq(n-1-5,n-1-2)), A(seq(last-5,last-2), seq(last-5,last-2)) ); - - VERIFY_IS_APPROX( A.col(A.cols()-1), A(all,last) ); - VERIFY_IS_APPROX( A(A.rows()-2, A.cols()/2), A(last-1, end/2) ); - VERIFY_IS_APPROX( a(a.size()-2), a(last-1) ); - VERIFY_IS_APPROX( a(a.size()/2), a((last+1)/2) ); - - // Check fall-back to Block - { - VERIFY( is_same_eq(A.col(0), A(all,0)) ); - VERIFY( is_same_eq(A.row(0), A(0,all)) ); - VERIFY( is_same_eq(A.block(0,0,2,2), A(seqN(0,2),seq(0,1))) ); - VERIFY( is_same_eq(A.middleRows(2,4), A(seqN(2,4),all)) ); - VERIFY( is_same_eq(A.middleCols(2,4), A(all,seqN(2,4))) ); - - VERIFY( is_same_eq(A.col(A.cols()-1), A(all,last)) ); - - const ArrayXXi& cA(A); - VERIFY( is_same_eq(cA.col(0), cA(all,0)) ); - VERIFY( is_same_eq(cA.row(0), cA(0,all)) ); - VERIFY( is_same_eq(cA.block(0,0,2,2), cA(seqN(0,2),seq(0,1))) ); - VERIFY( is_same_eq(cA.middleRows(2,4), cA(seqN(2,4),all)) ); - VERIFY( is_same_eq(cA.middleCols(2,4), cA(all,seqN(2,4))) ); - - VERIFY( is_same_eq(a.head(4), a(seq(0,3))) ); - VERIFY( is_same_eq(a.tail(4), a(seqN(last-3,4))) ); - VERIFY( is_same_eq(a.tail(4), a(seq(end-4,last))) ); - VERIFY( is_same_eq(a.segment<4>(3), a(seqN(3,fix<4>))) ); - } - - ArrayXXi A1=A, A2 = ArrayXXi::Random(4,4); - ArrayXi range25(4); range25 << 3,2,4,5; - A1(seqN(3,4),seq(2,5)) = A2; - VERIFY_IS_APPROX( A1.block(3,2,4,4), A2 ); - A1 = A; - A2.setOnes(); - A1(seq(6,3,-1),range25) = A2; - VERIFY_IS_APPROX( A1.block(3,2,4,4), A2 ); - - // check reverse - { - VERIFY( is_same_seq_type( seq(3,7).reverse(), seqN(7,5,fix<-1>) ) ); - VERIFY( is_same_seq_type( seq(7,3,fix<-2>).reverse(), seqN(3,3,fix<2>) ) ); - VERIFY_IS_APPROX( a(seqN(2,last/2).reverse()), a(seqN(2+(last/2-1)*1,last/2,fix<-1>)) ); - VERIFY_IS_APPROX( a(seqN(last/2,fix<4>).reverse()),a(seqN(last/2,fix<4>)).reverse() ); - VERIFY_IS_APPROX( A(seq(last-5,last-1,2).reverse(), seqN(last-3,3,fix<-2>).reverse()), - A(seq(last-5,last-1,2), seqN(last-3,3,fix<-2>)).reverse() ); - } - -#if EIGEN_HAS_CXX11 - VERIFY( (A(all, std::array{{1,3,2,4}})).ColsAtCompileTime == 4); - - VERIFY_IS_APPROX( (A(std::array{{1,3,5}}, std::array{{9,6,3,0}})), A(seqN(1,3,2), seqN(9,4,-3)) ); - -#if EIGEN_HAS_STATIC_ARRAY_TEMPLATE - VERIFY_IS_APPROX( A({3, 1, 6, 5}, all), A(std::array{{3, 1, 6, 5}}, all) ); - VERIFY_IS_APPROX( A(all,{3, 1, 6, 5}), A(all,std::array{{3, 1, 6, 5}}) ); - VERIFY_IS_APPROX( A({1,3,5},{3, 1, 6, 5}), A(std::array{{1,3,5}},std::array{{3, 1, 6, 5}}) ); - - VERIFY_IS_EQUAL( A({1,3,5},{3, 1, 6, 5}).RowsAtCompileTime, 3 ); - VERIFY_IS_EQUAL( A({1,3,5},{3, 1, 6, 5}).ColsAtCompileTime, 4 ); - - VERIFY_IS_APPROX( a({3, 1, 6, 5}), a(std::array{{3, 1, 6, 5}}) ); - VERIFY_IS_EQUAL( a({1,3,5}).SizeAtCompileTime, 3 ); - - VERIFY_IS_APPROX( b({3, 1, 6, 5}), b(std::array{{3, 1, 6, 5}}) ); - VERIFY_IS_EQUAL( b({1,3,5}).SizeAtCompileTime, 3 ); -#endif - -#endif - - // check mat(i,j) with weird types for i and j - { - VERIFY_IS_APPROX( A(B.RowsAtCompileTime-1, 1), A(3,1) ); - VERIFY_IS_APPROX( A(B.RowsAtCompileTime, 1), A(4,1) ); - VERIFY_IS_APPROX( A(B.RowsAtCompileTime-1, B.ColsAtCompileTime-1), A(3,3) ); - VERIFY_IS_APPROX( A(B.RowsAtCompileTime, B.ColsAtCompileTime), A(4,4) ); - const Index I = 3, J = 4; - VERIFY_IS_APPROX( A(I,J), A(3,4) ); - } - - // check extended block API - { - VERIFY( is_same_eq( A.block<3,4>(1,1), A.block(1,1,fix<3>,fix<4>)) ); - VERIFY( is_same_eq( A.block<3,4>(1,1,3,4), A.block(1,1,fix<3>(),fix<4>(4))) ); - VERIFY( is_same_eq( A.block<3,Dynamic>(1,1,3,4), A.block(1,1,fix<3>,4)) ); - VERIFY( is_same_eq( A.block(1,1,3,4), A.block(1,1,fix(3),fix<4>)) ); - VERIFY( is_same_eq( A.block(1,1,3,4), A.block(1,1,fix(3),fix(4))) ); - - VERIFY( is_same_eq( A.topLeftCorner<3,4>(), A.topLeftCorner(fix<3>,fix<4>)) ); - VERIFY( is_same_eq( A.bottomLeftCorner<3,4>(), A.bottomLeftCorner(fix<3>,fix<4>)) ); - VERIFY( is_same_eq( A.bottomRightCorner<3,4>(), A.bottomRightCorner(fix<3>,fix<4>)) ); - VERIFY( is_same_eq( A.topRightCorner<3,4>(), A.topRightCorner(fix<3>,fix<4>)) ); - - VERIFY( is_same_eq( A.leftCols<3>(), A.leftCols(fix<3>)) ); - VERIFY( is_same_eq( A.rightCols<3>(), A.rightCols(fix<3>)) ); - VERIFY( is_same_eq( A.middleCols<3>(1), A.middleCols(1,fix<3>)) ); - - VERIFY( is_same_eq( A.topRows<3>(), A.topRows(fix<3>)) ); - VERIFY( is_same_eq( A.bottomRows<3>(), A.bottomRows(fix<3>)) ); - VERIFY( is_same_eq( A.middleRows<3>(1), A.middleRows(1,fix<3>)) ); - - VERIFY( is_same_eq( a.segment<3>(1), a.segment(1,fix<3>)) ); - VERIFY( is_same_eq( a.head<3>(), a.head(fix<3>)) ); - VERIFY( is_same_eq( a.tail<3>(), a.tail(fix<3>)) ); - - const ArrayXXi& cA(A); - VERIFY( is_same_eq( cA.block(1,1,3,4), cA.block(1,1,fix(3),fix<4>)) ); - - VERIFY( is_same_eq( cA.topLeftCorner<3,4>(), cA.topLeftCorner(fix<3>,fix<4>)) ); - VERIFY( is_same_eq( cA.bottomLeftCorner<3,4>(), cA.bottomLeftCorner(fix<3>,fix<4>)) ); - VERIFY( is_same_eq( cA.bottomRightCorner<3,4>(), cA.bottomRightCorner(fix<3>,fix<4>)) ); - VERIFY( is_same_eq( cA.topRightCorner<3,4>(), cA.topRightCorner(fix<3>,fix<4>)) ); - - VERIFY( is_same_eq( cA.leftCols<3>(), cA.leftCols(fix<3>)) ); - VERIFY( is_same_eq( cA.rightCols<3>(), cA.rightCols(fix<3>)) ); - VERIFY( is_same_eq( cA.middleCols<3>(1), cA.middleCols(1,fix<3>)) ); - - VERIFY( is_same_eq( cA.topRows<3>(), cA.topRows(fix<3>)) ); - VERIFY( is_same_eq( cA.bottomRows<3>(), cA.bottomRows(fix<3>)) ); - VERIFY( is_same_eq( cA.middleRows<3>(1), cA.middleRows(1,fix<3>)) ); - } - -} - -void test_indexed_view() -{ -// for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( check_indexed_view() ); - CALL_SUBTEST_2( check_indexed_view() ); - CALL_SUBTEST_3( check_indexed_view() ); -// } -} diff --git a/testbed/nanogui/ext/eigen/test/inplace_decomposition.cpp b/testbed/nanogui/ext/eigen/test/inplace_decomposition.cpp deleted file mode 100644 index 92d0d91b..00000000 --- a/testbed/nanogui/ext/eigen/test/inplace_decomposition.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include -#include - -// This file test inplace decomposition through Ref<>, as supported by Cholesky, LU, and QR decompositions. - -template void inplace(bool square = false, bool SPD = false) -{ - typedef typename MatrixType::Scalar Scalar; - typedef Matrix RhsType; - typedef Matrix ResType; - - Index rows = MatrixType::RowsAtCompileTime==Dynamic ? internal::random(2,EIGEN_TEST_MAX_SIZE/2) : Index(MatrixType::RowsAtCompileTime); - Index cols = MatrixType::ColsAtCompileTime==Dynamic ? (square?rows:internal::random(2,rows)) : Index(MatrixType::ColsAtCompileTime); - - MatrixType A = MatrixType::Random(rows,cols); - RhsType b = RhsType::Random(rows); - ResType x(cols); - - if(SPD) - { - assert(square); - A.topRows(cols) = A.topRows(cols).adjoint() * A.topRows(cols); - A.diagonal().array() += 1e-3; - } - - MatrixType A0 = A; - MatrixType A1 = A; - - DecType dec(A); - - // Check that the content of A has been modified - VERIFY_IS_NOT_APPROX( A, A0 ); - - // Check that the decomposition is correct: - if(rows==cols) - { - VERIFY_IS_APPROX( A0 * (x = dec.solve(b)), b ); - } - else - { - VERIFY_IS_APPROX( A0.transpose() * A0 * (x = dec.solve(b)), A0.transpose() * b ); - } - - // Check that modifying A breaks the current dec: - A.setRandom(); - if(rows==cols) - { - VERIFY_IS_NOT_APPROX( A0 * (x = dec.solve(b)), b ); - } - else - { - VERIFY_IS_NOT_APPROX( A0.transpose() * A0 * (x = dec.solve(b)), A0.transpose() * b ); - } - - // Check that calling compute(A1) does not modify A1: - A = A0; - dec.compute(A1); - VERIFY_IS_EQUAL(A0,A1); - VERIFY_IS_NOT_APPROX( A, A0 ); - if(rows==cols) - { - VERIFY_IS_APPROX( A0 * (x = dec.solve(b)), b ); - } - else - { - VERIFY_IS_APPROX( A0.transpose() * A0 * (x = dec.solve(b)), A0.transpose() * b ); - } -} - - -void test_inplace_decomposition() -{ - EIGEN_UNUSED typedef Matrix Matrix43d; - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(( inplace >, MatrixXd>(true,true) )); - CALL_SUBTEST_1(( inplace >, Matrix4d>(true,true) )); - - CALL_SUBTEST_2(( inplace >, MatrixXd>(true,true) )); - CALL_SUBTEST_2(( inplace >, Matrix4d>(true,true) )); - - CALL_SUBTEST_3(( inplace >, MatrixXd>(true,false) )); - CALL_SUBTEST_3(( inplace >, Matrix4d>(true,false) )); - - CALL_SUBTEST_4(( inplace >, MatrixXd>(true,false) )); - CALL_SUBTEST_4(( inplace >, Matrix4d>(true,false) )); - - CALL_SUBTEST_5(( inplace >, MatrixXd>(false,false) )); - CALL_SUBTEST_5(( inplace >, Matrix43d>(false,false) )); - - CALL_SUBTEST_6(( inplace >, MatrixXd>(false,false) )); - CALL_SUBTEST_6(( inplace >, Matrix43d>(false,false) )); - - CALL_SUBTEST_7(( inplace >, MatrixXd>(false,false) )); - CALL_SUBTEST_7(( inplace >, Matrix43d>(false,false) )); - - CALL_SUBTEST_8(( inplace >, MatrixXd>(false,false) )); - CALL_SUBTEST_8(( inplace >, Matrix43d>(false,false) )); - } -} diff --git a/testbed/nanogui/ext/eigen/test/integer_types.cpp b/testbed/nanogui/ext/eigen/test/integer_types.cpp deleted file mode 100644 index a21f73a8..00000000 --- a/testbed/nanogui/ext/eigen/test/integer_types.cpp +++ /dev/null @@ -1,169 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT - -#include "main.h" - -#undef VERIFY_IS_APPROX -#define VERIFY_IS_APPROX(a, b) VERIFY((a)==(b)); -#undef VERIFY_IS_NOT_APPROX -#define VERIFY_IS_NOT_APPROX(a, b) VERIFY((a)!=(b)); - -template void signed_integer_type_tests(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - enum { is_signed = (Scalar(-1) > Scalar(0)) ? 0 : 1 }; - VERIFY(is_signed == 1); - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1(rows, cols), - m2 = MatrixType::Random(rows, cols), - mzero = MatrixType::Zero(rows, cols); - - do { - m1 = MatrixType::Random(rows, cols); - } while(m1 == mzero || m1 == m2); - - // check linear structure - - Scalar s1; - do { - s1 = internal::random(); - } while(s1 == 0); - - VERIFY_IS_EQUAL(-(-m1), m1); - VERIFY_IS_EQUAL(-m2+m1+m2, m1); - VERIFY_IS_EQUAL((-m1+m2)*s1, -s1*m1+s1*m2); -} - -template void integer_type_tests(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - VERIFY(NumTraits::IsInteger); - enum { is_signed = (Scalar(-1) > Scalar(0)) ? 0 : 1 }; - VERIFY(int(NumTraits::IsSigned) == is_signed); - - typedef Matrix VectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - - // this test relies a lot on Random.h, and there's not much more that we can do - // to test it, hence I consider that we will have tested Random.h - MatrixType m1(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - mzero = MatrixType::Zero(rows, cols); - - typedef Matrix SquareMatrixType; - SquareMatrixType identity = SquareMatrixType::Identity(rows, rows), - square = SquareMatrixType::Random(rows, rows); - VectorType v1(rows), - v2 = VectorType::Random(rows), - vzero = VectorType::Zero(rows); - - do { - m1 = MatrixType::Random(rows, cols); - } while(m1 == mzero || m1 == m2); - - do { - v1 = VectorType::Random(rows); - } while(v1 == vzero || v1 == v2); - - VERIFY_IS_APPROX( v1, v1); - VERIFY_IS_NOT_APPROX( v1, 2*v1); - VERIFY_IS_APPROX( vzero, v1-v1); - VERIFY_IS_APPROX( m1, m1); - VERIFY_IS_NOT_APPROX( m1, 2*m1); - VERIFY_IS_APPROX( mzero, m1-m1); - - VERIFY_IS_APPROX(m3 = m1,m1); - MatrixType m4; - VERIFY_IS_APPROX(m4 = m1,m1); - - m3.real() = m1.real(); - VERIFY_IS_APPROX(static_cast(m3).real(), static_cast(m1).real()); - VERIFY_IS_APPROX(static_cast(m3).real(), m1.real()); - - // check == / != operators - VERIFY(m1==m1); - VERIFY(m1!=m2); - VERIFY(!(m1==m2)); - VERIFY(!(m1!=m1)); - m1 = m2; - VERIFY(m1==m2); - VERIFY(!(m1!=m2)); - - // check linear structure - - Scalar s1; - do { - s1 = internal::random(); - } while(s1 == 0); - - VERIFY_IS_EQUAL(m1+m1, 2*m1); - VERIFY_IS_EQUAL(m1+m2-m1, m2); - VERIFY_IS_EQUAL(m1*s1, s1*m1); - VERIFY_IS_EQUAL((m1+m2)*s1, s1*m1+s1*m2); - m3 = m2; m3 += m1; - VERIFY_IS_EQUAL(m3, m1+m2); - m3 = m2; m3 -= m1; - VERIFY_IS_EQUAL(m3, m2-m1); - m3 = m2; m3 *= s1; - VERIFY_IS_EQUAL(m3, s1*m2); - - // check matrix product. - - VERIFY_IS_APPROX(identity * m1, m1); - VERIFY_IS_APPROX(square * (m1 + m2), square * m1 + square * m2); - VERIFY_IS_APPROX((m1 + m2).transpose() * square, m1.transpose() * square + m2.transpose() * square); - VERIFY_IS_APPROX((m1 * m2.transpose()) * m1, m1 * (m2.transpose() * m1)); -} - -void test_integer_types() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( integer_type_tests(Matrix()) ); - CALL_SUBTEST_1( integer_type_tests(Matrix()) ); - - CALL_SUBTEST_2( integer_type_tests(Matrix()) ); - CALL_SUBTEST_2( signed_integer_type_tests(Matrix()) ); - - CALL_SUBTEST_3( integer_type_tests(Matrix(2, 10)) ); - CALL_SUBTEST_3( signed_integer_type_tests(Matrix(2, 10)) ); - - CALL_SUBTEST_4( integer_type_tests(Matrix()) ); - CALL_SUBTEST_4( integer_type_tests(Matrix(20, 20)) ); - - CALL_SUBTEST_5( integer_type_tests(Matrix(7, 4)) ); - CALL_SUBTEST_5( signed_integer_type_tests(Matrix(7, 4)) ); - - CALL_SUBTEST_6( integer_type_tests(Matrix()) ); - - CALL_SUBTEST_7( integer_type_tests(Matrix()) ); - CALL_SUBTEST_7( signed_integer_type_tests(Matrix()) ); - - CALL_SUBTEST_8( integer_type_tests(Matrix(1, 5)) ); - } -#ifdef EIGEN_TEST_PART_9 - VERIFY_IS_EQUAL(internal::scalar_div_cost::value, 8); - VERIFY_IS_EQUAL(internal::scalar_div_cost::value, 8); - if(sizeof(long)>sizeof(int)) { - VERIFY(internal::scalar_div_cost::value > internal::scalar_div_cost::value); - VERIFY(internal::scalar_div_cost::value > internal::scalar_div_cost::value); - } -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/inverse.cpp b/testbed/nanogui/ext/eigen/test/inverse.cpp deleted file mode 100644 index 5c6777a1..00000000 --- a/testbed/nanogui/ext/eigen/test/inverse.cpp +++ /dev/null @@ -1,117 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void inverse(const MatrixType& m) -{ - using std::abs; - typedef typename MatrixType::Index Index; - /* this test covers the following files: - Inverse.h - */ - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - - MatrixType m1(rows, cols), - m2(rows, cols), - identity = MatrixType::Identity(rows, rows); - createRandomPIMatrixOfRank(rows,rows,rows,m1); - m2 = m1.inverse(); - VERIFY_IS_APPROX(m1, m2.inverse() ); - - VERIFY_IS_APPROX((Scalar(2)*m2).inverse(), m2.inverse()*Scalar(0.5)); - - VERIFY_IS_APPROX(identity, m1.inverse() * m1 ); - VERIFY_IS_APPROX(identity, m1 * m1.inverse() ); - - VERIFY_IS_APPROX(m1, m1.inverse().inverse() ); - - // since for the general case we implement separately row-major and col-major, test that - VERIFY_IS_APPROX(MatrixType(m1.transpose().inverse()), MatrixType(m1.inverse().transpose())); - -#if !defined(EIGEN_TEST_PART_5) && !defined(EIGEN_TEST_PART_6) - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - - //computeInverseAndDetWithCheck tests - //First: an invertible matrix - bool invertible; - RealScalar det; - - m2.setZero(); - m1.computeInverseAndDetWithCheck(m2, det, invertible); - VERIFY(invertible); - VERIFY_IS_APPROX(identity, m1*m2); - VERIFY_IS_APPROX(det, m1.determinant()); - - m2.setZero(); - m1.computeInverseWithCheck(m2, invertible); - VERIFY(invertible); - VERIFY_IS_APPROX(identity, m1*m2); - - //Second: a rank one matrix (not invertible, except for 1x1 matrices) - VectorType v3 = VectorType::Random(rows); - MatrixType m3 = v3*v3.transpose(), m4(rows,cols); - m3.computeInverseAndDetWithCheck(m4, det, invertible); - VERIFY( rows==1 ? invertible : !invertible ); - VERIFY_IS_MUCH_SMALLER_THAN(abs(det-m3.determinant()), RealScalar(1)); - m3.computeInverseWithCheck(m4, invertible); - VERIFY( rows==1 ? invertible : !invertible ); - - // check with submatrices - { - Matrix m5; - m5.setRandom(); - m5.topLeftCorner(rows,rows) = m1; - m2 = m5.template topLeftCorner().inverse(); - VERIFY_IS_APPROX( (m5.template topLeftCorner()), m2.inverse() ); - } -#endif - - // check in-place inversion - if(MatrixType::RowsAtCompileTime>=2 && MatrixType::RowsAtCompileTime<=4) - { - // in-place is forbidden - VERIFY_RAISES_ASSERT(m1 = m1.inverse()); - } - else - { - m2 = m1.inverse(); - m1 = m1.inverse(); - VERIFY_IS_APPROX(m1,m2); - } -} - -void test_inverse() -{ - int s = 0; - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( inverse(Matrix()) ); - CALL_SUBTEST_2( inverse(Matrix2d()) ); - CALL_SUBTEST_3( inverse(Matrix3f()) ); - CALL_SUBTEST_4( inverse(Matrix4f()) ); - CALL_SUBTEST_4( inverse(Matrix()) ); - - s = internal::random(50,320); - CALL_SUBTEST_5( inverse(MatrixXf(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(25,100); - CALL_SUBTEST_6( inverse(MatrixXcd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - CALL_SUBTEST_7( inverse(Matrix4d()) ); - CALL_SUBTEST_7( inverse(Matrix()) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/is_same_dense.cpp b/testbed/nanogui/ext/eigen/test/is_same_dense.cpp deleted file mode 100644 index 2c7838ce..00000000 --- a/testbed/nanogui/ext/eigen/test/is_same_dense.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -using internal::is_same_dense; - -void test_is_same_dense() -{ - typedef Matrix ColMatrixXd; - ColMatrixXd m1(10,10); - Ref ref_m1(m1); - Ref const_ref_m1(m1); - VERIFY(is_same_dense(m1,m1)); - VERIFY(is_same_dense(m1,ref_m1)); - VERIFY(is_same_dense(const_ref_m1,m1)); - VERIFY(is_same_dense(const_ref_m1,ref_m1)); - - VERIFY(is_same_dense(m1.block(0,0,m1.rows(),m1.cols()),m1)); - VERIFY(!is_same_dense(m1.row(0),m1.col(0))); - - Ref const_ref_m1_row(m1.row(1)); - VERIFY(!is_same_dense(m1.row(1),const_ref_m1_row)); - - Ref const_ref_m1_col(m1.col(1)); - VERIFY(is_same_dense(m1.col(1),const_ref_m1_col)); -} diff --git a/testbed/nanogui/ext/eigen/test/jacobi.cpp b/testbed/nanogui/ext/eigen/test/jacobi.cpp deleted file mode 100644 index 7ccd4124..00000000 --- a/testbed/nanogui/ext/eigen/test/jacobi.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template -void jacobi(const MatrixType& m = MatrixType()) -{ - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - - typedef Matrix JacobiVector; - - const MatrixType a(MatrixType::Random(rows, cols)); - - JacobiVector v = JacobiVector::Random().normalized(); - JacobiScalar c = v.x(), s = v.y(); - JacobiRotation rot(c, s); - - { - Index p = internal::random(0, rows-1); - Index q; - do { - q = internal::random(0, rows-1); - } while (q == p); - - MatrixType b = a; - b.applyOnTheLeft(p, q, rot); - VERIFY_IS_APPROX(b.row(p), c * a.row(p) + numext::conj(s) * a.row(q)); - VERIFY_IS_APPROX(b.row(q), -s * a.row(p) + numext::conj(c) * a.row(q)); - } - - { - Index p = internal::random(0, cols-1); - Index q; - do { - q = internal::random(0, cols-1); - } while (q == p); - - MatrixType b = a; - b.applyOnTheRight(p, q, rot); - VERIFY_IS_APPROX(b.col(p), c * a.col(p) - s * a.col(q)); - VERIFY_IS_APPROX(b.col(q), numext::conj(s) * a.col(p) + numext::conj(c) * a.col(q)); - } -} - -void test_jacobi() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(( jacobi() )); - CALL_SUBTEST_2(( jacobi() )); - CALL_SUBTEST_3(( jacobi() )); - CALL_SUBTEST_3(( jacobi >() )); - - int r = internal::random(2, internal::random(1,EIGEN_TEST_MAX_SIZE)/2), - c = internal::random(2, internal::random(1,EIGEN_TEST_MAX_SIZE)/2); - CALL_SUBTEST_4(( jacobi(MatrixXf(r,c)) )); - CALL_SUBTEST_5(( jacobi(MatrixXcd(r,c)) )); - CALL_SUBTEST_5(( jacobi >(MatrixXcd(r,c)) )); - // complex is really important to test as it is the only way to cover conjugation issues in certain unaligned paths - CALL_SUBTEST_6(( jacobi(MatrixXcf(r,c)) )); - CALL_SUBTEST_6(( jacobi >(MatrixXcf(r,c)) )); - - TEST_SET_BUT_UNUSED_VARIABLE(r); - TEST_SET_BUT_UNUSED_VARIABLE(c); - } -} diff --git a/testbed/nanogui/ext/eigen/test/jacobisvd.cpp b/testbed/nanogui/ext/eigen/test/jacobisvd.cpp deleted file mode 100644 index 7f5f7156..00000000 --- a/testbed/nanogui/ext/eigen/test/jacobisvd.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// discard stack allocation as that too bypasses malloc -#define EIGEN_STACK_ALLOCATION_LIMIT 0 -#define EIGEN_RUNTIME_NO_MALLOC -#include "main.h" -#include - -#define SVD_DEFAULT(M) JacobiSVD -#define SVD_FOR_MIN_NORM(M) JacobiSVD -#include "svd_common.h" - -// Check all variants of JacobiSVD -template -void jacobisvd(const MatrixType& a = MatrixType(), bool pickrandom = true) -{ - MatrixType m = a; - if(pickrandom) - svd_fill_random(m); - - CALL_SUBTEST(( svd_test_all_computation_options >(m, true) )); // check full only - CALL_SUBTEST(( svd_test_all_computation_options >(m, false) )); - CALL_SUBTEST(( svd_test_all_computation_options >(m, false) )); - if(m.rows()==m.cols()) - CALL_SUBTEST(( svd_test_all_computation_options >(m, false) )); -} - -template void jacobisvd_verify_assert(const MatrixType& m) -{ - svd_verify_assert >(m); - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - enum { - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - - - MatrixType a = MatrixType::Zero(rows, cols); - a.setZero(); - - if (ColsAtCompileTime == Dynamic) - { - JacobiSVD svd_fullqr; - VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeFullU|ComputeThinV)) - VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeThinU|ComputeThinV)) - VERIFY_RAISES_ASSERT(svd_fullqr.compute(a, ComputeThinU|ComputeFullV)) - } -} - -template -void jacobisvd_method() -{ - enum { Size = MatrixType::RowsAtCompileTime }; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix RealVecType; - MatrixType m = MatrixType::Identity(); - VERIFY_IS_APPROX(m.jacobiSvd().singularValues(), RealVecType::Ones()); - VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixU()); - VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixV()); - VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).solve(m), m); -} - -void test_jacobisvd() -{ - CALL_SUBTEST_3(( jacobisvd_verify_assert(Matrix3f()) )); - CALL_SUBTEST_4(( jacobisvd_verify_assert(Matrix4d()) )); - CALL_SUBTEST_7(( jacobisvd_verify_assert(MatrixXf(10,12)) )); - CALL_SUBTEST_8(( jacobisvd_verify_assert(MatrixXcd(7,5)) )); - - CALL_SUBTEST_11(svd_all_trivial_2x2(jacobisvd)); - CALL_SUBTEST_12(svd_all_trivial_2x2(jacobisvd)); - - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_3(( jacobisvd() )); - CALL_SUBTEST_4(( jacobisvd() )); - CALL_SUBTEST_5(( jacobisvd >() )); - CALL_SUBTEST_6(( jacobisvd >(Matrix(10,2)) )); - - int r = internal::random(1, 30), - c = internal::random(1, 30); - - TEST_SET_BUT_UNUSED_VARIABLE(r) - TEST_SET_BUT_UNUSED_VARIABLE(c) - - CALL_SUBTEST_10(( jacobisvd(MatrixXd(r,c)) )); - CALL_SUBTEST_7(( jacobisvd(MatrixXf(r,c)) )); - CALL_SUBTEST_8(( jacobisvd(MatrixXcd(r,c)) )); - (void) r; - (void) c; - - // Test on inf/nan matrix - CALL_SUBTEST_7( (svd_inf_nan, MatrixXf>()) ); - CALL_SUBTEST_10( (svd_inf_nan, MatrixXd>()) ); - - // bug1395 test compile-time vectors as input - CALL_SUBTEST_13(( jacobisvd_verify_assert(Matrix()) )); - CALL_SUBTEST_13(( jacobisvd_verify_assert(Matrix()) )); - CALL_SUBTEST_13(( jacobisvd_verify_assert(Matrix(r)) )); - CALL_SUBTEST_13(( jacobisvd_verify_assert(Matrix(c)) )); - } - - CALL_SUBTEST_7(( jacobisvd(MatrixXf(internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2), internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/2))) )); - CALL_SUBTEST_8(( jacobisvd(MatrixXcd(internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3), internal::random(EIGEN_TEST_MAX_SIZE/4, EIGEN_TEST_MAX_SIZE/3))) )); - - // test matrixbase method - CALL_SUBTEST_1(( jacobisvd_method() )); - CALL_SUBTEST_3(( jacobisvd_method() )); - - // Test problem size constructors - CALL_SUBTEST_7( JacobiSVD(10,10) ); - - // Check that preallocation avoids subsequent mallocs - CALL_SUBTEST_9( svd_preallocate() ); - - CALL_SUBTEST_2( svd_underoverflow() ); -} diff --git a/testbed/nanogui/ext/eigen/test/linearstructure.cpp b/testbed/nanogui/ext/eigen/test/linearstructure.cpp deleted file mode 100644 index 17474af1..00000000 --- a/testbed/nanogui/ext/eigen/test/linearstructure.cpp +++ /dev/null @@ -1,149 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -static bool g_called; -#define EIGEN_SCALAR_BINARY_OP_PLUGIN { g_called |= (!internal::is_same::value); } - -#include "main.h" - -template void linearStructure(const MatrixType& m) -{ - using std::abs; - /* this test covers the following files: - CwiseUnaryOp.h, CwiseBinaryOp.h, SelfCwiseBinaryOp.h - */ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - // this test relies a lot on Random.h, and there's not much more that we can do - // to test it, hence I consider that we will have tested Random.h - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols); - - Scalar s1 = internal::random(); - while (abs(s1)(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - VERIFY_IS_APPROX(-(-m1), m1); - VERIFY_IS_APPROX(m1+m1, 2*m1); - VERIFY_IS_APPROX(m1+m2-m1, m2); - VERIFY_IS_APPROX(-m2+m1+m2, m1); - VERIFY_IS_APPROX(m1*s1, s1*m1); - VERIFY_IS_APPROX((m1+m2)*s1, s1*m1+s1*m2); - VERIFY_IS_APPROX((-m1+m2)*s1, -s1*m1+s1*m2); - m3 = m2; m3 += m1; - VERIFY_IS_APPROX(m3, m1+m2); - m3 = m2; m3 -= m1; - VERIFY_IS_APPROX(m3, m2-m1); - m3 = m2; m3 *= s1; - VERIFY_IS_APPROX(m3, s1*m2); - if(!NumTraits::IsInteger) - { - m3 = m2; m3 /= s1; - VERIFY_IS_APPROX(m3, m2/s1); - } - - // again, test operator() to check const-qualification - VERIFY_IS_APPROX((-m1)(r,c), -(m1(r,c))); - VERIFY_IS_APPROX((m1-m2)(r,c), (m1(r,c))-(m2(r,c))); - VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c))); - VERIFY_IS_APPROX((s1*m1)(r,c), s1*(m1(r,c))); - VERIFY_IS_APPROX((m1*s1)(r,c), (m1(r,c))*s1); - if(!NumTraits::IsInteger) - VERIFY_IS_APPROX((m1/s1)(r,c), (m1(r,c))/s1); - - // use .block to disable vectorization and compare to the vectorized version - VERIFY_IS_APPROX(m1+m1.block(0,0,rows,cols), m1+m1); - VERIFY_IS_APPROX(m1.cwiseProduct(m1.block(0,0,rows,cols)), m1.cwiseProduct(m1)); - VERIFY_IS_APPROX(m1 - m1.block(0,0,rows,cols), m1 - m1); - VERIFY_IS_APPROX(m1.block(0,0,rows,cols) * s1, m1 * s1); -} - -// Make sure that complex * real and real * complex are properly optimized -template void real_complex(DenseIndex rows = MatrixType::RowsAtCompileTime, DenseIndex cols = MatrixType::ColsAtCompileTime) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - RealScalar s = internal::random(); - MatrixType m1 = MatrixType::Random(rows, cols); - - g_called = false; - VERIFY_IS_APPROX(s*m1, Scalar(s)*m1); - VERIFY(g_called && "real * matrix not properly optimized"); - - g_called = false; - VERIFY_IS_APPROX(m1*s, m1*Scalar(s)); - VERIFY(g_called && "matrix * real not properly optimized"); - - g_called = false; - VERIFY_IS_APPROX(m1/s, m1/Scalar(s)); - VERIFY(g_called && "matrix / real not properly optimized"); - - g_called = false; - VERIFY_IS_APPROX(s+m1.array(), Scalar(s)+m1.array()); - VERIFY(g_called && "real + matrix not properly optimized"); - - g_called = false; - VERIFY_IS_APPROX(m1.array()+s, m1.array()+Scalar(s)); - VERIFY(g_called && "matrix + real not properly optimized"); - - g_called = false; - VERIFY_IS_APPROX(s-m1.array(), Scalar(s)-m1.array()); - VERIFY(g_called && "real - matrix not properly optimized"); - - g_called = false; - VERIFY_IS_APPROX(m1.array()-s, m1.array()-Scalar(s)); - VERIFY(g_called && "matrix - real not properly optimized"); -} - -void test_linearstructure() -{ - g_called = true; - VERIFY(g_called); // avoid `unneeded-internal-declaration` warning. - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( linearStructure(Matrix()) ); - CALL_SUBTEST_2( linearStructure(Matrix2f()) ); - CALL_SUBTEST_3( linearStructure(Vector3d()) ); - CALL_SUBTEST_4( linearStructure(Matrix4d()) ); - CALL_SUBTEST_5( linearStructure(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_6( linearStructure(MatrixXf (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_7( linearStructure(MatrixXi (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_8( linearStructure(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_9( linearStructure(ArrayXXf (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_10( linearStructure(ArrayXXcf (internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - - CALL_SUBTEST_11( real_complex() ); - CALL_SUBTEST_11( real_complex(10,10) ); - CALL_SUBTEST_11( real_complex(10,10) ); - } - -#ifdef EIGEN_TEST_PART_4 - { - // make sure that /=scalar and /scalar do not overflow - // rational: 1.0/4.94e-320 overflow, but m/4.94e-320 should not - Matrix4d m2, m3; - m3 = m2 = Matrix4d::Random()*1e-20; - m2 = m2 / 4.9e-320; - VERIFY_IS_APPROX(m2.cwiseQuotient(m2), Matrix4d::Ones()); - m3 /= 4.9e-320; - VERIFY_IS_APPROX(m3.cwiseQuotient(m3), Matrix4d::Ones()); - - - } -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/lscg.cpp b/testbed/nanogui/ext/eigen/test/lscg.cpp deleted file mode 100644 index daa62a95..00000000 --- a/testbed/nanogui/ext/eigen/test/lscg.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse_solver.h" -#include - -template void test_lscg_T() -{ - LeastSquaresConjugateGradient > lscg_colmajor_diag; - LeastSquaresConjugateGradient, IdentityPreconditioner> lscg_colmajor_I; - - CALL_SUBTEST( check_sparse_square_solving(lscg_colmajor_diag) ); - CALL_SUBTEST( check_sparse_square_solving(lscg_colmajor_I) ); - - CALL_SUBTEST( check_sparse_leastsquare_solving(lscg_colmajor_diag) ); - CALL_SUBTEST( check_sparse_leastsquare_solving(lscg_colmajor_I) ); -} - -void test_lscg() -{ - CALL_SUBTEST_1(test_lscg_T()); - CALL_SUBTEST_2(test_lscg_T >()); -} diff --git a/testbed/nanogui/ext/eigen/test/lu.cpp b/testbed/nanogui/ext/eigen/test/lu.cpp deleted file mode 100644 index 9787f4d8..00000000 --- a/testbed/nanogui/ext/eigen/test/lu.cpp +++ /dev/null @@ -1,281 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -using namespace std; - -template -typename MatrixType::RealScalar matrix_l1_norm(const MatrixType& m) { - return m.cwiseAbs().colwise().sum().maxCoeff(); -} - -template void lu_non_invertible() -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::RealScalar RealScalar; - /* this test covers the following files: - LU.h - */ - Index rows, cols, cols2; - if(MatrixType::RowsAtCompileTime==Dynamic) - { - rows = internal::random(2,EIGEN_TEST_MAX_SIZE); - } - else - { - rows = MatrixType::RowsAtCompileTime; - } - if(MatrixType::ColsAtCompileTime==Dynamic) - { - cols = internal::random(2,EIGEN_TEST_MAX_SIZE); - cols2 = internal::random(2,EIGEN_TEST_MAX_SIZE); - } - else - { - cols2 = cols = MatrixType::ColsAtCompileTime; - } - - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - typedef typename internal::kernel_retval_base >::ReturnType KernelMatrixType; - typedef typename internal::image_retval_base >::ReturnType ImageMatrixType; - typedef Matrix - CMatrixType; - typedef Matrix - RMatrixType; - - Index rank = internal::random(1, (std::min)(rows, cols)-1); - - // The image of the zero matrix should consist of a single (zero) column vector - VERIFY((MatrixType::Zero(rows,cols).fullPivLu().image(MatrixType::Zero(rows,cols)).cols() == 1)); - - MatrixType m1(rows, cols), m3(rows, cols2); - CMatrixType m2(cols, cols2); - createRandomPIMatrixOfRank(rank, rows, cols, m1); - - FullPivLU lu; - - // The special value 0.01 below works well in tests. Keep in mind that we're only computing the rank - // of singular values are either 0 or 1. - // So it's not clear at all that the epsilon should play any role there. - lu.setThreshold(RealScalar(0.01)); - lu.compute(m1); - - MatrixType u(rows,cols); - u = lu.matrixLU().template triangularView(); - RMatrixType l = RMatrixType::Identity(rows,rows); - l.block(0,0,rows,(std::min)(rows,cols)).template triangularView() - = lu.matrixLU().block(0,0,rows,(std::min)(rows,cols)); - - VERIFY_IS_APPROX(lu.permutationP() * m1 * lu.permutationQ(), l*u); - - KernelMatrixType m1kernel = lu.kernel(); - ImageMatrixType m1image = lu.image(m1); - - VERIFY_IS_APPROX(m1, lu.reconstructedMatrix()); - VERIFY(rank == lu.rank()); - VERIFY(cols - lu.rank() == lu.dimensionOfKernel()); - VERIFY(!lu.isInjective()); - VERIFY(!lu.isInvertible()); - VERIFY(!lu.isSurjective()); - VERIFY((m1 * m1kernel).isMuchSmallerThan(m1)); - VERIFY(m1image.fullPivLu().rank() == rank); - VERIFY_IS_APPROX(m1 * m1.adjoint() * m1image, m1image); - - m2 = CMatrixType::Random(cols,cols2); - m3 = m1*m2; - m2 = CMatrixType::Random(cols,cols2); - // test that the code, which does resize(), may be applied to an xpr - m2.block(0,0,m2.rows(),m2.cols()) = lu.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - - // test solve with transposed - m3 = MatrixType::Random(rows,cols2); - m2 = m1.transpose()*m3; - m3 = MatrixType::Random(rows,cols2); - lu.template _solve_impl_transposed(m2, m3); - VERIFY_IS_APPROX(m2, m1.transpose()*m3); - m3 = MatrixType::Random(rows,cols2); - m3 = lu.transpose().solve(m2); - VERIFY_IS_APPROX(m2, m1.transpose()*m3); - - // test solve with conjugate transposed - m3 = MatrixType::Random(rows,cols2); - m2 = m1.adjoint()*m3; - m3 = MatrixType::Random(rows,cols2); - lu.template _solve_impl_transposed(m2, m3); - VERIFY_IS_APPROX(m2, m1.adjoint()*m3); - m3 = MatrixType::Random(rows,cols2); - m3 = lu.adjoint().solve(m2); - VERIFY_IS_APPROX(m2, m1.adjoint()*m3); -} - -template void lu_invertible() -{ - /* this test covers the following files: - LU.h - */ - typedef typename NumTraits::Real RealScalar; - Index size = MatrixType::RowsAtCompileTime; - if( size==Dynamic) - size = internal::random(1,EIGEN_TEST_MAX_SIZE); - - MatrixType m1(size, size), m2(size, size), m3(size, size); - FullPivLU lu; - lu.setThreshold(RealScalar(0.01)); - do { - m1 = MatrixType::Random(size,size); - lu.compute(m1); - } while(!lu.isInvertible()); - - VERIFY_IS_APPROX(m1, lu.reconstructedMatrix()); - VERIFY(0 == lu.dimensionOfKernel()); - VERIFY(lu.kernel().cols() == 1); // the kernel() should consist of a single (zero) column vector - VERIFY(size == lu.rank()); - VERIFY(lu.isInjective()); - VERIFY(lu.isSurjective()); - VERIFY(lu.isInvertible()); - VERIFY(lu.image(m1).fullPivLu().isInvertible()); - m3 = MatrixType::Random(size,size); - m2 = lu.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - MatrixType m1_inverse = lu.inverse(); - VERIFY_IS_APPROX(m2, m1_inverse*m3); - - RealScalar rcond = (RealScalar(1) / matrix_l1_norm(m1)) / matrix_l1_norm(m1_inverse); - const RealScalar rcond_est = lu.rcond(); - // Verify that the estimated condition number is within a factor of 10 of the - // truth. - VERIFY(rcond_est > rcond / 10 && rcond_est < rcond * 10); - - // test solve with transposed - lu.template _solve_impl_transposed(m3, m2); - VERIFY_IS_APPROX(m3, m1.transpose()*m2); - m3 = MatrixType::Random(size,size); - m3 = lu.transpose().solve(m2); - VERIFY_IS_APPROX(m2, m1.transpose()*m3); - - // test solve with conjugate transposed - lu.template _solve_impl_transposed(m3, m2); - VERIFY_IS_APPROX(m3, m1.adjoint()*m2); - m3 = MatrixType::Random(size,size); - m3 = lu.adjoint().solve(m2); - VERIFY_IS_APPROX(m2, m1.adjoint()*m3); - - // Regression test for Bug 302 - MatrixType m4 = MatrixType::Random(size,size); - VERIFY_IS_APPROX(lu.solve(m3*m4), lu.solve(m3)*m4); -} - -template void lu_partial_piv() -{ - /* this test covers the following files: - PartialPivLU.h - */ - typedef typename MatrixType::Index Index; - typedef typename NumTraits::Real RealScalar; - Index size = internal::random(1,4); - - MatrixType m1(size, size), m2(size, size), m3(size, size); - m1.setRandom(); - PartialPivLU plu(m1); - - VERIFY_IS_APPROX(m1, plu.reconstructedMatrix()); - - m3 = MatrixType::Random(size,size); - m2 = plu.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - MatrixType m1_inverse = plu.inverse(); - VERIFY_IS_APPROX(m2, m1_inverse*m3); - - RealScalar rcond = (RealScalar(1) / matrix_l1_norm(m1)) / matrix_l1_norm(m1_inverse); - const RealScalar rcond_est = plu.rcond(); - // Verify that the estimate is within a factor of 10 of the truth. - VERIFY(rcond_est > rcond / 10 && rcond_est < rcond * 10); - - // test solve with transposed - plu.template _solve_impl_transposed(m3, m2); - VERIFY_IS_APPROX(m3, m1.transpose()*m2); - m3 = MatrixType::Random(size,size); - m3 = plu.transpose().solve(m2); - VERIFY_IS_APPROX(m2, m1.transpose()*m3); - - // test solve with conjugate transposed - plu.template _solve_impl_transposed(m3, m2); - VERIFY_IS_APPROX(m3, m1.adjoint()*m2); - m3 = MatrixType::Random(size,size); - m3 = plu.adjoint().solve(m2); - VERIFY_IS_APPROX(m2, m1.adjoint()*m3); -} - -template void lu_verify_assert() -{ - MatrixType tmp; - - FullPivLU lu; - VERIFY_RAISES_ASSERT(lu.matrixLU()) - VERIFY_RAISES_ASSERT(lu.permutationP()) - VERIFY_RAISES_ASSERT(lu.permutationQ()) - VERIFY_RAISES_ASSERT(lu.kernel()) - VERIFY_RAISES_ASSERT(lu.image(tmp)) - VERIFY_RAISES_ASSERT(lu.solve(tmp)) - VERIFY_RAISES_ASSERT(lu.determinant()) - VERIFY_RAISES_ASSERT(lu.rank()) - VERIFY_RAISES_ASSERT(lu.dimensionOfKernel()) - VERIFY_RAISES_ASSERT(lu.isInjective()) - VERIFY_RAISES_ASSERT(lu.isSurjective()) - VERIFY_RAISES_ASSERT(lu.isInvertible()) - VERIFY_RAISES_ASSERT(lu.inverse()) - - PartialPivLU plu; - VERIFY_RAISES_ASSERT(plu.matrixLU()) - VERIFY_RAISES_ASSERT(plu.permutationP()) - VERIFY_RAISES_ASSERT(plu.solve(tmp)) - VERIFY_RAISES_ASSERT(plu.determinant()) - VERIFY_RAISES_ASSERT(plu.inverse()) -} - -void test_lu() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( lu_non_invertible() ); - CALL_SUBTEST_1( lu_invertible() ); - CALL_SUBTEST_1( lu_verify_assert() ); - - CALL_SUBTEST_2( (lu_non_invertible >()) ); - CALL_SUBTEST_2( (lu_verify_assert >()) ); - - CALL_SUBTEST_3( lu_non_invertible() ); - CALL_SUBTEST_3( lu_invertible() ); - CALL_SUBTEST_3( lu_verify_assert() ); - - CALL_SUBTEST_4( lu_non_invertible() ); - CALL_SUBTEST_4( lu_invertible() ); - CALL_SUBTEST_4( lu_partial_piv() ); - CALL_SUBTEST_4( lu_verify_assert() ); - - CALL_SUBTEST_5( lu_non_invertible() ); - CALL_SUBTEST_5( lu_invertible() ); - CALL_SUBTEST_5( lu_verify_assert() ); - - CALL_SUBTEST_6( lu_non_invertible() ); - CALL_SUBTEST_6( lu_invertible() ); - CALL_SUBTEST_6( lu_partial_piv() ); - CALL_SUBTEST_6( lu_verify_assert() ); - - CALL_SUBTEST_7(( lu_non_invertible >() )); - - // Test problem size constructors - CALL_SUBTEST_9( PartialPivLU(10) ); - CALL_SUBTEST_9( FullPivLU(10, 20); ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/main.h b/testbed/nanogui/ext/eigen/test/main.h deleted file mode 100644 index 25d2dcf4..00000000 --- a/testbed/nanogui/ext/eigen/test/main.h +++ /dev/null @@ -1,746 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// The following includes of STL headers have to be done _before_ the -// definition of macros min() and max(). The reason is that many STL -// implementations will not work properly as the min and max symbols collide -// with the STL functions std:min() and std::max(). The STL headers may check -// for the macro definition of min/max and issue a warning or undefine the -// macros. -// -// Still, Windows defines min() and max() in windef.h as part of the regular -// Windows system interfaces and many other Windows APIs depend on these -// macros being available. To prevent the macro expansion of min/max and to -// make Eigen compatible with the Windows environment all function calls of -// std::min() and std::max() have to be written with parenthesis around the -// function name. -// -// All STL headers used by Eigen should be included here. Because main.h is -// included before any Eigen header and because the STL headers are guarded -// against multiple inclusions, no STL header will see our own min/max macro -// definitions. -#include -#include -#include -#include -#include -#include -#include -#if __cplusplus >= 201103L -#include -#ifdef EIGEN_USE_THREADS -#include -#endif -#endif - -// To test that all calls from Eigen code to std::min() and std::max() are -// protected by parenthesis against macro expansion, the min()/max() macros -// are defined here and any not-parenthesized min/max call will cause a -// compiler error. -#define min(A,B) please_protect_your_min_with_parentheses -#define max(A,B) please_protect_your_max_with_parentheses -#define isnan(X) please_protect_your_isnan_with_parentheses -#define isinf(X) please_protect_your_isinf_with_parentheses -#define isfinite(X) please_protect_your_isfinite_with_parentheses -#ifdef M_PI -#undef M_PI -#endif -#define M_PI please_use_EIGEN_PI_instead_of_M_PI - -#define FORBIDDEN_IDENTIFIER (this_identifier_is_forbidden_to_avoid_clashes) this_identifier_is_forbidden_to_avoid_clashes -// B0 is defined in POSIX header termios.h -#define B0 FORBIDDEN_IDENTIFIER - -// Unit tests calling Eigen's blas library must preserve the default blocking size -// to avoid troubles. -#ifndef EIGEN_NO_DEBUG_SMALL_PRODUCT_BLOCKS -#define EIGEN_DEBUG_SMALL_PRODUCT_BLOCKS -#endif - -// shuts down ICC's remark #593: variable "XXX" was set but never used -#define TEST_SET_BUT_UNUSED_VARIABLE(X) EIGEN_UNUSED_VARIABLE(X) - -#ifdef TEST_ENABLE_TEMPORARY_TRACKING - -static long int nb_temporaries; -static long int nb_temporaries_on_assert = -1; - -inline void on_temporary_creation(long int size) { - // here's a great place to set a breakpoint when debugging failures in this test! - if(size!=0) nb_temporaries++; - if(nb_temporaries_on_assert>0) assert(nb_temporaries if NDEBUG is not defined. -#ifndef DEBUG -#define DEBUG -#endif - -// bounds integer values for AltiVec -#if defined(__ALTIVEC__) || defined(__VSX__) -#define EIGEN_MAKING_DOCS -#endif - -#ifndef EIGEN_TEST_FUNC -#error EIGEN_TEST_FUNC must be defined -#endif - -#define DEFAULT_REPEAT 10 - -namespace Eigen -{ - static std::vector g_test_stack; - // level == 0 <=> abort if test fail - // level >= 1 <=> warning message to std::cerr if test fail - static int g_test_level = 0; - static int g_repeat; - static unsigned int g_seed; - static bool g_has_set_repeat, g_has_set_seed; -} - -#define TRACK std::cerr << __FILE__ << " " << __LINE__ << std::endl -// #define TRACK while() - -#define EI_PP_MAKE_STRING2(S) #S -#define EI_PP_MAKE_STRING(S) EI_PP_MAKE_STRING2(S) - -#define EIGEN_DEFAULT_IO_FORMAT IOFormat(4, 0, " ", "\n", "", "", "", "") - -#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(__CUDA_ARCH__) - #define EIGEN_EXCEPTIONS -#endif - -#ifndef EIGEN_NO_ASSERTION_CHECKING - - namespace Eigen - { - static const bool should_raise_an_assert = false; - - // Used to avoid to raise two exceptions at a time in which - // case the exception is not properly caught. - // This may happen when a second exceptions is triggered in a destructor. - static bool no_more_assert = false; - static bool report_on_cerr_on_assert_failure = true; - - struct eigen_assert_exception - { - eigen_assert_exception(void) {} - ~eigen_assert_exception() { Eigen::no_more_assert = false; } - }; - } - // If EIGEN_DEBUG_ASSERTS is defined and if no assertion is triggered while - // one should have been, then the list of excecuted assertions is printed out. - // - // EIGEN_DEBUG_ASSERTS is not enabled by default as it - // significantly increases the compilation time - // and might even introduce side effects that would hide - // some memory errors. - #ifdef EIGEN_DEBUG_ASSERTS - - namespace Eigen - { - namespace internal - { - static bool push_assert = false; - } - static std::vector eigen_assert_list; - } - #define eigen_assert(a) \ - if( (!(a)) && (!no_more_assert) ) \ - { \ - if(report_on_cerr_on_assert_failure) \ - std::cerr << #a << " " __FILE__ << "(" << __LINE__ << ")\n"; \ - Eigen::no_more_assert = true; \ - EIGEN_THROW_X(Eigen::eigen_assert_exception()); \ - } \ - else if (Eigen::internal::push_assert) \ - { \ - eigen_assert_list.push_back(std::string(EI_PP_MAKE_STRING(__FILE__) " (" EI_PP_MAKE_STRING(__LINE__) ") : " #a) ); \ - } - - #ifdef EIGEN_EXCEPTIONS - #define VERIFY_RAISES_ASSERT(a) \ - { \ - Eigen::no_more_assert = false; \ - Eigen::eigen_assert_list.clear(); \ - Eigen::internal::push_assert = true; \ - Eigen::report_on_cerr_on_assert_failure = false; \ - try { \ - a; \ - std::cerr << "One of the following asserts should have been triggered:\n"; \ - for (uint ai=0 ; ai // required for createRandomPIMatrixOfRank - -inline void verify_impl(bool condition, const char *testname, const char *file, int line, const char *condition_as_string) -{ - if (!condition) - { - if(Eigen::g_test_level>0) - std::cerr << "WARNING: "; - std::cerr << "Test " << testname << " failed in " << file << " (" << line << ")" - << std::endl << " " << condition_as_string << std::endl; - std::cerr << "Stack:\n"; - const int test_stack_size = static_cast(Eigen::g_test_stack.size()); - for(int i=test_stack_size-1; i>=0; --i) - std::cerr << " - " << Eigen::g_test_stack[i] << "\n"; - std::cerr << "\n"; - if(Eigen::g_test_level==0) - abort(); - } -} - -#define VERIFY(a) ::verify_impl(a, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a)) - -#define VERIFY_GE(a, b) ::verify_impl(a >= b, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a >= b)) -#define VERIFY_LE(a, b) ::verify_impl(a <= b, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a <= b)) - - -#define VERIFY_IS_EQUAL(a, b) VERIFY(test_is_equal(a, b, true)) -#define VERIFY_IS_NOT_EQUAL(a, b) VERIFY(test_is_equal(a, b, false)) -#define VERIFY_IS_APPROX(a, b) VERIFY(verifyIsApprox(a, b)) -#define VERIFY_IS_NOT_APPROX(a, b) VERIFY(!test_isApprox(a, b)) -#define VERIFY_IS_MUCH_SMALLER_THAN(a, b) VERIFY(test_isMuchSmallerThan(a, b)) -#define VERIFY_IS_NOT_MUCH_SMALLER_THAN(a, b) VERIFY(!test_isMuchSmallerThan(a, b)) -#define VERIFY_IS_APPROX_OR_LESS_THAN(a, b) VERIFY(test_isApproxOrLessThan(a, b)) -#define VERIFY_IS_NOT_APPROX_OR_LESS_THAN(a, b) VERIFY(!test_isApproxOrLessThan(a, b)) - -#define VERIFY_IS_UNITARY(a) VERIFY(test_isUnitary(a)) - -#define CALL_SUBTEST(FUNC) do { \ - g_test_stack.push_back(EI_PP_MAKE_STRING(FUNC)); \ - FUNC; \ - g_test_stack.pop_back(); \ - } while (0) - - -namespace Eigen { - -template inline typename NumTraits::Real test_precision() { return NumTraits::dummy_precision(); } -template<> inline float test_precision() { return 1e-3f; } -template<> inline double test_precision() { return 1e-6; } -template<> inline long double test_precision() { return 1e-6l; } -template<> inline float test_precision >() { return test_precision(); } -template<> inline double test_precision >() { return test_precision(); } -template<> inline long double test_precision >() { return test_precision(); } - -inline bool test_isApprox(const int& a, const int& b) -{ return internal::isApprox(a, b, test_precision()); } -inline bool test_isMuchSmallerThan(const int& a, const int& b) -{ return internal::isMuchSmallerThan(a, b, test_precision()); } -inline bool test_isApproxOrLessThan(const int& a, const int& b) -{ return internal::isApproxOrLessThan(a, b, test_precision()); } - -inline bool test_isApprox(const float& a, const float& b) -{ return internal::isApprox(a, b, test_precision()); } -inline bool test_isMuchSmallerThan(const float& a, const float& b) -{ return internal::isMuchSmallerThan(a, b, test_precision()); } -inline bool test_isApproxOrLessThan(const float& a, const float& b) -{ return internal::isApproxOrLessThan(a, b, test_precision()); } - -inline bool test_isApprox(const double& a, const double& b) -{ return internal::isApprox(a, b, test_precision()); } -inline bool test_isMuchSmallerThan(const double& a, const double& b) -{ return internal::isMuchSmallerThan(a, b, test_precision()); } -inline bool test_isApproxOrLessThan(const double& a, const double& b) -{ return internal::isApproxOrLessThan(a, b, test_precision()); } - -#ifndef EIGEN_TEST_NO_COMPLEX -inline bool test_isApprox(const std::complex& a, const std::complex& b) -{ return internal::isApprox(a, b, test_precision >()); } -inline bool test_isMuchSmallerThan(const std::complex& a, const std::complex& b) -{ return internal::isMuchSmallerThan(a, b, test_precision >()); } - -inline bool test_isApprox(const std::complex& a, const std::complex& b) -{ return internal::isApprox(a, b, test_precision >()); } -inline bool test_isMuchSmallerThan(const std::complex& a, const std::complex& b) -{ return internal::isMuchSmallerThan(a, b, test_precision >()); } - -#ifndef EIGEN_TEST_NO_LONGDOUBLE -inline bool test_isApprox(const std::complex& a, const std::complex& b) -{ return internal::isApprox(a, b, test_precision >()); } -inline bool test_isMuchSmallerThan(const std::complex& a, const std::complex& b) -{ return internal::isMuchSmallerThan(a, b, test_precision >()); } -#endif -#endif - -#ifndef EIGEN_TEST_NO_LONGDOUBLE -inline bool test_isApprox(const long double& a, const long double& b) -{ - bool ret = internal::isApprox(a, b, test_precision()); - if (!ret) std::cerr - << std::endl << " actual = " << a - << std::endl << " expected = " << b << std::endl << std::endl; - return ret; -} - -inline bool test_isMuchSmallerThan(const long double& a, const long double& b) -{ return internal::isMuchSmallerThan(a, b, test_precision()); } -inline bool test_isApproxOrLessThan(const long double& a, const long double& b) -{ return internal::isApproxOrLessThan(a, b, test_precision()); } -#endif // EIGEN_TEST_NO_LONGDOUBLE - -inline bool test_isApprox(const half& a, const half& b) -{ return internal::isApprox(a, b, test_precision()); } -inline bool test_isMuchSmallerThan(const half& a, const half& b) -{ return internal::isMuchSmallerThan(a, b, test_precision()); } -inline bool test_isApproxOrLessThan(const half& a, const half& b) -{ return internal::isApproxOrLessThan(a, b, test_precision()); } - -// test_relative_error returns the relative difference between a and b as a real scalar as used in isApprox. -template -typename NumTraits::NonInteger test_relative_error(const EigenBase &a, const EigenBase &b) -{ - using std::sqrt; - typedef typename NumTraits::NonInteger RealScalar; - typename internal::nested_eval::type ea(a.derived()); - typename internal::nested_eval::type eb(b.derived()); - return sqrt(RealScalar((ea-eb).cwiseAbs2().sum()) / RealScalar((std::min)(eb.cwiseAbs2().sum(),ea.cwiseAbs2().sum()))); -} - -template -typename T1::RealScalar test_relative_error(const T1 &a, const T2 &b, const typename T1::Coefficients* = 0) -{ - return test_relative_error(a.coeffs(), b.coeffs()); -} - -template -typename T1::Scalar test_relative_error(const T1 &a, const T2 &b, const typename T1::MatrixType* = 0) -{ - return test_relative_error(a.matrix(), b.matrix()); -} - -template -S test_relative_error(const Translation &a, const Translation &b) -{ - return test_relative_error(a.vector(), b.vector()); -} - -template -S test_relative_error(const ParametrizedLine &a, const ParametrizedLine &b) -{ - return (std::max)(test_relative_error(a.origin(), b.origin()), test_relative_error(a.origin(), b.origin())); -} - -template -S test_relative_error(const AlignedBox &a, const AlignedBox &b) -{ - return (std::max)(test_relative_error((a.min)(), (b.min)()), test_relative_error((a.max)(), (b.max)())); -} - -template class SparseMatrixBase; -template -typename T1::RealScalar test_relative_error(const MatrixBase &a, const SparseMatrixBase &b) -{ - return test_relative_error(a,b.toDense()); -} - -template class SparseMatrixBase; -template -typename T1::RealScalar test_relative_error(const SparseMatrixBase &a, const MatrixBase &b) -{ - return test_relative_error(a.toDense(),b); -} - -template class SparseMatrixBase; -template -typename T1::RealScalar test_relative_error(const SparseMatrixBase &a, const SparseMatrixBase &b) -{ - return test_relative_error(a.toDense(),b.toDense()); -} - -template -typename NumTraits::Real>::NonInteger test_relative_error(const T1 &a, const T2 &b, typename internal::enable_if::Real>::value, T1>::type* = 0) -{ - typedef typename NumTraits::Real>::NonInteger RealScalar; - return numext::sqrt(RealScalar(numext::abs2(a-b))/RealScalar((numext::mini)(numext::abs2(a),numext::abs2(b)))); -} - -template -T test_relative_error(const Rotation2D &a, const Rotation2D &b) -{ - return test_relative_error(a.angle(), b.angle()); -} - -template -T test_relative_error(const AngleAxis &a, const AngleAxis &b) -{ - return (std::max)(test_relative_error(a.angle(), b.angle()), test_relative_error(a.axis(), b.axis())); -} - -template -inline bool test_isApprox(const Type1& a, const Type2& b, typename Type1::Scalar* = 0) // Enabled for Eigen's type only -{ - return a.isApprox(b, test_precision()); -} - -// get_test_precision is a small wrapper to test_precision allowing to return the scalar precision for either scalars or expressions -template -typename NumTraits::Real get_test_precision(const T&, const typename T::Scalar* = 0) -{ - return test_precision::Real>(); -} - -template -typename NumTraits::Real get_test_precision(const T&,typename internal::enable_if::Real>::value, T>::type* = 0) -{ - return test_precision::Real>(); -} - -// verifyIsApprox is a wrapper to test_isApprox that outputs the relative difference magnitude if the test fails. -template -inline bool verifyIsApprox(const Type1& a, const Type2& b) -{ - bool ret = test_isApprox(a,b); - if(!ret) - { - std::cerr << "Difference too large wrt tolerance " << get_test_precision(a) << ", relative error is: " << test_relative_error(a,b) << std::endl; - } - return ret; -} - -// The idea behind this function is to compare the two scalars a and b where -// the scalar ref is a hint about the expected order of magnitude of a and b. -// WARNING: the scalar a and b must be positive -// Therefore, if for some reason a and b are very small compared to ref, -// we won't issue a false negative. -// This test could be: abs(a-b) <= eps * ref -// However, it seems that simply comparing a+ref and b+ref is more sensitive to true error. -template -inline bool test_isApproxWithRef(const Scalar& a, const Scalar& b, const ScalarRef& ref) -{ - return test_isApprox(a+ref, b+ref); -} - -template -inline bool test_isMuchSmallerThan(const MatrixBase& m1, - const MatrixBase& m2) -{ - return m1.isMuchSmallerThan(m2, test_precision::Scalar>()); -} - -template -inline bool test_isMuchSmallerThan(const MatrixBase& m, - const typename NumTraits::Scalar>::Real& s) -{ - return m.isMuchSmallerThan(s, test_precision::Scalar>()); -} - -template -inline bool test_isUnitary(const MatrixBase& m) -{ - return m.isUnitary(test_precision::Scalar>()); -} - -// Forward declaration to avoid ICC warning -template -bool test_is_equal(const T& actual, const U& expected, bool expect_equal=true); - -template -bool test_is_equal(const T& actual, const U& expected, bool expect_equal) -{ - if ((actual==expected) == expect_equal) - return true; - // false: - std::cerr - << "\n actual = " << actual - << "\n expected " << (expect_equal ? "= " : "!=") << expected << "\n\n"; - return false; -} - -/** Creates a random Partial Isometry matrix of given rank. - * - * A partial isometry is a matrix all of whose singular values are either 0 or 1. - * This is very useful to test rank-revealing algorithms. - */ -// Forward declaration to avoid ICC warning -template -void createRandomPIMatrixOfRank(Index desired_rank, Index rows, Index cols, MatrixType& m); -template -void createRandomPIMatrixOfRank(Index desired_rank, Index rows, Index cols, MatrixType& m) -{ - typedef typename internal::traits::Scalar Scalar; - enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; - - typedef Matrix VectorType; - typedef Matrix MatrixAType; - typedef Matrix MatrixBType; - - if(desired_rank == 0) - { - m.setZero(rows,cols); - return; - } - - if(desired_rank == 1) - { - // here we normalize the vectors to get a partial isometry - m = VectorType::Random(rows).normalized() * VectorType::Random(cols).normalized().transpose(); - return; - } - - MatrixAType a = MatrixAType::Random(rows,rows); - MatrixType d = MatrixType::Identity(rows,cols); - MatrixBType b = MatrixBType::Random(cols,cols); - - // set the diagonal such that only desired_rank non-zero entries reamain - const Index diag_size = (std::min)(d.rows(),d.cols()); - if(diag_size != desired_rank) - d.diagonal().segment(desired_rank, diag_size-desired_rank) = VectorType::Zero(diag_size-desired_rank); - - HouseholderQR qra(a); - HouseholderQR qrb(b); - m = qra.householderQ() * d * qrb.householderQ(); -} - -// Forward declaration to avoid ICC warning -template -void randomPermutationVector(PermutationVectorType& v, Index size); -template -void randomPermutationVector(PermutationVectorType& v, Index size) -{ - typedef typename PermutationVectorType::Scalar Scalar; - v.resize(size); - for(Index i = 0; i < size; ++i) v(i) = Scalar(i); - if(size == 1) return; - for(Index n = 0; n < 3 * size; ++n) - { - Index i = internal::random(0, size-1); - Index j; - do j = internal::random(0, size-1); while(j==i); - std::swap(v(i), v(j)); - } -} - -template bool isNotNaN(const T& x) -{ - return x==x; -} - -template bool isPlusInf(const T& x) -{ - return x > NumTraits::highest(); -} - -template bool isMinusInf(const T& x) -{ - return x < NumTraits::lowest(); -} - -} // end namespace Eigen - -template struct GetDifferentType; - -template<> struct GetDifferentType { typedef double type; }; -template<> struct GetDifferentType { typedef float type; }; -template struct GetDifferentType > -{ typedef std::complex::type> type; }; - -// Forward declaration to avoid ICC warning -template std::string type_name(); -template std::string type_name() { return "other"; } -template<> std::string type_name() { return "float"; } -template<> std::string type_name() { return "double"; } -template<> std::string type_name() { return "long double"; } -template<> std::string type_name() { return "int"; } -template<> std::string type_name >() { return "complex"; } -template<> std::string type_name >() { return "complex"; } -template<> std::string type_name >() { return "complex"; } -template<> std::string type_name >() { return "complex"; } - -// forward declaration of the main test function -void EIGEN_CAT(test_,EIGEN_TEST_FUNC)(); - -using namespace Eigen; - -inline void set_repeat_from_string(const char *str) -{ - errno = 0; - g_repeat = int(strtoul(str, 0, 10)); - if(errno || g_repeat <= 0) - { - std::cout << "Invalid repeat value " << str << std::endl; - exit(EXIT_FAILURE); - } - g_has_set_repeat = true; -} - -inline void set_seed_from_string(const char *str) -{ - errno = 0; - g_seed = int(strtoul(str, 0, 10)); - if(errno || g_seed == 0) - { - std::cout << "Invalid seed value " << str << std::endl; - exit(EXIT_FAILURE); - } - g_has_set_seed = true; -} - -int main(int argc, char *argv[]) -{ - g_has_set_repeat = false; - g_has_set_seed = false; - bool need_help = false; - - for(int i = 1; i < argc; i++) - { - if(argv[i][0] == 'r') - { - if(g_has_set_repeat) - { - std::cout << "Argument " << argv[i] << " conflicting with a former argument" << std::endl; - return 1; - } - set_repeat_from_string(argv[i]+1); - } - else if(argv[i][0] == 's') - { - if(g_has_set_seed) - { - std::cout << "Argument " << argv[i] << " conflicting with a former argument" << std::endl; - return 1; - } - set_seed_from_string(argv[i]+1); - } - else - { - need_help = true; - } - } - - if(need_help) - { - std::cout << "This test application takes the following optional arguments:" << std::endl; - std::cout << " rN Repeat each test N times (default: " << DEFAULT_REPEAT << ")" << std::endl; - std::cout << " sN Use N as seed for random numbers (default: based on current time)" << std::endl; - std::cout << std::endl; - std::cout << "If defined, the environment variables EIGEN_REPEAT and EIGEN_SEED" << std::endl; - std::cout << "will be used as default values for these parameters." << std::endl; - return 1; - } - - char *env_EIGEN_REPEAT = getenv("EIGEN_REPEAT"); - if(!g_has_set_repeat && env_EIGEN_REPEAT) - set_repeat_from_string(env_EIGEN_REPEAT); - char *env_EIGEN_SEED = getenv("EIGEN_SEED"); - if(!g_has_set_seed && env_EIGEN_SEED) - set_seed_from_string(env_EIGEN_SEED); - - if(!g_has_set_seed) g_seed = (unsigned int) time(NULL); - if(!g_has_set_repeat) g_repeat = DEFAULT_REPEAT; - - std::cout << "Initializing random number generator with seed " << g_seed << std::endl; - std::stringstream ss; - ss << "Seed: " << g_seed; - g_test_stack.push_back(ss.str()); - srand(g_seed); - std::cout << "Repeating each test " << g_repeat << " times" << std::endl; - - Eigen::g_test_stack.push_back(std::string(EI_PP_MAKE_STRING(EIGEN_TEST_FUNC))); - - EIGEN_CAT(test_,EIGEN_TEST_FUNC)(); - return 0; -} - -// These warning are disabled here such that they are still ON when parsing Eigen's header files. -#if defined __INTEL_COMPILER - // remark #383: value copied to temporary, reference to temporary used - // -> this warning is raised even for legal usage as: g_test_stack.push_back("foo"); where g_test_stack is a std::vector - // remark #1418: external function definition with no prior declaration - // -> this warning is raised for all our test functions. Declaring them static would fix the issue. - // warning #279: controlling expression is constant - // remark #1572: floating-point equality and inequality comparisons are unreliable - #pragma warning disable 279 383 1418 1572 -#endif - -#ifdef _MSC_VER - // 4503 - decorated name length exceeded, name was truncated - #pragma warning( disable : 4503) -#endif diff --git a/testbed/nanogui/ext/eigen/test/mapped_matrix.cpp b/testbed/nanogui/ext/eigen/test/mapped_matrix.cpp deleted file mode 100644 index 6a84c589..00000000 --- a/testbed/nanogui/ext/eigen/test/mapped_matrix.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NO_STATIC_ASSERT -#define EIGEN_NO_STATIC_ASSERT // turn static asserts into runtime asserts in order to check them -#endif - -#include "main.h" - -#define EIGEN_TESTMAP_MAX_SIZE 256 - -template void map_class_vector(const VectorType& m) -{ - typedef typename VectorType::Index Index; - typedef typename VectorType::Scalar Scalar; - - Index size = m.size(); - - Scalar* array1 = internal::aligned_new(size); - Scalar* array2 = internal::aligned_new(size); - Scalar* array3 = new Scalar[size+1]; - Scalar* array3unaligned = (internal::UIntPtr(array3)%EIGEN_MAX_ALIGN_BYTES) == 0 ? array3+1 : array3; - Scalar array4[EIGEN_TESTMAP_MAX_SIZE]; - - Map(array1, size) = VectorType::Random(size); - Map(array2, size) = Map(array1, size); - Map(array3unaligned, size) = Map(array1, size); - Map(array4, size) = Map(array1, size); - VectorType ma1 = Map(array1, size); - VectorType ma2 = Map(array2, size); - VectorType ma3 = Map(array3unaligned, size); - VectorType ma4 = Map(array4, size); - VERIFY_IS_EQUAL(ma1, ma2); - VERIFY_IS_EQUAL(ma1, ma3); - VERIFY_IS_EQUAL(ma1, ma4); - #ifdef EIGEN_VECTORIZE - if(internal::packet_traits::Vectorizable && size>=AlignedMax) - VERIFY_RAISES_ASSERT((Map(array3unaligned, size))) - #endif - - internal::aligned_delete(array1, size); - internal::aligned_delete(array2, size); - delete[] array3; -} - -template void map_class_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = m.rows(), cols = m.cols(), size = rows*cols; - Scalar s1 = internal::random(); - - // array1 and array2 -> aligned heap allocation - Scalar* array1 = internal::aligned_new(size); - for(int i = 0; i < size; i++) array1[i] = Scalar(1); - Scalar* array2 = internal::aligned_new(size); - for(int i = 0; i < size; i++) array2[i] = Scalar(1); - // array3unaligned -> unaligned pointer to heap - Scalar* array3 = new Scalar[size+1]; - for(int i = 0; i < size+1; i++) array3[i] = Scalar(1); - Scalar* array3unaligned = internal::UIntPtr(array3)%EIGEN_MAX_ALIGN_BYTES == 0 ? array3+1 : array3; - Scalar array4[256]; - if(size<=256) - for(int i = 0; i < size; i++) array4[i] = Scalar(1); - - Map map1(array1, rows, cols); - Map map2(array2, rows, cols); - Map map3(array3unaligned, rows, cols); - Map map4(array4, rows, cols); - - VERIFY_IS_EQUAL(map1, MatrixType::Ones(rows,cols)); - VERIFY_IS_EQUAL(map2, MatrixType::Ones(rows,cols)); - VERIFY_IS_EQUAL(map3, MatrixType::Ones(rows,cols)); - map1 = MatrixType::Random(rows,cols); - map2 = map1; - map3 = map1; - MatrixType ma1 = map1; - MatrixType ma2 = map2; - MatrixType ma3 = map3; - VERIFY_IS_EQUAL(map1, map2); - VERIFY_IS_EQUAL(map1, map3); - VERIFY_IS_EQUAL(ma1, ma2); - VERIFY_IS_EQUAL(ma1, ma3); - VERIFY_IS_EQUAL(ma1, map3); - - VERIFY_IS_APPROX(s1*map1, s1*map2); - VERIFY_IS_APPROX(s1*ma1, s1*ma2); - VERIFY_IS_EQUAL(s1*ma1, s1*ma3); - VERIFY_IS_APPROX(s1*map1, s1*map3); - - map2 *= s1; - map3 *= s1; - VERIFY_IS_APPROX(s1*map1, map2); - VERIFY_IS_APPROX(s1*map1, map3); - - if(size<=256) - { - VERIFY_IS_EQUAL(map4, MatrixType::Ones(rows,cols)); - map4 = map1; - MatrixType ma4 = map4; - VERIFY_IS_EQUAL(map1, map4); - VERIFY_IS_EQUAL(ma1, map4); - VERIFY_IS_EQUAL(ma1, ma4); - VERIFY_IS_APPROX(s1*map1, s1*map4); - - map4 *= s1; - VERIFY_IS_APPROX(s1*map1, map4); - } - - internal::aligned_delete(array1, size); - internal::aligned_delete(array2, size); - delete[] array3; -} - -template void map_static_methods(const VectorType& m) -{ - typedef typename VectorType::Index Index; - typedef typename VectorType::Scalar Scalar; - - Index size = m.size(); - - Scalar* array1 = internal::aligned_new(size); - Scalar* array2 = internal::aligned_new(size); - Scalar* array3 = new Scalar[size+1]; - Scalar* array3unaligned = internal::UIntPtr(array3)%EIGEN_MAX_ALIGN_BYTES == 0 ? array3+1 : array3; - - VectorType::MapAligned(array1, size) = VectorType::Random(size); - VectorType::Map(array2, size) = VectorType::Map(array1, size); - VectorType::Map(array3unaligned, size) = VectorType::Map(array1, size); - VectorType ma1 = VectorType::Map(array1, size); - VectorType ma2 = VectorType::MapAligned(array2, size); - VectorType ma3 = VectorType::Map(array3unaligned, size); - VERIFY_IS_EQUAL(ma1, ma2); - VERIFY_IS_EQUAL(ma1, ma3); - - internal::aligned_delete(array1, size); - internal::aligned_delete(array2, size); - delete[] array3; -} - -template void check_const_correctness(const PlainObjectType&) -{ - // there's a lot that we can't test here while still having this test compile! - // the only possible approach would be to run a script trying to compile stuff and checking that it fails. - // CMake can help with that. - - // verify that map-to-const don't have LvalueBit - typedef typename internal::add_const::type ConstPlainObjectType; - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(Map::Flags & LvalueBit) ); - VERIFY( !(Map::Flags & LvalueBit) ); -} - -template -void map_not_aligned_on_scalar() -{ - typedef Matrix MatrixType; - typedef typename MatrixType::Index Index; - Index size = 11; - Scalar* array1 = internal::aligned_new((size+1)*(size+1)+1); - Scalar* array2 = reinterpret_cast(sizeof(Scalar)/2+std::size_t(array1)); - Map > map2(array2, size, size, OuterStride<>(size+1)); - MatrixType m2 = MatrixType::Random(size,size); - map2 = m2; - VERIFY_IS_EQUAL(m2, map2); - - typedef Matrix VectorType; - Map map3(array2, size); - MatrixType v3 = VectorType::Random(size); - map3 = v3; - VERIFY_IS_EQUAL(v3, map3); - - internal::aligned_delete(array1, (size+1)*(size+1)+1); -} - -void test_mapped_matrix() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( map_class_vector(Matrix()) ); - CALL_SUBTEST_1( check_const_correctness(Matrix()) ); - CALL_SUBTEST_2( map_class_vector(Vector4d()) ); - CALL_SUBTEST_2( map_class_vector(VectorXd(13)) ); - CALL_SUBTEST_2( check_const_correctness(Matrix4d()) ); - CALL_SUBTEST_3( map_class_vector(RowVector4f()) ); - CALL_SUBTEST_4( map_class_vector(VectorXcf(8)) ); - CALL_SUBTEST_5( map_class_vector(VectorXi(12)) ); - CALL_SUBTEST_5( check_const_correctness(VectorXi(12)) ); - - CALL_SUBTEST_1( map_class_matrix(Matrix()) ); - CALL_SUBTEST_2( map_class_matrix(Matrix4d()) ); - CALL_SUBTEST_11( map_class_matrix(Matrix()) ); - CALL_SUBTEST_4( map_class_matrix(MatrixXcf(internal::random(1,10),internal::random(1,10))) ); - CALL_SUBTEST_5( map_class_matrix(MatrixXi(internal::random(1,10),internal::random(1,10))) ); - - CALL_SUBTEST_6( map_static_methods(Matrix()) ); - CALL_SUBTEST_7( map_static_methods(Vector3f()) ); - CALL_SUBTEST_8( map_static_methods(RowVector3d()) ); - CALL_SUBTEST_9( map_static_methods(VectorXcd(8)) ); - CALL_SUBTEST_10( map_static_methods(VectorXf(12)) ); - - CALL_SUBTEST_11( map_not_aligned_on_scalar() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/mapstaticmethods.cpp b/testbed/nanogui/ext/eigen/test/mapstaticmethods.cpp deleted file mode 100644 index 06272d10..00000000 --- a/testbed/nanogui/ext/eigen/test/mapstaticmethods.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -float *ptr; -const float *const_ptr; - -template -struct mapstaticmethods_impl {}; - -template -struct mapstaticmethods_impl -{ - static void run(const PlainObjectType& m) - { - mapstaticmethods_impl::run(m); - - int i = internal::random(2,5), j = internal::random(2,5); - - PlainObjectType::Map(ptr).setZero(); - PlainObjectType::MapAligned(ptr).setZero(); - PlainObjectType::Map(const_ptr).sum(); - PlainObjectType::MapAligned(const_ptr).sum(); - - PlainObjectType::Map(ptr, InnerStride<>(i)).setZero(); - PlainObjectType::MapAligned(ptr, InnerStride<>(i)).setZero(); - PlainObjectType::Map(const_ptr, InnerStride<>(i)).sum(); - PlainObjectType::MapAligned(const_ptr, InnerStride<>(i)).sum(); - - PlainObjectType::Map(ptr, InnerStride<2>()).setZero(); - PlainObjectType::MapAligned(ptr, InnerStride<3>()).setZero(); - PlainObjectType::Map(const_ptr, InnerStride<4>()).sum(); - PlainObjectType::MapAligned(const_ptr, InnerStride<5>()).sum(); - - PlainObjectType::Map(ptr, OuterStride<>(i)).setZero(); - PlainObjectType::MapAligned(ptr, OuterStride<>(i)).setZero(); - PlainObjectType::Map(const_ptr, OuterStride<>(i)).sum(); - PlainObjectType::MapAligned(const_ptr, OuterStride<>(i)).sum(); - - PlainObjectType::Map(ptr, OuterStride<2>()).setZero(); - PlainObjectType::MapAligned(ptr, OuterStride<3>()).setZero(); - PlainObjectType::Map(const_ptr, OuterStride<4>()).sum(); - PlainObjectType::MapAligned(const_ptr, OuterStride<5>()).sum(); - - PlainObjectType::Map(ptr, Stride(i,j)).setZero(); - PlainObjectType::MapAligned(ptr, Stride<2,Dynamic>(2,i)).setZero(); - PlainObjectType::Map(const_ptr, Stride(i,3)).sum(); - PlainObjectType::MapAligned(const_ptr, Stride(i,j)).sum(); - - PlainObjectType::Map(ptr, Stride<2,3>()).setZero(); - PlainObjectType::MapAligned(ptr, Stride<3,4>()).setZero(); - PlainObjectType::Map(const_ptr, Stride<2,4>()).sum(); - PlainObjectType::MapAligned(const_ptr, Stride<5,3>()).sum(); - } -}; - -template -struct mapstaticmethods_impl -{ - static void run(const PlainObjectType& m) - { - typedef typename PlainObjectType::Index Index; - Index rows = m.rows(), cols = m.cols(); - - int i = internal::random(2,5), j = internal::random(2,5); - - PlainObjectType::Map(ptr, rows, cols).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols).setZero(); - PlainObjectType::Map(const_ptr, rows, cols).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols).sum(); - - PlainObjectType::Map(ptr, rows, cols, InnerStride<>(i)).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols, InnerStride<>(i)).setZero(); - PlainObjectType::Map(const_ptr, rows, cols, InnerStride<>(i)).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols, InnerStride<>(i)).sum(); - - PlainObjectType::Map(ptr, rows, cols, InnerStride<2>()).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols, InnerStride<3>()).setZero(); - PlainObjectType::Map(const_ptr, rows, cols, InnerStride<4>()).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols, InnerStride<5>()).sum(); - - PlainObjectType::Map(ptr, rows, cols, OuterStride<>(i)).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols, OuterStride<>(i)).setZero(); - PlainObjectType::Map(const_ptr, rows, cols, OuterStride<>(i)).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols, OuterStride<>(i)).sum(); - - PlainObjectType::Map(ptr, rows, cols, OuterStride<2>()).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols, OuterStride<3>()).setZero(); - PlainObjectType::Map(const_ptr, rows, cols, OuterStride<4>()).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols, OuterStride<5>()).sum(); - - PlainObjectType::Map(ptr, rows, cols, Stride(i,j)).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols, Stride<2,Dynamic>(2,i)).setZero(); - PlainObjectType::Map(const_ptr, rows, cols, Stride(i,3)).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols, Stride(i,j)).sum(); - - PlainObjectType::Map(ptr, rows, cols, Stride<2,3>()).setZero(); - PlainObjectType::MapAligned(ptr, rows, cols, Stride<3,4>()).setZero(); - PlainObjectType::Map(const_ptr, rows, cols, Stride<2,4>()).sum(); - PlainObjectType::MapAligned(const_ptr, rows, cols, Stride<5,3>()).sum(); - } -}; - -template -struct mapstaticmethods_impl -{ - static void run(const PlainObjectType& v) - { - typedef typename PlainObjectType::Index Index; - Index size = v.size(); - - int i = internal::random(2,5); - - PlainObjectType::Map(ptr, size).setZero(); - PlainObjectType::MapAligned(ptr, size).setZero(); - PlainObjectType::Map(const_ptr, size).sum(); - PlainObjectType::MapAligned(const_ptr, size).sum(); - - PlainObjectType::Map(ptr, size, InnerStride<>(i)).setZero(); - PlainObjectType::MapAligned(ptr, size, InnerStride<>(i)).setZero(); - PlainObjectType::Map(const_ptr, size, InnerStride<>(i)).sum(); - PlainObjectType::MapAligned(const_ptr, size, InnerStride<>(i)).sum(); - - PlainObjectType::Map(ptr, size, InnerStride<2>()).setZero(); - PlainObjectType::MapAligned(ptr, size, InnerStride<3>()).setZero(); - PlainObjectType::Map(const_ptr, size, InnerStride<4>()).sum(); - PlainObjectType::MapAligned(const_ptr, size, InnerStride<5>()).sum(); - } -}; - -template -void mapstaticmethods(const PlainObjectType& m) -{ - mapstaticmethods_impl::run(m); - VERIFY(true); // just to avoid 'unused function' warning -} - -void test_mapstaticmethods() -{ - ptr = internal::aligned_new(1000); - for(int i = 0; i < 1000; i++) ptr[i] = float(i); - - const_ptr = ptr; - - CALL_SUBTEST_1(( mapstaticmethods(Matrix()) )); - CALL_SUBTEST_1(( mapstaticmethods(Vector2f()) )); - CALL_SUBTEST_2(( mapstaticmethods(Vector3f()) )); - CALL_SUBTEST_2(( mapstaticmethods(Matrix2f()) )); - CALL_SUBTEST_3(( mapstaticmethods(Matrix4f()) )); - CALL_SUBTEST_3(( mapstaticmethods(Array4f()) )); - CALL_SUBTEST_4(( mapstaticmethods(Array3f()) )); - CALL_SUBTEST_4(( mapstaticmethods(Array33f()) )); - CALL_SUBTEST_5(( mapstaticmethods(Array44f()) )); - CALL_SUBTEST_5(( mapstaticmethods(VectorXf(1)) )); - CALL_SUBTEST_5(( mapstaticmethods(VectorXf(8)) )); - CALL_SUBTEST_6(( mapstaticmethods(MatrixXf(1,1)) )); - CALL_SUBTEST_6(( mapstaticmethods(MatrixXf(5,7)) )); - CALL_SUBTEST_7(( mapstaticmethods(ArrayXf(1)) )); - CALL_SUBTEST_7(( mapstaticmethods(ArrayXf(5)) )); - CALL_SUBTEST_8(( mapstaticmethods(ArrayXXf(1,1)) )); - CALL_SUBTEST_8(( mapstaticmethods(ArrayXXf(8,6)) )); - - internal::aligned_delete(ptr, 1000); -} - diff --git a/testbed/nanogui/ext/eigen/test/mapstride.cpp b/testbed/nanogui/ext/eigen/test/mapstride.cpp deleted file mode 100644 index 4858f8fe..00000000 --- a/testbed/nanogui/ext/eigen/test/mapstride.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void map_class_vector(const VectorType& m) -{ - typedef typename VectorType::Index Index; - typedef typename VectorType::Scalar Scalar; - - Index size = m.size(); - - VectorType v = VectorType::Random(size); - - Index arraysize = 3*size; - - Scalar* a_array = internal::aligned_new(arraysize+1); - Scalar* array = a_array; - if(Alignment!=Aligned) - array = (Scalar*)(internal::IntPtr(a_array) + (internal::packet_traits::AlignedOnScalar?sizeof(Scalar):sizeof(typename NumTraits::Real))); - - { - Map > map(array, size); - map = v; - for(int i = 0; i < size; ++i) - { - VERIFY(array[3*i] == v[i]); - VERIFY(map[i] == v[i]); - } - } - - { - Map > map(array, size, InnerStride(2)); - map = v; - for(int i = 0; i < size; ++i) - { - VERIFY(array[2*i] == v[i]); - VERIFY(map[i] == v[i]); - } - } - - internal::aligned_delete(a_array, arraysize+1); -} - -template void map_class_matrix(const MatrixType& _m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = _m.rows(), cols = _m.cols(); - - MatrixType m = MatrixType::Random(rows,cols); - Scalar s1 = internal::random(); - - Index arraysize = 2*(rows+4)*(cols+4); - - Scalar* a_array1 = internal::aligned_new(arraysize+1); - Scalar* array1 = a_array1; - if(Alignment!=Aligned) - array1 = (Scalar*)(internal::IntPtr(a_array1) + (internal::packet_traits::AlignedOnScalar?sizeof(Scalar):sizeof(typename NumTraits::Real))); - - Scalar a_array2[256]; - Scalar* array2 = a_array2; - if(Alignment!=Aligned) - array2 = (Scalar*)(internal::IntPtr(a_array2) + (internal::packet_traits::AlignedOnScalar?sizeof(Scalar):sizeof(typename NumTraits::Real))); - else - array2 = (Scalar*)(((internal::UIntPtr(a_array2)+EIGEN_MAX_ALIGN_BYTES-1)/EIGEN_MAX_ALIGN_BYTES)*EIGEN_MAX_ALIGN_BYTES); - Index maxsize2 = a_array2 - array2 + 256; - - // test no inner stride and some dynamic outer stride - for(int k=0; k<2; ++k) - { - if(k==1 && (m.innerSize()+1)*m.outerSize() > maxsize2) - break; - Scalar* array = (k==0 ? array1 : array2); - - Map > map(array, rows, cols, OuterStride(m.innerSize()+1)); - map = m; - VERIFY(map.outerStride() == map.innerSize()+1); - for(int i = 0; i < m.outerSize(); ++i) - for(int j = 0; j < m.innerSize(); ++j) - { - VERIFY(array[map.outerStride()*i+j] == m.coeffByOuterInner(i,j)); - VERIFY(map.coeffByOuterInner(i,j) == m.coeffByOuterInner(i,j)); - } - VERIFY_IS_APPROX(s1*map,s1*m); - map *= s1; - VERIFY_IS_APPROX(map,s1*m); - } - - // test no inner stride and an outer stride of +4. This is quite important as for fixed-size matrices, - // this allows to hit the special case where it's vectorizable. - for(int k=0; k<2; ++k) - { - if(k==1 && (m.innerSize()+4)*m.outerSize() > maxsize2) - break; - Scalar* array = (k==0 ? array1 : array2); - - enum { - InnerSize = MatrixType::InnerSizeAtCompileTime, - OuterStrideAtCompileTime = InnerSize==Dynamic ? Dynamic : InnerSize+4 - }; - Map > - map(array, rows, cols, OuterStride(m.innerSize()+4)); - map = m; - VERIFY(map.outerStride() == map.innerSize()+4); - for(int i = 0; i < m.outerSize(); ++i) - for(int j = 0; j < m.innerSize(); ++j) - { - VERIFY(array[map.outerStride()*i+j] == m.coeffByOuterInner(i,j)); - VERIFY(map.coeffByOuterInner(i,j) == m.coeffByOuterInner(i,j)); - } - VERIFY_IS_APPROX(s1*map,s1*m); - map *= s1; - VERIFY_IS_APPROX(map,s1*m); - } - - // test both inner stride and outer stride - for(int k=0; k<2; ++k) - { - if(k==1 && (2*m.innerSize()+1)*(m.outerSize()*2) > maxsize2) - break; - Scalar* array = (k==0 ? array1 : array2); - - Map > map(array, rows, cols, Stride(2*m.innerSize()+1, 2)); - map = m; - VERIFY(map.outerStride() == 2*map.innerSize()+1); - VERIFY(map.innerStride() == 2); - for(int i = 0; i < m.outerSize(); ++i) - for(int j = 0; j < m.innerSize(); ++j) - { - VERIFY(array[map.outerStride()*i+map.innerStride()*j] == m.coeffByOuterInner(i,j)); - VERIFY(map.coeffByOuterInner(i,j) == m.coeffByOuterInner(i,j)); - } - VERIFY_IS_APPROX(s1*map,s1*m); - map *= s1; - VERIFY_IS_APPROX(map,s1*m); - } - - internal::aligned_delete(a_array1, arraysize+1); -} - -void test_mapstride() -{ - for(int i = 0; i < g_repeat; i++) { - int maxn = 30; - CALL_SUBTEST_1( map_class_vector(Matrix()) ); - CALL_SUBTEST_1( map_class_vector(Matrix()) ); - CALL_SUBTEST_2( map_class_vector(Vector4d()) ); - CALL_SUBTEST_2( map_class_vector(Vector4d()) ); - CALL_SUBTEST_3( map_class_vector(RowVector4f()) ); - CALL_SUBTEST_3( map_class_vector(RowVector4f()) ); - CALL_SUBTEST_4( map_class_vector(VectorXcf(internal::random(1,maxn))) ); - CALL_SUBTEST_4( map_class_vector(VectorXcf(internal::random(1,maxn))) ); - CALL_SUBTEST_5( map_class_vector(VectorXi(internal::random(1,maxn))) ); - CALL_SUBTEST_5( map_class_vector(VectorXi(internal::random(1,maxn))) ); - - CALL_SUBTEST_1( map_class_matrix(Matrix()) ); - CALL_SUBTEST_1( map_class_matrix(Matrix()) ); - CALL_SUBTEST_2( map_class_matrix(Matrix4d()) ); - CALL_SUBTEST_2( map_class_matrix(Matrix4d()) ); - CALL_SUBTEST_3( map_class_matrix(Matrix()) ); - CALL_SUBTEST_3( map_class_matrix(Matrix()) ); - CALL_SUBTEST_3( map_class_matrix(Matrix()) ); - CALL_SUBTEST_3( map_class_matrix(Matrix()) ); - CALL_SUBTEST_4( map_class_matrix(MatrixXcf(internal::random(1,maxn),internal::random(1,maxn))) ); - CALL_SUBTEST_4( map_class_matrix(MatrixXcf(internal::random(1,maxn),internal::random(1,maxn))) ); - CALL_SUBTEST_5( map_class_matrix(MatrixXi(internal::random(1,maxn),internal::random(1,maxn))) ); - CALL_SUBTEST_5( map_class_matrix(MatrixXi(internal::random(1,maxn),internal::random(1,maxn))) ); - CALL_SUBTEST_6( map_class_matrix(MatrixXcd(internal::random(1,maxn),internal::random(1,maxn))) ); - CALL_SUBTEST_6( map_class_matrix(MatrixXcd(internal::random(1,maxn),internal::random(1,maxn))) ); - - TEST_SET_BUT_UNUSED_VARIABLE(maxn); - } -} diff --git a/testbed/nanogui/ext/eigen/test/meta.cpp b/testbed/nanogui/ext/eigen/test/meta.cpp deleted file mode 100644 index b8dea68e..00000000 --- a/testbed/nanogui/ext/eigen/test/meta.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template -bool check_is_convertible(const From&, const To&) -{ - return internal::is_convertible::value; -} - -void test_meta() -{ - VERIFY((internal::conditional<(3<4),internal::true_type, internal::false_type>::type::value)); - VERIFY(( internal::is_same::value)); - VERIFY((!internal::is_same::value)); - VERIFY((!internal::is_same::value)); - VERIFY((!internal::is_same::value)); - - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - - // test add_const - VERIFY(( internal::is_same< internal::add_const::type, const float >::value)); - VERIFY(( internal::is_same< internal::add_const::type, float* const>::value)); - VERIFY(( internal::is_same< internal::add_const::type, float const* const>::value)); - VERIFY(( internal::is_same< internal::add_const::type, float& >::value)); - - // test remove_const - VERIFY(( internal::is_same< internal::remove_const::type, float const* >::value)); - VERIFY(( internal::is_same< internal::remove_const::type, float const* >::value)); - VERIFY(( internal::is_same< internal::remove_const::type, float* >::value)); - - // test add_const_on_value_type - VERIFY(( internal::is_same< internal::add_const_on_value_type::type, float const& >::value)); - VERIFY(( internal::is_same< internal::add_const_on_value_type::type, float const* >::value)); - - VERIFY(( internal::is_same< internal::add_const_on_value_type::type, const float >::value)); - VERIFY(( internal::is_same< internal::add_const_on_value_type::type, const float >::value)); - - VERIFY(( internal::is_same< internal::add_const_on_value_type::type, const float* const>::value)); - VERIFY(( internal::is_same< internal::add_const_on_value_type::type, const float* const>::value)); - - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - VERIFY(( internal::is_same::type >::value)); - - VERIFY(( internal::is_convertible::value )); - VERIFY(( internal::is_convertible::value )); - VERIFY(( internal::is_convertible::value )); - VERIFY((!internal::is_convertible,double>::value )); - VERIFY(( internal::is_convertible::value )); -// VERIFY((!internal::is_convertible::value )); //does not work because the conversion is prevented by a static assertion - VERIFY((!internal::is_convertible::value )); - VERIFY((!internal::is_convertible::value )); - { - float f; - MatrixXf A, B; - VectorXf a, b; - VERIFY(( check_is_convertible(a.dot(b), f) )); - VERIFY(( check_is_convertible(a.transpose()*b, f) )); - VERIFY((!check_is_convertible(A*B, f) )); - VERIFY(( check_is_convertible(A*B, A) )); - } - - VERIFY(internal::meta_sqrt<1>::ret == 1); - #define VERIFY_META_SQRT(X) VERIFY(internal::meta_sqrt::ret == int(std::sqrt(double(X)))) - VERIFY_META_SQRT(2); - VERIFY_META_SQRT(3); - VERIFY_META_SQRT(4); - VERIFY_META_SQRT(5); - VERIFY_META_SQRT(6); - VERIFY_META_SQRT(8); - VERIFY_META_SQRT(9); - VERIFY_META_SQRT(15); - VERIFY_META_SQRT(16); - VERIFY_META_SQRT(17); - VERIFY_META_SQRT(255); - VERIFY_META_SQRT(256); - VERIFY_META_SQRT(257); - VERIFY_META_SQRT(1023); - VERIFY_META_SQRT(1024); - VERIFY_META_SQRT(1025); -} diff --git a/testbed/nanogui/ext/eigen/test/metis_support.cpp b/testbed/nanogui/ext/eigen/test/metis_support.cpp deleted file mode 100644 index d87c56a1..00000000 --- a/testbed/nanogui/ext/eigen/test/metis_support.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Désiré Nuentsa-Wakam -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse_solver.h" -#include -#include -#include - -template void test_metis_T() -{ - SparseLU, MetisOrdering > sparselu_metis; - - check_sparse_square_solving(sparselu_metis); -} - -void test_metis_support() -{ - CALL_SUBTEST_1(test_metis_T()); -} diff --git a/testbed/nanogui/ext/eigen/test/miscmatrices.cpp b/testbed/nanogui/ext/eigen/test/miscmatrices.cpp deleted file mode 100644 index ef20dc74..00000000 --- a/testbed/nanogui/ext/eigen/test/miscmatrices.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void miscMatrices(const MatrixType& m) -{ - /* this test covers the following files: - DiagonalMatrix.h Ones.h - */ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - Index rows = m.rows(); - Index cols = m.cols(); - - Index r = internal::random(0, rows-1), r2 = internal::random(0, rows-1), c = internal::random(0, cols-1); - VERIFY_IS_APPROX(MatrixType::Ones(rows,cols)(r,c), static_cast(1)); - MatrixType m1 = MatrixType::Ones(rows,cols); - VERIFY_IS_APPROX(m1(r,c), static_cast(1)); - VectorType v1 = VectorType::Random(rows); - v1[0]; - Matrix - square(v1.asDiagonal()); - if(r==r2) VERIFY_IS_APPROX(square(r,r2), v1[r]); - else VERIFY_IS_MUCH_SMALLER_THAN(square(r,r2), static_cast(1)); - square = MatrixType::Zero(rows, rows); - square.diagonal() = VectorType::Ones(rows); - VERIFY_IS_APPROX(square, MatrixType::Identity(rows, rows)); -} - -void test_miscmatrices() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( miscMatrices(Matrix()) ); - CALL_SUBTEST_2( miscMatrices(Matrix4d()) ); - CALL_SUBTEST_3( miscMatrices(MatrixXcf(3, 3)) ); - CALL_SUBTEST_4( miscMatrices(MatrixXi(8, 12)) ); - CALL_SUBTEST_5( miscMatrices(MatrixXcd(20, 20)) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/mixingtypes.cpp b/testbed/nanogui/ext/eigen/test/mixingtypes.cpp deleted file mode 100644 index b796082c..00000000 --- a/testbed/nanogui/ext/eigen/test/mixingtypes.cpp +++ /dev/null @@ -1,300 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2015 Gael Guennebaud -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// work around "uninitialized" warnings and give that option some testing -#define EIGEN_INITIALIZE_MATRICES_BY_ZERO - -#ifndef EIGEN_NO_STATIC_ASSERT -#define EIGEN_NO_STATIC_ASSERT // turn static asserts into runtime asserts in order to check them -#endif - -#if defined(EIGEN_TEST_PART_1) || defined(EIGEN_TEST_PART_2) || defined(EIGEN_TEST_PART_3) - -#ifndef EIGEN_DONT_VECTORIZE -#define EIGEN_DONT_VECTORIZE -#endif - -#endif - -static bool g_called; -#define EIGEN_SCALAR_BINARY_OP_PLUGIN { g_called |= (!internal::is_same::value); } - -#include "main.h" - -using namespace std; - -#define VERIFY_MIX_SCALAR(XPR,REF) \ - g_called = false; \ - VERIFY_IS_APPROX(XPR,REF); \ - VERIFY( g_called && #XPR" not properly optimized"); - -template void mixingtypes(int size = SizeAtCompileType) -{ - typedef std::complex CF; - typedef std::complex CD; - typedef Matrix Mat_f; - typedef Matrix Mat_d; - typedef Matrix, SizeAtCompileType, SizeAtCompileType> Mat_cf; - typedef Matrix, SizeAtCompileType, SizeAtCompileType> Mat_cd; - typedef Matrix Vec_f; - typedef Matrix Vec_d; - typedef Matrix, SizeAtCompileType, 1> Vec_cf; - typedef Matrix, SizeAtCompileType, 1> Vec_cd; - - Mat_f mf = Mat_f::Random(size,size); - Mat_d md = mf.template cast(); - //Mat_d rd = md; - Mat_cf mcf = Mat_cf::Random(size,size); - Mat_cd mcd = mcf.template cast >(); - Mat_cd rcd = mcd; - Vec_f vf = Vec_f::Random(size,1); - Vec_d vd = vf.template cast(); - Vec_cf vcf = Vec_cf::Random(size,1); - Vec_cd vcd = vcf.template cast >(); - float sf = internal::random(); - double sd = internal::random(); - complex scf = internal::random >(); - complex scd = internal::random >(); - - mf+mf; - - float epsf = std::sqrt(std::numeric_limits ::min EIGEN_EMPTY ()); - double epsd = std::sqrt(std::numeric_limits::min EIGEN_EMPTY ()); - - while(std::abs(sf )(); - while(std::abs(sd )(); - while(std::abs(scf)(); - while(std::abs(scd)(); - -// VERIFY_RAISES_ASSERT(mf+md); // does not even compile - -#ifdef EIGEN_DONT_VECTORIZE - VERIFY_RAISES_ASSERT(vf=vd); - VERIFY_RAISES_ASSERT(vf+=vd); -#endif - - // check scalar products - VERIFY_MIX_SCALAR(vcf * sf , vcf * complex(sf)); - VERIFY_MIX_SCALAR(sd * vcd , complex(sd) * vcd); - VERIFY_MIX_SCALAR(vf * scf , vf.template cast >() * scf); - VERIFY_MIX_SCALAR(scd * vd , scd * vd.template cast >()); - - VERIFY_MIX_SCALAR(vcf * 2 , vcf * complex(2)); - VERIFY_MIX_SCALAR(vcf * 2.1 , vcf * complex(2.1)); - VERIFY_MIX_SCALAR(2 * vcf, vcf * complex(2)); - VERIFY_MIX_SCALAR(2.1 * vcf , vcf * complex(2.1)); - - // check scalar quotients - VERIFY_MIX_SCALAR(vcf / sf , vcf / complex(sf)); - VERIFY_MIX_SCALAR(vf / scf , vf.template cast >() / scf); - VERIFY_MIX_SCALAR(vf.array() / scf, vf.template cast >().array() / scf); - VERIFY_MIX_SCALAR(scd / vd.array() , scd / vd.template cast >().array()); - - // check scalar increment - VERIFY_MIX_SCALAR(vcf.array() + sf , vcf.array() + complex(sf)); - VERIFY_MIX_SCALAR(sd + vcd.array(), complex(sd) + vcd.array()); - VERIFY_MIX_SCALAR(vf.array() + scf, vf.template cast >().array() + scf); - VERIFY_MIX_SCALAR(scd + vd.array() , scd + vd.template cast >().array()); - - // check scalar subtractions - VERIFY_MIX_SCALAR(vcf.array() - sf , vcf.array() - complex(sf)); - VERIFY_MIX_SCALAR(sd - vcd.array(), complex(sd) - vcd.array()); - VERIFY_MIX_SCALAR(vf.array() - scf, vf.template cast >().array() - scf); - VERIFY_MIX_SCALAR(scd - vd.array() , scd - vd.template cast >().array()); - - // check scalar powers - VERIFY_MIX_SCALAR( pow(vcf.array(), sf), Eigen::pow(vcf.array(), complex(sf)) ); - VERIFY_MIX_SCALAR( vcf.array().pow(sf) , Eigen::pow(vcf.array(), complex(sf)) ); - VERIFY_MIX_SCALAR( pow(sd, vcd.array()), Eigen::pow(complex(sd), vcd.array()) ); - VERIFY_MIX_SCALAR( Eigen::pow(vf.array(), scf), Eigen::pow(vf.template cast >().array(), scf) ); - VERIFY_MIX_SCALAR( vf.array().pow(scf) , Eigen::pow(vf.template cast >().array(), scf) ); - VERIFY_MIX_SCALAR( Eigen::pow(scd, vd.array()), Eigen::pow(scd, vd.template cast >().array()) ); - - // check dot product - vf.dot(vf); -#if 0 // we get other compilation errors here than just static asserts - VERIFY_RAISES_ASSERT(vd.dot(vf)); -#endif - VERIFY_IS_APPROX(vcf.dot(vf), vcf.dot(vf.template cast >())); - - // check diagonal product - VERIFY_IS_APPROX(vf.asDiagonal() * mcf, vf.template cast >().asDiagonal() * mcf); - VERIFY_IS_APPROX(vcd.asDiagonal() * md, vcd.asDiagonal() * md.template cast >()); - VERIFY_IS_APPROX(mcf * vf.asDiagonal(), mcf * vf.template cast >().asDiagonal()); - VERIFY_IS_APPROX(md * vcd.asDiagonal(), md.template cast >() * vcd.asDiagonal()); - -// vd.asDiagonal() * mf; // does not even compile -// vcd.asDiagonal() * mf; // does not even compile - - // check inner product - VERIFY_IS_APPROX((vf.transpose() * vcf).value(), (vf.template cast >().transpose() * vcf).value()); - - // check outer product - VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast >() * vcf.transpose()).eval()); - - // coeff wise product - - VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast >() * vcf.transpose()).eval()); - - Mat_cd mcd2 = mcd; - VERIFY_IS_APPROX(mcd.array() *= md.array(), mcd2.array() *= md.array().template cast >()); - - // check matrix-matrix products - VERIFY_IS_APPROX(sd*md*mcd, (sd*md).template cast().eval()*mcd); - VERIFY_IS_APPROX(sd*mcd*md, sd*mcd*md.template cast()); - VERIFY_IS_APPROX(scd*md*mcd, scd*md.template cast().eval()*mcd); - VERIFY_IS_APPROX(scd*mcd*md, scd*mcd*md.template cast()); - - VERIFY_IS_APPROX(sf*mf*mcf, sf*mf.template cast()*mcf); - VERIFY_IS_APPROX(sf*mcf*mf, sf*mcf*mf.template cast()); - VERIFY_IS_APPROX(scf*mf*mcf, scf*mf.template cast()*mcf); - VERIFY_IS_APPROX(scf*mcf*mf, scf*mcf*mf.template cast()); - - VERIFY_IS_APPROX(sd*md.adjoint()*mcd, (sd*md).template cast().eval().adjoint()*mcd); - VERIFY_IS_APPROX(sd*mcd.adjoint()*md, sd*mcd.adjoint()*md.template cast()); - VERIFY_IS_APPROX(sd*md.adjoint()*mcd.adjoint(), (sd*md).template cast().eval().adjoint()*mcd.adjoint()); - VERIFY_IS_APPROX(sd*mcd.adjoint()*md.adjoint(), sd*mcd.adjoint()*md.template cast().adjoint()); - VERIFY_IS_APPROX(sd*md*mcd.adjoint(), (sd*md).template cast().eval()*mcd.adjoint()); - VERIFY_IS_APPROX(sd*mcd*md.adjoint(), sd*mcd*md.template cast().adjoint()); - - VERIFY_IS_APPROX(sf*mf.adjoint()*mcf, (sf*mf).template cast().eval().adjoint()*mcf); - VERIFY_IS_APPROX(sf*mcf.adjoint()*mf, sf*mcf.adjoint()*mf.template cast()); - VERIFY_IS_APPROX(sf*mf.adjoint()*mcf.adjoint(), (sf*mf).template cast().eval().adjoint()*mcf.adjoint()); - VERIFY_IS_APPROX(sf*mcf.adjoint()*mf.adjoint(), sf*mcf.adjoint()*mf.template cast().adjoint()); - VERIFY_IS_APPROX(sf*mf*mcf.adjoint(), (sf*mf).template cast().eval()*mcf.adjoint()); - VERIFY_IS_APPROX(sf*mcf*mf.adjoint(), sf*mcf*mf.template cast().adjoint()); - - VERIFY_IS_APPROX(sf*mf*vcf, (sf*mf).template cast().eval()*vcf); - VERIFY_IS_APPROX(scf*mf*vcf,(scf*mf.template cast()).eval()*vcf); - VERIFY_IS_APPROX(sf*mcf*vf, sf*mcf*vf.template cast()); - VERIFY_IS_APPROX(scf*mcf*vf,scf*mcf*vf.template cast()); - - VERIFY_IS_APPROX(sf*vcf.adjoint()*mf, sf*vcf.adjoint()*mf.template cast().eval()); - VERIFY_IS_APPROX(scf*vcf.adjoint()*mf, scf*vcf.adjoint()*mf.template cast().eval()); - VERIFY_IS_APPROX(sf*vf.adjoint()*mcf, sf*vf.adjoint().template cast().eval()*mcf); - VERIFY_IS_APPROX(scf*vf.adjoint()*mcf, scf*vf.adjoint().template cast().eval()*mcf); - - VERIFY_IS_APPROX(sd*md*vcd, (sd*md).template cast().eval()*vcd); - VERIFY_IS_APPROX(scd*md*vcd,(scd*md.template cast()).eval()*vcd); - VERIFY_IS_APPROX(sd*mcd*vd, sd*mcd*vd.template cast().eval()); - VERIFY_IS_APPROX(scd*mcd*vd,scd*mcd*vd.template cast().eval()); - - VERIFY_IS_APPROX(sd*vcd.adjoint()*md, sd*vcd.adjoint()*md.template cast().eval()); - VERIFY_IS_APPROX(scd*vcd.adjoint()*md, scd*vcd.adjoint()*md.template cast().eval()); - VERIFY_IS_APPROX(sd*vd.adjoint()*mcd, sd*vd.adjoint().template cast().eval()*mcd); - VERIFY_IS_APPROX(scd*vd.adjoint()*mcd, scd*vd.adjoint().template cast().eval()*mcd); - - VERIFY_IS_APPROX( sd*vcd.adjoint()*md.template triangularView(), sd*vcd.adjoint()*md.template cast().eval().template triangularView()); - VERIFY_IS_APPROX(scd*vcd.adjoint()*md.template triangularView(), scd*vcd.adjoint()*md.template cast().eval().template triangularView()); - VERIFY_IS_APPROX( sd*vcd.adjoint()*md.transpose().template triangularView(), sd*vcd.adjoint()*md.transpose().template cast().eval().template triangularView()); - VERIFY_IS_APPROX(scd*vcd.adjoint()*md.transpose().template triangularView(), scd*vcd.adjoint()*md.transpose().template cast().eval().template triangularView()); - VERIFY_IS_APPROX( sd*vd.adjoint()*mcd.template triangularView(), sd*vd.adjoint().template cast().eval()*mcd.template triangularView()); - VERIFY_IS_APPROX(scd*vd.adjoint()*mcd.template triangularView(), scd*vd.adjoint().template cast().eval()*mcd.template triangularView()); - VERIFY_IS_APPROX( sd*vd.adjoint()*mcd.transpose().template triangularView(), sd*vd.adjoint().template cast().eval()*mcd.transpose().template triangularView()); - VERIFY_IS_APPROX(scd*vd.adjoint()*mcd.transpose().template triangularView(), scd*vd.adjoint().template cast().eval()*mcd.transpose().template triangularView()); - - // Not supported yet: trmm -// VERIFY_IS_APPROX(sd*mcd*md.template triangularView(), sd*mcd*md.template cast().eval().template triangularView()); -// VERIFY_IS_APPROX(scd*mcd*md.template triangularView(), scd*mcd*md.template cast().eval().template triangularView()); -// VERIFY_IS_APPROX(sd*md*mcd.template triangularView(), sd*md.template cast().eval()*mcd.template triangularView()); -// VERIFY_IS_APPROX(scd*md*mcd.template triangularView(), scd*md.template cast().eval()*mcd.template triangularView()); - - // Not supported yet: symv -// VERIFY_IS_APPROX(sd*vcd.adjoint()*md.template selfadjointView(), sd*vcd.adjoint()*md.template cast().eval().template selfadjointView()); -// VERIFY_IS_APPROX(scd*vcd.adjoint()*md.template selfadjointView(), scd*vcd.adjoint()*md.template cast().eval().template selfadjointView()); -// VERIFY_IS_APPROX(sd*vd.adjoint()*mcd.template selfadjointView(), sd*vd.adjoint().template cast().eval()*mcd.template selfadjointView()); -// VERIFY_IS_APPROX(scd*vd.adjoint()*mcd.template selfadjointView(), scd*vd.adjoint().template cast().eval()*mcd.template selfadjointView()); - - // Not supported yet: symm -// VERIFY_IS_APPROX(sd*vcd.adjoint()*md.template selfadjointView(), sd*vcd.adjoint()*md.template cast().eval().template selfadjointView()); -// VERIFY_IS_APPROX(scd*vcd.adjoint()*md.template selfadjointView(), scd*vcd.adjoint()*md.template cast().eval().template selfadjointView()); -// VERIFY_IS_APPROX(sd*vd.adjoint()*mcd.template selfadjointView(), sd*vd.adjoint().template cast().eval()*mcd.template selfadjointView()); -// VERIFY_IS_APPROX(scd*vd.adjoint()*mcd.template selfadjointView(), scd*vd.adjoint().template cast().eval()*mcd.template selfadjointView()); - - rcd.setZero(); - VERIFY_IS_APPROX(Mat_cd(rcd.template triangularView() = sd * mcd * md), - Mat_cd((sd * mcd * md.template cast().eval()).template triangularView())); - VERIFY_IS_APPROX(Mat_cd(rcd.template triangularView() = sd * md * mcd), - Mat_cd((sd * md.template cast().eval() * mcd).template triangularView())); - VERIFY_IS_APPROX(Mat_cd(rcd.template triangularView() = scd * mcd * md), - Mat_cd((scd * mcd * md.template cast().eval()).template triangularView())); - VERIFY_IS_APPROX(Mat_cd(rcd.template triangularView() = scd * md * mcd), - Mat_cd((scd * md.template cast().eval() * mcd).template triangularView())); - - - VERIFY_IS_APPROX( md.array() * mcd.array(), md.template cast().eval().array() * mcd.array() ); - VERIFY_IS_APPROX( mcd.array() * md.array(), mcd.array() * md.template cast().eval().array() ); - - VERIFY_IS_APPROX( md.array() + mcd.array(), md.template cast().eval().array() + mcd.array() ); - VERIFY_IS_APPROX( mcd.array() + md.array(), mcd.array() + md.template cast().eval().array() ); - - VERIFY_IS_APPROX( md.array() - mcd.array(), md.template cast().eval().array() - mcd.array() ); - VERIFY_IS_APPROX( mcd.array() - md.array(), mcd.array() - md.template cast().eval().array() ); - - if(mcd.array().abs().minCoeff()>epsd) - { - VERIFY_IS_APPROX( md.array() / mcd.array(), md.template cast().eval().array() / mcd.array() ); - } - if(md.array().abs().minCoeff()>epsd) - { - VERIFY_IS_APPROX( mcd.array() / md.array(), mcd.array() / md.template cast().eval().array() ); - } - - if(md.array().abs().minCoeff()>epsd || mcd.array().abs().minCoeff()>epsd) - { - VERIFY_IS_APPROX( md.array().pow(mcd.array()), md.template cast().eval().array().pow(mcd.array()) ); - VERIFY_IS_APPROX( mcd.array().pow(md.array()), mcd.array().pow(md.template cast().eval().array()) ); - - VERIFY_IS_APPROX( pow(md.array(),mcd.array()), md.template cast().eval().array().pow(mcd.array()) ); - VERIFY_IS_APPROX( pow(mcd.array(),md.array()), mcd.array().pow(md.template cast().eval().array()) ); - } - - rcd = mcd; - VERIFY_IS_APPROX( rcd = md, md.template cast().eval() ); - rcd = mcd; - VERIFY_IS_APPROX( rcd += md, mcd + md.template cast().eval() ); - rcd = mcd; - VERIFY_IS_APPROX( rcd -= md, mcd - md.template cast().eval() ); - rcd = mcd; - VERIFY_IS_APPROX( rcd.array() *= md.array(), mcd.array() * md.template cast().eval().array() ); - rcd = mcd; - if(md.array().abs().minCoeff()>epsd) - { - VERIFY_IS_APPROX( rcd.array() /= md.array(), mcd.array() / md.template cast().eval().array() ); - } - - rcd = mcd; - VERIFY_IS_APPROX( rcd.noalias() += md + mcd*md, mcd + (md.template cast().eval()) + mcd*(md.template cast().eval())); - - VERIFY_IS_APPROX( rcd.noalias() = md*md, ((md*md).eval().template cast()) ); - rcd = mcd; - VERIFY_IS_APPROX( rcd.noalias() += md*md, mcd + ((md*md).eval().template cast()) ); - rcd = mcd; - VERIFY_IS_APPROX( rcd.noalias() -= md*md, mcd - ((md*md).eval().template cast()) ); - - VERIFY_IS_APPROX( rcd.noalias() = mcd + md*md, mcd + ((md*md).eval().template cast()) ); - rcd = mcd; - VERIFY_IS_APPROX( rcd.noalias() += mcd + md*md, mcd + mcd + ((md*md).eval().template cast()) ); - rcd = mcd; - VERIFY_IS_APPROX( rcd.noalias() -= mcd + md*md, - ((md*md).eval().template cast()) ); -} - -void test_mixingtypes() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(mixingtypes<3>()); - CALL_SUBTEST_2(mixingtypes<4>()); - CALL_SUBTEST_3(mixingtypes(internal::random(1,EIGEN_TEST_MAX_SIZE))); - - CALL_SUBTEST_4(mixingtypes<3>()); - CALL_SUBTEST_5(mixingtypes<4>()); - CALL_SUBTEST_6(mixingtypes(internal::random(1,EIGEN_TEST_MAX_SIZE))); - } -} diff --git a/testbed/nanogui/ext/eigen/test/mpl2only.cpp b/testbed/nanogui/ext/eigen/test/mpl2only.cpp deleted file mode 100644 index 7d04d6bb..00000000 --- a/testbed/nanogui/ext/eigen/test/mpl2only.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_MPL2_ONLY -#include -#include -#include -#include -#include -#include -#include - -int main() -{ - return 0; -} diff --git a/testbed/nanogui/ext/eigen/test/nesting_ops.cpp b/testbed/nanogui/ext/eigen/test/nesting_ops.cpp deleted file mode 100644 index a419b0e4..00000000 --- a/testbed/nanogui/ext/eigen/test/nesting_ops.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Hauke Heibel -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define TEST_ENABLE_TEMPORARY_TRACKING - -#include "main.h" - -template -void use_n_times(const XprType &xpr) -{ - typename internal::nested_eval::type mat(xpr); - typename XprType::PlainObject res(mat.rows(), mat.cols()); - nb_temporaries--; // remove res - res.setZero(); - for(int i=0; i -bool verify_eval_type(const XprType &, const ReferenceType&) -{ - typedef typename internal::nested_eval::type EvalType; - return internal::is_same::type, typename internal::remove_all::type>::value; -} - -template void run_nesting_ops_1(const MatrixType& _m) -{ - typename internal::nested_eval::type m(_m); - - // Make really sure that we are in debug mode! - VERIFY_RAISES_ASSERT(eigen_assert(false)); - - // The only intention of these tests is to ensure that this code does - // not trigger any asserts or segmentation faults... more to come. - VERIFY_IS_APPROX( (m.transpose() * m).diagonal().sum(), (m.transpose() * m).diagonal().sum() ); - VERIFY_IS_APPROX( (m.transpose() * m).diagonal().array().abs().sum(), (m.transpose() * m).diagonal().array().abs().sum() ); - - VERIFY_IS_APPROX( (m.transpose() * m).array().abs().sum(), (m.transpose() * m).array().abs().sum() ); -} - -template void run_nesting_ops_2(const MatrixType& _m) -{ - typedef typename MatrixType::Scalar Scalar; - Index rows = _m.rows(); - Index cols = _m.cols(); - MatrixType m1 = MatrixType::Random(rows,cols); - Matrix m2; - - if((MatrixType::SizeAtCompileTime==Dynamic)) - { - VERIFY_EVALUATION_COUNT( use_n_times<1>(m1 + m1*m1), 1 ); - VERIFY_EVALUATION_COUNT( use_n_times<10>(m1 + m1*m1), 1 ); - - VERIFY_EVALUATION_COUNT( use_n_times<1>(m1.template triangularView().solve(m1.col(0))), 1 ); - VERIFY_EVALUATION_COUNT( use_n_times<10>(m1.template triangularView().solve(m1.col(0))), 1 ); - - VERIFY_EVALUATION_COUNT( use_n_times<1>(Scalar(2)*m1.template triangularView().solve(m1.col(0))), 2 ); // FIXME could be one by applying the scaling in-place on the solve result - VERIFY_EVALUATION_COUNT( use_n_times<1>(m1.col(0)+m1.template triangularView().solve(m1.col(0))), 2 ); // FIXME could be one by adding m1.col() inplace - VERIFY_EVALUATION_COUNT( use_n_times<10>(m1.col(0)+m1.template triangularView().solve(m1.col(0))), 2 ); - } - - { - VERIFY( verify_eval_type<10>(m1, m1) ); - if(!NumTraits::IsComplex) - { - VERIFY( verify_eval_type<3>(2*m1, 2*m1) ); - VERIFY( verify_eval_type<4>(2*m1, m1) ); - } - else - { - VERIFY( verify_eval_type<2>(2*m1, 2*m1) ); - VERIFY( verify_eval_type<3>(2*m1, m1) ); - } - VERIFY( verify_eval_type<2>(m1+m1, m1+m1) ); - VERIFY( verify_eval_type<3>(m1+m1, m1) ); - VERIFY( verify_eval_type<1>(m1*m1.transpose(), m2) ); - VERIFY( verify_eval_type<1>(m1*(m1+m1).transpose(), m2) ); - VERIFY( verify_eval_type<2>(m1*m1.transpose(), m2) ); - VERIFY( verify_eval_type<1>(m1+m1*m1, m1) ); - - VERIFY( verify_eval_type<1>(m1.template triangularView().solve(m1), m1) ); - VERIFY( verify_eval_type<1>(m1+m1.template triangularView().solve(m1), m1) ); - } -} - - -void test_nesting_ops() -{ - CALL_SUBTEST_1(run_nesting_ops_1(MatrixXf::Random(25,25))); - CALL_SUBTEST_2(run_nesting_ops_1(MatrixXcd::Random(25,25))); - CALL_SUBTEST_3(run_nesting_ops_1(Matrix4f::Random())); - CALL_SUBTEST_4(run_nesting_ops_1(Matrix2d::Random())); - - Index s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_1( run_nesting_ops_2(MatrixXf(s,s)) ); - CALL_SUBTEST_2( run_nesting_ops_2(MatrixXcd(s,s)) ); - CALL_SUBTEST_3( run_nesting_ops_2(Matrix4f()) ); - CALL_SUBTEST_4( run_nesting_ops_2(Matrix2d()) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) -} diff --git a/testbed/nanogui/ext/eigen/test/nomalloc.cpp b/testbed/nanogui/ext/eigen/test/nomalloc.cpp deleted file mode 100644 index 50756c2f..00000000 --- a/testbed/nanogui/ext/eigen/test/nomalloc.cpp +++ /dev/null @@ -1,229 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// discard stack allocation as that too bypasses malloc -#define EIGEN_STACK_ALLOCATION_LIMIT 0 -// heap allocation will raise an assert if enabled at runtime -#define EIGEN_RUNTIME_NO_MALLOC - -#include "main.h" -#include -#include -#include -#include -#include - -template void nomalloc(const MatrixType& m) -{ - /* this test check no dynamic memory allocation are issued with fixed-size matrices - */ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols); - - Scalar s1 = internal::random(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - VERIFY_IS_APPROX((m1+m2)*s1, s1*m1+s1*m2); - VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c))); - VERIFY_IS_APPROX(m1.cwiseProduct(m1.block(0,0,rows,cols)), (m1.array()*m1.array()).matrix()); - VERIFY_IS_APPROX((m1*m1.transpose())*m2, m1*(m1.transpose()*m2)); - - m2.col(0).noalias() = m1 * m1.col(0); - m2.col(0).noalias() -= m1.adjoint() * m1.col(0); - m2.col(0).noalias() -= m1 * m1.row(0).adjoint(); - m2.col(0).noalias() -= m1.adjoint() * m1.row(0).adjoint(); - - m2.row(0).noalias() = m1.row(0) * m1; - m2.row(0).noalias() -= m1.row(0) * m1.adjoint(); - m2.row(0).noalias() -= m1.col(0).adjoint() * m1; - m2.row(0).noalias() -= m1.col(0).adjoint() * m1.adjoint(); - VERIFY_IS_APPROX(m2,m2); - - m2.col(0).noalias() = m1.template triangularView() * m1.col(0); - m2.col(0).noalias() -= m1.adjoint().template triangularView() * m1.col(0); - m2.col(0).noalias() -= m1.template triangularView() * m1.row(0).adjoint(); - m2.col(0).noalias() -= m1.adjoint().template triangularView() * m1.row(0).adjoint(); - - m2.row(0).noalias() = m1.row(0) * m1.template triangularView(); - m2.row(0).noalias() -= m1.row(0) * m1.adjoint().template triangularView(); - m2.row(0).noalias() -= m1.col(0).adjoint() * m1.template triangularView(); - m2.row(0).noalias() -= m1.col(0).adjoint() * m1.adjoint().template triangularView(); - VERIFY_IS_APPROX(m2,m2); - - m2.col(0).noalias() = m1.template selfadjointView() * m1.col(0); - m2.col(0).noalias() -= m1.adjoint().template selfadjointView() * m1.col(0); - m2.col(0).noalias() -= m1.template selfadjointView() * m1.row(0).adjoint(); - m2.col(0).noalias() -= m1.adjoint().template selfadjointView() * m1.row(0).adjoint(); - - m2.row(0).noalias() = m1.row(0) * m1.template selfadjointView(); - m2.row(0).noalias() -= m1.row(0) * m1.adjoint().template selfadjointView(); - m2.row(0).noalias() -= m1.col(0).adjoint() * m1.template selfadjointView(); - m2.row(0).noalias() -= m1.col(0).adjoint() * m1.adjoint().template selfadjointView(); - VERIFY_IS_APPROX(m2,m2); - - m2.template selfadjointView().rankUpdate(m1.col(0),-1); - m2.template selfadjointView().rankUpdate(m1.row(0),-1); - m2.template selfadjointView().rankUpdate(m1.col(0), m1.col(0)); // rank-2 - - // The following fancy matrix-matrix products are not safe yet regarding static allocation - m2.template selfadjointView().rankUpdate(m1); - m2 += m2.template triangularView() * m1; - m2.template triangularView() = m2 * m2; - m1 += m1.template selfadjointView() * m2; - VERIFY_IS_APPROX(m2,m2); -} - -template -void ctms_decompositions() -{ - const int maxSize = 16; - const int size = 12; - - typedef Eigen::Matrix Matrix; - - typedef Eigen::Matrix Vector; - - typedef Eigen::Matrix, - Eigen::Dynamic, Eigen::Dynamic, - 0, - maxSize, maxSize> ComplexMatrix; - - const Matrix A(Matrix::Random(size, size)), B(Matrix::Random(size, size)); - Matrix X(size,size); - const ComplexMatrix complexA(ComplexMatrix::Random(size, size)); - const Matrix saA = A.adjoint() * A; - const Vector b(Vector::Random(size)); - Vector x(size); - - // Cholesky module - Eigen::LLT LLT; LLT.compute(A); - X = LLT.solve(B); - x = LLT.solve(b); - Eigen::LDLT LDLT; LDLT.compute(A); - X = LDLT.solve(B); - x = LDLT.solve(b); - - // Eigenvalues module - Eigen::HessenbergDecomposition hessDecomp; hessDecomp.compute(complexA); - Eigen::ComplexSchur cSchur(size); cSchur.compute(complexA); - Eigen::ComplexEigenSolver cEigSolver; cEigSolver.compute(complexA); - Eigen::EigenSolver eigSolver; eigSolver.compute(A); - Eigen::SelfAdjointEigenSolver saEigSolver(size); saEigSolver.compute(saA); - Eigen::Tridiagonalization tridiag; tridiag.compute(saA); - - // LU module - Eigen::PartialPivLU ppLU; ppLU.compute(A); - X = ppLU.solve(B); - x = ppLU.solve(b); - Eigen::FullPivLU fpLU; fpLU.compute(A); - X = fpLU.solve(B); - x = fpLU.solve(b); - - // QR module - Eigen::HouseholderQR hQR; hQR.compute(A); - X = hQR.solve(B); - x = hQR.solve(b); - Eigen::ColPivHouseholderQR cpQR; cpQR.compute(A); - X = cpQR.solve(B); - x = cpQR.solve(b); - Eigen::FullPivHouseholderQR fpQR; fpQR.compute(A); - // FIXME X = fpQR.solve(B); - x = fpQR.solve(b); - - // SVD module - Eigen::JacobiSVD jSVD; jSVD.compute(A, ComputeFullU | ComputeFullV); -} - -void test_zerosized() { - // default constructors: - Eigen::MatrixXd A; - Eigen::VectorXd v; - // explicit zero-sized: - Eigen::ArrayXXd A0(0,0); - Eigen::ArrayXd v0(0); - - // assigning empty objects to each other: - A=A0; - v=v0; -} - -template void test_reference(const MatrixType& m) { - typedef typename MatrixType::Scalar Scalar; - enum { Flag = MatrixType::IsRowMajor ? Eigen::RowMajor : Eigen::ColMajor}; - enum { TransposeFlag = !MatrixType::IsRowMajor ? Eigen::RowMajor : Eigen::ColMajor}; - typename MatrixType::Index rows = m.rows(), cols=m.cols(); - typedef Eigen::Matrix MatrixX; - typedef Eigen::Matrix MatrixXT; - // Dynamic reference: - typedef Eigen::Ref Ref; - typedef Eigen::Ref RefT; - - Ref r1(m); - Ref r2(m.block(rows/3, cols/4, rows/2, cols/2)); - RefT r3(m.transpose()); - RefT r4(m.topLeftCorner(rows/2, cols/2).transpose()); - - VERIFY_RAISES_ASSERT(RefT r5(m)); - VERIFY_RAISES_ASSERT(Ref r6(m.transpose())); - VERIFY_RAISES_ASSERT(Ref r7(Scalar(2) * m)); - - // Copy constructors shall also never malloc - Ref r8 = r1; - RefT r9 = r3; - - // Initializing from a compatible Ref shall also never malloc - Eigen::Ref > r10=r8, r11=m; - - // Initializing from an incompatible Ref will malloc: - typedef Eigen::Ref RefAligned; - VERIFY_RAISES_ASSERT(RefAligned r12=r10); - VERIFY_RAISES_ASSERT(Ref r13=r10); // r10 has more dynamic strides - -} - -void test_nomalloc() -{ - // create some dynamic objects - Eigen::MatrixXd M1 = MatrixXd::Random(3,3); - Ref R1 = 2.0*M1; // Ref requires temporary - - // from here on prohibit malloc: - Eigen::internal::set_is_malloc_allowed(false); - - // check that our operator new is indeed called: - VERIFY_RAISES_ASSERT(MatrixXd dummy(MatrixXd::Random(3,3))); - CALL_SUBTEST_1(nomalloc(Matrix()) ); - CALL_SUBTEST_2(nomalloc(Matrix4d()) ); - CALL_SUBTEST_3(nomalloc(Matrix()) ); - - // Check decomposition modules with dynamic matrices that have a known compile-time max size (ctms) - CALL_SUBTEST_4(ctms_decompositions()); - - CALL_SUBTEST_5(test_zerosized()); - - CALL_SUBTEST_6(test_reference(Matrix())); - CALL_SUBTEST_7(test_reference(R1)); - CALL_SUBTEST_8(Ref R2 = M1.topRows<2>(); test_reference(R2)); -} diff --git a/testbed/nanogui/ext/eigen/test/nullary.cpp b/testbed/nanogui/ext/eigen/test/nullary.cpp deleted file mode 100644 index acd55506..00000000 --- a/testbed/nanogui/ext/eigen/test/nullary.cpp +++ /dev/null @@ -1,304 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010-2011 Jitse Niesen -// Copyright (C) 2016 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template -bool equalsIdentity(const MatrixType& A) -{ - typedef typename MatrixType::Scalar Scalar; - Scalar zero = static_cast(0); - - bool offDiagOK = true; - for (Index i = 0; i < A.rows(); ++i) { - for (Index j = i+1; j < A.cols(); ++j) { - offDiagOK = offDiagOK && (A(i,j) == zero); - } - } - for (Index i = 0; i < A.rows(); ++i) { - for (Index j = 0; j < (std::min)(i, A.cols()); ++j) { - offDiagOK = offDiagOK && (A(i,j) == zero); - } - } - - bool diagOK = (A.diagonal().array() == 1).all(); - return offDiagOK && diagOK; - -} - -template -void check_extremity_accuracy(const VectorType &v, const typename VectorType::Scalar &low, const typename VectorType::Scalar &high) -{ - typedef typename VectorType::Scalar Scalar; - typedef typename VectorType::RealScalar RealScalar; - - RealScalar prec = internal::is_same::value ? NumTraits::dummy_precision()*10 : NumTraits::dummy_precision()/10; - Index size = v.size(); - - if(size<20) - return; - - for (int i=0; isize-6) - { - Scalar ref = (low*RealScalar(size-i-1))/RealScalar(size-1) + (high*RealScalar(i))/RealScalar(size-1); - if(std::abs(ref)>1) - { - if(!internal::isApprox(v(i), ref, prec)) - std::cout << v(i) << " != " << ref << " ; relative error: " << std::abs((v(i)-ref)/ref) << " ; required precision: " << prec << " ; range: " << low << "," << high << " ; i: " << i << "\n"; - VERIFY(internal::isApprox(v(i), (low*RealScalar(size-i-1))/RealScalar(size-1) + (high*RealScalar(i))/RealScalar(size-1), prec)); - } - } - } -} - -template -void testVectorType(const VectorType& base) -{ - typedef typename VectorType::Scalar Scalar; - typedef typename VectorType::RealScalar RealScalar; - - const Index size = base.size(); - - Scalar high = internal::random(-500,500); - Scalar low = (size == 1 ? high : internal::random(-500,500)); - if (low>high) std::swap(low,high); - - // check low==high - if(internal::random(0.f,1.f)<0.05f) - low = high; - // check abs(low) >> abs(high) - else if(size>2 && std::numeric_limits::max_exponent10>0 && internal::random(0.f,1.f)<0.1f) - low = -internal::random(1,2) * RealScalar(std::pow(RealScalar(10),std::numeric_limits::max_exponent10/2)); - - const Scalar step = ((size == 1) ? 1 : (high-low)/(size-1)); - - // check whether the result yields what we expect it to do - VectorType m(base); - m.setLinSpaced(size,low,high); - - if(!NumTraits::IsInteger) - { - VectorType n(size); - for (int i=0; i::IsInteger) || ((high-low)>=size && (Index(high-low)%(size-1))==0) || (Index(high-low+1)::IsInteger) || (high-low>=size)) - for (int i=0; i::IsInteger) - CALL_SUBTEST( check_extremity_accuracy(m, low, high) ); - } - - VERIFY( m(m.size()-1) <= high ); - VERIFY( (m.array() <= high).all() ); - VERIFY( (m.array() >= low).all() ); - - - VERIFY( m(m.size()-1) >= low ); - if(size>=1) - { - VERIFY( internal::isApprox(m(0),low) ); - VERIFY_IS_EQUAL(m(0) , low); - } - - // check whether everything works with row and col major vectors - Matrix row_vector(size); - Matrix col_vector(size); - row_vector.setLinSpaced(size,low,high); - col_vector.setLinSpaced(size,low,high); - // when using the extended precision (e.g., FPU) the relative error might exceed 1 bit - // when computing the squared sum in isApprox, thus the 2x factor. - VERIFY( row_vector.isApprox(col_vector.transpose(), Scalar(2)*NumTraits::epsilon())); - - Matrix size_changer(size+50); - size_changer.setLinSpaced(size,low,high); - VERIFY( size_changer.size() == size ); - - typedef Matrix ScalarMatrix; - ScalarMatrix scalar; - scalar.setLinSpaced(1,low,high); - VERIFY_IS_APPROX( scalar, ScalarMatrix::Constant(high) ); - VERIFY_IS_APPROX( ScalarMatrix::LinSpaced(1,low,high), ScalarMatrix::Constant(high) ); - - // regression test for bug 526 (linear vectorized transversal) - if (size > 1 && (!NumTraits::IsInteger)) { - m.tail(size-1).setLinSpaced(low, high); - VERIFY_IS_APPROX(m(size-1), high); - } - - // regression test for bug 1383 (LinSpaced with empty size/range) - { - Index n0 = VectorType::SizeAtCompileTime==Dynamic ? 0 : VectorType::SizeAtCompileTime; - low = internal::random(); - m = VectorType::LinSpaced(n0,low,low-1); - VERIFY(m.size()==n0); - - if(VectorType::SizeAtCompileTime==Dynamic) - { - VERIFY_IS_EQUAL(VectorType::LinSpaced(n0,0,Scalar(n0-1)).sum(),Scalar(0)); - VERIFY_IS_EQUAL(VectorType::LinSpaced(n0,low,low-1).sum(),Scalar(0)); - } - - m.setLinSpaced(n0,0,Scalar(n0-1)); - VERIFY(m.size()==n0); - m.setLinSpaced(n0,low,low-1); - VERIFY(m.size()==n0); - - // empty range only: - VERIFY_IS_APPROX(VectorType::LinSpaced(size,low,low),VectorType::Constant(size,low)); - m.setLinSpaced(size,low,low); - VERIFY_IS_APPROX(m,VectorType::Constant(size,low)); - - if(NumTraits::IsInteger) - { - VERIFY_IS_APPROX( VectorType::LinSpaced(size,low,Scalar(low+size-1)), VectorType::LinSpaced(size,Scalar(low+size-1),low).reverse() ); - - if(VectorType::SizeAtCompileTime==Dynamic) - { - // Check negative multiplicator path: - for(Index k=1; k<5; ++k) - VERIFY_IS_APPROX( VectorType::LinSpaced(size,low,Scalar(low+(size-1)*k)), VectorType::LinSpaced(size,Scalar(low+(size-1)*k),low).reverse() ); - // Check negative divisor path: - for(Index k=1; k<5; ++k) - VERIFY_IS_APPROX( VectorType::LinSpaced(size*k,low,Scalar(low+size-1)), VectorType::LinSpaced(size*k,Scalar(low+size-1),low).reverse() ); - } - } - } -} - -template -void testMatrixType(const MatrixType& m) -{ - using std::abs; - const Index rows = m.rows(); - const Index cols = m.cols(); - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - Scalar s1; - do { - s1 = internal::random(); - } while(abs(s1)::IsInteger)); - - MatrixType A; - A.setIdentity(rows, cols); - VERIFY(equalsIdentity(A)); - VERIFY(equalsIdentity(MatrixType::Identity(rows, cols))); - - - A = MatrixType::Constant(rows,cols,s1); - Index i = internal::random(0,rows-1); - Index j = internal::random(0,cols-1); - VERIFY_IS_APPROX( MatrixType::Constant(rows,cols,s1)(i,j), s1 ); - VERIFY_IS_APPROX( MatrixType::Constant(rows,cols,s1).coeff(i,j), s1 ); - VERIFY_IS_APPROX( A(i,j), s1 ); -} - -void test_nullary() -{ - CALL_SUBTEST_1( testMatrixType(Matrix2d()) ); - CALL_SUBTEST_2( testMatrixType(MatrixXcf(internal::random(1,300),internal::random(1,300))) ); - CALL_SUBTEST_3( testMatrixType(MatrixXf(internal::random(1,300),internal::random(1,300))) ); - - for(int i = 0; i < g_repeat*10; i++) { - CALL_SUBTEST_4( testVectorType(VectorXd(internal::random(1,30000))) ); - CALL_SUBTEST_5( testVectorType(Vector4d()) ); // regression test for bug 232 - CALL_SUBTEST_6( testVectorType(Vector3d()) ); - CALL_SUBTEST_7( testVectorType(VectorXf(internal::random(1,30000))) ); - CALL_SUBTEST_8( testVectorType(Vector3f()) ); - CALL_SUBTEST_8( testVectorType(Vector4f()) ); - CALL_SUBTEST_8( testVectorType(Matrix()) ); - CALL_SUBTEST_8( testVectorType(Matrix()) ); - - CALL_SUBTEST_9( testVectorType(VectorXi(internal::random(1,10))) ); - CALL_SUBTEST_9( testVectorType(VectorXi(internal::random(9,300))) ); - CALL_SUBTEST_9( testVectorType(Matrix()) ); - } - -#ifdef EIGEN_TEST_PART_6 - // Assignment of a RowVectorXd to a MatrixXd (regression test for bug #79). - VERIFY( (MatrixXd(RowVectorXd::LinSpaced(3, 0, 1)) - RowVector3d(0, 0.5, 1)).norm() < std::numeric_limits::epsilon() ); -#endif - -#ifdef EIGEN_TEST_PART_9 - // Check possible overflow issue - { - int n = 60000; - ArrayXi a1(n), a2(n); - a1.setLinSpaced(n, 0, n-1); - for(int i=0; i >::value )); - VERIFY(( !internal::has_unary_operator >::value )); - VERIFY(( !internal::has_binary_operator >::value )); - VERIFY(( internal::functor_has_linear_access >::ret )); - - VERIFY(( !internal::has_nullary_operator >::value )); - VERIFY(( !internal::has_unary_operator >::value )); - VERIFY(( internal::has_binary_operator >::value )); - VERIFY(( !internal::functor_has_linear_access >::ret )); - - VERIFY(( !internal::has_nullary_operator >::value )); - VERIFY(( internal::has_unary_operator >::value )); - VERIFY(( !internal::has_binary_operator >::value )); - VERIFY(( internal::functor_has_linear_access >::ret )); - - // Regression unit test for a weird MSVC bug. - // Search "nullary_wrapper_workaround_msvc" in CoreEvaluators.h for the details. - // See also traits::match. - { - MatrixXf A = MatrixXf::Random(3,3); - Ref R = 2.0*A; - VERIFY_IS_APPROX(R, A+A); - - Ref R1 = MatrixXf::Random(3,3)+A; - - VectorXi V = VectorXi::Random(3); - Ref R2 = VectorXi::LinSpaced(3,1,3)+V; - VERIFY_IS_APPROX(R2, V+Vector3i(1,2,3)); - - VERIFY(( internal::has_nullary_operator >::value )); - VERIFY(( !internal::has_unary_operator >::value )); - VERIFY(( !internal::has_binary_operator >::value )); - VERIFY(( internal::functor_has_linear_access >::ret )); - - VERIFY(( !internal::has_nullary_operator >::value )); - VERIFY(( internal::has_unary_operator >::value )); - VERIFY(( !internal::has_binary_operator >::value )); - VERIFY(( internal::functor_has_linear_access >::ret )); - } -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/packetmath.cpp b/testbed/nanogui/ext/eigen/test/packetmath.cpp deleted file mode 100644 index 08b36034..00000000 --- a/testbed/nanogui/ext/eigen/test/packetmath.cpp +++ /dev/null @@ -1,642 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include "unsupported/Eigen/SpecialFunctions" - -#if defined __GNUC__ && __GNUC__>=6 - #pragma GCC diagnostic ignored "-Wignored-attributes" -#endif -// using namespace Eigen; - -#ifdef EIGEN_VECTORIZE_SSE -const bool g_vectorize_sse = true; -#else -const bool g_vectorize_sse = false; -#endif - -namespace Eigen { -namespace internal { -template T negate(const T& x) { return -x; } -} -} - -// NOTE: we disbale inlining for this function to workaround a GCC issue when using -O3 and the i387 FPU. -template EIGEN_DONT_INLINE -bool isApproxAbs(const Scalar& a, const Scalar& b, const typename NumTraits::Real& refvalue) -{ - return internal::isMuchSmallerThan(a-b, refvalue); -} - -template bool areApproxAbs(const Scalar* a, const Scalar* b, int size, const typename NumTraits::Real& refvalue) -{ - for (int i=0; i >(a,size) << "]" << " != vec: [" << Map >(b,size) << "]\n"; - return false; - } - } - return true; -} - -template bool areApprox(const Scalar* a, const Scalar* b, int size) -{ - for (int i=0; i >(a,size) << "]" << " != vec: [" << Map >(b,size) << "]\n"; - return false; - } - } - return true; -} - -#define CHECK_CWISE1(REFOP, POP) { \ - for (int i=0; i(data1))); \ - VERIFY(areApprox(ref, data2, PacketSize) && #POP); \ -} - -template -struct packet_helper -{ - template - inline Packet load(const T* from) const { return internal::pload(from); } - - template - inline void store(T* to, const Packet& x) const { internal::pstore(to,x); } -}; - -template -struct packet_helper -{ - template - inline T load(const T* from) const { return *from; } - - template - inline void store(T* to, const T& x) const { *to = x; } -}; - -#define CHECK_CWISE1_IF(COND, REFOP, POP) if(COND) { \ - packet_helper h; \ - for (int i=0; i h; \ - for (int i=0; i void packetmath() -{ - using std::abs; - typedef internal::packet_traits PacketTraits; - typedef typename PacketTraits::type Packet; - const int PacketSize = PacketTraits::size; - typedef typename NumTraits::Real RealScalar; - - const int max_size = PacketSize > 4 ? PacketSize : 4; - const int size = PacketSize*max_size; - EIGEN_ALIGN_MAX Scalar data1[size]; - EIGEN_ALIGN_MAX Scalar data2[size]; - EIGEN_ALIGN_MAX Packet packets[PacketSize*2]; - EIGEN_ALIGN_MAX Scalar ref[size]; - RealScalar refvalue = 0; - for (int i=0; i()/RealScalar(PacketSize); - data2[i] = internal::random()/RealScalar(PacketSize); - refvalue = (std::max)(refvalue,abs(data1[i])); - } - - internal::pstore(data2, internal::pload(data1)); - VERIFY(areApprox(data1, data2, PacketSize) && "aligned load/store"); - - for (int offset=0; offset(data1+offset)); - VERIFY(areApprox(data1+offset, data2, PacketSize) && "internal::ploadu"); - } - - for (int offset=0; offset(data1)); - VERIFY(areApprox(data1, data2+offset, PacketSize) && "internal::pstoreu"); - } - - for (int offset=0; offset(data1); - packets[1] = internal::pload(data1+PacketSize); - if (offset==0) internal::palign<0>(packets[0], packets[1]); - else if (offset==1) internal::palign<1>(packets[0], packets[1]); - else if (offset==2) internal::palign<2>(packets[0], packets[1]); - else if (offset==3) internal::palign<3>(packets[0], packets[1]); - else if (offset==4) internal::palign<4>(packets[0], packets[1]); - else if (offset==5) internal::palign<5>(packets[0], packets[1]); - else if (offset==6) internal::palign<6>(packets[0], packets[1]); - else if (offset==7) internal::palign<7>(packets[0], packets[1]); - else if (offset==8) internal::palign<8>(packets[0], packets[1]); - else if (offset==9) internal::palign<9>(packets[0], packets[1]); - else if (offset==10) internal::palign<10>(packets[0], packets[1]); - else if (offset==11) internal::palign<11>(packets[0], packets[1]); - else if (offset==12) internal::palign<12>(packets[0], packets[1]); - else if (offset==13) internal::palign<13>(packets[0], packets[1]); - else if (offset==14) internal::palign<14>(packets[0], packets[1]); - else if (offset==15) internal::palign<15>(packets[0], packets[1]); - internal::pstore(data2, packets[0]); - - for (int i=0; i::value) || (!PacketTraits::Vectorizable) || PacketTraits::HasDiv); - - CHECK_CWISE2_IF(PacketTraits::HasAdd, REF_ADD, internal::padd); - CHECK_CWISE2_IF(PacketTraits::HasSub, REF_SUB, internal::psub); - CHECK_CWISE2_IF(PacketTraits::HasMul, REF_MUL, internal::pmul); - CHECK_CWISE2_IF(PacketTraits::HasDiv, REF_DIV, internal::pdiv); - - CHECK_CWISE1(internal::negate, internal::pnegate); - CHECK_CWISE1(numext::conj, internal::pconj); - - for(int offset=0;offset<3;++offset) - { - for (int i=0; i(data1[offset])); - VERIFY(areApprox(ref, data2, PacketSize) && "internal::pset1"); - } - - { - for (int i=0; i(data1, A0, A1, A2, A3); - internal::pstore(data2+0*PacketSize, A0); - internal::pstore(data2+1*PacketSize, A1); - internal::pstore(data2+2*PacketSize, A2); - internal::pstore(data2+3*PacketSize, A3); - VERIFY(areApprox(ref, data2, 4*PacketSize) && "internal::pbroadcast4"); - } - - { - for (int i=0; i(data1, A0, A1); - internal::pstore(data2+0*PacketSize, A0); - internal::pstore(data2+1*PacketSize, A1); - VERIFY(areApprox(ref, data2, 2*PacketSize) && "internal::pbroadcast2"); - } - - VERIFY(internal::isApprox(data1[0], internal::pfirst(internal::pload(data1))) && "internal::pfirst"); - - if(PacketSize>1) - { - for(int offset=0;offset<4;++offset) - { - for(int i=0;i(data1+offset)); - VERIFY(areApprox(ref, data2, PacketSize) && "ploaddup"); - } - } - - if(PacketSize>2) - { - for(int offset=0;offset<4;++offset) - { - for(int i=0;i(data1+offset)); - VERIFY(areApprox(ref, data2, PacketSize) && "ploadquad"); - } - } - - ref[0] = 0; - for (int i=0; i(data1)), refvalue) && "internal::predux"); - - { - for (int i=0; i<4; ++i) - ref[i] = 0; - for (int i=0; i(data1))); - VERIFY(areApprox(ref, data2, PacketSize>4?PacketSize/2:PacketSize) && "internal::predux_downto4"); - } - - ref[0] = 1; - for (int i=0; i(data1))) && "internal::predux_mul"); - - for (int j=0; j(data1+j*PacketSize); - } - internal::pstore(data2, internal::preduxp(packets)); - VERIFY(areApproxAbs(ref, data2, PacketSize, refvalue) && "internal::preduxp"); - - for (int i=0; i(data1))); - VERIFY(areApprox(ref, data2, PacketSize) && "internal::preverse"); - - internal::PacketBlock kernel; - for (int i=0; i(data1+i*PacketSize); - } - ptranspose(kernel); - for (int i=0; i(data1); - Packet elsePacket = internal::pload(data2); - EIGEN_ALIGN_MAX internal::Selector selector; - for (int i = 0; i < PacketSize; ++i) { - selector.select[i] = i; - } - - Packet blend = internal::pblend(selector, thenPacket, elsePacket); - EIGEN_ALIGN_MAX Scalar result[size]; - internal::pstore(result, blend); - for (int i = 0; i < PacketSize; ++i) { - VERIFY(isApproxAbs(result[i], (selector.select[i] ? data1[i] : data2[i]), refvalue)); - } - } - - if (PacketTraits::HasBlend || g_vectorize_sse) { - // pinsertfirst - for (int i=0; i(); - ref[0] = s; - internal::pstore(data2, internal::pinsertfirst(internal::pload(data1),s)); - VERIFY(areApprox(ref, data2, PacketSize) && "internal::pinsertfirst"); - } - - if (PacketTraits::HasBlend || g_vectorize_sse) { - // pinsertlast - for (int i=0; i(); - ref[PacketSize-1] = s; - internal::pstore(data2, internal::pinsertlast(internal::pload(data1),s)); - VERIFY(areApprox(ref, data2, PacketSize) && "internal::pinsertlast"); - } -} - -template void packetmath_real() -{ - using std::abs; - typedef internal::packet_traits PacketTraits; - typedef typename PacketTraits::type Packet; - const int PacketSize = PacketTraits::size; - - const int size = PacketSize*4; - EIGEN_ALIGN_MAX Scalar data1[PacketTraits::size*4]; - EIGEN_ALIGN_MAX Scalar data2[PacketTraits::size*4]; - EIGEN_ALIGN_MAX Scalar ref[PacketTraits::size*4]; - - for (int i=0; i(-1,1) * std::pow(Scalar(10), internal::random(-3,3)); - data2[i] = internal::random(-1,1) * std::pow(Scalar(10), internal::random(-3,3)); - } - CHECK_CWISE1_IF(PacketTraits::HasSin, std::sin, internal::psin); - CHECK_CWISE1_IF(PacketTraits::HasCos, std::cos, internal::pcos); - CHECK_CWISE1_IF(PacketTraits::HasTan, std::tan, internal::ptan); - - CHECK_CWISE1_IF(PacketTraits::HasRound, numext::round, internal::pround); - CHECK_CWISE1_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil); - CHECK_CWISE1_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor); - - for (int i=0; i(-1,1); - data2[i] = internal::random(-1,1); - } - CHECK_CWISE1_IF(PacketTraits::HasASin, std::asin, internal::pasin); - CHECK_CWISE1_IF(PacketTraits::HasACos, std::acos, internal::pacos); - - for (int i=0; i(-87,88); - data2[i] = internal::random(-87,88); - } - CHECK_CWISE1_IF(PacketTraits::HasExp, std::exp, internal::pexp); - for (int i=0; i(-1,1) * std::pow(Scalar(10), internal::random(-6,6)); - data2[i] = internal::random(-1,1) * std::pow(Scalar(10), internal::random(-6,6)); - } - CHECK_CWISE1_IF(PacketTraits::HasTanh, std::tanh, internal::ptanh); - if(PacketTraits::HasExp && PacketTraits::size>=2) - { - data1[0] = std::numeric_limits::quiet_NaN(); - data1[1] = std::numeric_limits::epsilon(); - packet_helper h; - h.store(data2, internal::pexp(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - VERIFY_IS_EQUAL(std::exp(std::numeric_limits::epsilon()), data2[1]); - - data1[0] = -std::numeric_limits::epsilon(); - data1[1] = 0; - h.store(data2, internal::pexp(h.load(data1))); - VERIFY_IS_EQUAL(std::exp(-std::numeric_limits::epsilon()), data2[0]); - VERIFY_IS_EQUAL(std::exp(Scalar(0)), data2[1]); - - data1[0] = (std::numeric_limits::min)(); - data1[1] = -(std::numeric_limits::min)(); - h.store(data2, internal::pexp(h.load(data1))); - VERIFY_IS_EQUAL(std::exp((std::numeric_limits::min)()), data2[0]); - VERIFY_IS_EQUAL(std::exp(-(std::numeric_limits::min)()), data2[1]); - - data1[0] = std::numeric_limits::denorm_min(); - data1[1] = -std::numeric_limits::denorm_min(); - h.store(data2, internal::pexp(h.load(data1))); - VERIFY_IS_EQUAL(std::exp(std::numeric_limits::denorm_min()), data2[0]); - VERIFY_IS_EQUAL(std::exp(-std::numeric_limits::denorm_min()), data2[1]); - } - - if (PacketTraits::HasTanh) { - // NOTE this test migh fail with GCC prior to 6.3, see MathFunctionsImpl.h for details. - data1[0] = std::numeric_limits::quiet_NaN(); - packet_helper::HasTanh,Packet> h; - h.store(data2, internal::ptanh(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - } - -#if EIGEN_HAS_C99_MATH - { - data1[0] = std::numeric_limits::quiet_NaN(); - packet_helper::HasLGamma,Packet> h; - h.store(data2, internal::plgamma(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - } - { - data1[0] = std::numeric_limits::quiet_NaN(); - packet_helper::HasErf,Packet> h; - h.store(data2, internal::perf(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - } - { - data1[0] = std::numeric_limits::quiet_NaN(); - packet_helper::HasErfc,Packet> h; - h.store(data2, internal::perfc(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - } -#endif // EIGEN_HAS_C99_MATH - - for (int i=0; i(0,1) * std::pow(Scalar(10), internal::random(-6,6)); - data2[i] = internal::random(0,1) * std::pow(Scalar(10), internal::random(-6,6)); - } - - if(internal::random(0,1)<0.1f) - data1[internal::random(0, PacketSize)] = 0; - CHECK_CWISE1_IF(PacketTraits::HasSqrt, std::sqrt, internal::psqrt); - CHECK_CWISE1_IF(PacketTraits::HasLog, std::log, internal::plog); -#if EIGEN_HAS_C99_MATH && (__cplusplus > 199711L) - CHECK_CWISE1_IF(PacketTraits::HasExpm1, std::expm1, internal::pexpm1); - CHECK_CWISE1_IF(PacketTraits::HasLog1p, std::log1p, internal::plog1p); - CHECK_CWISE1_IF(internal::packet_traits::HasLGamma, std::lgamma, internal::plgamma); - CHECK_CWISE1_IF(internal::packet_traits::HasErf, std::erf, internal::perf); - CHECK_CWISE1_IF(internal::packet_traits::HasErfc, std::erfc, internal::perfc); -#endif - - if(PacketTraits::HasLog && PacketTraits::size>=2) - { - data1[0] = std::numeric_limits::quiet_NaN(); - data1[1] = std::numeric_limits::epsilon(); - packet_helper h; - h.store(data2, internal::plog(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - VERIFY_IS_EQUAL(std::log(std::numeric_limits::epsilon()), data2[1]); - - data1[0] = -std::numeric_limits::epsilon(); - data1[1] = 0; - h.store(data2, internal::plog(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - VERIFY_IS_EQUAL(std::log(Scalar(0)), data2[1]); - - data1[0] = (std::numeric_limits::min)(); - data1[1] = -(std::numeric_limits::min)(); - h.store(data2, internal::plog(h.load(data1))); - VERIFY_IS_EQUAL(std::log((std::numeric_limits::min)()), data2[0]); - VERIFY((numext::isnan)(data2[1])); - - data1[0] = std::numeric_limits::denorm_min(); - data1[1] = -std::numeric_limits::denorm_min(); - h.store(data2, internal::plog(h.load(data1))); - // VERIFY_IS_EQUAL(std::log(std::numeric_limits::denorm_min()), data2[0]); - VERIFY((numext::isnan)(data2[1])); - - data1[0] = Scalar(-1.0f); - h.store(data2, internal::plog(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - h.store(data2, internal::psqrt(h.load(data1))); - VERIFY((numext::isnan)(data2[0])); - VERIFY((numext::isnan)(data2[1])); - } -} - -template void packetmath_notcomplex() -{ - using std::abs; - typedef internal::packet_traits PacketTraits; - typedef typename PacketTraits::type Packet; - const int PacketSize = PacketTraits::size; - - EIGEN_ALIGN_MAX Scalar data1[PacketTraits::size*4]; - EIGEN_ALIGN_MAX Scalar data2[PacketTraits::size*4]; - EIGEN_ALIGN_MAX Scalar ref[PacketTraits::size*4]; - - Array::Map(data1, PacketTraits::size*4).setRandom(); - - ref[0] = data1[0]; - for (int i=0; i(data1))) && "internal::predux_min"); - - VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasMin); - VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasMax); - - CHECK_CWISE2_IF(PacketTraits::HasMin, (std::min), internal::pmin); - CHECK_CWISE2_IF(PacketTraits::HasMax, (std::max), internal::pmax); - CHECK_CWISE1(abs, internal::pabs); - - ref[0] = data1[0]; - for (int i=0; i(data1))) && "internal::predux_max"); - - for (int i=0; i(data1[0])); - VERIFY(areApprox(ref, data2, PacketSize) && "internal::plset"); -} - -template void test_conj_helper(Scalar* data1, Scalar* data2, Scalar* ref, Scalar* pval) -{ - typedef internal::packet_traits PacketTraits; - typedef typename PacketTraits::type Packet; - const int PacketSize = PacketTraits::size; - - internal::conj_if cj0; - internal::conj_if cj1; - internal::conj_helper cj; - internal::conj_helper pcj; - - for(int i=0;i(data1),internal::pload(data2))); - VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper pmul"); - - for(int i=0;i(data1),internal::pload(data2),internal::pload(pval))); - VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper pmadd"); -} - -template void packetmath_complex() -{ - typedef internal::packet_traits PacketTraits; - typedef typename PacketTraits::type Packet; - const int PacketSize = PacketTraits::size; - - const int size = PacketSize*4; - EIGEN_ALIGN_MAX Scalar data1[PacketSize*4]; - EIGEN_ALIGN_MAX Scalar data2[PacketSize*4]; - EIGEN_ALIGN_MAX Scalar ref[PacketSize*4]; - EIGEN_ALIGN_MAX Scalar pval[PacketSize*4]; - - for (int i=0; i() * Scalar(1e2); - data2[i] = internal::random() * Scalar(1e2); - } - - test_conj_helper (data1,data2,ref,pval); - test_conj_helper (data1,data2,ref,pval); - test_conj_helper (data1,data2,ref,pval); - test_conj_helper (data1,data2,ref,pval); - - { - for(int i=0;i(data1))); - VERIFY(areApprox(ref, pval, PacketSize) && "pcplxflip"); - } -} - -template void packetmath_scatter_gather() -{ - typedef internal::packet_traits PacketTraits; - typedef typename PacketTraits::type Packet; - typedef typename NumTraits::Real RealScalar; - const int PacketSize = PacketTraits::size; - EIGEN_ALIGN_MAX Scalar data1[PacketSize]; - RealScalar refvalue = 0; - for (int i=0; i()/RealScalar(PacketSize); - } - - int stride = internal::random(1,20); - - EIGEN_ALIGN_MAX Scalar buffer[PacketSize*20]; - memset(buffer, 0, 20*PacketSize*sizeof(Scalar)); - Packet packet = internal::pload(data1); - internal::pscatter(buffer, packet, stride); - - for (int i = 0; i < PacketSize*20; ++i) { - if ((i%stride) == 0 && i()/RealScalar(PacketSize); - } - packet = internal::pgather(buffer, 7); - internal::pstore(data1, packet); - for (int i = 0; i < PacketSize; ++i) { - VERIFY(isApproxAbs(data1[i], buffer[i*7], refvalue) && "pgather"); - } -} - -void test_packetmath() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( packetmath() ); - CALL_SUBTEST_2( packetmath() ); - CALL_SUBTEST_3( packetmath() ); - CALL_SUBTEST_4( packetmath >() ); - CALL_SUBTEST_5( packetmath >() ); - - CALL_SUBTEST_1( packetmath_notcomplex() ); - CALL_SUBTEST_2( packetmath_notcomplex() ); - CALL_SUBTEST_3( packetmath_notcomplex() ); - - CALL_SUBTEST_1( packetmath_real() ); - CALL_SUBTEST_2( packetmath_real() ); - - CALL_SUBTEST_4( packetmath_complex >() ); - CALL_SUBTEST_5( packetmath_complex >() ); - - CALL_SUBTEST_1( packetmath_scatter_gather() ); - CALL_SUBTEST_2( packetmath_scatter_gather() ); - CALL_SUBTEST_3( packetmath_scatter_gather() ); - CALL_SUBTEST_4( packetmath_scatter_gather >() ); - CALL_SUBTEST_5( packetmath_scatter_gather >() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/pardiso_support.cpp b/testbed/nanogui/ext/eigen/test/pardiso_support.cpp deleted file mode 100644 index 67efad6d..00000000 --- a/testbed/nanogui/ext/eigen/test/pardiso_support.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - Intel Copyright (C) .... -*/ - -#include "sparse_solver.h" -#include - -template void test_pardiso_T() -{ - PardisoLLT < SparseMatrix, Lower> pardiso_llt_lower; - PardisoLLT < SparseMatrix, Upper> pardiso_llt_upper; - PardisoLDLT < SparseMatrix, Lower> pardiso_ldlt_lower; - PardisoLDLT < SparseMatrix, Upper> pardiso_ldlt_upper; - PardisoLU < SparseMatrix > pardiso_lu; - - check_sparse_spd_solving(pardiso_llt_lower); - check_sparse_spd_solving(pardiso_llt_upper); - check_sparse_spd_solving(pardiso_ldlt_lower); - check_sparse_spd_solving(pardiso_ldlt_upper); - check_sparse_square_solving(pardiso_lu); -} - -void test_pardiso_support() -{ - CALL_SUBTEST_1(test_pardiso_T()); - CALL_SUBTEST_2(test_pardiso_T()); - CALL_SUBTEST_3(test_pardiso_T< std::complex >()); - CALL_SUBTEST_4(test_pardiso_T< std::complex >()); -} diff --git a/testbed/nanogui/ext/eigen/test/pastix_support.cpp b/testbed/nanogui/ext/eigen/test/pastix_support.cpp deleted file mode 100644 index b62f8573..00000000 --- a/testbed/nanogui/ext/eigen/test/pastix_support.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2012 Gael Guennebaud -// Copyright (C) 2012 Désiré Nuentsa-Wakam -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_DEBUG_SMALL_PRODUCT_BLOCKS -#include "sparse_solver.h" -#include -#include - - -template void test_pastix_T() -{ - PastixLLT< SparseMatrix, Eigen::Lower > pastix_llt_lower; - PastixLDLT< SparseMatrix, Eigen::Lower > pastix_ldlt_lower; - PastixLLT< SparseMatrix, Eigen::Upper > pastix_llt_upper; - PastixLDLT< SparseMatrix, Eigen::Upper > pastix_ldlt_upper; - PastixLU< SparseMatrix > pastix_lu; - - check_sparse_spd_solving(pastix_llt_lower); - check_sparse_spd_solving(pastix_ldlt_lower); - check_sparse_spd_solving(pastix_llt_upper); - check_sparse_spd_solving(pastix_ldlt_upper); - check_sparse_square_solving(pastix_lu); - - // Some compilation check: - pastix_llt_lower.iparm(); - pastix_llt_lower.dparm(); - pastix_ldlt_lower.iparm(); - pastix_ldlt_lower.dparm(); - pastix_lu.iparm(); - pastix_lu.dparm(); -} - -// There is no support for selfadjoint matrices with PaStiX. -// Complex symmetric matrices should pass though -template void test_pastix_T_LU() -{ - PastixLU< SparseMatrix > pastix_lu; - check_sparse_square_solving(pastix_lu); -} - -void test_pastix_support() -{ - CALL_SUBTEST_1(test_pastix_T()); - CALL_SUBTEST_2(test_pastix_T()); - CALL_SUBTEST_3( (test_pastix_T_LU >()) ); - CALL_SUBTEST_4(test_pastix_T_LU >()); -} diff --git a/testbed/nanogui/ext/eigen/test/permutationmatrices.cpp b/testbed/nanogui/ext/eigen/test/permutationmatrices.cpp deleted file mode 100644 index db126657..00000000 --- a/testbed/nanogui/ext/eigen/test/permutationmatrices.cpp +++ /dev/null @@ -1,156 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define TEST_ENABLE_TEMPORARY_TRACKING - -#include "main.h" - -using namespace std; -template void permutationmatrices(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime, - Options = MatrixType::Options }; - typedef PermutationMatrix LeftPermutationType; - typedef Matrix LeftPermutationVectorType; - typedef Map MapLeftPerm; - typedef PermutationMatrix RightPermutationType; - typedef Matrix RightPermutationVectorType; - typedef Map MapRightPerm; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m_original = MatrixType::Random(rows,cols); - LeftPermutationVectorType lv; - randomPermutationVector(lv, rows); - LeftPermutationType lp(lv); - RightPermutationVectorType rv; - randomPermutationVector(rv, cols); - RightPermutationType rp(rv); - MatrixType m_permuted = MatrixType::Random(rows,cols); - - VERIFY_EVALUATION_COUNT(m_permuted = lp * m_original * rp, 1); // 1 temp for sub expression "lp * m_original" - - for (int i=0; i lm(lp); - Matrix rm(rp); - - VERIFY_IS_APPROX(m_permuted, lm*m_original*rm); - - m_permuted = m_original; - VERIFY_EVALUATION_COUNT(m_permuted = lp * m_permuted * rp, 1); - VERIFY_IS_APPROX(m_permuted, lm*m_original*rm); - - VERIFY_IS_APPROX(lp.inverse()*m_permuted*rp.inverse(), m_original); - VERIFY_IS_APPROX(lv.asPermutation().inverse()*m_permuted*rv.asPermutation().inverse(), m_original); - VERIFY_IS_APPROX(MapLeftPerm(lv.data(),lv.size()).inverse()*m_permuted*MapRightPerm(rv.data(),rv.size()).inverse(), m_original); - - VERIFY((lp*lp.inverse()).toDenseMatrix().isIdentity()); - VERIFY((lv.asPermutation()*lv.asPermutation().inverse()).toDenseMatrix().isIdentity()); - VERIFY((MapLeftPerm(lv.data(),lv.size())*MapLeftPerm(lv.data(),lv.size()).inverse()).toDenseMatrix().isIdentity()); - - LeftPermutationVectorType lv2; - randomPermutationVector(lv2, rows); - LeftPermutationType lp2(lv2); - Matrix lm2(lp2); - VERIFY_IS_APPROX((lp*lp2).toDenseMatrix().template cast(), lm*lm2); - VERIFY_IS_APPROX((lv.asPermutation()*lv2.asPermutation()).toDenseMatrix().template cast(), lm*lm2); - VERIFY_IS_APPROX((MapLeftPerm(lv.data(),lv.size())*MapLeftPerm(lv2.data(),lv2.size())).toDenseMatrix().template cast(), lm*lm2); - - LeftPermutationType identityp; - identityp.setIdentity(rows); - VERIFY_IS_APPROX(m_original, identityp*m_original); - - // check inplace permutations - m_permuted = m_original; - VERIFY_EVALUATION_COUNT(m_permuted.noalias()= lp.inverse() * m_permuted, 1); // 1 temp to allocate the mask - VERIFY_IS_APPROX(m_permuted, lp.inverse()*m_original); - - m_permuted = m_original; - VERIFY_EVALUATION_COUNT(m_permuted.noalias() = m_permuted * rp.inverse(), 1); // 1 temp to allocate the mask - VERIFY_IS_APPROX(m_permuted, m_original*rp.inverse()); - - m_permuted = m_original; - VERIFY_EVALUATION_COUNT(m_permuted.noalias() = lp * m_permuted, 1); // 1 temp to allocate the mask - VERIFY_IS_APPROX(m_permuted, lp*m_original); - - m_permuted = m_original; - VERIFY_EVALUATION_COUNT(m_permuted.noalias() = m_permuted * rp, 1); // 1 temp to allocate the mask - VERIFY_IS_APPROX(m_permuted, m_original*rp); - - if(rows>1 && cols>1) - { - lp2 = lp; - Index i = internal::random(0, rows-1); - Index j; - do j = internal::random(0, rows-1); while(j==i); - lp2.applyTranspositionOnTheLeft(i, j); - lm = lp; - lm.row(i).swap(lm.row(j)); - VERIFY_IS_APPROX(lm, lp2.toDenseMatrix().template cast()); - - RightPermutationType rp2 = rp; - i = internal::random(0, cols-1); - do j = internal::random(0, cols-1); while(j==i); - rp2.applyTranspositionOnTheRight(i, j); - rm = rp; - rm.col(i).swap(rm.col(j)); - VERIFY_IS_APPROX(rm, rp2.toDenseMatrix().template cast()); - } - - { - // simple compilation check - Matrix A = rp; - Matrix B = rp.transpose(); - VERIFY_IS_APPROX(A, B.transpose()); - } -} - -template -void bug890() -{ - typedef Matrix MatrixType; - typedef Matrix VectorType; - typedef Stride S; - typedef Map MapType; - typedef PermutationMatrix Perm; - - VectorType v1(2), v2(2), op(4), rhs(2); - v1 << 666,667; - op << 1,0,0,1; - rhs << 42,42; - - Perm P(2); - P.indices() << 1, 0; - - MapType(v1.data(),2,1,S(1,1)) = P * MapType(rhs.data(),2,1,S(1,1)); - VERIFY_IS_APPROX(v1, (P * rhs).eval()); - - MapType(v1.data(),2,1,S(1,1)) = P.inverse() * MapType(rhs.data(),2,1,S(1,1)); - VERIFY_IS_APPROX(v1, (P.inverse() * rhs).eval()); -} - -void test_permutationmatrices() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( permutationmatrices(Matrix()) ); - CALL_SUBTEST_2( permutationmatrices(Matrix3f()) ); - CALL_SUBTEST_3( permutationmatrices(Matrix()) ); - CALL_SUBTEST_4( permutationmatrices(Matrix4d()) ); - CALL_SUBTEST_5( permutationmatrices(Matrix()) ); - CALL_SUBTEST_6( permutationmatrices(Matrix(20, 30)) ); - CALL_SUBTEST_7( permutationmatrices(MatrixXcf(15, 10)) ); - } - CALL_SUBTEST_5( bug890() ); -} diff --git a/testbed/nanogui/ext/eigen/test/prec_inverse_4x4.cpp b/testbed/nanogui/ext/eigen/test/prec_inverse_4x4.cpp deleted file mode 100644 index eb6ad18c..00000000 --- a/testbed/nanogui/ext/eigen/test/prec_inverse_4x4.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template void inverse_permutation_4x4() -{ - typedef typename MatrixType::Scalar Scalar; - Vector4i indices(0,1,2,3); - for(int i = 0; i < 24; ++i) - { - MatrixType m = PermutationMatrix<4>(indices); - MatrixType inv = m.inverse(); - double error = double( (m*inv-MatrixType::Identity()).norm() / NumTraits::epsilon() ); - EIGEN_DEBUG_VAR(error) - VERIFY(error == 0.0); - std::next_permutation(indices.data(),indices.data()+4); - } -} - -template void inverse_general_4x4(int repeat) -{ - using std::abs; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - double error_sum = 0., error_max = 0.; - for(int i = 0; i < repeat; ++i) - { - MatrixType m; - RealScalar absdet; - do { - m = MatrixType::Random(); - absdet = abs(m.determinant()); - } while(absdet < NumTraits::epsilon()); - MatrixType inv = m.inverse(); - double error = double( (m*inv-MatrixType::Identity()).norm() * absdet / NumTraits::epsilon() ); - error_sum += error; - error_max = (std::max)(error_max, error); - } - std::cerr << "inverse_general_4x4, Scalar = " << type_name() << std::endl; - double error_avg = error_sum / repeat; - EIGEN_DEBUG_VAR(error_avg); - EIGEN_DEBUG_VAR(error_max); - // FIXME that 1.25 used to be a 1.0 until the NumTraits changes on 28 April 2010, what's going wrong?? - // FIXME that 1.25 used to be 1.2 until we tested gcc 4.1 on 30 June 2010 and got 1.21. - VERIFY(error_avg < (NumTraits::IsComplex ? 8.0 : 1.25)); - VERIFY(error_max < (NumTraits::IsComplex ? 64.0 : 20.0)); - - { - int s = 5;//internal::random(4,10); - int i = 0;//internal::random(0,s-4); - int j = 0;//internal::random(0,s-4); - Matrix mat(s,s); - mat.setRandom(); - MatrixType submat = mat.template block<4,4>(i,j); - MatrixType mat_inv = mat.template block<4,4>(i,j).inverse(); - VERIFY_IS_APPROX(mat_inv, submat.inverse()); - mat.template block<4,4>(i,j) = submat.inverse(); - VERIFY_IS_APPROX(mat_inv, (mat.template block<4,4>(i,j))); - } -} - -void test_prec_inverse_4x4() -{ - CALL_SUBTEST_1((inverse_permutation_4x4())); - CALL_SUBTEST_1(( inverse_general_4x4(200000 * g_repeat) )); - CALL_SUBTEST_1(( inverse_general_4x4 >(200000 * g_repeat) )); - - CALL_SUBTEST_2((inverse_permutation_4x4 >())); - CALL_SUBTEST_2(( inverse_general_4x4 >(200000 * g_repeat) )); - CALL_SUBTEST_2(( inverse_general_4x4 >(200000 * g_repeat) )); - - CALL_SUBTEST_3((inverse_permutation_4x4())); - CALL_SUBTEST_3((inverse_general_4x4(50000 * g_repeat))); -} diff --git a/testbed/nanogui/ext/eigen/test/product.h b/testbed/nanogui/ext/eigen/test/product.h deleted file mode 100644 index 3b651127..00000000 --- a/testbed/nanogui/ext/eigen/test/product.h +++ /dev/null @@ -1,231 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template -bool areNotApprox(const MatrixBase& m1, const MatrixBase& m2, typename Derived1::RealScalar epsilon = NumTraits::dummy_precision()) -{ - return !((m1-m2).cwiseAbs2().maxCoeff() < epsilon * epsilon - * (std::max)(m1.cwiseAbs2().maxCoeff(), m2.cwiseAbs2().maxCoeff())); -} - -template void product(const MatrixType& m) -{ - /* this test covers the following files: - Identity.h Product.h - */ - typedef typename MatrixType::Scalar Scalar; - typedef Matrix RowVectorType; - typedef Matrix ColVectorType; - typedef Matrix RowSquareMatrixType; - typedef Matrix ColSquareMatrixType; - typedef Matrix OtherMajorMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - // this test relies a lot on Random.h, and there's not much more that we can do - // to test it, hence I consider that we will have tested Random.h - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols); - RowSquareMatrixType - identity = RowSquareMatrixType::Identity(rows, rows), - square = RowSquareMatrixType::Random(rows, rows), - res = RowSquareMatrixType::Random(rows, rows); - ColSquareMatrixType - square2 = ColSquareMatrixType::Random(cols, cols), - res2 = ColSquareMatrixType::Random(cols, cols); - RowVectorType v1 = RowVectorType::Random(rows); - ColVectorType vc2 = ColVectorType::Random(cols), vcres(cols); - OtherMajorMatrixType tm1 = m1; - - Scalar s1 = internal::random(); - - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1), - c2 = internal::random(0, cols-1); - - // begin testing Product.h: only associativity for now - // (we use Transpose.h but this doesn't count as a test for it) - VERIFY_IS_APPROX((m1*m1.transpose())*m2, m1*(m1.transpose()*m2)); - m3 = m1; - m3 *= m1.transpose() * m2; - VERIFY_IS_APPROX(m3, m1 * (m1.transpose()*m2)); - VERIFY_IS_APPROX(m3, m1 * (m1.transpose()*m2)); - - // continue testing Product.h: distributivity - VERIFY_IS_APPROX(square*(m1 + m2), square*m1+square*m2); - VERIFY_IS_APPROX(square*(m1 - m2), square*m1-square*m2); - - // continue testing Product.h: compatibility with ScalarMultiple.h - VERIFY_IS_APPROX(s1*(square*m1), (s1*square)*m1); - VERIFY_IS_APPROX(s1*(square*m1), square*(m1*s1)); - - // test Product.h together with Identity.h - VERIFY_IS_APPROX(v1, identity*v1); - VERIFY_IS_APPROX(v1.transpose(), v1.transpose() * identity); - // again, test operator() to check const-qualification - VERIFY_IS_APPROX(MatrixType::Identity(rows, cols)(r,c), static_cast(r==c)); - - if (rows!=cols) - VERIFY_RAISES_ASSERT(m3 = m1*m1); - - // test the previous tests were not screwed up because operator* returns 0 - // (we use the more accurate default epsilon) - if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) - { - VERIFY(areNotApprox(m1.transpose()*m2,m2.transpose()*m1)); - } - - // test optimized operator+= path - res = square; - res.noalias() += m1 * m2.transpose(); - VERIFY_IS_APPROX(res, square + m1 * m2.transpose()); - if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) - { - VERIFY(areNotApprox(res,square + m2 * m1.transpose())); - } - vcres = vc2; - vcres.noalias() += m1.transpose() * v1; - VERIFY_IS_APPROX(vcres, vc2 + m1.transpose() * v1); - - // test optimized operator-= path - res = square; - res.noalias() -= m1 * m2.transpose(); - VERIFY_IS_APPROX(res, square - (m1 * m2.transpose())); - if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) - { - VERIFY(areNotApprox(res,square - m2 * m1.transpose())); - } - vcres = vc2; - vcres.noalias() -= m1.transpose() * v1; - VERIFY_IS_APPROX(vcres, vc2 - m1.transpose() * v1); - - // test d ?= a+b*c rules - res.noalias() = square + m1 * m2.transpose(); - VERIFY_IS_APPROX(res, square + m1 * m2.transpose()); - res.noalias() += square + m1 * m2.transpose(); - VERIFY_IS_APPROX(res, 2*(square + m1 * m2.transpose())); - res.noalias() -= square + m1 * m2.transpose(); - VERIFY_IS_APPROX(res, square + m1 * m2.transpose()); - - // test d ?= a-b*c rules - res.noalias() = square - m1 * m2.transpose(); - VERIFY_IS_APPROX(res, square - m1 * m2.transpose()); - res.noalias() += square - m1 * m2.transpose(); - VERIFY_IS_APPROX(res, 2*(square - m1 * m2.transpose())); - res.noalias() -= square - m1 * m2.transpose(); - VERIFY_IS_APPROX(res, square - m1 * m2.transpose()); - - - tm1 = m1; - VERIFY_IS_APPROX(tm1.transpose() * v1, m1.transpose() * v1); - VERIFY_IS_APPROX(v1.transpose() * tm1, v1.transpose() * m1); - - // test submatrix and matrix/vector product - for (int i=0; i::IsInteger && (std::min)(rows,cols)>1) - { - VERIFY(areNotApprox(res2,square2 + m2.transpose() * m1)); - } - - VERIFY_IS_APPROX(res.col(r).noalias() = square.adjoint() * square.col(r), (square.adjoint() * square.col(r)).eval()); - VERIFY_IS_APPROX(res.col(r).noalias() = square * square.col(r), (square * square.col(r)).eval()); - - // vector at runtime (see bug 1166) - { - RowSquareMatrixType ref(square); - ColSquareMatrixType ref2(square2); - ref = res = square; - VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.col(0).transpose() * square.transpose(), (ref.row(0) = m1.col(0).transpose() * square.transpose())); - VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.block(0,0,rows,1).transpose() * square.transpose(), (ref.row(0) = m1.col(0).transpose() * square.transpose())); - VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.col(0).transpose() * square, (ref.row(0) = m1.col(0).transpose() * square)); - VERIFY_IS_APPROX(res.block(0,0,1,rows).noalias() = m1.block(0,0,rows,1).transpose() * square, (ref.row(0) = m1.col(0).transpose() * square)); - ref2 = res2 = square2; - VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.row(0) * square2.transpose(), (ref2.row(0) = m1.row(0) * square2.transpose())); - VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.block(0,0,1,cols) * square2.transpose(), (ref2.row(0) = m1.row(0) * square2.transpose())); - VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.row(0) * square2, (ref2.row(0) = m1.row(0) * square2)); - VERIFY_IS_APPROX(res2.block(0,0,1,cols).noalias() = m1.block(0,0,1,cols) * square2, (ref2.row(0) = m1.row(0) * square2)); - } - - // vector.block() (see bug 1283) - { - RowVectorType w1(rows); - VERIFY_IS_APPROX(square * v1.block(0,0,rows,1), square * v1); - VERIFY_IS_APPROX(w1.noalias() = square * v1.block(0,0,rows,1), square * v1); - VERIFY_IS_APPROX(w1.block(0,0,rows,1).noalias() = square * v1.block(0,0,rows,1), square * v1); - - Matrix w2(cols); - VERIFY_IS_APPROX(vc2.block(0,0,cols,1).transpose() * square2, vc2.transpose() * square2); - VERIFY_IS_APPROX(w2.noalias() = vc2.block(0,0,cols,1).transpose() * square2, vc2.transpose() * square2); - VERIFY_IS_APPROX(w2.block(0,0,1,cols).noalias() = vc2.block(0,0,cols,1).transpose() * square2, vc2.transpose() * square2); - - vc2 = square2.block(0,0,1,cols).transpose(); - VERIFY_IS_APPROX(square2.block(0,0,1,cols) * square2, vc2.transpose() * square2); - VERIFY_IS_APPROX(w2.noalias() = square2.block(0,0,1,cols) * square2, vc2.transpose() * square2); - VERIFY_IS_APPROX(w2.block(0,0,1,cols).noalias() = square2.block(0,0,1,cols) * square2, vc2.transpose() * square2); - - vc2 = square2.block(0,0,cols,1); - VERIFY_IS_APPROX(square2.block(0,0,cols,1).transpose() * square2, vc2.transpose() * square2); - VERIFY_IS_APPROX(w2.noalias() = square2.block(0,0,cols,1).transpose() * square2, vc2.transpose() * square2); - VERIFY_IS_APPROX(w2.block(0,0,1,cols).noalias() = square2.block(0,0,cols,1).transpose() * square2, vc2.transpose() * square2); - } - - // inner product - { - Scalar x = square2.row(c) * square2.col(c2); - VERIFY_IS_APPROX(x, square2.row(c).transpose().cwiseProduct(square2.col(c2)).sum()); - } - - // outer product - { - VERIFY_IS_APPROX(m1.col(c) * m1.row(r), m1.block(0,c,rows,1) * m1.block(r,0,1,cols)); - VERIFY_IS_APPROX(m1.row(r).transpose() * m1.col(c).transpose(), m1.block(r,0,1,cols).transpose() * m1.block(0,c,rows,1).transpose()); - VERIFY_IS_APPROX(m1.block(0,c,rows,1) * m1.row(r), m1.block(0,c,rows,1) * m1.block(r,0,1,cols)); - VERIFY_IS_APPROX(m1.col(c) * m1.block(r,0,1,cols), m1.block(0,c,rows,1) * m1.block(r,0,1,cols)); - VERIFY_IS_APPROX(m1.leftCols(1) * m1.row(r), m1.block(0,0,rows,1) * m1.block(r,0,1,cols)); - VERIFY_IS_APPROX(m1.col(c) * m1.topRows(1), m1.block(0,c,rows,1) * m1.block(0,0,1,cols)); - } - - // Aliasing - { - ColVectorType x(cols); x.setRandom(); - ColVectorType z(x); - ColVectorType y(cols); y.setZero(); - ColSquareMatrixType A(cols,cols); A.setRandom(); - // CwiseBinaryOp - VERIFY_IS_APPROX(x = y + A*x, A*z); - x = z; - // CwiseUnaryOp - VERIFY_IS_APPROX(x = Scalar(1.)*(A*x), A*z); - } - - // regression for blas_trais - { - VERIFY_IS_APPROX(square * (square*square).transpose(), square * square.transpose() * square.transpose()); - VERIFY_IS_APPROX(square * (-(square*square)), -square * square * square); - VERIFY_IS_APPROX(square * (s1*(square*square)), s1 * square * square * square); - VERIFY_IS_APPROX(square * (square*square).conjugate(), square * square.conjugate() * square.conjugate()); - } - -} diff --git a/testbed/nanogui/ext/eigen/test/product_extra.cpp b/testbed/nanogui/ext/eigen/test/product_extra.cpp deleted file mode 100644 index e2b855bf..00000000 --- a/testbed/nanogui/ext/eigen/test/product_extra.cpp +++ /dev/null @@ -1,375 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void product_extra(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix RowVectorType; - typedef Matrix ColVectorType; - typedef Matrix OtherMajorMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - mzero = MatrixType::Zero(rows, cols), - identity = MatrixType::Identity(rows, rows), - square = MatrixType::Random(rows, rows), - res = MatrixType::Random(rows, rows), - square2 = MatrixType::Random(cols, cols), - res2 = MatrixType::Random(cols, cols); - RowVectorType v1 = RowVectorType::Random(rows), vrres(rows); - ColVectorType vc2 = ColVectorType::Random(cols), vcres(cols); - OtherMajorMatrixType tm1 = m1; - - Scalar s1 = internal::random(), - s2 = internal::random(), - s3 = internal::random(); - - VERIFY_IS_APPROX(m3.noalias() = m1 * m2.adjoint(), m1 * m2.adjoint().eval()); - VERIFY_IS_APPROX(m3.noalias() = m1.adjoint() * square.adjoint(), m1.adjoint().eval() * square.adjoint().eval()); - VERIFY_IS_APPROX(m3.noalias() = m1.adjoint() * m2, m1.adjoint().eval() * m2); - VERIFY_IS_APPROX(m3.noalias() = (s1 * m1.adjoint()) * m2, (s1 * m1.adjoint()).eval() * m2); - VERIFY_IS_APPROX(m3.noalias() = ((s1 * m1).adjoint()) * m2, (numext::conj(s1) * m1.adjoint()).eval() * m2); - VERIFY_IS_APPROX(m3.noalias() = (- m1.adjoint() * s1) * (s3 * m2), (- m1.adjoint() * s1).eval() * (s3 * m2).eval()); - VERIFY_IS_APPROX(m3.noalias() = (s2 * m1.adjoint() * s1) * m2, (s2 * m1.adjoint() * s1).eval() * m2); - VERIFY_IS_APPROX(m3.noalias() = (-m1*s2) * s1*m2.adjoint(), (-m1*s2).eval() * (s1*m2.adjoint()).eval()); - - // a very tricky case where a scale factor has to be automatically conjugated: - VERIFY_IS_APPROX( m1.adjoint() * (s1*m2).conjugate(), (m1.adjoint()).eval() * ((s1*m2).conjugate()).eval()); - - - // test all possible conjugate combinations for the four matrix-vector product cases: - - VERIFY_IS_APPROX((-m1.conjugate() * s2) * (s1 * vc2), - (-m1.conjugate()*s2).eval() * (s1 * vc2).eval()); - VERIFY_IS_APPROX((-m1 * s2) * (s1 * vc2.conjugate()), - (-m1*s2).eval() * (s1 * vc2.conjugate()).eval()); - VERIFY_IS_APPROX((-m1.conjugate() * s2) * (s1 * vc2.conjugate()), - (-m1.conjugate()*s2).eval() * (s1 * vc2.conjugate()).eval()); - - VERIFY_IS_APPROX((s1 * vc2.transpose()) * (-m1.adjoint() * s2), - (s1 * vc2.transpose()).eval() * (-m1.adjoint()*s2).eval()); - VERIFY_IS_APPROX((s1 * vc2.adjoint()) * (-m1.transpose() * s2), - (s1 * vc2.adjoint()).eval() * (-m1.transpose()*s2).eval()); - VERIFY_IS_APPROX((s1 * vc2.adjoint()) * (-m1.adjoint() * s2), - (s1 * vc2.adjoint()).eval() * (-m1.adjoint()*s2).eval()); - - VERIFY_IS_APPROX((-m1.adjoint() * s2) * (s1 * v1.transpose()), - (-m1.adjoint()*s2).eval() * (s1 * v1.transpose()).eval()); - VERIFY_IS_APPROX((-m1.transpose() * s2) * (s1 * v1.adjoint()), - (-m1.transpose()*s2).eval() * (s1 * v1.adjoint()).eval()); - VERIFY_IS_APPROX((-m1.adjoint() * s2) * (s1 * v1.adjoint()), - (-m1.adjoint()*s2).eval() * (s1 * v1.adjoint()).eval()); - - VERIFY_IS_APPROX((s1 * v1) * (-m1.conjugate() * s2), - (s1 * v1).eval() * (-m1.conjugate()*s2).eval()); - VERIFY_IS_APPROX((s1 * v1.conjugate()) * (-m1 * s2), - (s1 * v1.conjugate()).eval() * (-m1*s2).eval()); - VERIFY_IS_APPROX((s1 * v1.conjugate()) * (-m1.conjugate() * s2), - (s1 * v1.conjugate()).eval() * (-m1.conjugate()*s2).eval()); - - VERIFY_IS_APPROX((-m1.adjoint() * s2) * (s1 * v1.adjoint()), - (-m1.adjoint()*s2).eval() * (s1 * v1.adjoint()).eval()); - - // test the vector-matrix product with non aligned starts - Index i = internal::random(0,m1.rows()-2); - Index j = internal::random(0,m1.cols()-2); - Index r = internal::random(1,m1.rows()-i); - Index c = internal::random(1,m1.cols()-j); - Index i2 = internal::random(0,m1.rows()-1); - Index j2 = internal::random(0,m1.cols()-1); - - VERIFY_IS_APPROX(m1.col(j2).adjoint() * m1.block(0,j,m1.rows(),c), m1.col(j2).adjoint().eval() * m1.block(0,j,m1.rows(),c).eval()); - VERIFY_IS_APPROX(m1.block(i,0,r,m1.cols()) * m1.row(i2).adjoint(), m1.block(i,0,r,m1.cols()).eval() * m1.row(i2).adjoint().eval()); - - // regression test - MatrixType tmp = m1 * m1.adjoint() * s1; - VERIFY_IS_APPROX(tmp, m1 * m1.adjoint() * s1); - - // regression test for bug 1343, assignment to arrays - Array a1 = m1 * vc2; - VERIFY_IS_APPROX(a1.matrix(),m1*vc2); - Array a2 = s1 * (m1 * vc2); - VERIFY_IS_APPROX(a2.matrix(),s1*m1*vc2); - Array a3 = v1 * m1; - VERIFY_IS_APPROX(a3.matrix(),v1*m1); - Array a4 = m1 * m2.adjoint(); - VERIFY_IS_APPROX(a4.matrix(),m1*m2.adjoint()); -} - -// Regression test for bug reported at http://forum.kde.org/viewtopic.php?f=74&t=96947 -void mat_mat_scalar_scalar_product() -{ - Eigen::Matrix2Xd dNdxy(2, 3); - dNdxy << -0.5, 0.5, 0, - -0.3, 0, 0.3; - double det = 6.0, wt = 0.5; - VERIFY_IS_APPROX(dNdxy.transpose()*dNdxy*det*wt, det*wt*dNdxy.transpose()*dNdxy); -} - -template -void zero_sized_objects(const MatrixType& m) -{ - typedef typename MatrixType::Scalar Scalar; - const int PacketSize = internal::packet_traits::size; - const int PacketSize1 = PacketSize>1 ? PacketSize-1 : 1; - Index rows = m.rows(); - Index cols = m.cols(); - - { - MatrixType res, a(rows,0), b(0,cols); - VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(rows,cols) ); - VERIFY_IS_APPROX( (res=a*a.transpose()), MatrixType::Zero(rows,rows) ); - VERIFY_IS_APPROX( (res=b.transpose()*b), MatrixType::Zero(cols,cols) ); - VERIFY_IS_APPROX( (res=b.transpose()*a.transpose()), MatrixType::Zero(cols,rows) ); - } - - { - MatrixType res, a(rows,cols), b(cols,0); - res = a*b; - VERIFY(res.rows()==rows && res.cols()==0); - b.resize(0,rows); - res = b*a; - VERIFY(res.rows()==0 && res.cols()==cols); - } - - { - Matrix a; - Matrix b; - Matrix res; - VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize,1) ); - VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize,1) ); - } - - { - Matrix a; - Matrix b; - Matrix res; - VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize1,1) ); - VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize1,1) ); - } - - { - Matrix a(PacketSize,0); - Matrix b(0,1); - Matrix res; - VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize,1) ); - VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize,1) ); - } - - { - Matrix a(PacketSize1,0); - Matrix b(0,1); - Matrix res; - VERIFY_IS_APPROX( (res=a*b), MatrixType::Zero(PacketSize1,1) ); - VERIFY_IS_APPROX( (res=a.lazyProduct(b)), MatrixType::Zero(PacketSize1,1) ); - } -} - -template -void bug_127() -{ - // Bug 127 - // - // a product of the form lhs*rhs with - // - // lhs: - // rows = 1, cols = 4 - // RowsAtCompileTime = 1, ColsAtCompileTime = -1 - // MaxRowsAtCompileTime = 1, MaxColsAtCompileTime = 5 - // - // rhs: - // rows = 4, cols = 0 - // RowsAtCompileTime = -1, ColsAtCompileTime = -1 - // MaxRowsAtCompileTime = 5, MaxColsAtCompileTime = 1 - // - // was failing on a runtime assertion, because it had been mis-compiled as a dot product because Product.h was using the - // max-sizes to detect size 1 indicating vectors, and that didn't account for 0-sized object with max-size 1. - - Matrix a(1,4); - Matrix b(4,0); - a*b; -} - -template void bug_817() -{ - ArrayXXf B = ArrayXXf::Random(10,10), C; - VectorXf x = VectorXf::Random(10); - C = (x.transpose()*B.matrix()); - B = (x.transpose()*B.matrix()); - VERIFY_IS_APPROX(B,C); -} - -template -void unaligned_objects() -{ - // Regression test for the bug reported here: - // http://forum.kde.org/viewtopic.php?f=74&t=107541 - // Recall the matrix*vector kernel avoid unaligned loads by loading two packets and then reassemble then. - // There was a mistake in the computation of the valid range for fully unaligned objects: in some rare cases, - // memory was read outside the allocated matrix memory. Though the values were not used, this might raise segfault. - for(int m=450;m<460;++m) - { - for(int n=8;n<12;++n) - { - MatrixXf M(m, n); - VectorXf v1(n), r1(500); - RowVectorXf v2(m), r2(16); - - M.setRandom(); - v1.setRandom(); - v2.setRandom(); - for(int o=0; o<4; ++o) - { - r1.segment(o,m).noalias() = M * v1; - VERIFY_IS_APPROX(r1.segment(o,m), M * MatrixXf(v1)); - r2.segment(o,n).noalias() = v2 * M; - VERIFY_IS_APPROX(r2.segment(o,n), MatrixXf(v2) * M); - } - } - } -} - -template -EIGEN_DONT_INLINE -Index test_compute_block_size(Index m, Index n, Index k) -{ - Index mc(m), nc(n), kc(k); - internal::computeProductBlockingSizes(kc, mc, nc); - return kc+mc+nc; -} - -template -Index compute_block_size() -{ - Index ret = 0; - ret += test_compute_block_size(0,1,1); - ret += test_compute_block_size(1,0,1); - ret += test_compute_block_size(1,1,0); - ret += test_compute_block_size(0,0,1); - ret += test_compute_block_size(0,1,0); - ret += test_compute_block_size(1,0,0); - ret += test_compute_block_size(0,0,0); - return ret; -} - -template -void aliasing_with_resize() -{ - Index m = internal::random(10,50); - Index n = internal::random(10,50); - MatrixXd A, B, C(m,n), D(m,m); - VectorXd a, b, c(n); - C.setRandom(); - D.setRandom(); - c.setRandom(); - double s = internal::random(1,10); - - A = C; - B = A * A.transpose(); - A = A * A.transpose(); - VERIFY_IS_APPROX(A,B); - - A = C; - B = (A * A.transpose())/s; - A = (A * A.transpose())/s; - VERIFY_IS_APPROX(A,B); - - A = C; - B = (A * A.transpose()) + D; - A = (A * A.transpose()) + D; - VERIFY_IS_APPROX(A,B); - - A = C; - B = D + (A * A.transpose()); - A = D + (A * A.transpose()); - VERIFY_IS_APPROX(A,B); - - A = C; - B = s * (A * A.transpose()); - A = s * (A * A.transpose()); - VERIFY_IS_APPROX(A,B); - - A = C; - a = c; - b = (A * a)/s; - a = (A * a)/s; - VERIFY_IS_APPROX(a,b); -} - -template -void bug_1308() -{ - int n = 10; - MatrixXd r(n,n); - VectorXd v = VectorXd::Random(n); - r = v * RowVectorXd::Ones(n); - VERIFY_IS_APPROX(r, v.rowwise().replicate(n)); - r = VectorXd::Ones(n) * v.transpose(); - VERIFY_IS_APPROX(r, v.rowwise().replicate(n).transpose()); - - Matrix4d ones44 = Matrix4d::Ones(); - Matrix4d m44 = Matrix4d::Ones() * Matrix4d::Ones(); - VERIFY_IS_APPROX(m44,Matrix4d::Constant(4)); - VERIFY_IS_APPROX(m44.noalias()=ones44*Matrix4d::Ones(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(m44.noalias()=ones44.transpose()*Matrix4d::Ones(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(m44.noalias()=Matrix4d::Ones()*ones44, Matrix4d::Constant(4)); - VERIFY_IS_APPROX(m44.noalias()=Matrix4d::Ones()*ones44.transpose(), Matrix4d::Constant(4)); - - typedef Matrix RMatrix4d; - RMatrix4d r44 = Matrix4d::Ones() * Matrix4d::Ones(); - VERIFY_IS_APPROX(r44,Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=ones44*Matrix4d::Ones(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=ones44.transpose()*Matrix4d::Ones(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=Matrix4d::Ones()*ones44, Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=Matrix4d::Ones()*ones44.transpose(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=ones44*RMatrix4d::Ones(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=ones44.transpose()*RMatrix4d::Ones(), Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=RMatrix4d::Ones()*ones44, Matrix4d::Constant(4)); - VERIFY_IS_APPROX(r44.noalias()=RMatrix4d::Ones()*ones44.transpose(), Matrix4d::Constant(4)); - -// RowVector4d r4; - m44.setOnes(); - r44.setZero(); - VERIFY_IS_APPROX(r44.noalias() += m44.row(0).transpose() * RowVector4d::Ones(), ones44); - r44.setZero(); - VERIFY_IS_APPROX(r44.noalias() += m44.col(0) * RowVector4d::Ones(), ones44); - r44.setZero(); - VERIFY_IS_APPROX(r44.noalias() += Vector4d::Ones() * m44.row(0), ones44); - r44.setZero(); - VERIFY_IS_APPROX(r44.noalias() += Vector4d::Ones() * m44.col(0).transpose(), ones44); -} - -void test_product_extra() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( product_extra(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_2( product_extra(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_2( mat_mat_scalar_scalar_product() ); - CALL_SUBTEST_3( product_extra(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_1( zero_sized_objects(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } - CALL_SUBTEST_5( bug_127<0>() ); - CALL_SUBTEST_5( bug_817<0>() ); - CALL_SUBTEST_5( bug_1308<0>() ); - CALL_SUBTEST_6( unaligned_objects<0>() ); - CALL_SUBTEST_7( compute_block_size() ); - CALL_SUBTEST_7( compute_block_size() ); - CALL_SUBTEST_7( compute_block_size >() ); - CALL_SUBTEST_8( aliasing_with_resize() ); - -} diff --git a/testbed/nanogui/ext/eigen/test/product_large.cpp b/testbed/nanogui/ext/eigen/test/product_large.cpp deleted file mode 100644 index 845cd40c..00000000 --- a/testbed/nanogui/ext/eigen/test/product_large.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "product.h" - -template -void test_aliasing() -{ - int rows = internal::random(1,12); - int cols = internal::random(1,12); - typedef Matrix MatrixType; - typedef Matrix VectorType; - VectorType x(cols); x.setRandom(); - VectorType z(x); - VectorType y(rows); y.setZero(); - MatrixType A(rows,cols); A.setRandom(); - // CwiseBinaryOp - VERIFY_IS_APPROX(x = y + A*x, A*z); // OK because "y + A*x" is marked as "assume-aliasing" - x = z; - // CwiseUnaryOp - VERIFY_IS_APPROX(x = T(1.)*(A*x), A*z); // OK because 1*(A*x) is replaced by (1*A*x) which is a Product<> expression - x = z; - // VERIFY_IS_APPROX(x = y-A*x, -A*z); // Not OK in 3.3 because x is resized before A*x gets evaluated - x = z; -} - -void test_product_large() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( product(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_2( product(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_3( product(MatrixXi(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_4( product(MatrixXcf(internal::random(1,EIGEN_TEST_MAX_SIZE/2), internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_5( product(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - - CALL_SUBTEST_1( test_aliasing() ); - } - -#if defined EIGEN_TEST_PART_6 - { - // test a specific issue in DiagonalProduct - int N = 1000000; - VectorXf v = VectorXf::Ones(N); - MatrixXf m = MatrixXf::Ones(N,3); - m = (v+v).asDiagonal() * m; - VERIFY_IS_APPROX(m, MatrixXf::Constant(N,3,2)); - } - - { - // test deferred resizing in Matrix::operator= - MatrixXf a = MatrixXf::Random(10,4), b = MatrixXf::Random(4,10), c = a; - VERIFY_IS_APPROX((a = a * b), (c * b).eval()); - } - - { - // check the functions to setup blocking sizes compile and do not segfault - // FIXME check they do what they are supposed to do !! - std::ptrdiff_t l1 = internal::random(10000,20000); - std::ptrdiff_t l2 = internal::random(100000,200000); - std::ptrdiff_t l3 = internal::random(1000000,2000000); - setCpuCacheSizes(l1,l2,l3); - VERIFY(l1==l1CacheSize()); - VERIFY(l2==l2CacheSize()); - std::ptrdiff_t k1 = internal::random(10,100)*16; - std::ptrdiff_t m1 = internal::random(10,100)*16; - std::ptrdiff_t n1 = internal::random(10,100)*16; - // only makes sure it compiles fine - internal::computeProductBlockingSizes(k1,m1,n1,1); - } - - { - // test regression in row-vector by matrix (bad Map type) - MatrixXf mat1(10,32); mat1.setRandom(); - MatrixXf mat2(32,32); mat2.setRandom(); - MatrixXf r1 = mat1.row(2)*mat2.transpose(); - VERIFY_IS_APPROX(r1, (mat1.row(2)*mat2.transpose()).eval()); - - MatrixXf r2 = mat1.row(2)*mat2; - VERIFY_IS_APPROX(r2, (mat1.row(2)*mat2).eval()); - } - - { - Eigen::MatrixXd A(10,10), B, C; - A.setRandom(); - C = A; - for(int k=0; k<79; ++k) - C = C * A; - B.noalias() = (((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)) * ((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))) - * (((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)) * ((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))); - VERIFY_IS_APPROX(B,C); - } -#endif - - // Regression test for bug 714: -#if defined EIGEN_HAS_OPENMP - omp_set_dynamic(1); - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_6( product(Matrix(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - } -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/product_mmtr.cpp b/testbed/nanogui/ext/eigen/test/product_mmtr.cpp deleted file mode 100644 index f6e4bb1a..00000000 --- a/testbed/nanogui/ext/eigen/test/product_mmtr.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#define CHECK_MMTR(DEST, TRI, OP) { \ - ref2 = ref1 = DEST; \ - DEST.template triangularView() OP; \ - ref1 OP; \ - ref2.template triangularView() \ - = ref1.template triangularView(); \ - VERIFY_IS_APPROX(DEST,ref2); \ - } - -template void mmtr(int size) -{ - typedef Matrix MatrixColMaj; - typedef Matrix MatrixRowMaj; - - DenseIndex othersize = internal::random(1,200); - - MatrixColMaj matc = MatrixColMaj::Zero(size, size); - MatrixRowMaj matr = MatrixRowMaj::Zero(size, size); - MatrixColMaj ref1(size, size), ref2(size, size); - - MatrixColMaj soc(size,othersize); soc.setRandom(); - MatrixColMaj osc(othersize,size); osc.setRandom(); - MatrixRowMaj sor(size,othersize); sor.setRandom(); - MatrixRowMaj osr(othersize,size); osr.setRandom(); - MatrixColMaj sqc(size,size); sqc.setRandom(); - MatrixRowMaj sqr(size,size); sqr.setRandom(); - - Scalar s = internal::random(); - - CHECK_MMTR(matc, Lower, = s*soc*sor.adjoint()); - CHECK_MMTR(matc, Upper, = s*(soc*soc.adjoint())); - CHECK_MMTR(matr, Lower, = s*soc*soc.adjoint()); - CHECK_MMTR(matr, Upper, = soc*(s*sor.adjoint())); - - CHECK_MMTR(matc, Lower, += s*soc*soc.adjoint()); - CHECK_MMTR(matc, Upper, += s*(soc*sor.transpose())); - CHECK_MMTR(matr, Lower, += s*sor*soc.adjoint()); - CHECK_MMTR(matr, Upper, += soc*(s*soc.adjoint())); - - CHECK_MMTR(matc, Lower, -= s*soc*soc.adjoint()); - CHECK_MMTR(matc, Upper, -= s*(osc.transpose()*osc.conjugate())); - CHECK_MMTR(matr, Lower, -= s*soc*soc.adjoint()); - CHECK_MMTR(matr, Upper, -= soc*(s*soc.adjoint())); - - CHECK_MMTR(matc, Lower, -= s*sqr*sqc.template triangularView()); - CHECK_MMTR(matc, Upper, = s*sqc*sqr.template triangularView()); - CHECK_MMTR(matc, Lower, += s*sqr*sqc.template triangularView()); - CHECK_MMTR(matc, Upper, = s*sqc*sqc.template triangularView()); - - CHECK_MMTR(matc, Lower, = (s*sqr).template triangularView()*sqc); - CHECK_MMTR(matc, Upper, -= (s*sqc).template triangularView()*sqc); - CHECK_MMTR(matc, Lower, = (s*sqr).template triangularView()*sqc); - CHECK_MMTR(matc, Upper, += (s*sqc).template triangularView()*sqc); - - // check aliasing - ref2 = ref1 = matc; - ref1 = sqc.adjoint() * matc * sqc; - ref2.template triangularView() = ref1.template triangularView(); - matc.template triangularView() = sqc.adjoint() * matc * sqc; - VERIFY_IS_APPROX(matc, ref2); - - ref2 = ref1 = matc; - ref1 = sqc * matc * sqc.adjoint(); - ref2.template triangularView() = ref1.template triangularView(); - matc.template triangularView() = sqc * matc * sqc.adjoint(); - VERIFY_IS_APPROX(matc, ref2); -} - -void test_product_mmtr() -{ - for(int i = 0; i < g_repeat ; i++) - { - CALL_SUBTEST_1((mmtr(internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_2((mmtr(internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_3((mmtr >(internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); - CALL_SUBTEST_4((mmtr >(internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_notemporary.cpp b/testbed/nanogui/ext/eigen/test/product_notemporary.cpp deleted file mode 100644 index 8bf71b4f..00000000 --- a/testbed/nanogui/ext/eigen/test/product_notemporary.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define TEST_ENABLE_TEMPORARY_TRACKING - -#include "main.h" - -template void product_notemporary(const MatrixType& m) -{ - /* This test checks the number of temporaries created - * during the evaluation of a complex expression */ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix RowVectorType; - typedef Matrix ColVectorType; - typedef Matrix ColMajorMatrixType; - typedef Matrix RowMajorMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - ColMajorMatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols); - RowVectorType rv1 = RowVectorType::Random(rows), rvres(rows); - ColVectorType cv1 = ColVectorType::Random(cols), cvres(cols); - RowMajorMatrixType rm3(rows, cols); - - Scalar s1 = internal::random(), - s2 = internal::random(), - s3 = internal::random(); - - Index c0 = internal::random(4,cols-8), - c1 = internal::random(8,cols-c0), - r0 = internal::random(4,cols-8), - r1 = internal::random(8,rows-r0); - - VERIFY_EVALUATION_COUNT( m3 = (m1 * m2.adjoint()), 1); - VERIFY_EVALUATION_COUNT( m3 = (m1 * m2.adjoint()).transpose(), 1); - VERIFY_EVALUATION_COUNT( m3.noalias() = m1 * m2.adjoint(), 0); - - VERIFY_EVALUATION_COUNT( m3 = s1 * (m1 * m2.transpose()), 1); -// VERIFY_EVALUATION_COUNT( m3 = m3 + s1 * (m1 * m2.transpose()), 1); - VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * (m1 * m2.transpose()), 0); - - VERIFY_EVALUATION_COUNT( m3 = m3 + (m1 * m2.adjoint()), 1); - - VERIFY_EVALUATION_COUNT( m3 = m3 + (m1 * m2.adjoint()).transpose(), 1); - VERIFY_EVALUATION_COUNT( m3.noalias() = m3 + m1 * m2.transpose(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() += m3 + m1 * m2.transpose(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() -= m3 + m1 * m2.transpose(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() = m3 - m1 * m2.transpose(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() += m3 - m1 * m2.transpose(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() -= m3 - m1 * m2.transpose(), 0); - - VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * m1 * s2 * m2.adjoint(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() = s1 * m1 * s2 * (m1*s3+m2*s2).adjoint(), 1); - VERIFY_EVALUATION_COUNT( m3.noalias() = (s1 * m1).adjoint() * s2 * m2, 0); - VERIFY_EVALUATION_COUNT( m3.noalias() += s1 * (-m1*s3).adjoint() * (s2 * m2 * s3), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() -= s1 * (m1.transpose() * m2), 0); - - VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() += -m1.block(r0,c0,r1,c1) * (s2*m2.block(r0,c0,r1,c1)).adjoint() ), 0); - VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() -= s1 * m1.block(r0,c0,r1,c1) * m2.block(c0,r0,c1,r1) ), 0); - - // NOTE this is because the Block expression is not handled yet by our expression analyser - VERIFY_EVALUATION_COUNT(( m3.block(r0,r0,r1,r1).noalias() = s1 * m1.block(r0,c0,r1,c1) * (s1*m2).block(c0,r0,c1,r1) ), 1); - - VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).template triangularView() * m2, 0); - VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView() * (m2+m2), 1); - VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template triangularView() * m2.adjoint(), 0); - - VERIFY_EVALUATION_COUNT( m3.template triangularView() = (m1 * m2.adjoint()), 0); - VERIFY_EVALUATION_COUNT( m3.template triangularView() -= (m1 * m2.adjoint()), 0); - - // NOTE this is because the blas_traits require innerstride==1 to avoid a temporary, but that doesn't seem to be actually needed for the triangular products - VERIFY_EVALUATION_COUNT( rm3.col(c0).noalias() = (s1 * m1.adjoint()).template triangularView() * (s2*m2.row(c0)).adjoint(), 1); - - VERIFY_EVALUATION_COUNT( m1.template triangularView().solveInPlace(m3), 0); - VERIFY_EVALUATION_COUNT( m1.adjoint().template triangularView().solveInPlace(m3.transpose()), 0); - - VERIFY_EVALUATION_COUNT( m3.noalias() -= (s1 * m1).adjoint().template selfadjointView() * (-m2*s3).adjoint(), 0); - VERIFY_EVALUATION_COUNT( m3.noalias() = s2 * m2.adjoint() * (s1 * m1.adjoint()).template selfadjointView(), 0); - VERIFY_EVALUATION_COUNT( rm3.noalias() = (s1 * m1.adjoint()).template selfadjointView() * m2.adjoint(), 0); - - // NOTE this is because the blas_traits require innerstride==1 to avoid a temporary, but that doesn't seem to be actually needed for the triangular products - VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() = (s1 * m1).adjoint().template selfadjointView() * (-m2.row(c0)*s3).adjoint(), 1); - VERIFY_EVALUATION_COUNT( m3.col(c0).noalias() -= (s1 * m1).adjoint().template selfadjointView() * (-m2.row(c0)*s3).adjoint(), 1); - - VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() += m1.block(r0,r0,r1,r1).template selfadjointView() * (s1*m2.block(r0,c0,r1,c1)), 0); - VERIFY_EVALUATION_COUNT( m3.block(r0,c0,r1,c1).noalias() = m1.block(r0,r0,r1,r1).template selfadjointView() * m2.block(r0,c0,r1,c1), 0); - - VERIFY_EVALUATION_COUNT( m3.template selfadjointView().rankUpdate(m2.adjoint()), 0); - - // Here we will get 1 temporary for each resize operation of the lhs operator; resize(r1,c1) would lead to zero temporaries - m3.resize(1,1); - VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template selfadjointView() * m2.block(r0,c0,r1,c1), 1); - m3.resize(1,1); - VERIFY_EVALUATION_COUNT( m3.noalias() = m1.block(r0,r0,r1,r1).template triangularView() * m2.block(r0,c0,r1,c1), 1); - - // Zero temporaries for lazy products ... - VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose().lazyProduct(m3)).diagonal().sum(), 0 ); - - // ... and even no temporary for even deeply (>=2) nested products - VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().sum(), 0 ); - VERIFY_EVALUATION_COUNT( Scalar tmp = 0; tmp += Scalar(RealScalar(1)) / (m3.transpose() * m3).diagonal().array().abs().sum(), 0 ); - - // Zero temporaries for ... CoeffBasedProductMode - VERIFY_EVALUATION_COUNT( m3.col(0).template head<5>() * m3.col(0).transpose() + m3.col(0).template head<5>() * m3.col(0).transpose(), 0 ); - - // Check matrix * vectors - VERIFY_EVALUATION_COUNT( cvres.noalias() = m1 * cv1, 0 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * cv1, 0 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * m2.col(0), 0 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * rv1.adjoint(), 0 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() -= m1 * m2.row(0).transpose(), 0 ); - - VERIFY_EVALUATION_COUNT( cvres.noalias() = (m1+m1) * cv1, 0 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() = (rm3+rm3) * cv1, 0 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() = (m1+m1) * (m1*cv1), 1 ); - VERIFY_EVALUATION_COUNT( cvres.noalias() = (rm3+rm3) * (m1*cv1), 1 ); - - // Check outer products - m3 = cv1 * rv1; - VERIFY_EVALUATION_COUNT( m3.noalias() = cv1 * rv1, 0 ); - VERIFY_EVALUATION_COUNT( m3.noalias() = (cv1+cv1) * (rv1+rv1), 1 ); - VERIFY_EVALUATION_COUNT( m3.noalias() = (m1*cv1) * (rv1), 1 ); - VERIFY_EVALUATION_COUNT( m3.noalias() += (m1*cv1) * (rv1), 1 ); - VERIFY_EVALUATION_COUNT( rm3.noalias() = (cv1) * (rv1 * m1), 1 ); - VERIFY_EVALUATION_COUNT( rm3.noalias() -= (cv1) * (rv1 * m1), 1 ); - VERIFY_EVALUATION_COUNT( rm3.noalias() = (m1*cv1) * (rv1 * m1), 2 ); - VERIFY_EVALUATION_COUNT( rm3.noalias() += (m1*cv1) * (rv1 * m1), 2 ); - - // Check nested products - VERIFY_EVALUATION_COUNT( cvres.noalias() = m1.adjoint() * m1 * cv1, 1 ); - VERIFY_EVALUATION_COUNT( rvres.noalias() = rv1 * (m1 * m2.adjoint()), 1 ); -} - -void test_product_notemporary() -{ - int s; - for(int i = 0; i < g_repeat; i++) { - s = internal::random(16,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_1( product_notemporary(MatrixXf(s, s)) ); - CALL_SUBTEST_2( product_notemporary(MatrixXd(s, s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(16,EIGEN_TEST_MAX_SIZE/2); - CALL_SUBTEST_3( product_notemporary(MatrixXcf(s,s)) ); - CALL_SUBTEST_4( product_notemporary(MatrixXcd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_selfadjoint.cpp b/testbed/nanogui/ext/eigen/test/product_selfadjoint.cpp deleted file mode 100644 index 3d768aa7..00000000 --- a/testbed/nanogui/ext/eigen/test/product_selfadjoint.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void product_selfadjoint(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix VectorType; - typedef Matrix RowVectorType; - - typedef Matrix RhsMatrixType; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3; - VectorType v1 = VectorType::Random(rows), - v2 = VectorType::Random(rows), - v3(rows); - RowVectorType r1 = RowVectorType::Random(rows), - r2 = RowVectorType::Random(rows); - RhsMatrixType m4 = RhsMatrixType::Random(rows,10); - - Scalar s1 = internal::random(), - s2 = internal::random(), - s3 = internal::random(); - - m1 = (m1.adjoint() + m1).eval(); - - // rank2 update - m2 = m1.template triangularView(); - m2.template selfadjointView().rankUpdate(v1,v2); - VERIFY_IS_APPROX(m2, (m1 + v1 * v2.adjoint()+ v2 * v1.adjoint()).template triangularView().toDenseMatrix()); - - m2 = m1.template triangularView(); - m2.template selfadjointView().rankUpdate(-v1,s2*v2,s3); - VERIFY_IS_APPROX(m2, (m1 + (s3*(-v1)*(s2*v2).adjoint()+numext::conj(s3)*(s2*v2)*(-v1).adjoint())).template triangularView().toDenseMatrix()); - - m2 = m1.template triangularView(); - m2.template selfadjointView().rankUpdate(-s2*r1.adjoint(),r2.adjoint()*s3,s1); - VERIFY_IS_APPROX(m2, (m1 + s1*(-s2*r1.adjoint())*(r2.adjoint()*s3).adjoint() + numext::conj(s1)*(r2.adjoint()*s3) * (-s2*r1.adjoint()).adjoint()).template triangularView().toDenseMatrix()); - - if (rows>1) - { - m2 = m1.template triangularView(); - m2.block(1,1,rows-1,cols-1).template selfadjointView().rankUpdate(v1.tail(rows-1),v2.head(cols-1)); - m3 = m1; - m3.block(1,1,rows-1,cols-1) += v1.tail(rows-1) * v2.head(cols-1).adjoint()+ v2.head(cols-1) * v1.tail(rows-1).adjoint(); - VERIFY_IS_APPROX(m2, m3.template triangularView().toDenseMatrix()); - } -} - -void test_product_selfadjoint() -{ - int s = 0; - for(int i = 0; i < g_repeat ; i++) { - CALL_SUBTEST_1( product_selfadjoint(Matrix()) ); - CALL_SUBTEST_2( product_selfadjoint(Matrix()) ); - CALL_SUBTEST_3( product_selfadjoint(Matrix3d()) ); - - s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); - CALL_SUBTEST_4( product_selfadjoint(MatrixXcf(s, s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); - CALL_SUBTEST_5( product_selfadjoint(MatrixXcd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_6( product_selfadjoint(MatrixXd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_7( product_selfadjoint(Matrix(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_small.cpp b/testbed/nanogui/ext/eigen/test/product_small.cpp deleted file mode 100644 index fdfdd9f6..00000000 --- a/testbed/nanogui/ext/eigen/test/product_small.cpp +++ /dev/null @@ -1,293 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT -#include "product.h" -#include - -// regression test for bug 447 -template -void product1x1() -{ - Matrix matAstatic; - Matrix matBstatic; - matAstatic.setRandom(); - matBstatic.setRandom(); - VERIFY_IS_APPROX( (matAstatic * matBstatic).coeff(0,0), - matAstatic.cwiseProduct(matBstatic.transpose()).sum() ); - - MatrixXf matAdynamic(1,3); - MatrixXf matBdynamic(3,1); - matAdynamic.setRandom(); - matBdynamic.setRandom(); - VERIFY_IS_APPROX( (matAdynamic * matBdynamic).coeff(0,0), - matAdynamic.cwiseProduct(matBdynamic.transpose()).sum() ); -} - -template -const TC& ref_prod(TC &C, const TA &A, const TB &B) -{ - for(Index i=0;i -typename internal::enable_if::type -test_lazy_single(int rows, int cols, int depth) -{ - Matrix A(rows,depth); A.setRandom(); - Matrix B(depth,cols); B.setRandom(); - Matrix C(rows,cols); C.setRandom(); - Matrix D(C); - VERIFY_IS_APPROX(C+=A.lazyProduct(B), ref_prod(D,A,B)); -} - -template -typename internal::enable_if< ( (Rows ==1&&Depth!=1&&OA==ColMajor) - || (Depth==1&&Rows !=1&&OA==RowMajor) - || (Cols ==1&&Depth!=1&&OB==RowMajor) - || (Depth==1&&Cols !=1&&OB==ColMajor) - || (Rows ==1&&Cols !=1&&OC==ColMajor) - || (Cols ==1&&Rows !=1&&OC==RowMajor)),void>::type -test_lazy_single(int, int, int) -{ -} - -template -void test_lazy_all_layout(int rows=Rows, int cols=Cols, int depth=Depth) -{ - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); - CALL_SUBTEST(( test_lazy_single(rows,cols,depth) )); -} - -template -void test_lazy_l1() -{ - int rows = internal::random(1,12); - int cols = internal::random(1,12); - int depth = internal::random(1,12); - - // Inner - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout(1,1,depth) )); - - // Outer - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout(4,cols) )); - CALL_SUBTEST(( test_lazy_all_layout(7,cols) )); - CALL_SUBTEST(( test_lazy_all_layout(rows) )); - CALL_SUBTEST(( test_lazy_all_layout(rows) )); - CALL_SUBTEST(( test_lazy_all_layout(rows,cols) )); -} - -template -void test_lazy_l2() -{ - int rows = internal::random(1,12); - int cols = internal::random(1,12); - int depth = internal::random(1,12); - - // mat-vec - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout(rows) )); - CALL_SUBTEST(( test_lazy_all_layout(4,1,depth) )); - CALL_SUBTEST(( test_lazy_all_layout(rows,1,depth) )); - - // vec-mat - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout(1,cols) )); - CALL_SUBTEST(( test_lazy_all_layout(1,4,depth) )); - CALL_SUBTEST(( test_lazy_all_layout(1,cols,depth) )); -} - -template -void test_lazy_l3() -{ - int rows = internal::random(1,12); - int cols = internal::random(1,12); - int depth = internal::random(1,12); - // mat-mat - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout(rows) )); - CALL_SUBTEST(( test_lazy_all_layout(4,3,depth) )); - CALL_SUBTEST(( test_lazy_all_layout(rows,6,depth) )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout() )); - CALL_SUBTEST(( test_lazy_all_layout(8,cols) )); - CALL_SUBTEST(( test_lazy_all_layout(3,4,depth) )); - CALL_SUBTEST(( test_lazy_all_layout(4,cols,depth) )); -} - -template -void test_linear_but_not_vectorizable() -{ - // Check tricky cases for which the result of the product is a vector and thus must exhibit the LinearBit flag, - // but is not vectorizable along the linear dimension. - Index n = N==Dynamic ? internal::random(1,32) : N; - Index m = M==Dynamic ? internal::random(1,32) : M; - Index k = K==Dynamic ? internal::random(1,32) : K; - - { - Matrix A; A.setRandom(n,m+1); - Matrix B; B.setRandom(m*2,k); - Matrix C; - Matrix R; - - C.noalias() = A.template topLeftCorner<1,M>() * (B.template topRows()+B.template bottomRows()); - R.noalias() = A.template topLeftCorner<1,M>() * (B.template topRows()+B.template bottomRows()).eval(); - VERIFY_IS_APPROX(C,R); - } - - { - Matrix A; A.setRandom(m+1,n); - Matrix B; B.setRandom(k,m*2); - Matrix C; - Matrix R; - - C.noalias() = (B.template leftCols()+B.template rightCols()) * A.template topLeftCorner(); - R.noalias() = (B.template leftCols()+B.template rightCols()).eval() * A.template topLeftCorner(); - VERIFY_IS_APPROX(C,R); - } -} - -template -void bug_1311() -{ - Matrix< double, Rows, 2 > A; A.setRandom(); - Vector2d b = Vector2d::Random() ; - Matrix res; - res.noalias() = 1. * (A * b); - VERIFY_IS_APPROX(res, A*b); - res.noalias() = 1.*A * b; - VERIFY_IS_APPROX(res, A*b); - res.noalias() = (1.*A).lazyProduct(b); - VERIFY_IS_APPROX(res, A*b); - res.noalias() = (1.*A).lazyProduct(1.*b); - VERIFY_IS_APPROX(res, A*b); - res.noalias() = (A).lazyProduct(1.*b); - VERIFY_IS_APPROX(res, A*b); -} - -void test_product_small() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( product(Matrix()) ); - CALL_SUBTEST_2( product(Matrix()) ); - CALL_SUBTEST_8( product(Matrix()) ); - CALL_SUBTEST_3( product(Matrix3d()) ); - CALL_SUBTEST_4( product(Matrix4d()) ); - CALL_SUBTEST_5( product(Matrix4f()) ); - CALL_SUBTEST_6( product1x1<0>() ); - - CALL_SUBTEST_11( test_lazy_l1() ); - CALL_SUBTEST_12( test_lazy_l2() ); - CALL_SUBTEST_13( test_lazy_l3() ); - - CALL_SUBTEST_21( test_lazy_l1() ); - CALL_SUBTEST_22( test_lazy_l2() ); - CALL_SUBTEST_23( test_lazy_l3() ); - - CALL_SUBTEST_31( test_lazy_l1 >() ); - CALL_SUBTEST_32( test_lazy_l2 >() ); - CALL_SUBTEST_33( test_lazy_l3 >() ); - - CALL_SUBTEST_41( test_lazy_l1 >() ); - CALL_SUBTEST_42( test_lazy_l2 >() ); - CALL_SUBTEST_43( test_lazy_l3 >() ); - - CALL_SUBTEST_7(( test_linear_but_not_vectorizable() )); - CALL_SUBTEST_7(( test_linear_but_not_vectorizable() )); - CALL_SUBTEST_7(( test_linear_but_not_vectorizable() )); - - CALL_SUBTEST_6( bug_1311<3>() ); - CALL_SUBTEST_6( bug_1311<5>() ); - } - -#ifdef EIGEN_TEST_PART_6 - { - // test compilation of (outer_product) * vector - Vector3f v = Vector3f::Random(); - VERIFY_IS_APPROX( (v * v.transpose()) * v, (v * v.transpose()).eval() * v); - } - - { - // regression test for pull-request #93 - Eigen::Matrix A; A.setRandom(); - Eigen::Matrix B; B.setRandom(); - Eigen::Matrix C; C.setRandom(); - VERIFY_IS_APPROX(B * A.inverse(), B * A.inverse()[0]); - VERIFY_IS_APPROX(A.inverse() * C, A.inverse()[0] * C); - } - - { - Eigen::Matrix A, B, C; - A.setRandom(); - C = A; - for(int k=0; k<79; ++k) - C = C * A; - B.noalias() = (((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)) * ((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))) - * (((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A)) * ((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))*((A*A)*(A*A))); - VERIFY_IS_APPROX(B,C); - } -#endif -} diff --git a/testbed/nanogui/ext/eigen/test/product_symm.cpp b/testbed/nanogui/ext/eigen/test/product_symm.cpp deleted file mode 100644 index 8c44383f..00000000 --- a/testbed/nanogui/ext/eigen/test/product_symm.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void symm(int size = Size, int othersize = OtherSize) -{ - typedef Matrix MatrixType; - typedef Matrix Rhs1; - typedef Matrix Rhs2; - enum { order = OtherSize==1 ? 0 : RowMajor }; - typedef Matrix Rhs3; - typedef typename MatrixType::Index Index; - - Index rows = size; - Index cols = size; - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), m3; - - m1 = (m1+m1.adjoint()).eval(); - - Rhs1 rhs1 = Rhs1::Random(cols, othersize), rhs12(cols, othersize), rhs13(cols, othersize); - Rhs2 rhs2 = Rhs2::Random(othersize, rows), rhs22(othersize, rows), rhs23(othersize, rows); - Rhs3 rhs3 = Rhs3::Random(cols, othersize), rhs32(cols, othersize), rhs33(cols, othersize); - - Scalar s1 = internal::random(), - s2 = internal::random(); - - m2 = m1.template triangularView(); - m3 = m2.template selfadjointView(); - VERIFY_IS_EQUAL(m1, m3); - VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView() * (s2*rhs1), - rhs13 = (s1*m1) * (s2*rhs1)); - - VERIFY_IS_APPROX(rhs12 = (s1*m2).transpose().template selfadjointView() * (s2*rhs1), - rhs13 = (s1*m1.transpose()) * (s2*rhs1)); - - VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView().transpose() * (s2*rhs1), - rhs13 = (s1*m1.transpose()) * (s2*rhs1)); - - VERIFY_IS_APPROX(rhs12 = (s1*m2).conjugate().template selfadjointView() * (s2*rhs1), - rhs13 = (s1*m1).conjugate() * (s2*rhs1)); - - VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView().conjugate() * (s2*rhs1), - rhs13 = (s1*m1).conjugate() * (s2*rhs1)); - - VERIFY_IS_APPROX(rhs12 = (s1*m2).adjoint().template selfadjointView() * (s2*rhs1), - rhs13 = (s1*m1).adjoint() * (s2*rhs1)); - - VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView().adjoint() * (s2*rhs1), - rhs13 = (s1*m1).adjoint() * (s2*rhs1)); - - m2 = m1.template triangularView(); rhs12.setRandom(); rhs13 = rhs12; - m3 = m2.template selfadjointView(); - VERIFY_IS_EQUAL(m1, m3); - VERIFY_IS_APPROX(rhs12 += (s1*m2).template selfadjointView() * (s2*rhs1), - rhs13 += (s1*m1) * (s2*rhs1)); - - m2 = m1.template triangularView(); - VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView() * (s2*rhs2.adjoint()), - rhs13 = (s1*m1) * (s2*rhs2.adjoint())); - - m2 = m1.template triangularView(); - VERIFY_IS_APPROX(rhs12 = (s1*m2).template selfadjointView() * (s2*rhs2.adjoint()), - rhs13 = (s1*m1) * (s2*rhs2.adjoint())); - - m2 = m1.template triangularView(); - VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView() * (s2*rhs2.adjoint()), - rhs13 = (s1*m1.adjoint()) * (s2*rhs2.adjoint())); - - // test row major = <...> - m2 = m1.template triangularView(); rhs12.setRandom(); rhs13 = rhs12; - VERIFY_IS_APPROX(rhs12 -= (s1*m2).template selfadjointView() * (s2*rhs3), - rhs13 -= (s1*m1) * (s2 * rhs3)); - - m2 = m1.template triangularView(); - VERIFY_IS_APPROX(rhs12 = (s1*m2.adjoint()).template selfadjointView() * (s2*rhs3).conjugate(), - rhs13 = (s1*m1.adjoint()) * (s2*rhs3).conjugate()); - - - m2 = m1.template triangularView(); rhs13 = rhs12; - VERIFY_IS_APPROX(rhs12.noalias() += s1 * ((m2.adjoint()).template selfadjointView() * (s2*rhs3).conjugate()), - rhs13 += (s1*m1.adjoint()) * (s2*rhs3).conjugate()); - - m2 = m1.template triangularView(); - VERIFY_IS_APPROX(rhs22 = (rhs2) * (m2).template selfadjointView(), rhs23 = (rhs2) * (m1)); - VERIFY_IS_APPROX(rhs22 = (s2*rhs2) * (s1*m2).template selfadjointView(), rhs23 = (s2*rhs2) * (s1*m1)); - -} - -void test_product_symm() -{ - for(int i = 0; i < g_repeat ; i++) - { - CALL_SUBTEST_1(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - CALL_SUBTEST_2(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - CALL_SUBTEST_3(( symm,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)) )); - CALL_SUBTEST_4(( symm,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)) )); - - CALL_SUBTEST_5(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - CALL_SUBTEST_6(( symm(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - CALL_SUBTEST_7(( symm,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - CALL_SUBTEST_8(( symm,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)) )); - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_syrk.cpp b/testbed/nanogui/ext/eigen/test/product_syrk.cpp deleted file mode 100644 index e10f0f2f..00000000 --- a/testbed/nanogui/ext/eigen/test/product_syrk.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void syrk(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef Matrix RMatrixType; - typedef Matrix Rhs1; - typedef Matrix Rhs2; - typedef Matrix Rhs3; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3 = MatrixType::Random(rows, cols); - RMatrixType rm2 = MatrixType::Random(rows, cols); - - Rhs1 rhs1 = Rhs1::Random(internal::random(1,320), cols); Rhs1 rhs11 = Rhs1::Random(rhs1.rows(), cols); - Rhs2 rhs2 = Rhs2::Random(rows, internal::random(1,320)); Rhs2 rhs22 = Rhs2::Random(rows, rhs2.cols()); - Rhs3 rhs3 = Rhs3::Random(internal::random(1,320), rows); - - Scalar s1 = internal::random(); - - Index c = internal::random(0,cols-1); - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(rhs2,s1)._expression()), - ((s1 * rhs2 * rhs2.adjoint()).eval().template triangularView().toDenseMatrix())); - m2.setZero(); - VERIFY_IS_APPROX(((m2.template triangularView() += s1 * rhs2 * rhs22.adjoint()).nestedExpression()), - ((s1 * rhs2 * rhs22.adjoint()).eval().template triangularView().toDenseMatrix())); - - - m2.setZero(); - VERIFY_IS_APPROX(m2.template selfadjointView().rankUpdate(rhs2,s1)._expression(), - (s1 * rhs2 * rhs2.adjoint()).eval().template triangularView().toDenseMatrix()); - m2.setZero(); - VERIFY_IS_APPROX((m2.template triangularView() += s1 * rhs22 * rhs2.adjoint()).nestedExpression(), - (s1 * rhs22 * rhs2.adjoint()).eval().template triangularView().toDenseMatrix()); - - - m2.setZero(); - VERIFY_IS_APPROX(m2.template selfadjointView().rankUpdate(rhs1.adjoint(),s1)._expression(), - (s1 * rhs1.adjoint() * rhs1).eval().template triangularView().toDenseMatrix()); - m2.setZero(); - VERIFY_IS_APPROX((m2.template triangularView() += s1 * rhs11.adjoint() * rhs1).nestedExpression(), - (s1 * rhs11.adjoint() * rhs1).eval().template triangularView().toDenseMatrix()); - - - m2.setZero(); - VERIFY_IS_APPROX(m2.template selfadjointView().rankUpdate(rhs1.adjoint(),s1)._expression(), - (s1 * rhs1.adjoint() * rhs1).eval().template triangularView().toDenseMatrix()); - VERIFY_IS_APPROX((m2.template triangularView() = s1 * rhs1.adjoint() * rhs11).nestedExpression(), - (s1 * rhs1.adjoint() * rhs11).eval().template triangularView().toDenseMatrix()); - - - m2.setZero(); - VERIFY_IS_APPROX(m2.template selfadjointView().rankUpdate(rhs3.adjoint(),s1)._expression(), - (s1 * rhs3.adjoint() * rhs3).eval().template triangularView().toDenseMatrix()); - - m2.setZero(); - VERIFY_IS_APPROX(m2.template selfadjointView().rankUpdate(rhs3.adjoint(),s1)._expression(), - (s1 * rhs3.adjoint() * rhs3).eval().template triangularView().toDenseMatrix()); - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(m1.col(c),s1)._expression()), - ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView().toDenseMatrix())); - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(m1.col(c),s1)._expression()), - ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView().toDenseMatrix())); - rm2.setZero(); - VERIFY_IS_APPROX((rm2.template selfadjointView().rankUpdate(m1.col(c),s1)._expression()), - ((s1 * m1.col(c) * m1.col(c).adjoint()).eval().template triangularView().toDenseMatrix())); - m2.setZero(); - VERIFY_IS_APPROX((m2.template triangularView() += s1 * m3.col(c) * m1.col(c).adjoint()).nestedExpression(), - ((s1 * m3.col(c) * m1.col(c).adjoint()).eval().template triangularView().toDenseMatrix())); - rm2.setZero(); - VERIFY_IS_APPROX((rm2.template triangularView() += s1 * m1.col(c) * m3.col(c).adjoint()).nestedExpression(), - ((s1 * m1.col(c) * m3.col(c).adjoint()).eval().template triangularView().toDenseMatrix())); - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(m1.col(c).conjugate(),s1)._expression()), - ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint()).eval().template triangularView().toDenseMatrix())); - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(m1.col(c).conjugate(),s1)._expression()), - ((s1 * m1.col(c).conjugate() * m1.col(c).conjugate().adjoint()).eval().template triangularView().toDenseMatrix())); - - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(m1.row(c),s1)._expression()), - ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView().toDenseMatrix())); - rm2.setZero(); - VERIFY_IS_APPROX((rm2.template selfadjointView().rankUpdate(m1.row(c),s1)._expression()), - ((s1 * m1.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView().toDenseMatrix())); - m2.setZero(); - VERIFY_IS_APPROX((m2.template triangularView() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).nestedExpression(), - ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView().toDenseMatrix())); - rm2.setZero(); - VERIFY_IS_APPROX((rm2.template triangularView() += s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).nestedExpression(), - ((s1 * m3.row(c).transpose() * m1.row(c).transpose().adjoint()).eval().template triangularView().toDenseMatrix())); - - - m2.setZero(); - VERIFY_IS_APPROX((m2.template selfadjointView().rankUpdate(m1.row(c).adjoint(),s1)._expression()), - ((s1 * m1.row(c).adjoint() * m1.row(c).adjoint().adjoint()).eval().template triangularView().toDenseMatrix())); -} - -void test_product_syrk() -{ - for(int i = 0; i < g_repeat ; i++) - { - int s; - s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_1( syrk(MatrixXf(s, s)) ); - CALL_SUBTEST_2( syrk(MatrixXd(s, s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); - CALL_SUBTEST_3( syrk(MatrixXcf(s, s)) ); - CALL_SUBTEST_4( syrk(MatrixXcd(s, s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_trmm.cpp b/testbed/nanogui/ext/eigen/test/product_trmm.cpp deleted file mode 100644 index 12e55441..00000000 --- a/testbed/nanogui/ext/eigen/test/product_trmm.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template -int get_random_size() -{ - const int factor = NumTraits::ReadCost; - const int max_test_size = EIGEN_TEST_MAX_SIZE>2*factor ? EIGEN_TEST_MAX_SIZE/factor : EIGEN_TEST_MAX_SIZE; - return internal::random(1,max_test_size); -} - -template -void trmm(int rows=get_random_size(), - int cols=get_random_size(), - int otherCols = OtherCols==Dynamic?get_random_size():OtherCols) -{ - typedef Matrix TriMatrix; - typedef Matrix OnTheRight; - typedef Matrix OnTheLeft; - - typedef Matrix ResXS; - typedef Matrix ResSX; - - TriMatrix mat(rows,cols), tri(rows,cols), triTr(cols,rows); - - OnTheRight ge_right(cols,otherCols); - OnTheLeft ge_left(otherCols,rows); - ResSX ge_sx, ge_sx_save; - ResXS ge_xs, ge_xs_save; - - Scalar s1 = internal::random(), - s2 = internal::random(); - - mat.setRandom(); - tri = mat.template triangularView(); - triTr = mat.transpose().template triangularView(); - ge_right.setRandom(); - ge_left.setRandom(); - - VERIFY_IS_APPROX( ge_xs = mat.template triangularView() * ge_right, tri * ge_right); - VERIFY_IS_APPROX( ge_sx = ge_left * mat.template triangularView(), ge_left * tri); - - VERIFY_IS_APPROX( ge_xs.noalias() = mat.template triangularView() * ge_right, tri * ge_right); - VERIFY_IS_APPROX( ge_sx.noalias() = ge_left * mat.template triangularView(), ge_left * tri); - - VERIFY_IS_APPROX( ge_xs.noalias() = (s1*mat.adjoint()).template triangularView() * (s2*ge_left.transpose()), s1*triTr.conjugate() * (s2*ge_left.transpose())); - VERIFY_IS_APPROX( ge_sx.noalias() = ge_right.transpose() * mat.adjoint().template triangularView(), ge_right.transpose() * triTr.conjugate()); - - VERIFY_IS_APPROX( ge_xs.noalias() = (s1*mat.adjoint()).template triangularView() * (s2*ge_left.adjoint()), s1*triTr.conjugate() * (s2*ge_left.adjoint())); - VERIFY_IS_APPROX( ge_sx.noalias() = ge_right.adjoint() * mat.adjoint().template triangularView(), ge_right.adjoint() * triTr.conjugate()); - - ge_xs_save = ge_xs; - VERIFY_IS_APPROX( (ge_xs_save + s1*triTr.conjugate() * (s2*ge_left.adjoint())).eval(), ge_xs.noalias() += (s1*mat.adjoint()).template triangularView() * (s2*ge_left.adjoint()) ); - ge_sx.setRandom(); - ge_sx_save = ge_sx; - VERIFY_IS_APPROX( ge_sx_save - (ge_right.adjoint() * (-s1 * triTr).conjugate()).eval(), ge_sx.noalias() -= (ge_right.adjoint() * (-s1 * mat).adjoint().template triangularView()).eval()); - - VERIFY_IS_APPROX( ge_xs = (s1*mat).adjoint().template triangularView() * ge_left.adjoint(), numext::conj(s1) * triTr.conjugate() * ge_left.adjoint()); - - // TODO check with sub-matrix expressions ? -} - -template -void trmv(int rows=get_random_size(), int cols=get_random_size()) -{ - trmm(rows,cols,1); -} - -template -void trmm(int rows=get_random_size(), int cols=get_random_size(), int otherCols = get_random_size()) -{ - trmm(rows,cols,otherCols); -} - -#define CALL_ALL_ORDERS(NB,SCALAR,MODE) \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - EIGEN_CAT(CALL_SUBTEST_,NB)((trmm())); \ - \ - EIGEN_CAT(CALL_SUBTEST_1,NB)((trmv())); \ - EIGEN_CAT(CALL_SUBTEST_1,NB)((trmv())); - - -#define CALL_ALL(NB,SCALAR) \ - CALL_ALL_ORDERS(EIGEN_CAT(1,NB),SCALAR,Upper) \ - CALL_ALL_ORDERS(EIGEN_CAT(2,NB),SCALAR,UnitUpper) \ - CALL_ALL_ORDERS(EIGEN_CAT(3,NB),SCALAR,StrictlyUpper) \ - CALL_ALL_ORDERS(EIGEN_CAT(1,NB),SCALAR,Lower) \ - CALL_ALL_ORDERS(EIGEN_CAT(2,NB),SCALAR,UnitLower) \ - CALL_ALL_ORDERS(EIGEN_CAT(3,NB),SCALAR,StrictlyLower) - - -void test_product_trmm() -{ - for(int i = 0; i < g_repeat ; i++) - { - CALL_ALL(1,float); // EIGEN_SUFFIXES;11;111;21;121;31;131 - CALL_ALL(2,double); // EIGEN_SUFFIXES;12;112;22;122;32;132 - CALL_ALL(3,std::complex); // EIGEN_SUFFIXES;13;113;23;123;33;133 - CALL_ALL(4,std::complex); // EIGEN_SUFFIXES;14;114;24;124;34;134 - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_trmv.cpp b/testbed/nanogui/ext/eigen/test/product_trmv.cpp deleted file mode 100644 index 57a202af..00000000 --- a/testbed/nanogui/ext/eigen/test/product_trmv.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// This file is triangularView of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void trmv(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - - RealScalar largerEps = 10*test_precision(); - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m3(rows, cols); - VectorType v1 = VectorType::Random(rows); - - Scalar s1 = internal::random(); - - m1 = MatrixType::Random(rows, cols); - - // check with a column-major matrix - m3 = m1.template triangularView(); - VERIFY((m3 * v1).isApprox(m1.template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3 * v1).isApprox(m1.template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3 * v1).isApprox(m1.template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3 * v1).isApprox(m1.template triangularView() * v1, largerEps)); - - // check conjugated and scalar multiple expressions (col-major) - m3 = m1.template triangularView(); - VERIFY(((s1*m3).conjugate() * v1).isApprox((s1*m1).conjugate().template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3.conjugate() * v1.conjugate()).isApprox(m1.conjugate().template triangularView() * v1.conjugate(), largerEps)); - - // check with a row-major matrix - m3 = m1.template triangularView(); - VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3.transpose() * v1).isApprox(m1.transpose().template triangularView() * v1, largerEps)); - - // check conjugated and scalar multiple expressions (row-major) - m3 = m1.template triangularView(); - VERIFY((m3.adjoint() * v1).isApprox(m1.adjoint().template triangularView() * v1, largerEps)); - m3 = m1.template triangularView(); - VERIFY((m3.adjoint() * (s1*v1.conjugate())).isApprox(m1.adjoint().template triangularView() * (s1*v1.conjugate()), largerEps)); - m3 = m1.template triangularView(); - - // check transposed cases: - m3 = m1.template triangularView(); - VERIFY((v1.transpose() * m3).isApprox(v1.transpose() * m1.template triangularView(), largerEps)); - VERIFY((v1.adjoint() * m3).isApprox(v1.adjoint() * m1.template triangularView(), largerEps)); - VERIFY((v1.adjoint() * m3.adjoint()).isApprox(v1.adjoint() * m1.template triangularView().adjoint(), largerEps)); - - // TODO check with sub-matrices -} - -void test_product_trmv() -{ - int s = 0; - for(int i = 0; i < g_repeat ; i++) { - CALL_SUBTEST_1( trmv(Matrix()) ); - CALL_SUBTEST_2( trmv(Matrix()) ); - CALL_SUBTEST_3( trmv(Matrix3d()) ); - - s = internal::random(1,EIGEN_TEST_MAX_SIZE/2); - CALL_SUBTEST_4( trmv(MatrixXcf(s,s)) ); - CALL_SUBTEST_5( trmv(MatrixXcd(s,s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - - s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_6( trmv(Matrix(s, s)) ); - TEST_SET_BUT_UNUSED_VARIABLE(s) - } -} diff --git a/testbed/nanogui/ext/eigen/test/product_trsolve.cpp b/testbed/nanogui/ext/eigen/test/product_trsolve.cpp deleted file mode 100644 index 4b97fa9d..00000000 --- a/testbed/nanogui/ext/eigen/test/product_trsolve.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#define VERIFY_TRSM(TRI,XB) { \ - (XB).setRandom(); ref = (XB); \ - (TRI).solveInPlace(XB); \ - VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \ - (XB).setRandom(); ref = (XB); \ - (XB) = (TRI).solve(XB); \ - VERIFY_IS_APPROX((TRI).toDenseMatrix() * (XB), ref); \ - } - -#define VERIFY_TRSM_ONTHERIGHT(TRI,XB) { \ - (XB).setRandom(); ref = (XB); \ - (TRI).transpose().template solveInPlace(XB.transpose()); \ - VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \ - (XB).setRandom(); ref = (XB); \ - (XB).transpose() = (TRI).transpose().template solve(XB.transpose()); \ - VERIFY_IS_APPROX((XB).transpose() * (TRI).transpose().toDenseMatrix(), ref.transpose()); \ - } - -template void trsolve(int size=Size,int cols=Cols) -{ - typedef typename NumTraits::Real RealScalar; - - Matrix cmLhs(size,size); - Matrix rmLhs(size,size); - - enum { colmajor = Size==1 ? RowMajor : ColMajor, - rowmajor = Cols==1 ? ColMajor : RowMajor }; - Matrix cmRhs(size,cols); - Matrix rmRhs(size,cols); - Matrix ref(size,cols); - - cmLhs.setRandom(); cmLhs *= static_cast(0.1); cmLhs.diagonal().array() += static_cast(1); - rmLhs.setRandom(); rmLhs *= static_cast(0.1); rmLhs.diagonal().array() += static_cast(1); - - VERIFY_TRSM(cmLhs.conjugate().template triangularView(), cmRhs); - VERIFY_TRSM(cmLhs.adjoint() .template triangularView(), cmRhs); - VERIFY_TRSM(cmLhs .template triangularView(), cmRhs); - VERIFY_TRSM(cmLhs .template triangularView(), rmRhs); - VERIFY_TRSM(cmLhs.conjugate().template triangularView(), rmRhs); - VERIFY_TRSM(cmLhs.adjoint() .template triangularView(), rmRhs); - - VERIFY_TRSM(cmLhs.conjugate().template triangularView(), cmRhs); - VERIFY_TRSM(cmLhs .template triangularView(), rmRhs); - - VERIFY_TRSM(rmLhs .template triangularView(), cmRhs); - VERIFY_TRSM(rmLhs.conjugate().template triangularView(), rmRhs); - - - VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView(), cmRhs); - VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView(), cmRhs); - VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView(), rmRhs); - VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView(), rmRhs); - - VERIFY_TRSM_ONTHERIGHT(cmLhs.conjugate().template triangularView(), cmRhs); - VERIFY_TRSM_ONTHERIGHT(cmLhs .template triangularView(), rmRhs); - - VERIFY_TRSM_ONTHERIGHT(rmLhs .template triangularView(), cmRhs); - VERIFY_TRSM_ONTHERIGHT(rmLhs.conjugate().template triangularView(), rmRhs); - - int c = internal::random(0,cols-1); - VERIFY_TRSM(rmLhs.template triangularView(), rmRhs.col(c)); - VERIFY_TRSM(cmLhs.template triangularView(), rmRhs.col(c)); -} - -void test_product_trsolve() -{ - for(int i = 0; i < g_repeat ; i++) - { - // matrices - CALL_SUBTEST_1((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_2((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_3((trsolve,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); - CALL_SUBTEST_4((trsolve,Dynamic,Dynamic>(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2)))); - - // vectors - CALL_SUBTEST_5((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_6((trsolve(internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_7((trsolve,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)))); - CALL_SUBTEST_8((trsolve,Dynamic,1>(internal::random(1,EIGEN_TEST_MAX_SIZE)))); - - // meta-unrollers - CALL_SUBTEST_9((trsolve())); - CALL_SUBTEST_10((trsolve())); - CALL_SUBTEST_11((trsolve,4,1>())); - CALL_SUBTEST_12((trsolve())); - CALL_SUBTEST_13((trsolve())); - CALL_SUBTEST_14((trsolve())); - - } -} diff --git a/testbed/nanogui/ext/eigen/test/qr.cpp b/testbed/nanogui/ext/eigen/test/qr.cpp deleted file mode 100644 index dfcc1e8f..00000000 --- a/testbed/nanogui/ext/eigen/test/qr.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void qr(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - - Index rows = m.rows(); - Index cols = m.cols(); - - typedef typename MatrixType::Scalar Scalar; - typedef Matrix MatrixQType; - - MatrixType a = MatrixType::Random(rows,cols); - HouseholderQR qrOfA(a); - - MatrixQType q = qrOfA.householderQ(); - VERIFY_IS_UNITARY(q); - - MatrixType r = qrOfA.matrixQR().template triangularView(); - VERIFY_IS_APPROX(a, qrOfA.householderQ() * r); -} - -template void qr_fixedsize() -{ - enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; - typedef typename MatrixType::Scalar Scalar; - Matrix m1 = Matrix::Random(); - HouseholderQR > qr(m1); - - Matrix r = qr.matrixQR(); - // FIXME need better way to construct trapezoid - for(int i = 0; i < Rows; i++) for(int j = 0; j < Cols; j++) if(i>j) r(i,j) = Scalar(0); - - VERIFY_IS_APPROX(m1, qr.householderQ() * r); - - Matrix m2 = Matrix::Random(Cols,Cols2); - Matrix m3 = m1*m2; - m2 = Matrix::Random(Cols,Cols2); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); -} - -template void qr_invertible() -{ - using std::log; - using std::abs; - using std::pow; - using std::max; - typedef typename NumTraits::Real RealScalar; - typedef typename MatrixType::Scalar Scalar; - - int size = internal::random(10,50); - - MatrixType m1(size, size), m2(size, size), m3(size, size); - m1 = MatrixType::Random(size,size); - - if (internal::is_same::value) - { - // let's build a matrix more stable to inverse - MatrixType a = MatrixType::Random(size,size*4); - m1 += a * a.adjoint(); - } - - HouseholderQR qr(m1); - m3 = MatrixType::Random(size,size); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - - // now construct a matrix with prescribed determinant - m1.setZero(); - for(int i = 0; i < size; i++) m1(i,i) = internal::random(); - RealScalar absdet = abs(m1.diagonal().prod()); - m3 = qr.householderQ(); // get a unitary - m1 = m3 * m1 * m3; - qr.compute(m1); - VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant()); - // This test is tricky if the determinant becomes too small. - // Since we generate random numbers with magnitude rrange [0,1], the average determinant is 0.5^size - VERIFY_IS_MUCH_SMALLER_THAN( abs(absdet-qr.absDeterminant()), numext::maxi(RealScalar(pow(0.5,size)),numext::maxi(abs(absdet),abs(qr.absDeterminant()))) ); - -} - -template void qr_verify_assert() -{ - MatrixType tmp; - - HouseholderQR qr; - VERIFY_RAISES_ASSERT(qr.matrixQR()) - VERIFY_RAISES_ASSERT(qr.solve(tmp)) - VERIFY_RAISES_ASSERT(qr.householderQ()) - VERIFY_RAISES_ASSERT(qr.absDeterminant()) - VERIFY_RAISES_ASSERT(qr.logAbsDeterminant()) -} - -void test_qr() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( qr(MatrixXf(internal::random(1,EIGEN_TEST_MAX_SIZE),internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_2( qr(MatrixXcd(internal::random(1,EIGEN_TEST_MAX_SIZE/2),internal::random(1,EIGEN_TEST_MAX_SIZE/2))) ); - CALL_SUBTEST_3(( qr_fixedsize, 2 >() )); - CALL_SUBTEST_4(( qr_fixedsize, 4 >() )); - CALL_SUBTEST_5(( qr_fixedsize, 7 >() )); - CALL_SUBTEST_11( qr(Matrix()) ); - } - - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( qr_invertible() ); - CALL_SUBTEST_6( qr_invertible() ); - CALL_SUBTEST_7( qr_invertible() ); - CALL_SUBTEST_8( qr_invertible() ); - } - - CALL_SUBTEST_9(qr_verify_assert()); - CALL_SUBTEST_10(qr_verify_assert()); - CALL_SUBTEST_1(qr_verify_assert()); - CALL_SUBTEST_6(qr_verify_assert()); - CALL_SUBTEST_7(qr_verify_assert()); - CALL_SUBTEST_8(qr_verify_assert()); - - // Test problem size constructors - CALL_SUBTEST_12(HouseholderQR(10, 20)); -} diff --git a/testbed/nanogui/ext/eigen/test/qr_colpivoting.cpp b/testbed/nanogui/ext/eigen/test/qr_colpivoting.cpp deleted file mode 100644 index 26ed27f5..00000000 --- a/testbed/nanogui/ext/eigen/test/qr_colpivoting.cpp +++ /dev/null @@ -1,342 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template -void cod() { - typedef typename MatrixType::Index Index; - - Index rows = internal::random(2, EIGEN_TEST_MAX_SIZE); - Index cols = internal::random(2, EIGEN_TEST_MAX_SIZE); - Index cols2 = internal::random(2, EIGEN_TEST_MAX_SIZE); - Index rank = internal::random(1, (std::min)(rows, cols) - 1); - - typedef typename MatrixType::Scalar Scalar; - typedef Matrix - MatrixQType; - MatrixType matrix; - createRandomPIMatrixOfRank(rank, rows, cols, matrix); - CompleteOrthogonalDecomposition cod(matrix); - VERIFY(rank == cod.rank()); - VERIFY(cols - cod.rank() == cod.dimensionOfKernel()); - VERIFY(!cod.isInjective()); - VERIFY(!cod.isInvertible()); - VERIFY(!cod.isSurjective()); - - MatrixQType q = cod.householderQ(); - VERIFY_IS_UNITARY(q); - - MatrixType z = cod.matrixZ(); - VERIFY_IS_UNITARY(z); - - MatrixType t; - t.setZero(rows, cols); - t.topLeftCorner(rank, rank) = - cod.matrixT().topLeftCorner(rank, rank).template triangularView(); - - MatrixType c = q * t * z * cod.colsPermutation().inverse(); - VERIFY_IS_APPROX(matrix, c); - - MatrixType exact_solution = MatrixType::Random(cols, cols2); - MatrixType rhs = matrix * exact_solution; - MatrixType cod_solution = cod.solve(rhs); - VERIFY_IS_APPROX(rhs, matrix * cod_solution); - - // Verify that we get the same minimum-norm solution as the SVD. - JacobiSVD svd(matrix, ComputeThinU | ComputeThinV); - MatrixType svd_solution = svd.solve(rhs); - VERIFY_IS_APPROX(cod_solution, svd_solution); - - MatrixType pinv = cod.pseudoInverse(); - VERIFY_IS_APPROX(cod_solution, pinv * rhs); -} - -template -void cod_fixedsize() { - enum { - Rows = MatrixType::RowsAtCompileTime, - Cols = MatrixType::ColsAtCompileTime - }; - typedef typename MatrixType::Scalar Scalar; - int rank = internal::random(1, (std::min)(int(Rows), int(Cols)) - 1); - Matrix matrix; - createRandomPIMatrixOfRank(rank, Rows, Cols, matrix); - CompleteOrthogonalDecomposition > cod(matrix); - VERIFY(rank == cod.rank()); - VERIFY(Cols - cod.rank() == cod.dimensionOfKernel()); - VERIFY(cod.isInjective() == (rank == Rows)); - VERIFY(cod.isSurjective() == (rank == Cols)); - VERIFY(cod.isInvertible() == (cod.isInjective() && cod.isSurjective())); - - Matrix exact_solution; - exact_solution.setRandom(Cols, Cols2); - Matrix rhs = matrix * exact_solution; - Matrix cod_solution = cod.solve(rhs); - VERIFY_IS_APPROX(rhs, matrix * cod_solution); - - // Verify that we get the same minimum-norm solution as the SVD. - JacobiSVD svd(matrix, ComputeFullU | ComputeFullV); - Matrix svd_solution = svd.solve(rhs); - VERIFY_IS_APPROX(cod_solution, svd_solution); -} - -template void qr() -{ - using std::sqrt; - typedef typename MatrixType::Index Index; - - Index rows = internal::random(2,EIGEN_TEST_MAX_SIZE), cols = internal::random(2,EIGEN_TEST_MAX_SIZE), cols2 = internal::random(2,EIGEN_TEST_MAX_SIZE); - Index rank = internal::random(1, (std::min)(rows, cols)-1); - - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix MatrixQType; - MatrixType m1; - createRandomPIMatrixOfRank(rank,rows,cols,m1); - ColPivHouseholderQR qr(m1); - VERIFY_IS_EQUAL(rank, qr.rank()); - VERIFY_IS_EQUAL(cols - qr.rank(), qr.dimensionOfKernel()); - VERIFY(!qr.isInjective()); - VERIFY(!qr.isInvertible()); - VERIFY(!qr.isSurjective()); - - MatrixQType q = qr.householderQ(); - VERIFY_IS_UNITARY(q); - - MatrixType r = qr.matrixQR().template triangularView(); - MatrixType c = q * r * qr.colsPermutation().inverse(); - VERIFY_IS_APPROX(m1, c); - - // Verify that the absolute value of the diagonal elements in R are - // non-increasing until they reach the singularity threshold. - RealScalar threshold = - sqrt(RealScalar(rows)) * numext::abs(r(0, 0)) * NumTraits::epsilon(); - for (Index i = 0; i < (std::min)(rows, cols) - 1; ++i) { - RealScalar x = numext::abs(r(i, i)); - RealScalar y = numext::abs(r(i + 1, i + 1)); - if (x < threshold && y < threshold) continue; - if (!test_isApproxOrLessThan(y, x)) { - for (Index j = 0; j < (std::min)(rows, cols); ++j) { - std::cout << "i = " << j << ", |r_ii| = " << numext::abs(r(j, j)) << std::endl; - } - std::cout << "Failure at i=" << i << ", rank=" << rank - << ", threshold=" << threshold << std::endl; - } - VERIFY_IS_APPROX_OR_LESS_THAN(y, x); - } - - MatrixType m2 = MatrixType::Random(cols,cols2); - MatrixType m3 = m1*m2; - m2 = MatrixType::Random(cols,cols2); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - - { - Index size = rows; - do { - m1 = MatrixType::Random(size,size); - qr.compute(m1); - } while(!qr.isInvertible()); - MatrixType m1_inv = qr.inverse(); - m3 = m1 * MatrixType::Random(size,cols2); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m2, m1_inv*m3); - } -} - -template void qr_fixedsize() -{ - using std::sqrt; - using std::abs; - enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - int rank = internal::random(1, (std::min)(int(Rows), int(Cols))-1); - Matrix m1; - createRandomPIMatrixOfRank(rank,Rows,Cols,m1); - ColPivHouseholderQR > qr(m1); - VERIFY_IS_EQUAL(rank, qr.rank()); - VERIFY_IS_EQUAL(Cols - qr.rank(), qr.dimensionOfKernel()); - VERIFY_IS_EQUAL(qr.isInjective(), (rank == Rows)); - VERIFY_IS_EQUAL(qr.isSurjective(), (rank == Cols)); - VERIFY_IS_EQUAL(qr.isInvertible(), (qr.isInjective() && qr.isSurjective())); - - Matrix r = qr.matrixQR().template triangularView(); - Matrix c = qr.householderQ() * r * qr.colsPermutation().inverse(); - VERIFY_IS_APPROX(m1, c); - - Matrix m2 = Matrix::Random(Cols,Cols2); - Matrix m3 = m1*m2; - m2 = Matrix::Random(Cols,Cols2); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - // Verify that the absolute value of the diagonal elements in R are - // non-increasing until they reache the singularity threshold. - RealScalar threshold = - sqrt(RealScalar(Rows)) * (std::abs)(r(0, 0)) * NumTraits::epsilon(); - for (Index i = 0; i < (std::min)(int(Rows), int(Cols)) - 1; ++i) { - RealScalar x = numext::abs(r(i, i)); - RealScalar y = numext::abs(r(i + 1, i + 1)); - if (x < threshold && y < threshold) continue; - if (!test_isApproxOrLessThan(y, x)) { - for (Index j = 0; j < (std::min)(int(Rows), int(Cols)); ++j) { - std::cout << "i = " << j << ", |r_ii| = " << numext::abs(r(j, j)) << std::endl; - } - std::cout << "Failure at i=" << i << ", rank=" << rank - << ", threshold=" << threshold << std::endl; - } - VERIFY_IS_APPROX_OR_LESS_THAN(y, x); - } -} - -// This test is meant to verify that pivots are chosen such that -// even for a graded matrix, the diagonal of R falls of roughly -// monotonically until it reaches the threshold for singularity. -// We use the so-called Kahan matrix, which is a famous counter-example -// for rank-revealing QR. See -// http://www.netlib.org/lapack/lawnspdf/lawn176.pdf -// page 3 for more detail. -template void qr_kahan_matrix() -{ - using std::sqrt; - using std::abs; - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - Index rows = 300, cols = rows; - - MatrixType m1; - m1.setZero(rows,cols); - RealScalar s = std::pow(NumTraits::epsilon(), 1.0 / rows); - RealScalar c = std::sqrt(1 - s*s); - RealScalar pow_s_i(1.0); // pow(s,i) - for (Index i = 0; i < rows; ++i) { - m1(i, i) = pow_s_i; - m1.row(i).tail(rows - i - 1) = -pow_s_i * c * MatrixType::Ones(1, rows - i - 1); - pow_s_i *= s; - } - m1 = (m1 + m1.transpose()).eval(); - ColPivHouseholderQR qr(m1); - MatrixType r = qr.matrixQR().template triangularView(); - - RealScalar threshold = - std::sqrt(RealScalar(rows)) * numext::abs(r(0, 0)) * NumTraits::epsilon(); - for (Index i = 0; i < (std::min)(rows, cols) - 1; ++i) { - RealScalar x = numext::abs(r(i, i)); - RealScalar y = numext::abs(r(i + 1, i + 1)); - if (x < threshold && y < threshold) continue; - if (!test_isApproxOrLessThan(y, x)) { - for (Index j = 0; j < (std::min)(rows, cols); ++j) { - std::cout << "i = " << j << ", |r_ii| = " << numext::abs(r(j, j)) << std::endl; - } - std::cout << "Failure at i=" << i << ", rank=" << qr.rank() - << ", threshold=" << threshold << std::endl; - } - VERIFY_IS_APPROX_OR_LESS_THAN(y, x); - } -} - -template void qr_invertible() -{ - using std::log; - using std::abs; - typedef typename NumTraits::Real RealScalar; - typedef typename MatrixType::Scalar Scalar; - - int size = internal::random(10,50); - - MatrixType m1(size, size), m2(size, size), m3(size, size); - m1 = MatrixType::Random(size,size); - - if (internal::is_same::value) - { - // let's build a matrix more stable to inverse - MatrixType a = MatrixType::Random(size,size*2); - m1 += a * a.adjoint(); - } - - ColPivHouseholderQR qr(m1); - m3 = MatrixType::Random(size,size); - m2 = qr.solve(m3); - //VERIFY_IS_APPROX(m3, m1*m2); - - // now construct a matrix with prescribed determinant - m1.setZero(); - for(int i = 0; i < size; i++) m1(i,i) = internal::random(); - RealScalar absdet = abs(m1.diagonal().prod()); - m3 = qr.householderQ(); // get a unitary - m1 = m3 * m1 * m3; - qr.compute(m1); - VERIFY_IS_APPROX(absdet, qr.absDeterminant()); - VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant()); -} - -template void qr_verify_assert() -{ - MatrixType tmp; - - ColPivHouseholderQR qr; - VERIFY_RAISES_ASSERT(qr.matrixQR()) - VERIFY_RAISES_ASSERT(qr.solve(tmp)) - VERIFY_RAISES_ASSERT(qr.householderQ()) - VERIFY_RAISES_ASSERT(qr.dimensionOfKernel()) - VERIFY_RAISES_ASSERT(qr.isInjective()) - VERIFY_RAISES_ASSERT(qr.isSurjective()) - VERIFY_RAISES_ASSERT(qr.isInvertible()) - VERIFY_RAISES_ASSERT(qr.inverse()) - VERIFY_RAISES_ASSERT(qr.absDeterminant()) - VERIFY_RAISES_ASSERT(qr.logAbsDeterminant()) -} - -void test_qr_colpivoting() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( qr() ); - CALL_SUBTEST_2( qr() ); - CALL_SUBTEST_3( qr() ); - CALL_SUBTEST_4(( qr_fixedsize, 4 >() )); - CALL_SUBTEST_5(( qr_fixedsize, 3 >() )); - CALL_SUBTEST_5(( qr_fixedsize, 1 >() )); - } - - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( cod() ); - CALL_SUBTEST_2( cod() ); - CALL_SUBTEST_3( cod() ); - CALL_SUBTEST_4(( cod_fixedsize, 4 >() )); - CALL_SUBTEST_5(( cod_fixedsize, 3 >() )); - CALL_SUBTEST_5(( cod_fixedsize, 1 >() )); - } - - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( qr_invertible() ); - CALL_SUBTEST_2( qr_invertible() ); - CALL_SUBTEST_6( qr_invertible() ); - CALL_SUBTEST_3( qr_invertible() ); - } - - CALL_SUBTEST_7(qr_verify_assert()); - CALL_SUBTEST_8(qr_verify_assert()); - CALL_SUBTEST_1(qr_verify_assert()); - CALL_SUBTEST_2(qr_verify_assert()); - CALL_SUBTEST_6(qr_verify_assert()); - CALL_SUBTEST_3(qr_verify_assert()); - - // Test problem size constructors - CALL_SUBTEST_9(ColPivHouseholderQR(10, 20)); - - CALL_SUBTEST_1( qr_kahan_matrix() ); - CALL_SUBTEST_2( qr_kahan_matrix() ); -} diff --git a/testbed/nanogui/ext/eigen/test/qr_fullpivoting.cpp b/testbed/nanogui/ext/eigen/test/qr_fullpivoting.cpp deleted file mode 100644 index 70e89c19..00000000 --- a/testbed/nanogui/ext/eigen/test/qr_fullpivoting.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void qr() -{ - typedef typename MatrixType::Index Index; - - Index max_size = EIGEN_TEST_MAX_SIZE; - Index min_size = numext::maxi(1,EIGEN_TEST_MAX_SIZE/10); - Index rows = internal::random(min_size,max_size), - cols = internal::random(min_size,max_size), - cols2 = internal::random(min_size,max_size), - rank = internal::random(1, (std::min)(rows, cols)-1); - - typedef typename MatrixType::Scalar Scalar; - typedef Matrix MatrixQType; - MatrixType m1; - createRandomPIMatrixOfRank(rank,rows,cols,m1); - FullPivHouseholderQR qr(m1); - VERIFY_IS_EQUAL(rank, qr.rank()); - VERIFY_IS_EQUAL(cols - qr.rank(), qr.dimensionOfKernel()); - VERIFY(!qr.isInjective()); - VERIFY(!qr.isInvertible()); - VERIFY(!qr.isSurjective()); - - MatrixType r = qr.matrixQR(); - - MatrixQType q = qr.matrixQ(); - VERIFY_IS_UNITARY(q); - - // FIXME need better way to construct trapezoid - for(int i = 0; i < rows; i++) for(int j = 0; j < cols; j++) if(i>j) r(i,j) = Scalar(0); - - MatrixType c = qr.matrixQ() * r * qr.colsPermutation().inverse(); - - VERIFY_IS_APPROX(m1, c); - - // stress the ReturnByValue mechanism - MatrixType tmp; - VERIFY_IS_APPROX(tmp.noalias() = qr.matrixQ() * r, (qr.matrixQ() * r).eval()); - - MatrixType m2 = MatrixType::Random(cols,cols2); - MatrixType m3 = m1*m2; - m2 = MatrixType::Random(cols,cols2); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - - { - Index size = rows; - do { - m1 = MatrixType::Random(size,size); - qr.compute(m1); - } while(!qr.isInvertible()); - MatrixType m1_inv = qr.inverse(); - m3 = m1 * MatrixType::Random(size,cols2); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m2, m1_inv*m3); - } -} - -template void qr_invertible() -{ - using std::log; - using std::abs; - typedef typename NumTraits::Real RealScalar; - typedef typename MatrixType::Scalar Scalar; - - Index max_size = numext::mini(50,EIGEN_TEST_MAX_SIZE); - Index min_size = numext::maxi(1,EIGEN_TEST_MAX_SIZE/10); - Index size = internal::random(min_size,max_size); - - MatrixType m1(size, size), m2(size, size), m3(size, size); - m1 = MatrixType::Random(size,size); - - if (internal::is_same::value) - { - // let's build a matrix more stable to inverse - MatrixType a = MatrixType::Random(size,size*2); - m1 += a * a.adjoint(); - } - - FullPivHouseholderQR qr(m1); - VERIFY(qr.isInjective()); - VERIFY(qr.isInvertible()); - VERIFY(qr.isSurjective()); - - m3 = MatrixType::Random(size,size); - m2 = qr.solve(m3); - VERIFY_IS_APPROX(m3, m1*m2); - - // now construct a matrix with prescribed determinant - m1.setZero(); - for(int i = 0; i < size; i++) m1(i,i) = internal::random(); - RealScalar absdet = abs(m1.diagonal().prod()); - m3 = qr.matrixQ(); // get a unitary - m1 = m3 * m1 * m3; - qr.compute(m1); - VERIFY_IS_APPROX(absdet, qr.absDeterminant()); - VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant()); -} - -template void qr_verify_assert() -{ - MatrixType tmp; - - FullPivHouseholderQR qr; - VERIFY_RAISES_ASSERT(qr.matrixQR()) - VERIFY_RAISES_ASSERT(qr.solve(tmp)) - VERIFY_RAISES_ASSERT(qr.matrixQ()) - VERIFY_RAISES_ASSERT(qr.dimensionOfKernel()) - VERIFY_RAISES_ASSERT(qr.isInjective()) - VERIFY_RAISES_ASSERT(qr.isSurjective()) - VERIFY_RAISES_ASSERT(qr.isInvertible()) - VERIFY_RAISES_ASSERT(qr.inverse()) - VERIFY_RAISES_ASSERT(qr.absDeterminant()) - VERIFY_RAISES_ASSERT(qr.logAbsDeterminant()) -} - -void test_qr_fullpivoting() -{ - for(int i = 0; i < 1; i++) { - // FIXME : very weird bug here -// CALL_SUBTEST(qr(Matrix2f()) ); - CALL_SUBTEST_1( qr() ); - CALL_SUBTEST_2( qr() ); - CALL_SUBTEST_3( qr() ); - } - - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( qr_invertible() ); - CALL_SUBTEST_2( qr_invertible() ); - CALL_SUBTEST_4( qr_invertible() ); - CALL_SUBTEST_3( qr_invertible() ); - } - - CALL_SUBTEST_5(qr_verify_assert()); - CALL_SUBTEST_6(qr_verify_assert()); - CALL_SUBTEST_1(qr_verify_assert()); - CALL_SUBTEST_2(qr_verify_assert()); - CALL_SUBTEST_4(qr_verify_assert()); - CALL_SUBTEST_3(qr_verify_assert()); - - // Test problem size constructors - CALL_SUBTEST_7(FullPivHouseholderQR(10, 20)); - CALL_SUBTEST_7((FullPivHouseholderQR >(10,20))); - CALL_SUBTEST_7((FullPivHouseholderQR >(Matrix::Random()))); - CALL_SUBTEST_7((FullPivHouseholderQR >(20,10))); - CALL_SUBTEST_7((FullPivHouseholderQR >(Matrix::Random()))); -} diff --git a/testbed/nanogui/ext/eigen/test/qtvector.cpp b/testbed/nanogui/ext/eigen/test/qtvector.cpp deleted file mode 100644 index 2be885e4..00000000 --- a/testbed/nanogui/ext/eigen/test/qtvector.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_WORK_AROUND_QT_BUG_CALLING_WRONG_OPERATOR_NEW_FIXED_IN_QT_4_5 - -#include "main.h" -#include -#include -#include - -template -void check_qtvector_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - - Index rows = m.rows(); - Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - QVector v(10, MatrixType(rows,cols)), w(20, y); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], y); - } - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.fill(y,22); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(MatrixType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - MatrixType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(int i=23; i -void check_qtvector_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - QVector v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.fill(y,22); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(TransformType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - TransformType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; int(i) -void check_qtvector_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - QVector v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.fill(y,22); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(QuaternionType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - QuaternionType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; int(i) -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -typedef long long int64; - -template Scalar check_in_range(Scalar x, Scalar y) -{ - Scalar r = internal::random(x,y); - VERIFY(r>=x); - if(y>=x) - { - VERIFY(r<=y); - } - return r; -} - -template void check_all_in_range(Scalar x, Scalar y) -{ - Array mask(y-x+1); - mask.fill(0); - long n = (y-x+1)*32; - for(long k=0; k0).all() ); -} - -template void check_histogram(Scalar x, Scalar y, int bins) -{ - Array hist(bins); - hist.fill(0); - int f = 100000; - int n = bins*f; - int64 range = int64(y)-int64(x); - int divisor = int((range+1)/bins); - assert(((range+1)%bins)==0); - for(int k=0; k()/double(f))-1.0).abs()<0.02).all() ); -} - -void test_rand() -{ - long long_ref = NumTraits::highest()/10; - signed char char_offset = (std::min)(g_repeat,64); - signed char short_offset = (std::min)(g_repeat,16000); - - for(int i = 0; i < g_repeat*10000; i++) { - CALL_SUBTEST(check_in_range(10,11)); - CALL_SUBTEST(check_in_range(1.24234523,1.24234523)); - CALL_SUBTEST(check_in_range(-1,1)); - CALL_SUBTEST(check_in_range(-1432.2352,-1432.2352)); - - CALL_SUBTEST(check_in_range(10,11)); - CALL_SUBTEST(check_in_range(1.24234523,1.24234523)); - CALL_SUBTEST(check_in_range(-1,1)); - CALL_SUBTEST(check_in_range(-1432.2352,-1432.2352)); - - CALL_SUBTEST(check_in_range(0,-1)); - CALL_SUBTEST(check_in_range(0,-1)); - CALL_SUBTEST(check_in_range(0,-1)); - CALL_SUBTEST(check_in_range(-673456,673456)); - CALL_SUBTEST(check_in_range(-RAND_MAX+10,RAND_MAX-10)); - CALL_SUBTEST(check_in_range(-24345,24345)); - CALL_SUBTEST(check_in_range(-long_ref,long_ref)); - } - - CALL_SUBTEST(check_all_in_range(11,11)); - CALL_SUBTEST(check_all_in_range(11,11+char_offset)); - CALL_SUBTEST(check_all_in_range(-5,5)); - CALL_SUBTEST(check_all_in_range(-11-char_offset,-11)); - CALL_SUBTEST(check_all_in_range(-126,-126+char_offset)); - CALL_SUBTEST(check_all_in_range(126-char_offset,126)); - CALL_SUBTEST(check_all_in_range(-126,126)); - - CALL_SUBTEST(check_all_in_range(11,11)); - CALL_SUBTEST(check_all_in_range(11,11+short_offset)); - CALL_SUBTEST(check_all_in_range(-5,5)); - CALL_SUBTEST(check_all_in_range(-11-short_offset,-11)); - CALL_SUBTEST(check_all_in_range(-24345,-24345+short_offset)); - CALL_SUBTEST(check_all_in_range(24345,24345+short_offset)); - - CALL_SUBTEST(check_all_in_range(11,11)); - CALL_SUBTEST(check_all_in_range(11,11+g_repeat)); - CALL_SUBTEST(check_all_in_range(-5,5)); - CALL_SUBTEST(check_all_in_range(-11-g_repeat,-11)); - CALL_SUBTEST(check_all_in_range(-673456,-673456+g_repeat)); - CALL_SUBTEST(check_all_in_range(673456,673456+g_repeat)); - - CALL_SUBTEST(check_all_in_range(11,11)); - CALL_SUBTEST(check_all_in_range(11,11+g_repeat)); - CALL_SUBTEST(check_all_in_range(-5,5)); - CALL_SUBTEST(check_all_in_range(-11-g_repeat,-11)); - CALL_SUBTEST(check_all_in_range(-long_ref,-long_ref+g_repeat)); - CALL_SUBTEST(check_all_in_range( long_ref, long_ref+g_repeat)); - - CALL_SUBTEST(check_histogram(-5,5,11)); - int bins = 100; - CALL_SUBTEST(check_histogram(-3333,-3333+bins*(3333/bins)-1,bins)); - bins = 1000; - CALL_SUBTEST(check_histogram(-RAND_MAX+10,-RAND_MAX+10+bins*(RAND_MAX/bins)-1,bins)); - CALL_SUBTEST(check_histogram(-RAND_MAX+10,-int64(RAND_MAX)+10+bins*(2*int64(RAND_MAX)/bins)-1,bins)); -} diff --git a/testbed/nanogui/ext/eigen/test/real_qz.cpp b/testbed/nanogui/ext/eigen/test/real_qz.cpp deleted file mode 100644 index 99ac3123..00000000 --- a/testbed/nanogui/ext/eigen/test/real_qz.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Alexey Korepanov -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_RUNTIME_NO_MALLOC -#include "main.h" -#include -#include - -template void real_qz(const MatrixType& m) -{ - /* this test covers the following files: - RealQZ.h - */ - using std::abs; - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index dim = m.cols(); - - MatrixType A = MatrixType::Random(dim,dim), - B = MatrixType::Random(dim,dim); - - - // Regression test for bug 985: Randomly set rows or columns to zero - Index k=internal::random(0, dim-1); - switch(internal::random(0,10)) { - case 0: - A.row(k).setZero(); break; - case 1: - A.col(k).setZero(); break; - case 2: - B.row(k).setZero(); break; - case 3: - B.col(k).setZero(); break; - default: - break; - } - - RealQZ qz(dim); - // TODO enable full-prealocation of required memory, this probably requires an in-place mode for HessenbergDecomposition - //Eigen::internal::set_is_malloc_allowed(false); - qz.compute(A,B); - //Eigen::internal::set_is_malloc_allowed(true); - - VERIFY_IS_EQUAL(qz.info(), Success); - // check for zeros - bool all_zeros = true; - for (Index i=0; i void matrixRedux(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols); - - // The entries of m1 are uniformly distributed in [0,1], so m1.prod() is very small. This may lead to test - // failures if we underflow into denormals. Thus, we scale so that entries are close to 1. - MatrixType m1_for_prod = MatrixType::Ones(rows, cols) + RealScalar(0.2) * m1; - - VERIFY_IS_MUCH_SMALLER_THAN(MatrixType::Zero(rows, cols).sum(), Scalar(1)); - VERIFY_IS_APPROX(MatrixType::Ones(rows, cols).sum(), Scalar(float(rows*cols))); // the float() here to shut up excessive MSVC warning about int->complex conversion being lossy - Scalar s(0), p(1), minc(numext::real(m1.coeff(0))), maxc(numext::real(m1.coeff(0))); - for(int j = 0; j < cols; j++) - for(int i = 0; i < rows; i++) - { - s += m1(i,j); - p *= m1_for_prod(i,j); - minc = (std::min)(numext::real(minc), numext::real(m1(i,j))); - maxc = (std::max)(numext::real(maxc), numext::real(m1(i,j))); - } - const Scalar mean = s/Scalar(RealScalar(rows*cols)); - - VERIFY_IS_APPROX(m1.sum(), s); - VERIFY_IS_APPROX(m1.mean(), mean); - VERIFY_IS_APPROX(m1_for_prod.prod(), p); - VERIFY_IS_APPROX(m1.real().minCoeff(), numext::real(minc)); - VERIFY_IS_APPROX(m1.real().maxCoeff(), numext::real(maxc)); - - // test slice vectorization assuming assign is ok - Index r0 = internal::random(0,rows-1); - Index c0 = internal::random(0,cols-1); - Index r1 = internal::random(r0+1,rows)-r0; - Index c1 = internal::random(c0+1,cols)-c0; - VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).sum(), m1.block(r0,c0,r1,c1).eval().sum()); - VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).mean(), m1.block(r0,c0,r1,c1).eval().mean()); - VERIFY_IS_APPROX(m1_for_prod.block(r0,c0,r1,c1).prod(), m1_for_prod.block(r0,c0,r1,c1).eval().prod()); - VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).real().minCoeff(), m1.block(r0,c0,r1,c1).real().eval().minCoeff()); - VERIFY_IS_APPROX(m1.block(r0,c0,r1,c1).real().maxCoeff(), m1.block(r0,c0,r1,c1).real().eval().maxCoeff()); - - // regression for bug 1090 - const int R1 = MatrixType::RowsAtCompileTime>=2 ? MatrixType::RowsAtCompileTime/2 : 6; - const int C1 = MatrixType::ColsAtCompileTime>=2 ? MatrixType::ColsAtCompileTime/2 : 6; - if(R1<=rows-r0 && C1<=cols-c0) - { - VERIFY_IS_APPROX( (m1.template block(r0,c0).sum()), m1.block(r0,c0,R1,C1).sum() ); - } - - // test empty objects - VERIFY_IS_APPROX(m1.block(r0,c0,0,0).sum(), Scalar(0)); - VERIFY_IS_APPROX(m1.block(r0,c0,0,0).prod(), Scalar(1)); - - // test nesting complex expression - VERIFY_EVALUATION_COUNT( (m1.matrix()*m1.matrix().transpose()).sum(), (MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1) ); - Matrix m2(rows,rows); - m2.setRandom(); - VERIFY_EVALUATION_COUNT( ((m1.matrix()*m1.matrix().transpose())+m2).sum(),(MatrixType::IsVectorAtCompileTime && MatrixType::SizeAtCompileTime!=1 ? 0 : 1)); -} - -template void vectorRedux(const VectorType& w) -{ - using std::abs; - typedef typename VectorType::Index Index; - typedef typename VectorType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - Index size = w.size(); - - VectorType v = VectorType::Random(size); - VectorType v_for_prod = VectorType::Ones(size) + Scalar(0.2) * v; // see comment above declaration of m1_for_prod - - for(int i = 1; i < size; i++) - { - Scalar s(0), p(1); - RealScalar minc(numext::real(v.coeff(0))), maxc(numext::real(v.coeff(0))); - for(int j = 0; j < i; j++) - { - s += v[j]; - p *= v_for_prod[j]; - minc = (std::min)(minc, numext::real(v[j])); - maxc = (std::max)(maxc, numext::real(v[j])); - } - VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.head(i).sum()), Scalar(1)); - VERIFY_IS_APPROX(p, v_for_prod.head(i).prod()); - VERIFY_IS_APPROX(minc, v.real().head(i).minCoeff()); - VERIFY_IS_APPROX(maxc, v.real().head(i).maxCoeff()); - } - - for(int i = 0; i < size-1; i++) - { - Scalar s(0), p(1); - RealScalar minc(numext::real(v.coeff(i))), maxc(numext::real(v.coeff(i))); - for(int j = i; j < size; j++) - { - s += v[j]; - p *= v_for_prod[j]; - minc = (std::min)(minc, numext::real(v[j])); - maxc = (std::max)(maxc, numext::real(v[j])); - } - VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.tail(size-i).sum()), Scalar(1)); - VERIFY_IS_APPROX(p, v_for_prod.tail(size-i).prod()); - VERIFY_IS_APPROX(minc, v.real().tail(size-i).minCoeff()); - VERIFY_IS_APPROX(maxc, v.real().tail(size-i).maxCoeff()); - } - - for(int i = 0; i < size/2; i++) - { - Scalar s(0), p(1); - RealScalar minc(numext::real(v.coeff(i))), maxc(numext::real(v.coeff(i))); - for(int j = i; j < size-i; j++) - { - s += v[j]; - p *= v_for_prod[j]; - minc = (std::min)(minc, numext::real(v[j])); - maxc = (std::max)(maxc, numext::real(v[j])); - } - VERIFY_IS_MUCH_SMALLER_THAN(abs(s - v.segment(i, size-2*i).sum()), Scalar(1)); - VERIFY_IS_APPROX(p, v_for_prod.segment(i, size-2*i).prod()); - VERIFY_IS_APPROX(minc, v.real().segment(i, size-2*i).minCoeff()); - VERIFY_IS_APPROX(maxc, v.real().segment(i, size-2*i).maxCoeff()); - } - - // test empty objects - VERIFY_IS_APPROX(v.head(0).sum(), Scalar(0)); - VERIFY_IS_APPROX(v.tail(0).prod(), Scalar(1)); - VERIFY_RAISES_ASSERT(v.head(0).mean()); - VERIFY_RAISES_ASSERT(v.head(0).minCoeff()); - VERIFY_RAISES_ASSERT(v.head(0).maxCoeff()); -} - -void test_redux() -{ - // the max size cannot be too large, otherwise reduxion operations obviously generate large errors. - int maxsize = (std::min)(100,EIGEN_TEST_MAX_SIZE); - TEST_SET_BUT_UNUSED_VARIABLE(maxsize); - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( matrixRedux(Matrix()) ); - CALL_SUBTEST_1( matrixRedux(Array()) ); - CALL_SUBTEST_2( matrixRedux(Matrix2f()) ); - CALL_SUBTEST_2( matrixRedux(Array2f()) ); - CALL_SUBTEST_2( matrixRedux(Array22f()) ); - CALL_SUBTEST_3( matrixRedux(Matrix4d()) ); - CALL_SUBTEST_3( matrixRedux(Array4d()) ); - CALL_SUBTEST_3( matrixRedux(Array44d()) ); - CALL_SUBTEST_4( matrixRedux(MatrixXcf(internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_4( matrixRedux(ArrayXXcf(internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_5( matrixRedux(MatrixXd (internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_5( matrixRedux(ArrayXXd (internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_6( matrixRedux(MatrixXi (internal::random(1,maxsize), internal::random(1,maxsize))) ); - CALL_SUBTEST_6( matrixRedux(ArrayXXi (internal::random(1,maxsize), internal::random(1,maxsize))) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_7( vectorRedux(Vector4f()) ); - CALL_SUBTEST_7( vectorRedux(Array4f()) ); - CALL_SUBTEST_5( vectorRedux(VectorXd(internal::random(1,maxsize))) ); - CALL_SUBTEST_5( vectorRedux(ArrayXd(internal::random(1,maxsize))) ); - CALL_SUBTEST_8( vectorRedux(VectorXf(internal::random(1,maxsize))) ); - CALL_SUBTEST_8( vectorRedux(ArrayXf(internal::random(1,maxsize))) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/ref.cpp b/testbed/nanogui/ext/eigen/test/ref.cpp deleted file mode 100644 index 769db041..00000000 --- a/testbed/nanogui/ext/eigen/test/ref.cpp +++ /dev/null @@ -1,280 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 20013 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// This unit test cannot be easily written to work with EIGEN_DEFAULT_TO_ROW_MAJOR -#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR -#undef EIGEN_DEFAULT_TO_ROW_MAJOR -#endif - -#define TEST_ENABLE_TEMPORARY_TRACKING - -#include "main.h" - -// test Ref.h - -// Deal with i387 extended precision -#if EIGEN_ARCH_i386 && !(EIGEN_ARCH_x86_64) - -#if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_AT_LEAST(4,4) -#pragma GCC optimize ("-ffloat-store") -#else -#undef VERIFY_IS_EQUAL -#define VERIFY_IS_EQUAL(X,Y) VERIFY_IS_APPROX(X,Y) -#endif - -#endif - -template void ref_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix DynMatrixType; - typedef Matrix RealDynMatrixType; - - typedef Ref RefMat; - typedef Ref RefDynMat; - typedef Ref ConstRefDynMat; - typedef Ref > RefRealMatWithStride; - - Index rows = m.rows(), cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = m1; - - Index i = internal::random(0,rows-1); - Index j = internal::random(0,cols-1); - Index brows = internal::random(1,rows-i); - Index bcols = internal::random(1,cols-j); - - RefMat rm0 = m1; - VERIFY_IS_EQUAL(rm0, m1); - RefDynMat rm1 = m1; - VERIFY_IS_EQUAL(rm1, m1); - RefDynMat rm2 = m1.block(i,j,brows,bcols); - VERIFY_IS_EQUAL(rm2, m1.block(i,j,brows,bcols)); - rm2.setOnes(); - m2.block(i,j,brows,bcols).setOnes(); - VERIFY_IS_EQUAL(m1, m2); - - m2.block(i,j,brows,bcols).setRandom(); - rm2 = m2.block(i,j,brows,bcols); - VERIFY_IS_EQUAL(m1, m2); - - ConstRefDynMat rm3 = m1.block(i,j,brows,bcols); - m1.block(i,j,brows,bcols) *= 2; - m2.block(i,j,brows,bcols) *= 2; - VERIFY_IS_EQUAL(rm3, m2.block(i,j,brows,bcols)); - RefRealMatWithStride rm4 = m1.real(); - VERIFY_IS_EQUAL(rm4, m2.real()); - rm4.array() += 1; - m2.real().array() += 1; - VERIFY_IS_EQUAL(m1, m2); -} - -template void ref_vector(const VectorType& m) -{ - typedef typename VectorType::Index Index; - typedef typename VectorType::Scalar Scalar; - typedef typename VectorType::RealScalar RealScalar; - typedef Matrix DynMatrixType; - typedef Matrix MatrixType; - typedef Matrix RealDynMatrixType; - - typedef Ref RefMat; - typedef Ref RefDynMat; - typedef Ref ConstRefDynMat; - typedef Ref > RefRealMatWithStride; - typedef Ref > RefMatWithStride; - - Index size = m.size(); - - VectorType v1 = VectorType::Random(size), - v2 = v1; - MatrixType mat1 = MatrixType::Random(size,size), - mat2 = mat1, - mat3 = MatrixType::Random(size,size); - - Index i = internal::random(0,size-1); - Index bsize = internal::random(1,size-i); - - RefMat rm0 = v1; - VERIFY_IS_EQUAL(rm0, v1); - RefDynMat rv1 = v1; - VERIFY_IS_EQUAL(rv1, v1); - RefDynMat rv2 = v1.segment(i,bsize); - VERIFY_IS_EQUAL(rv2, v1.segment(i,bsize)); - rv2.setOnes(); - v2.segment(i,bsize).setOnes(); - VERIFY_IS_EQUAL(v1, v2); - - v2.segment(i,bsize).setRandom(); - rv2 = v2.segment(i,bsize); - VERIFY_IS_EQUAL(v1, v2); - - ConstRefDynMat rm3 = v1.segment(i,bsize); - v1.segment(i,bsize) *= 2; - v2.segment(i,bsize) *= 2; - VERIFY_IS_EQUAL(rm3, v2.segment(i,bsize)); - - RefRealMatWithStride rm4 = v1.real(); - VERIFY_IS_EQUAL(rm4, v2.real()); - rm4.array() += 1; - v2.real().array() += 1; - VERIFY_IS_EQUAL(v1, v2); - - RefMatWithStride rm5 = mat1.row(i).transpose(); - VERIFY_IS_EQUAL(rm5, mat1.row(i).transpose()); - rm5.array() += 1; - mat2.row(i).array() += 1; - VERIFY_IS_EQUAL(mat1, mat2); - rm5.noalias() = rm4.transpose() * mat3; - mat2.row(i) = v2.real().transpose() * mat3; - VERIFY_IS_APPROX(mat1, mat2); -} - -template void check_const_correctness(const PlainObjectType&) -{ - // verify that ref-to-const don't have LvalueBit - typedef typename internal::add_const::type ConstPlainObjectType; - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(Ref::Flags & LvalueBit) ); - VERIFY( !(Ref::Flags & LvalueBit) ); -} - -template -EIGEN_DONT_INLINE void call_ref_1(Ref a, const B &b) { VERIFY_IS_EQUAL(a,b); } -template -EIGEN_DONT_INLINE void call_ref_2(const Ref& a, const B &b) { VERIFY_IS_EQUAL(a,b); } -template -EIGEN_DONT_INLINE void call_ref_3(Ref > a, const B &b) { VERIFY_IS_EQUAL(a,b); } -template -EIGEN_DONT_INLINE void call_ref_4(const Ref >& a, const B &b) { VERIFY_IS_EQUAL(a,b); } -template -EIGEN_DONT_INLINE void call_ref_5(Ref > a, const B &b) { VERIFY_IS_EQUAL(a,b); } -template -EIGEN_DONT_INLINE void call_ref_6(const Ref >& a, const B &b) { VERIFY_IS_EQUAL(a,b); } -template -EIGEN_DONT_INLINE void call_ref_7(Ref > a, const B &b) { VERIFY_IS_EQUAL(a,b); } - -void call_ref() -{ - VectorXcf ca = VectorXcf::Random(10); - VectorXf a = VectorXf::Random(10); - RowVectorXf b = RowVectorXf::Random(10); - MatrixXf A = MatrixXf::Random(10,10); - RowVector3f c = RowVector3f::Random(); - const VectorXf& ac(a); - VectorBlock ab(a,0,3); - const VectorBlock abc(a,0,3); - - - VERIFY_EVALUATION_COUNT( call_ref_1(a,a), 0); - VERIFY_EVALUATION_COUNT( call_ref_1(b,b.transpose()), 0); -// call_ref_1(ac,a RowMatrixXd; -int test_ref_overload_fun1(Ref ) { return 1; } -int test_ref_overload_fun1(Ref ) { return 2; } -int test_ref_overload_fun1(Ref ) { return 3; } - -int test_ref_overload_fun2(Ref ) { return 4; } -int test_ref_overload_fun2(Ref ) { return 5; } - -void test_ref_ambiguous(const Ref &A, Ref B) -{ - B = A; - B = A - A; -} - -// See also bug 969 -void test_ref_overloads() -{ - MatrixXd Ad, Bd; - RowMatrixXd rAd, rBd; - VERIFY( test_ref_overload_fun1(Ad)==1 ); - VERIFY( test_ref_overload_fun1(rAd)==2 ); - - MatrixXf Af, Bf; - VERIFY( test_ref_overload_fun2(Ad)==4 ); - VERIFY( test_ref_overload_fun2(Ad+Bd)==4 ); - VERIFY( test_ref_overload_fun2(Af+Bf)==5 ); - - ArrayXd A, B; - test_ref_ambiguous(A, B); -} - -void test_ref() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( ref_vector(Matrix()) ); - CALL_SUBTEST_1( check_const_correctness(Matrix()) ); - CALL_SUBTEST_2( ref_vector(Vector4d()) ); - CALL_SUBTEST_2( check_const_correctness(Matrix4d()) ); - CALL_SUBTEST_3( ref_vector(Vector4cf()) ); - CALL_SUBTEST_4( ref_vector(VectorXcf(8)) ); - CALL_SUBTEST_5( ref_vector(VectorXi(12)) ); - CALL_SUBTEST_5( check_const_correctness(VectorXi(12)) ); - - CALL_SUBTEST_1( ref_matrix(Matrix()) ); - CALL_SUBTEST_2( ref_matrix(Matrix4d()) ); - CALL_SUBTEST_1( ref_matrix(Matrix()) ); - CALL_SUBTEST_4( ref_matrix(MatrixXcf(internal::random(1,10),internal::random(1,10))) ); - CALL_SUBTEST_4( ref_matrix(Matrix,10,15>()) ); - CALL_SUBTEST_5( ref_matrix(MatrixXi(internal::random(1,10),internal::random(1,10))) ); - CALL_SUBTEST_6( call_ref() ); - } - - CALL_SUBTEST_7( test_ref_overloads() ); -} diff --git a/testbed/nanogui/ext/eigen/test/resize.cpp b/testbed/nanogui/ext/eigen/test/resize.cpp deleted file mode 100644 index 4adaafe5..00000000 --- a/testbed/nanogui/ext/eigen/test/resize.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Keir Mierle -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template -void resizeLikeTest() -{ - MatrixXf A(rows, cols); - MatrixXf B; - Matrix C; - B.resizeLike(A); - C.resizeLike(B); // Shouldn't crash. - VERIFY(B.rows() == rows && B.cols() == cols); - - VectorXf x(rows); - RowVectorXf y; - y.resizeLike(x); - VERIFY(y.rows() == 1 && y.cols() == rows); - - y.resize(cols); - x.resizeLike(y); - VERIFY(x.rows() == cols && x.cols() == 1); -} - -void resizeLikeTest12() { resizeLikeTest<1,2>(); } -void resizeLikeTest1020() { resizeLikeTest<10,20>(); } -void resizeLikeTest31() { resizeLikeTest<3,1>(); } - -void test_resize() -{ - CALL_SUBTEST(resizeLikeTest12() ); - CALL_SUBTEST(resizeLikeTest1020() ); - CALL_SUBTEST(resizeLikeTest31() ); -} diff --git a/testbed/nanogui/ext/eigen/test/rvalue_types.cpp b/testbed/nanogui/ext/eigen/test/rvalue_types.cpp deleted file mode 100644 index 8887f1b1..00000000 --- a/testbed/nanogui/ext/eigen/test/rvalue_types.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2013 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include - -using internal::UIntPtr; - -#if EIGEN_HAS_RVALUE_REFERENCES -template -void rvalue_copyassign(const MatrixType& m) -{ - - typedef typename internal::traits::Scalar Scalar; - - // create a temporary which we are about to destroy by moving - MatrixType tmp = m; - UIntPtr src_address = reinterpret_cast(tmp.data()); - - // move the temporary to n - MatrixType n = std::move(tmp); - UIntPtr dst_address = reinterpret_cast(n.data()); - - if (MatrixType::RowsAtCompileTime==Dynamic|| MatrixType::ColsAtCompileTime==Dynamic) - { - // verify that we actually moved the guts - VERIFY_IS_EQUAL(src_address, dst_address); - } - - // verify that the content did not change - Scalar abs_diff = (m-n).array().abs().sum(); - VERIFY_IS_EQUAL(abs_diff, Scalar(0)); -} -#else -template -void rvalue_copyassign(const MatrixType&) {} -#endif - -void test_rvalue_types() -{ - CALL_SUBTEST_1(rvalue_copyassign( MatrixXf::Random(50,50).eval() )); - CALL_SUBTEST_1(rvalue_copyassign( ArrayXXf::Random(50,50).eval() )); - - CALL_SUBTEST_1(rvalue_copyassign( Matrix::Random(50).eval() )); - CALL_SUBTEST_1(rvalue_copyassign( Array::Random(50).eval() )); - - CALL_SUBTEST_1(rvalue_copyassign( Matrix::Random(50).eval() )); - CALL_SUBTEST_1(rvalue_copyassign( Array::Random(50).eval() )); - - CALL_SUBTEST_2(rvalue_copyassign( Array::Random().eval() )); - CALL_SUBTEST_2(rvalue_copyassign( Array::Random().eval() )); - CALL_SUBTEST_2(rvalue_copyassign( Array::Random().eval() )); - - CALL_SUBTEST_2(rvalue_copyassign( Array::Random().eval() )); - CALL_SUBTEST_2(rvalue_copyassign( Array::Random().eval() )); - CALL_SUBTEST_2(rvalue_copyassign( Array::Random().eval() )); -} diff --git a/testbed/nanogui/ext/eigen/test/schur_complex.cpp b/testbed/nanogui/ext/eigen/test/schur_complex.cpp deleted file mode 100644 index deb78e44..00000000 --- a/testbed/nanogui/ext/eigen/test/schur_complex.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010,2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template void schur(int size = MatrixType::ColsAtCompileTime) -{ - typedef typename ComplexSchur::ComplexScalar ComplexScalar; - typedef typename ComplexSchur::ComplexMatrixType ComplexMatrixType; - - // Test basic functionality: T is triangular and A = U T U* - for(int counter = 0; counter < g_repeat; ++counter) { - MatrixType A = MatrixType::Random(size, size); - ComplexSchur schurOfA(A); - VERIFY_IS_EQUAL(schurOfA.info(), Success); - ComplexMatrixType U = schurOfA.matrixU(); - ComplexMatrixType T = schurOfA.matrixT(); - for(int row = 1; row < size; ++row) { - for(int col = 0; col < row; ++col) { - VERIFY(T(row,col) == (typename MatrixType::Scalar)0); - } - } - VERIFY_IS_APPROX(A.template cast(), U * T * U.adjoint()); - } - - // Test asserts when not initialized - ComplexSchur csUninitialized; - VERIFY_RAISES_ASSERT(csUninitialized.matrixT()); - VERIFY_RAISES_ASSERT(csUninitialized.matrixU()); - VERIFY_RAISES_ASSERT(csUninitialized.info()); - - // Test whether compute() and constructor returns same result - MatrixType A = MatrixType::Random(size, size); - ComplexSchur cs1; - cs1.compute(A); - ComplexSchur cs2(A); - VERIFY_IS_EQUAL(cs1.info(), Success); - VERIFY_IS_EQUAL(cs2.info(), Success); - VERIFY_IS_EQUAL(cs1.matrixT(), cs2.matrixT()); - VERIFY_IS_EQUAL(cs1.matrixU(), cs2.matrixU()); - - // Test maximum number of iterations - ComplexSchur cs3; - cs3.setMaxIterations(ComplexSchur::m_maxIterationsPerRow * size).compute(A); - VERIFY_IS_EQUAL(cs3.info(), Success); - VERIFY_IS_EQUAL(cs3.matrixT(), cs1.matrixT()); - VERIFY_IS_EQUAL(cs3.matrixU(), cs1.matrixU()); - cs3.setMaxIterations(1).compute(A); - VERIFY_IS_EQUAL(cs3.info(), size > 1 ? NoConvergence : Success); - VERIFY_IS_EQUAL(cs3.getMaxIterations(), 1); - - MatrixType Atriangular = A; - Atriangular.template triangularView().setZero(); - cs3.setMaxIterations(1).compute(Atriangular); // triangular matrices do not need any iterations - VERIFY_IS_EQUAL(cs3.info(), Success); - VERIFY_IS_EQUAL(cs3.matrixT(), Atriangular.template cast()); - VERIFY_IS_EQUAL(cs3.matrixU(), ComplexMatrixType::Identity(size, size)); - - // Test computation of only T, not U - ComplexSchur csOnlyT(A, false); - VERIFY_IS_EQUAL(csOnlyT.info(), Success); - VERIFY_IS_EQUAL(cs1.matrixT(), csOnlyT.matrixT()); - VERIFY_RAISES_ASSERT(csOnlyT.matrixU()); - - if (size > 1 && size < 20) - { - // Test matrix with NaN - A(0,0) = std::numeric_limits::quiet_NaN(); - ComplexSchur csNaN(A); - VERIFY_IS_EQUAL(csNaN.info(), NoConvergence); - } -} - -void test_schur_complex() -{ - CALL_SUBTEST_1(( schur() )); - CALL_SUBTEST_2(( schur(internal::random(1,EIGEN_TEST_MAX_SIZE/4)) )); - CALL_SUBTEST_3(( schur, 1, 1> >() )); - CALL_SUBTEST_4(( schur >() )); - - // Test problem size constructors - CALL_SUBTEST_5(ComplexSchur(10)); -} diff --git a/testbed/nanogui/ext/eigen/test/schur_real.cpp b/testbed/nanogui/ext/eigen/test/schur_real.cpp deleted file mode 100644 index 4aede87d..00000000 --- a/testbed/nanogui/ext/eigen/test/schur_real.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010,2012 Jitse Niesen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template void verifyIsQuasiTriangular(const MatrixType& T) -{ - typedef typename MatrixType::Index Index; - - const Index size = T.cols(); - typedef typename MatrixType::Scalar Scalar; - - // Check T is lower Hessenberg - for(int row = 2; row < size; ++row) { - for(int col = 0; col < row - 1; ++col) { - VERIFY(T(row,col) == Scalar(0)); - } - } - - // Check that any non-zero on the subdiagonal is followed by a zero and is - // part of a 2x2 diagonal block with imaginary eigenvalues. - for(int row = 1; row < size; ++row) { - if (T(row,row-1) != Scalar(0)) { - VERIFY(row == size-1 || T(row+1,row) == 0); - Scalar tr = T(row-1,row-1) + T(row,row); - Scalar det = T(row-1,row-1) * T(row,row) - T(row-1,row) * T(row,row-1); - VERIFY(4 * det > tr * tr); - } - } -} - -template void schur(int size = MatrixType::ColsAtCompileTime) -{ - // Test basic functionality: T is quasi-triangular and A = U T U* - for(int counter = 0; counter < g_repeat; ++counter) { - MatrixType A = MatrixType::Random(size, size); - RealSchur schurOfA(A); - VERIFY_IS_EQUAL(schurOfA.info(), Success); - MatrixType U = schurOfA.matrixU(); - MatrixType T = schurOfA.matrixT(); - verifyIsQuasiTriangular(T); - VERIFY_IS_APPROX(A, U * T * U.transpose()); - } - - // Test asserts when not initialized - RealSchur rsUninitialized; - VERIFY_RAISES_ASSERT(rsUninitialized.matrixT()); - VERIFY_RAISES_ASSERT(rsUninitialized.matrixU()); - VERIFY_RAISES_ASSERT(rsUninitialized.info()); - - // Test whether compute() and constructor returns same result - MatrixType A = MatrixType::Random(size, size); - RealSchur rs1; - rs1.compute(A); - RealSchur rs2(A); - VERIFY_IS_EQUAL(rs1.info(), Success); - VERIFY_IS_EQUAL(rs2.info(), Success); - VERIFY_IS_EQUAL(rs1.matrixT(), rs2.matrixT()); - VERIFY_IS_EQUAL(rs1.matrixU(), rs2.matrixU()); - - // Test maximum number of iterations - RealSchur rs3; - rs3.setMaxIterations(RealSchur::m_maxIterationsPerRow * size).compute(A); - VERIFY_IS_EQUAL(rs3.info(), Success); - VERIFY_IS_EQUAL(rs3.matrixT(), rs1.matrixT()); - VERIFY_IS_EQUAL(rs3.matrixU(), rs1.matrixU()); - if (size > 2) { - rs3.setMaxIterations(1).compute(A); - VERIFY_IS_EQUAL(rs3.info(), NoConvergence); - VERIFY_IS_EQUAL(rs3.getMaxIterations(), 1); - } - - MatrixType Atriangular = A; - Atriangular.template triangularView().setZero(); - rs3.setMaxIterations(1).compute(Atriangular); // triangular matrices do not need any iterations - VERIFY_IS_EQUAL(rs3.info(), Success); - VERIFY_IS_APPROX(rs3.matrixT(), Atriangular); // approx because of scaling... - VERIFY_IS_EQUAL(rs3.matrixU(), MatrixType::Identity(size, size)); - - // Test computation of only T, not U - RealSchur rsOnlyT(A, false); - VERIFY_IS_EQUAL(rsOnlyT.info(), Success); - VERIFY_IS_EQUAL(rs1.matrixT(), rsOnlyT.matrixT()); - VERIFY_RAISES_ASSERT(rsOnlyT.matrixU()); - - if (size > 2 && size < 20) - { - // Test matrix with NaN - A(0,0) = std::numeric_limits::quiet_NaN(); - RealSchur rsNaN(A); - VERIFY_IS_EQUAL(rsNaN.info(), NoConvergence); - } -} - -void test_schur_real() -{ - CALL_SUBTEST_1(( schur() )); - CALL_SUBTEST_2(( schur(internal::random(1,EIGEN_TEST_MAX_SIZE/4)) )); - CALL_SUBTEST_3(( schur >() )); - CALL_SUBTEST_4(( schur >() )); - - // Test problem size constructors - CALL_SUBTEST_5(RealSchur(10)); -} diff --git a/testbed/nanogui/ext/eigen/test/selfadjoint.cpp b/testbed/nanogui/ext/eigen/test/selfadjoint.cpp deleted file mode 100644 index 92401e50..00000000 --- a/testbed/nanogui/ext/eigen/test/selfadjoint.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// This file is triangularView of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -// This file tests the basic selfadjointView API, -// the related products and decompositions are tested in specific files. - -template void selfadjoint(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - m4(rows, cols); - - m1.diagonal() = m1.diagonal().real().template cast(); - - // check selfadjoint to dense - m3 = m1.template selfadjointView(); - VERIFY_IS_APPROX(MatrixType(m3.template triangularView()), MatrixType(m1.template triangularView())); - VERIFY_IS_APPROX(m3, m3.adjoint()); - - m3 = m1.template selfadjointView(); - VERIFY_IS_APPROX(MatrixType(m3.template triangularView()), MatrixType(m1.template triangularView())); - VERIFY_IS_APPROX(m3, m3.adjoint()); - - m3 = m1.template selfadjointView(); - m4 = m2; - m4 += m1.template selfadjointView(); - VERIFY_IS_APPROX(m4, m2+m3); - - m3 = m1.template selfadjointView(); - m4 = m2; - m4 -= m1.template selfadjointView(); - VERIFY_IS_APPROX(m4, m2-m3); -} - -void bug_159() -{ - Matrix3d m = Matrix3d::Random().selfadjointView(); - EIGEN_UNUSED_VARIABLE(m) -} - -void test_selfadjoint() -{ - for(int i = 0; i < g_repeat ; i++) - { - int s = internal::random(1,EIGEN_TEST_MAX_SIZE); - - CALL_SUBTEST_1( selfadjoint(Matrix()) ); - CALL_SUBTEST_2( selfadjoint(Matrix()) ); - CALL_SUBTEST_3( selfadjoint(Matrix3cf()) ); - CALL_SUBTEST_4( selfadjoint(MatrixXcd(s,s)) ); - CALL_SUBTEST_5( selfadjoint(Matrix(s, s)) ); - - TEST_SET_BUT_UNUSED_VARIABLE(s) - } - - CALL_SUBTEST_1( bug_159() ); -} diff --git a/testbed/nanogui/ext/eigen/test/simplicial_cholesky.cpp b/testbed/nanogui/ext/eigen/test/simplicial_cholesky.cpp deleted file mode 100644 index 649c817b..00000000 --- a/testbed/nanogui/ext/eigen/test/simplicial_cholesky.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse_solver.h" - -template void test_simplicial_cholesky_T() -{ - typedef SparseMatrix SparseMatrixType; - SimplicialCholesky chol_colmajor_lower_amd; - SimplicialCholesky chol_colmajor_upper_amd; - SimplicialLLT< SparseMatrixType, Lower> llt_colmajor_lower_amd; - SimplicialLLT< SparseMatrixType, Upper> llt_colmajor_upper_amd; - SimplicialLDLT< SparseMatrixType, Lower> ldlt_colmajor_lower_amd; - SimplicialLDLT< SparseMatrixType, Upper> ldlt_colmajor_upper_amd; - SimplicialLDLT< SparseMatrixType, Lower, NaturalOrdering > ldlt_colmajor_lower_nat; - SimplicialLDLT< SparseMatrixType, Upper, NaturalOrdering > ldlt_colmajor_upper_nat; - - check_sparse_spd_solving(chol_colmajor_lower_amd); - check_sparse_spd_solving(chol_colmajor_upper_amd); - check_sparse_spd_solving(llt_colmajor_lower_amd); - check_sparse_spd_solving(llt_colmajor_upper_amd); - check_sparse_spd_solving(ldlt_colmajor_lower_amd); - check_sparse_spd_solving(ldlt_colmajor_upper_amd); - - check_sparse_spd_determinant(chol_colmajor_lower_amd); - check_sparse_spd_determinant(chol_colmajor_upper_amd); - check_sparse_spd_determinant(llt_colmajor_lower_amd); - check_sparse_spd_determinant(llt_colmajor_upper_amd); - check_sparse_spd_determinant(ldlt_colmajor_lower_amd); - check_sparse_spd_determinant(ldlt_colmajor_upper_amd); - - check_sparse_spd_solving(ldlt_colmajor_lower_nat, 300, 1000); - check_sparse_spd_solving(ldlt_colmajor_upper_nat, 300, 1000); -} - -void test_simplicial_cholesky() -{ - CALL_SUBTEST_1(( test_simplicial_cholesky_T() )); - CALL_SUBTEST_2(( test_simplicial_cholesky_T, int>() )); - CALL_SUBTEST_3(( test_simplicial_cholesky_T() )); -} diff --git a/testbed/nanogui/ext/eigen/test/sizeof.cpp b/testbed/nanogui/ext/eigen/test/sizeof.cpp deleted file mode 100644 index 03ad2045..00000000 --- a/testbed/nanogui/ext/eigen/test/sizeof.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void verifySizeOf(const MatrixType&) -{ - typedef typename MatrixType::Scalar Scalar; - if (MatrixType::RowsAtCompileTime!=Dynamic && MatrixType::ColsAtCompileTime!=Dynamic) - VERIFY_IS_EQUAL(std::ptrdiff_t(sizeof(MatrixType)),std::ptrdiff_t(sizeof(Scalar))*std::ptrdiff_t(MatrixType::SizeAtCompileTime)); - else - VERIFY_IS_EQUAL(sizeof(MatrixType),sizeof(Scalar*) + 2 * sizeof(typename MatrixType::Index)); -} - -void test_sizeof() -{ - CALL_SUBTEST(verifySizeOf(Matrix()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Array()) ); - CALL_SUBTEST(verifySizeOf(Vector2d()) ); - CALL_SUBTEST(verifySizeOf(Vector4f()) ); - CALL_SUBTEST(verifySizeOf(Matrix4d()) ); - CALL_SUBTEST(verifySizeOf(Matrix()) ); - CALL_SUBTEST(verifySizeOf(Matrix()) ); - CALL_SUBTEST(verifySizeOf(MatrixXcf(3, 3)) ); - CALL_SUBTEST(verifySizeOf(MatrixXi(8, 12)) ); - CALL_SUBTEST(verifySizeOf(MatrixXcd(20, 20)) ); - CALL_SUBTEST(verifySizeOf(Matrix()) ); - - VERIFY(sizeof(std::complex) == 2*sizeof(float)); - VERIFY(sizeof(std::complex) == 2*sizeof(double)); -} diff --git a/testbed/nanogui/ext/eigen/test/sizeoverflow.cpp b/testbed/nanogui/ext/eigen/test/sizeoverflow.cpp deleted file mode 100644 index 240d2229..00000000 --- a/testbed/nanogui/ext/eigen/test/sizeoverflow.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#define VERIFY_THROWS_BADALLOC(a) { \ - bool threw = false; \ - try { \ - a; \ - } \ - catch (std::bad_alloc&) { threw = true; } \ - VERIFY(threw && "should have thrown bad_alloc: " #a); \ - } - -template -void triggerMatrixBadAlloc(Index rows, Index cols) -{ - VERIFY_THROWS_BADALLOC( MatrixType m(rows, cols) ); - VERIFY_THROWS_BADALLOC( MatrixType m; m.resize(rows, cols) ); - VERIFY_THROWS_BADALLOC( MatrixType m; m.conservativeResize(rows, cols) ); -} - -template -void triggerVectorBadAlloc(Index size) -{ - VERIFY_THROWS_BADALLOC( VectorType v(size) ); - VERIFY_THROWS_BADALLOC( VectorType v; v.resize(size) ); - VERIFY_THROWS_BADALLOC( VectorType v; v.conservativeResize(size) ); -} - -void test_sizeoverflow() -{ - // there are 2 levels of overflow checking. first in PlainObjectBase.h we check for overflow in rows*cols computations. - // this is tested in tests of the form times_itself_gives_0 * times_itself_gives_0 - // Then in Memory.h we check for overflow in size * sizeof(T) computations. - // this is tested in tests of the form times_4_gives_0 * sizeof(float) - - size_t times_itself_gives_0 = size_t(1) << (8 * sizeof(Index) / 2); - VERIFY(times_itself_gives_0 * times_itself_gives_0 == 0); - - size_t times_4_gives_0 = size_t(1) << (8 * sizeof(Index) - 2); - VERIFY(times_4_gives_0 * 4 == 0); - - size_t times_8_gives_0 = size_t(1) << (8 * sizeof(Index) - 3); - VERIFY(times_8_gives_0 * 8 == 0); - - triggerMatrixBadAlloc(times_itself_gives_0, times_itself_gives_0); - triggerMatrixBadAlloc(times_itself_gives_0 / 4, times_itself_gives_0); - triggerMatrixBadAlloc(times_4_gives_0, 1); - - triggerMatrixBadAlloc(times_itself_gives_0, times_itself_gives_0); - triggerMatrixBadAlloc(times_itself_gives_0 / 8, times_itself_gives_0); - triggerMatrixBadAlloc(times_8_gives_0, 1); - - triggerVectorBadAlloc(times_4_gives_0); - - triggerVectorBadAlloc(times_8_gives_0); -} diff --git a/testbed/nanogui/ext/eigen/test/smallvectors.cpp b/testbed/nanogui/ext/eigen/test/smallvectors.cpp deleted file mode 100644 index 78151139..00000000 --- a/testbed/nanogui/ext/eigen/test/smallvectors.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2006-2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT -#include "main.h" - -template void smallVectors() -{ - typedef Matrix V2; - typedef Matrix V3; - typedef Matrix V4; - typedef Matrix VX; - Scalar x1 = internal::random(), - x2 = internal::random(), - x3 = internal::random(), - x4 = internal::random(); - V2 v2(x1, x2); - V3 v3(x1, x2, x3); - V4 v4(x1, x2, x3, x4); - VERIFY_IS_APPROX(x1, v2.x()); - VERIFY_IS_APPROX(x1, v3.x()); - VERIFY_IS_APPROX(x1, v4.x()); - VERIFY_IS_APPROX(x2, v2.y()); - VERIFY_IS_APPROX(x2, v3.y()); - VERIFY_IS_APPROX(x2, v4.y()); - VERIFY_IS_APPROX(x3, v3.z()); - VERIFY_IS_APPROX(x3, v4.z()); - VERIFY_IS_APPROX(x4, v4.w()); - - if (!NumTraits::IsInteger) - { - VERIFY_RAISES_ASSERT(V3(2, 1)) - VERIFY_RAISES_ASSERT(V3(3, 2)) - VERIFY_RAISES_ASSERT(V3(Scalar(3), 1)) - VERIFY_RAISES_ASSERT(V3(3, Scalar(1))) - VERIFY_RAISES_ASSERT(V3(Scalar(3), Scalar(1))) - VERIFY_RAISES_ASSERT(V3(Scalar(123), Scalar(123))) - - VERIFY_RAISES_ASSERT(V4(1, 3)) - VERIFY_RAISES_ASSERT(V4(2, 4)) - VERIFY_RAISES_ASSERT(V4(1, Scalar(4))) - VERIFY_RAISES_ASSERT(V4(Scalar(1), 4)) - VERIFY_RAISES_ASSERT(V4(Scalar(1), Scalar(4))) - VERIFY_RAISES_ASSERT(V4(Scalar(123), Scalar(123))) - - VERIFY_RAISES_ASSERT(VX(3, 2)) - VERIFY_RAISES_ASSERT(VX(Scalar(3), 1)) - VERIFY_RAISES_ASSERT(VX(3, Scalar(1))) - VERIFY_RAISES_ASSERT(VX(Scalar(3), Scalar(1))) - VERIFY_RAISES_ASSERT(VX(Scalar(123), Scalar(123))) - } -} - -void test_smallvectors() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST(smallVectors() ); - CALL_SUBTEST(smallVectors() ); - CALL_SUBTEST(smallVectors() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/sparse.h b/testbed/nanogui/ext/eigen/test/sparse.h deleted file mode 100644 index 9912e1e2..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse.h +++ /dev/null @@ -1,210 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_TESTSPARSE_H -#define EIGEN_TESTSPARSE_H - -#define EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET - -#include "main.h" - -#if EIGEN_GNUC_AT_LEAST(4,0) && !defined __ICC && !defined(__clang__) - -#ifdef min -#undef min -#endif - -#ifdef max -#undef max -#endif - -#include -#define EIGEN_UNORDERED_MAP_SUPPORT -namespace std { - using std::tr1::unordered_map; -} -#endif - -#ifdef EIGEN_GOOGLEHASH_SUPPORT - #include -#endif - -#include -#include -#include - -enum { - ForceNonZeroDiag = 1, - MakeLowerTriangular = 2, - MakeUpperTriangular = 4, - ForceRealDiag = 8 -}; - -/* Initializes both a sparse and dense matrix with same random values, - * and a ratio of \a density non zero entries. - * \param flags is a union of ForceNonZeroDiag, MakeLowerTriangular and MakeUpperTriangular - * allowing to control the shape of the matrix. - * \param zeroCoords and nonzeroCoords allows to get the coordinate lists of the non zero, - * and zero coefficients respectively. - */ -template void -initSparse(double density, - Matrix& refMat, - SparseMatrix& sparseMat, - int flags = 0, - std::vector >* zeroCoords = 0, - std::vector >* nonzeroCoords = 0) -{ - enum { IsRowMajor = SparseMatrix::IsRowMajor }; - sparseMat.setZero(); - //sparseMat.reserve(int(refMat.rows()*refMat.cols()*density)); - sparseMat.reserve(VectorXi::Constant(IsRowMajor ? refMat.rows() : refMat.cols(), int((1.5*density)*(IsRowMajor?refMat.cols():refMat.rows())))); - - for(Index j=0; j(0,1) < density) ? internal::random() : Scalar(0); - if ((flags&ForceNonZeroDiag) && (i==j)) - { - // FIXME: the following is too conservative - v = internal::random()*Scalar(3.); - v = v*v; - if(numext::real(v)>0) v += Scalar(5); - else v -= Scalar(5); - } - if ((flags & MakeLowerTriangular) && aj>ai) - v = Scalar(0); - else if ((flags & MakeUpperTriangular) && ajpush_back(Matrix (ai,aj)); - } - else if (zeroCoords) - { - zeroCoords->push_back(Matrix (ai,aj)); - } - refMat(ai,aj) = v; - } - } - //sparseMat.finalize(); -} - -template void -initSparse(double density, - Matrix& refMat, - DynamicSparseMatrix& sparseMat, - int flags = 0, - std::vector >* zeroCoords = 0, - std::vector >* nonzeroCoords = 0) -{ - enum { IsRowMajor = DynamicSparseMatrix::IsRowMajor }; - sparseMat.setZero(); - sparseMat.reserve(int(refMat.rows()*refMat.cols()*density)); - for(int j=0; j(0,1) < density) ? internal::random() : Scalar(0); - if ((flags&ForceNonZeroDiag) && (i==j)) - { - v = internal::random()*Scalar(3.); - v = v*v + Scalar(5.); - } - if ((flags & MakeLowerTriangular) && aj>ai) - v = Scalar(0); - else if ((flags & MakeUpperTriangular) && ajpush_back(Matrix (ai,aj)); - } - else if (zeroCoords) - { - zeroCoords->push_back(Matrix (ai,aj)); - } - refMat(ai,aj) = v; - } - } - sparseMat.finalize(); -} - -template void -initSparse(double density, - Matrix& refVec, - SparseVector& sparseVec, - std::vector* zeroCoords = 0, - std::vector* nonzeroCoords = 0) -{ - sparseVec.reserve(int(refVec.size()*density)); - sparseVec.setZero(); - for(int i=0; i(0,1) < density) ? internal::random() : Scalar(0); - if (v!=Scalar(0)) - { - sparseVec.insertBack(i) = v; - if (nonzeroCoords) - nonzeroCoords->push_back(i); - } - else if (zeroCoords) - zeroCoords->push_back(i); - refVec[i] = v; - } -} - -template void -initSparse(double density, - Matrix& refVec, - SparseVector& sparseVec, - std::vector* zeroCoords = 0, - std::vector* nonzeroCoords = 0) -{ - sparseVec.reserve(int(refVec.size()*density)); - sparseVec.setZero(); - for(int i=0; i(0,1) < density) ? internal::random() : Scalar(0); - if (v!=Scalar(0)) - { - sparseVec.insertBack(i) = v; - if (nonzeroCoords) - nonzeroCoords->push_back(i); - } - else if (zeroCoords) - zeroCoords->push_back(i); - refVec[i] = v; - } -} - - -#include -#endif // EIGEN_TESTSPARSE_H diff --git a/testbed/nanogui/ext/eigen/test/sparseLM.cpp b/testbed/nanogui/ext/eigen/test/sparseLM.cpp deleted file mode 100644 index 8e148f9b..00000000 --- a/testbed/nanogui/ext/eigen/test/sparseLM.cpp +++ /dev/null @@ -1,176 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Desire Nuentsa -// Copyright (C) 2012 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -#include -#include -#include - -#include "main.h" -#include - -using namespace std; -using namespace Eigen; - -template -struct sparseGaussianTest : SparseFunctor -{ - typedef Matrix VectorType; - typedef SparseFunctor Base; - typedef typename Base::JacobianType JacobianType; - sparseGaussianTest(int inputs, int values) : SparseFunctor(inputs,values) - { } - - VectorType model(const VectorType& uv, VectorType& x) - { - VectorType y; //Change this to use expression template - int m = Base::values(); - int n = Base::inputs(); - eigen_assert(uv.size()%2 == 0); - eigen_assert(uv.size() == n); - eigen_assert(x.size() == m); - y.setZero(m); - int half = n/2; - VectorBlock u(uv, 0, half); - VectorBlock v(uv, half, half); - Scalar coeff; - for (int j = 0; j < m; j++) - { - for (int i = 0; i < half; i++) - { - coeff = (x(j)-i)/v(i); - coeff *= coeff; - if (coeff < 1. && coeff > 0.) - y(j) += u(i)*std::pow((1-coeff), 2); - } - } - return y; - } - void initPoints(VectorType& uv_ref, VectorType& x) - { - m_x = x; - m_y = this->model(uv_ref,x); - } - int operator()(const VectorType& uv, VectorType& fvec) - { - int m = Base::values(); - int n = Base::inputs(); - eigen_assert(uv.size()%2 == 0); - eigen_assert(uv.size() == n); - int half = n/2; - VectorBlock u(uv, 0, half); - VectorBlock v(uv, half, half); - fvec = m_y; - Scalar coeff; - for (int j = 0; j < m; j++) - { - for (int i = 0; i < half; i++) - { - coeff = (m_x(j)-i)/v(i); - coeff *= coeff; - if (coeff < 1. && coeff > 0.) - fvec(j) -= u(i)*std::pow((1-coeff), 2); - } - } - return 0; - } - - int df(const VectorType& uv, JacobianType& fjac) - { - int m = Base::values(); - int n = Base::inputs(); - eigen_assert(n == uv.size()); - eigen_assert(fjac.rows() == m); - eigen_assert(fjac.cols() == n); - int half = n/2; - VectorBlock u(uv, 0, half); - VectorBlock v(uv, half, half); - Scalar coeff; - - //Derivatives with respect to u - for (int col = 0; col < half; col++) - { - for (int row = 0; row < m; row++) - { - coeff = (m_x(row)-col)/v(col); - coeff = coeff*coeff; - if(coeff < 1. && coeff > 0.) - { - fjac.coeffRef(row,col) = -(1-coeff)*(1-coeff); - } - } - } - //Derivatives with respect to v - for (int col = 0; col < half; col++) - { - for (int row = 0; row < m; row++) - { - coeff = (m_x(row)-col)/v(col); - coeff = coeff*coeff; - if(coeff < 1. && coeff > 0.) - { - fjac.coeffRef(row,col+half) = -4 * (u(col)/v(col))*coeff*(1-coeff); - } - } - } - return 0; - } - - VectorType m_x, m_y; //Data points -}; - - -template -void test_sparseLM_T() -{ - typedef Matrix VectorType; - - int inputs = 10; - int values = 2000; - sparseGaussianTest sparse_gaussian(inputs, values); - VectorType uv(inputs),uv_ref(inputs); - VectorType x(values); - // Generate the reference solution - uv_ref << -2, 1, 4 ,8, 6, 1.8, 1.2, 1.1, 1.9 , 3; - //Generate the reference data points - x.setRandom(); - x = 10*x; - x.array() += 10; - sparse_gaussian.initPoints(uv_ref, x); - - - // Generate the initial parameters - VectorBlock u(uv, 0, inputs/2); - VectorBlock v(uv, inputs/2, inputs/2); - v.setOnes(); - //Generate u or Solve for u from v - u.setOnes(); - - // Solve the optimization problem - LevenbergMarquardt > lm(sparse_gaussian); - int info; -// info = lm.minimize(uv); - - VERIFY_IS_EQUAL(info,1); - // Do a step by step solution and save the residual - int maxiter = 200; - int iter = 0; - MatrixXd Err(values, maxiter); - MatrixXd Mod(values, maxiter); - LevenbergMarquardtSpace::Status status; - status = lm.minimizeInit(uv); - if (status==LevenbergMarquardtSpace::ImproperInputParameters) - return ; - -} -void test_sparseLM() -{ - CALL_SUBTEST_1(test_sparseLM_T()); - - // CALL_SUBTEST_2(test_sparseLM_T()); -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_basic.cpp b/testbed/nanogui/ext/eigen/test/sparse_basic.cpp deleted file mode 100644 index 38498502..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_basic.cpp +++ /dev/null @@ -1,688 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// Copyright (C) 2008 Daniel Gomez Ferro -// Copyright (C) 2013 Désiré Nuentsa-Wakam -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -static long g_realloc_count = 0; -#define EIGEN_SPARSE_COMPRESSED_STORAGE_REALLOCATE_PLUGIN g_realloc_count++; - -#include "sparse.h" - -template void sparse_basic(const SparseMatrixType& ref) -{ - typedef typename SparseMatrixType::StorageIndex StorageIndex; - typedef Matrix Vector2; - - const Index rows = ref.rows(); - const Index cols = ref.cols(); - //const Index inner = ref.innerSize(); - //const Index outer = ref.outerSize(); - - typedef typename SparseMatrixType::Scalar Scalar; - typedef typename SparseMatrixType::RealScalar RealScalar; - enum { Flags = SparseMatrixType::Flags }; - - double density = (std::max)(8./(rows*cols), 0.01); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - Scalar eps = 1e-6; - - Scalar s1 = internal::random(); - { - SparseMatrixType m(rows, cols); - DenseMatrix refMat = DenseMatrix::Zero(rows, cols); - DenseVector vec1 = DenseVector::Random(rows); - - std::vector zeroCoords; - std::vector nonzeroCoords; - initSparse(density, refMat, m, 0, &zeroCoords, &nonzeroCoords); - - // test coeff and coeffRef - for (std::size_t i=0; i >::value) - VERIFY_RAISES_ASSERT( m.coeffRef(zeroCoords[i].x(),zeroCoords[i].y()) = 5 ); - } - VERIFY_IS_APPROX(m, refMat); - - if(!nonzeroCoords.empty()) { - m.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5); - refMat.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5); - } - - VERIFY_IS_APPROX(m, refMat); - - // test assertion - VERIFY_RAISES_ASSERT( m.coeffRef(-1,1) = 0 ); - VERIFY_RAISES_ASSERT( m.coeffRef(0,m.cols()) = 0 ); - } - - // test insert (inner random) - { - DenseMatrix m1(rows,cols); - m1.setZero(); - SparseMatrixType m2(rows,cols); - bool call_reserve = internal::random()%2; - Index nnz = internal::random(1,int(rows)/2); - if(call_reserve) - { - if(internal::random()%2) - m2.reserve(VectorXi::Constant(m2.outerSize(), int(nnz))); - else - m2.reserve(m2.outerSize() * nnz); - } - g_realloc_count = 0; - for (Index j=0; j(0,rows-1); - if (m1.coeff(i,j)==Scalar(0)) - m2.insert(i,j) = m1(i,j) = internal::random(); - } - } - - if(call_reserve && !SparseMatrixType::IsRowMajor) - { - VERIFY(g_realloc_count==0); - } - - m2.finalize(); - VERIFY_IS_APPROX(m2,m1); - } - - // test insert (fully random) - { - DenseMatrix m1(rows,cols); - m1.setZero(); - SparseMatrixType m2(rows,cols); - if(internal::random()%2) - m2.reserve(VectorXi::Constant(m2.outerSize(), 2)); - for (int k=0; k(0,rows-1); - Index j = internal::random(0,cols-1); - if ((m1.coeff(i,j)==Scalar(0)) && (internal::random()%2)) - m2.insert(i,j) = m1(i,j) = internal::random(); - else - { - Scalar v = internal::random(); - m2.coeffRef(i,j) += v; - m1(i,j) += v; - } - } - VERIFY_IS_APPROX(m2,m1); - } - - // test insert (un-compressed) - for(int mode=0;mode<4;++mode) - { - DenseMatrix m1(rows,cols); - m1.setZero(); - SparseMatrixType m2(rows,cols); - VectorXi r(VectorXi::Constant(m2.outerSize(), ((mode%2)==0) ? int(m2.innerSize()) : std::max(1,int(m2.innerSize())/8))); - m2.reserve(r); - for (Index k=0; k(0,rows-1); - Index j = internal::random(0,cols-1); - if (m1.coeff(i,j)==Scalar(0)) - m2.insert(i,j) = m1(i,j) = internal::random(); - if(mode==3) - m2.reserve(r); - } - if(internal::random()%2) - m2.makeCompressed(); - VERIFY_IS_APPROX(m2,m1); - } - - // test basic computations - { - DenseMatrix refM1 = DenseMatrix::Zero(rows, cols); - DenseMatrix refM2 = DenseMatrix::Zero(rows, cols); - DenseMatrix refM3 = DenseMatrix::Zero(rows, cols); - DenseMatrix refM4 = DenseMatrix::Zero(rows, cols); - SparseMatrixType m1(rows, cols); - SparseMatrixType m2(rows, cols); - SparseMatrixType m3(rows, cols); - SparseMatrixType m4(rows, cols); - initSparse(density, refM1, m1); - initSparse(density, refM2, m2); - initSparse(density, refM3, m3); - initSparse(density, refM4, m4); - - if(internal::random()) - m1.makeCompressed(); - - Index m1_nnz = m1.nonZeros(); - - VERIFY_IS_APPROX(m1*s1, refM1*s1); - VERIFY_IS_APPROX(m1+m2, refM1+refM2); - VERIFY_IS_APPROX(m1+m2+m3, refM1+refM2+refM3); - VERIFY_IS_APPROX(m3.cwiseProduct(m1+m2), refM3.cwiseProduct(refM1+refM2)); - VERIFY_IS_APPROX(m1*s1-m2, refM1*s1-refM2); - VERIFY_IS_APPROX(m4=m1/s1, refM1/s1); - VERIFY_IS_EQUAL(m4.nonZeros(), m1_nnz); - - if(SparseMatrixType::IsRowMajor) - VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0))); - else - VERIFY_IS_APPROX(m1.innerVector(0).dot(refM2.col(0)), refM1.col(0).dot(refM2.col(0))); - - DenseVector rv = DenseVector::Random(m1.cols()); - DenseVector cv = DenseVector::Random(m1.rows()); - Index r = internal::random(0,m1.rows()-2); - Index c = internal::random(0,m1.cols()-1); - VERIFY_IS_APPROX(( m1.template block<1,Dynamic>(r,0,1,m1.cols()).dot(rv)) , refM1.row(r).dot(rv)); - VERIFY_IS_APPROX(m1.row(r).dot(rv), refM1.row(r).dot(rv)); - VERIFY_IS_APPROX(m1.col(c).dot(cv), refM1.col(c).dot(cv)); - - VERIFY_IS_APPROX(m1.conjugate(), refM1.conjugate()); - VERIFY_IS_APPROX(m1.real(), refM1.real()); - - refM4.setRandom(); - // sparse cwise* dense - VERIFY_IS_APPROX(m3.cwiseProduct(refM4), refM3.cwiseProduct(refM4)); - // dense cwise* sparse - VERIFY_IS_APPROX(refM4.cwiseProduct(m3), refM4.cwiseProduct(refM3)); -// VERIFY_IS_APPROX(m3.cwise()/refM4, refM3.cwise()/refM4); - - VERIFY_IS_APPROX(refM4 + m3, refM4 + refM3); - VERIFY_IS_APPROX(m3 + refM4, refM3 + refM4); - VERIFY_IS_APPROX(refM4 - m3, refM4 - refM3); - VERIFY_IS_APPROX(m3 - refM4, refM3 - refM4); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + RealScalar(0.5)*m3).eval(), RealScalar(0.5)*refM4 + RealScalar(0.5)*refM3); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + m3*RealScalar(0.5)).eval(), RealScalar(0.5)*refM4 + RealScalar(0.5)*refM3); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + m3.cwiseProduct(m3)).eval(), RealScalar(0.5)*refM4 + refM3.cwiseProduct(refM3)); - - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + RealScalar(0.5)*m3).eval(), RealScalar(0.5)*refM4 + RealScalar(0.5)*refM3); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + m3*RealScalar(0.5)).eval(), RealScalar(0.5)*refM4 + RealScalar(0.5)*refM3); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + (m3+m3)).eval(), RealScalar(0.5)*refM4 + (refM3+refM3)); - VERIFY_IS_APPROX(((refM3+m3)+RealScalar(0.5)*m3).eval(), RealScalar(0.5)*refM3 + (refM3+refM3)); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + (refM3+m3)).eval(), RealScalar(0.5)*refM4 + (refM3+refM3)); - VERIFY_IS_APPROX((RealScalar(0.5)*refM4 + (m3+refM3)).eval(), RealScalar(0.5)*refM4 + (refM3+refM3)); - - - VERIFY_IS_APPROX(m1.sum(), refM1.sum()); - - m4 = m1; refM4 = m4; - - VERIFY_IS_APPROX(m1*=s1, refM1*=s1); - VERIFY_IS_EQUAL(m1.nonZeros(), m1_nnz); - VERIFY_IS_APPROX(m1/=s1, refM1/=s1); - VERIFY_IS_EQUAL(m1.nonZeros(), m1_nnz); - - VERIFY_IS_APPROX(m1+=m2, refM1+=refM2); - VERIFY_IS_APPROX(m1-=m2, refM1-=refM2); - - if (rows>=2 && cols>=2) - { - VERIFY_RAISES_ASSERT( m1 += m1.innerVector(0) ); - VERIFY_RAISES_ASSERT( m1 -= m1.innerVector(0) ); - VERIFY_RAISES_ASSERT( refM1 -= m1.innerVector(0) ); - VERIFY_RAISES_ASSERT( refM1 += m1.innerVector(0) ); - m1 = m4; refM1 = refM4; - } - - // test aliasing - VERIFY_IS_APPROX((m1 = -m1), (refM1 = -refM1)); - VERIFY_IS_EQUAL(m1.nonZeros(), m1_nnz); - m1 = m4; refM1 = refM4; - VERIFY_IS_APPROX((m1 = m1.transpose()), (refM1 = refM1.transpose().eval())); - VERIFY_IS_EQUAL(m1.nonZeros(), m1_nnz); - m1 = m4; refM1 = refM4; - VERIFY_IS_APPROX((m1 = -m1.transpose()), (refM1 = -refM1.transpose().eval())); - VERIFY_IS_EQUAL(m1.nonZeros(), m1_nnz); - m1 = m4; refM1 = refM4; - VERIFY_IS_APPROX((m1 += -m1), (refM1 += -refM1)); - VERIFY_IS_EQUAL(m1.nonZeros(), m1_nnz); - m1 = m4; refM1 = refM4; - - if(m1.isCompressed()) - { - VERIFY_IS_APPROX(m1.coeffs().sum(), m1.sum()); - m1.coeffs() += s1; - for(Index j = 0; j SpBool; - SpBool mb1 = m1.real().template cast(); - SpBool mb2 = m2.real().template cast(); - VERIFY_IS_EQUAL(mb1.template cast().sum(), refM1.real().template cast().count()); - VERIFY_IS_EQUAL((mb1 && mb2).template cast().sum(), (refM1.real().template cast() && refM2.real().template cast()).count()); - VERIFY_IS_EQUAL((mb1 || mb2).template cast().sum(), (refM1.real().template cast() || refM2.real().template cast()).count()); - SpBool mb3 = mb1 && mb2; - if(mb1.coeffs().all() && mb2.coeffs().all()) - { - VERIFY_IS_EQUAL(mb3.nonZeros(), (refM1.real().template cast() && refM2.real().template cast()).count()); - } - } - } - - // test reverse iterators - { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); - SparseMatrixType m2(rows, cols); - initSparse(density, refMat2, m2); - std::vector ref_value(m2.innerSize()); - std::vector ref_index(m2.innerSize()); - if(internal::random()) - m2.makeCompressed(); - for(Index j = 0; j(density, refMat2, m2); - VERIFY_IS_APPROX(m2.transpose().eval(), refMat2.transpose().eval()); - VERIFY_IS_APPROX(m2.transpose(), refMat2.transpose()); - - VERIFY_IS_APPROX(SparseMatrixType(m2.adjoint()), refMat2.adjoint()); - - // check isApprox handles opposite storage order - typename Transpose::PlainObject m3(m2); - VERIFY(m2.isApprox(m3)); - } - - // test prune - { - SparseMatrixType m2(rows, cols); - DenseMatrix refM2(rows, cols); - refM2.setZero(); - int countFalseNonZero = 0; - int countTrueNonZero = 0; - m2.reserve(VectorXi::Constant(m2.outerSize(), int(m2.innerSize()))); - for (Index j=0; j(0,1); - if (x<0.1f) - { - // do nothing - } - else if (x<0.5f) - { - countFalseNonZero++; - m2.insert(i,j) = Scalar(0); - } - else - { - countTrueNonZero++; - m2.insert(i,j) = Scalar(1); - refM2(i,j) = Scalar(1); - } - } - } - if(internal::random()) - m2.makeCompressed(); - VERIFY(countFalseNonZero+countTrueNonZero == m2.nonZeros()); - if(countTrueNonZero>0) - VERIFY_IS_APPROX(m2, refM2); - m2.prune(Scalar(1)); - VERIFY(countTrueNonZero==m2.nonZeros()); - VERIFY_IS_APPROX(m2, refM2); - } - - // test setFromTriplets - { - typedef Triplet TripletType; - std::vector triplets; - Index ntriplets = rows*cols; - triplets.reserve(ntriplets); - DenseMatrix refMat_sum = DenseMatrix::Zero(rows,cols); - DenseMatrix refMat_prod = DenseMatrix::Zero(rows,cols); - DenseMatrix refMat_last = DenseMatrix::Zero(rows,cols); - - for(Index i=0;i(0,StorageIndex(rows-1)); - StorageIndex c = internal::random(0,StorageIndex(cols-1)); - Scalar v = internal::random(); - triplets.push_back(TripletType(r,c,v)); - refMat_sum(r,c) += v; - if(std::abs(refMat_prod(r,c))==0) - refMat_prod(r,c) = v; - else - refMat_prod(r,c) *= v; - refMat_last(r,c) = v; - } - SparseMatrixType m(rows,cols); - m.setFromTriplets(triplets.begin(), triplets.end()); - VERIFY_IS_APPROX(m, refMat_sum); - - m.setFromTriplets(triplets.begin(), triplets.end(), std::multiplies()); - VERIFY_IS_APPROX(m, refMat_prod); -#if (defined(__cplusplus) && __cplusplus >= 201103L) - m.setFromTriplets(triplets.begin(), triplets.end(), [] (Scalar,Scalar b) { return b; }); - VERIFY_IS_APPROX(m, refMat_last); -#endif - } - - // test Map - { - DenseMatrix refMat2(rows, cols), refMat3(rows, cols); - SparseMatrixType m2(rows, cols), m3(rows, cols); - initSparse(density, refMat2, m2); - initSparse(density, refMat3, m3); - { - Map mapMat2(m2.rows(), m2.cols(), m2.nonZeros(), m2.outerIndexPtr(), m2.innerIndexPtr(), m2.valuePtr(), m2.innerNonZeroPtr()); - Map mapMat3(m3.rows(), m3.cols(), m3.nonZeros(), m3.outerIndexPtr(), m3.innerIndexPtr(), m3.valuePtr(), m3.innerNonZeroPtr()); - VERIFY_IS_APPROX(mapMat2+mapMat3, refMat2+refMat3); - VERIFY_IS_APPROX(mapMat2+mapMat3, refMat2+refMat3); - } - { - MappedSparseMatrix mapMat2(m2.rows(), m2.cols(), m2.nonZeros(), m2.outerIndexPtr(), m2.innerIndexPtr(), m2.valuePtr(), m2.innerNonZeroPtr()); - MappedSparseMatrix mapMat3(m3.rows(), m3.cols(), m3.nonZeros(), m3.outerIndexPtr(), m3.innerIndexPtr(), m3.valuePtr(), m3.innerNonZeroPtr()); - VERIFY_IS_APPROX(mapMat2+mapMat3, refMat2+refMat3); - VERIFY_IS_APPROX(mapMat2+mapMat3, refMat2+refMat3); - } - - Index i = internal::random(0,rows-1); - Index j = internal::random(0,cols-1); - m2.coeffRef(i,j) = 123; - if(internal::random()) - m2.makeCompressed(); - Map mapMat2(rows, cols, m2.nonZeros(), m2.outerIndexPtr(), m2.innerIndexPtr(), m2.valuePtr(), m2.innerNonZeroPtr()); - VERIFY_IS_EQUAL(m2.coeff(i,j),Scalar(123)); - VERIFY_IS_EQUAL(mapMat2.coeff(i,j),Scalar(123)); - mapMat2.coeffRef(i,j) = -123; - VERIFY_IS_EQUAL(m2.coeff(i,j),Scalar(-123)); - } - - // test triangularView - { - DenseMatrix refMat2(rows, cols), refMat3(rows, cols); - SparseMatrixType m2(rows, cols), m3(rows, cols); - initSparse(density, refMat2, m2); - refMat3 = refMat2.template triangularView(); - m3 = m2.template triangularView(); - VERIFY_IS_APPROX(m3, refMat3); - - refMat3 = refMat2.template triangularView(); - m3 = m2.template triangularView(); - VERIFY_IS_APPROX(m3, refMat3); - - { - refMat3 = refMat2.template triangularView(); - m3 = m2.template triangularView(); - VERIFY_IS_APPROX(m3, refMat3); - - refMat3 = refMat2.template triangularView(); - m3 = m2.template triangularView(); - VERIFY_IS_APPROX(m3, refMat3); - } - - refMat3 = refMat2.template triangularView(); - m3 = m2.template triangularView(); - VERIFY_IS_APPROX(m3, refMat3); - - refMat3 = refMat2.template triangularView(); - m3 = m2.template triangularView(); - VERIFY_IS_APPROX(m3, refMat3); - - // check sparse-triangular to dense - refMat3 = m2.template triangularView(); - VERIFY_IS_APPROX(refMat3, DenseMatrix(refMat2.template triangularView())); - } - - // test selfadjointView - if(!SparseMatrixType::IsRowMajor) - { - DenseMatrix refMat2(rows, rows), refMat3(rows, rows); - SparseMatrixType m2(rows, rows), m3(rows, rows); - initSparse(density, refMat2, m2); - refMat3 = refMat2.template selfadjointView(); - m3 = m2.template selfadjointView(); - VERIFY_IS_APPROX(m3, refMat3); - - refMat3 += refMat2.template selfadjointView(); - m3 += m2.template selfadjointView(); - VERIFY_IS_APPROX(m3, refMat3); - - refMat3 -= refMat2.template selfadjointView(); - m3 -= m2.template selfadjointView(); - VERIFY_IS_APPROX(m3, refMat3); - - // selfadjointView only works for square matrices: - SparseMatrixType m4(rows, rows+1); - VERIFY_RAISES_ASSERT(m4.template selfadjointView()); - VERIFY_RAISES_ASSERT(m4.template selfadjointView()); - } - - // test sparseView - { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows); - SparseMatrixType m2(rows, rows); - initSparse(density, refMat2, m2); - VERIFY_IS_APPROX(m2.eval(), refMat2.sparseView().eval()); - - // sparse view on expressions: - VERIFY_IS_APPROX((s1*m2).eval(), (s1*refMat2).sparseView().eval()); - VERIFY_IS_APPROX((m2+m2).eval(), (refMat2+refMat2).sparseView().eval()); - VERIFY_IS_APPROX((m2*m2).eval(), (refMat2.lazyProduct(refMat2)).sparseView().eval()); - VERIFY_IS_APPROX((m2*m2).eval(), (refMat2*refMat2).sparseView().eval()); - } - - // test diagonal - { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); - SparseMatrixType m2(rows, cols); - initSparse(density, refMat2, m2); - VERIFY_IS_APPROX(m2.diagonal(), refMat2.diagonal().eval()); - DenseVector d = m2.diagonal(); - VERIFY_IS_APPROX(d, refMat2.diagonal().eval()); - d = m2.diagonal().array(); - VERIFY_IS_APPROX(d, refMat2.diagonal().eval()); - VERIFY_IS_APPROX(const_cast(m2).diagonal(), refMat2.diagonal().eval()); - - initSparse(density, refMat2, m2, ForceNonZeroDiag); - m2.diagonal() += refMat2.diagonal(); - refMat2.diagonal() += refMat2.diagonal(); - VERIFY_IS_APPROX(m2, refMat2); - } - - // test diagonal to sparse - { - DenseVector d = DenseVector::Random(rows); - DenseMatrix refMat2 = d.asDiagonal(); - SparseMatrixType m2(rows, rows); - m2 = d.asDiagonal(); - VERIFY_IS_APPROX(m2, refMat2); - SparseMatrixType m3(d.asDiagonal()); - VERIFY_IS_APPROX(m3, refMat2); - refMat2 += d.asDiagonal(); - m2 += d.asDiagonal(); - VERIFY_IS_APPROX(m2, refMat2); - } - - // test conservative resize - { - std::vector< std::pair > inc; - if(rows > 3 && cols > 2) - inc.push_back(std::pair(-3,-2)); - inc.push_back(std::pair(0,0)); - inc.push_back(std::pair(3,2)); - inc.push_back(std::pair(3,0)); - inc.push_back(std::pair(0,3)); - - for(size_t i = 0; i< inc.size(); i++) { - StorageIndex incRows = inc[i].first; - StorageIndex incCols = inc[i].second; - SparseMatrixType m1(rows, cols); - DenseMatrix refMat1 = DenseMatrix::Zero(rows, cols); - initSparse(density, refMat1, m1); - - m1.conservativeResize(rows+incRows, cols+incCols); - refMat1.conservativeResize(rows+incRows, cols+incCols); - if (incRows > 0) refMat1.bottomRows(incRows).setZero(); - if (incCols > 0) refMat1.rightCols(incCols).setZero(); - - VERIFY_IS_APPROX(m1, refMat1); - - // Insert new values - if (incRows > 0) - m1.insert(m1.rows()-1, 0) = refMat1(refMat1.rows()-1, 0) = 1; - if (incCols > 0) - m1.insert(0, m1.cols()-1) = refMat1(0, refMat1.cols()-1) = 1; - - VERIFY_IS_APPROX(m1, refMat1); - - - } - } - - // test Identity matrix - { - DenseMatrix refMat1 = DenseMatrix::Identity(rows, rows); - SparseMatrixType m1(rows, rows); - m1.setIdentity(); - VERIFY_IS_APPROX(m1, refMat1); - for(int k=0; k(0,rows-1); - Index j = internal::random(0,rows-1); - Scalar v = internal::random(); - m1.coeffRef(i,j) = v; - refMat1.coeffRef(i,j) = v; - VERIFY_IS_APPROX(m1, refMat1); - if(internal::random(0,10)<2) - m1.makeCompressed(); - } - m1.setIdentity(); - refMat1.setIdentity(); - VERIFY_IS_APPROX(m1, refMat1); - } - - // test array/vector of InnerIterator - { - typedef typename SparseMatrixType::InnerIterator IteratorType; - - DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); - SparseMatrixType m2(rows, cols); - initSparse(density, refMat2, m2); - IteratorType static_array[2]; - static_array[0] = IteratorType(m2,0); - static_array[1] = IteratorType(m2,m2.outerSize()-1); - VERIFY( static_array[0] || m2.innerVector(static_array[0].outer()).nonZeros() == 0 ); - VERIFY( static_array[1] || m2.innerVector(static_array[1].outer()).nonZeros() == 0 ); - if(static_array[0] && static_array[1]) - { - ++(static_array[1]); - static_array[1] = IteratorType(m2,0); - VERIFY( static_array[1] ); - VERIFY( static_array[1].index() == static_array[0].index() ); - VERIFY( static_array[1].outer() == static_array[0].outer() ); - VERIFY( static_array[1].value() == static_array[0].value() ); - } - - std::vector iters(2); - iters[0] = IteratorType(m2,0); - iters[1] = IteratorType(m2,m2.outerSize()-1); - } -} - - -template -void big_sparse_triplet(Index rows, Index cols, double density) { - typedef typename SparseMatrixType::StorageIndex StorageIndex; - typedef typename SparseMatrixType::Scalar Scalar; - typedef Triplet TripletType; - std::vector triplets; - double nelements = density * rows*cols; - VERIFY(nelements>=0 && nelements < NumTraits::highest()); - Index ntriplets = Index(nelements); - triplets.reserve(ntriplets); - Scalar sum = Scalar(0); - for(Index i=0;i(0,rows-1); - Index c = internal::random(0,cols-1); - Scalar v = internal::random(); - triplets.push_back(TripletType(r,c,v)); - sum += v; - } - SparseMatrixType m(rows,cols); - m.setFromTriplets(triplets.begin(), triplets.end()); - VERIFY(m.nonZeros() <= ntriplets); - VERIFY_IS_APPROX(sum, m.sum()); -} - - -void test_sparse_basic() -{ - for(int i = 0; i < g_repeat; i++) { - int r = Eigen::internal::random(1,200), c = Eigen::internal::random(1,200); - if(Eigen::internal::random(0,4) == 0) { - r = c; // check square matrices in 25% of tries - } - EIGEN_UNUSED_VARIABLE(r+c); - CALL_SUBTEST_1(( sparse_basic(SparseMatrix(1, 1)) )); - CALL_SUBTEST_1(( sparse_basic(SparseMatrix(8, 8)) )); - CALL_SUBTEST_2(( sparse_basic(SparseMatrix, ColMajor>(r, c)) )); - CALL_SUBTEST_2(( sparse_basic(SparseMatrix, RowMajor>(r, c)) )); - CALL_SUBTEST_1(( sparse_basic(SparseMatrix(r, c)) )); - CALL_SUBTEST_5(( sparse_basic(SparseMatrix(r, c)) )); - CALL_SUBTEST_5(( sparse_basic(SparseMatrix(r, c)) )); - - r = Eigen::internal::random(1,100); - c = Eigen::internal::random(1,100); - if(Eigen::internal::random(0,4) == 0) { - r = c; // check square matrices in 25% of tries - } - - CALL_SUBTEST_6(( sparse_basic(SparseMatrix(short(r), short(c))) )); - CALL_SUBTEST_6(( sparse_basic(SparseMatrix(short(r), short(c))) )); - } - - // Regression test for bug 900: (manually insert higher values here, if you have enough RAM): - CALL_SUBTEST_3((big_sparse_triplet >(10000, 10000, 0.125))); - CALL_SUBTEST_4((big_sparse_triplet >(10000, 10000, 0.125))); - - // Regression test for bug 1105 -#ifdef EIGEN_TEST_PART_7 - { - int n = Eigen::internal::random(200,600); - SparseMatrix,0, long> mat(n, n); - std::complex val; - - for(int i=0; i -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse.h" - -template -typename Eigen::internal::enable_if<(T::Flags&RowMajorBit)==RowMajorBit, typename T::RowXpr>::type -innervec(T& A, Index i) -{ - return A.row(i); -} - -template -typename Eigen::internal::enable_if<(T::Flags&RowMajorBit)==0, typename T::ColXpr>::type -innervec(T& A, Index i) -{ - return A.col(i); -} - -template void sparse_block(const SparseMatrixType& ref) -{ - const Index rows = ref.rows(); - const Index cols = ref.cols(); - const Index inner = ref.innerSize(); - const Index outer = ref.outerSize(); - - typedef typename SparseMatrixType::Scalar Scalar; - typedef typename SparseMatrixType::StorageIndex StorageIndex; - - double density = (std::max)(8./(rows*cols), 0.01); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - typedef Matrix RowDenseVector; - typedef SparseVector SparseVectorType; - - Scalar s1 = internal::random(); - { - SparseMatrixType m(rows, cols); - DenseMatrix refMat = DenseMatrix::Zero(rows, cols); - initSparse(density, refMat, m); - - VERIFY_IS_APPROX(m, refMat); - - // test InnerIterators and Block expressions - for (int t=0; t<10; ++t) - { - Index j = internal::random(0,cols-2); - Index i = internal::random(0,rows-2); - Index w = internal::random(1,cols-j); - Index h = internal::random(1,rows-i); - - VERIFY_IS_APPROX(m.block(i,j,h,w), refMat.block(i,j,h,w)); - for(Index c=0; c(density, refMat2, m2); - Index j0 = internal::random(0,outer-1); - Index j1 = internal::random(0,outer-1); - Index r0 = internal::random(0,rows-1); - Index c0 = internal::random(0,cols-1); - - VERIFY_IS_APPROX(m2.innerVector(j0), innervec(refMat2,j0)); - VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), innervec(refMat2,j0)+innervec(refMat2,j1)); - - m2.innerVector(j0) *= Scalar(2); - innervec(refMat2,j0) *= Scalar(2); - VERIFY_IS_APPROX(m2, refMat2); - - m2.row(r0) *= Scalar(3); - refMat2.row(r0) *= Scalar(3); - VERIFY_IS_APPROX(m2, refMat2); - - m2.col(c0) *= Scalar(4); - refMat2.col(c0) *= Scalar(4); - VERIFY_IS_APPROX(m2, refMat2); - - m2.row(r0) /= Scalar(3); - refMat2.row(r0) /= Scalar(3); - VERIFY_IS_APPROX(m2, refMat2); - - m2.col(c0) /= Scalar(4); - refMat2.col(c0) /= Scalar(4); - VERIFY_IS_APPROX(m2, refMat2); - - SparseVectorType v1; - VERIFY_IS_APPROX(v1 = m2.col(c0) * 4, refMat2.col(c0)*4); - VERIFY_IS_APPROX(v1 = m2.row(r0) * 4, refMat2.row(r0).transpose()*4); - - SparseMatrixType m3(rows,cols); - m3.reserve(VectorXi::Constant(outer,int(inner/2))); - for(Index j=0; j(k+1); - for(Index j=0; j<(std::min)(outer, inner); ++j) - { - VERIFY(j==numext::real(m3.innerVector(j).nonZeros())); - if(j>0) - VERIFY(j==numext::real(m3.innerVector(j).lastCoeff())); - } - m3.makeCompressed(); - for(Index j=0; j<(std::min)(outer, inner); ++j) - { - VERIFY(j==numext::real(m3.innerVector(j).nonZeros())); - if(j>0) - VERIFY(j==numext::real(m3.innerVector(j).lastCoeff())); - } - - VERIFY(m3.innerVector(j0).nonZeros() == m3.transpose().innerVector(j0).nonZeros()); - -// m2.innerVector(j0) = 2*m2.innerVector(j1); -// refMat2.col(j0) = 2*refMat2.col(j1); -// VERIFY_IS_APPROX(m2, refMat2); - } - - // test innerVectors() - { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); - SparseMatrixType m2(rows, cols); - initSparse(density, refMat2, m2); - if(internal::random(0,1)>0.5f) m2.makeCompressed(); - Index j0 = internal::random(0,outer-2); - Index j1 = internal::random(0,outer-2); - Index n0 = internal::random(1,outer-(std::max)(j0,j1)); - if(SparseMatrixType::IsRowMajor) - VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(j0,0,n0,cols)); - else - VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0)); - if(SparseMatrixType::IsRowMajor) - VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), - refMat2.middleRows(j0,n0)+refMat2.middleRows(j1,n0)); - else - VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), - refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); - - VERIFY_IS_APPROX(m2, refMat2); - - VERIFY(m2.innerVectors(j0,n0).nonZeros() == m2.transpose().innerVectors(j0,n0).nonZeros()); - - m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0); - if(SparseMatrixType::IsRowMajor) - refMat2.middleRows(j0,n0) = (refMat2.middleRows(j0,n0) + refMat2.middleRows(j1,n0)).eval(); - else - refMat2.middleCols(j0,n0) = (refMat2.middleCols(j0,n0) + refMat2.middleCols(j1,n0)).eval(); - - VERIFY_IS_APPROX(m2, refMat2); - } - - // test generic blocks - { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); - SparseMatrixType m2(rows, cols); - initSparse(density, refMat2, m2); - Index j0 = internal::random(0,outer-2); - Index j1 = internal::random(0,outer-2); - Index n0 = internal::random(1,outer-(std::max)(j0,j1)); - if(SparseMatrixType::IsRowMajor) - VERIFY_IS_APPROX(m2.block(j0,0,n0,cols), refMat2.block(j0,0,n0,cols)); - else - VERIFY_IS_APPROX(m2.block(0,j0,rows,n0), refMat2.block(0,j0,rows,n0)); - - if(SparseMatrixType::IsRowMajor) - VERIFY_IS_APPROX(m2.block(j0,0,n0,cols)+m2.block(j1,0,n0,cols), - refMat2.block(j0,0,n0,cols)+refMat2.block(j1,0,n0,cols)); - else - VERIFY_IS_APPROX(m2.block(0,j0,rows,n0)+m2.block(0,j1,rows,n0), - refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); - - Index i = internal::random(0,m2.outerSize()-1); - if(SparseMatrixType::IsRowMajor) { - m2.innerVector(i) = m2.innerVector(i) * s1; - refMat2.row(i) = refMat2.row(i) * s1; - VERIFY_IS_APPROX(m2,refMat2); - } else { - m2.innerVector(i) = m2.innerVector(i) * s1; - refMat2.col(i) = refMat2.col(i) * s1; - VERIFY_IS_APPROX(m2,refMat2); - } - - Index r0 = internal::random(0,rows-2); - Index c0 = internal::random(0,cols-2); - Index r1 = internal::random(1,rows-r0); - Index c1 = internal::random(1,cols-c0); - - VERIFY_IS_APPROX(DenseVector(m2.col(c0)), refMat2.col(c0)); - VERIFY_IS_APPROX(m2.col(c0), refMat2.col(c0)); - - VERIFY_IS_APPROX(RowDenseVector(m2.row(r0)), refMat2.row(r0)); - VERIFY_IS_APPROX(m2.row(r0), refMat2.row(r0)); - - VERIFY_IS_APPROX(m2.block(r0,c0,r1,c1), refMat2.block(r0,c0,r1,c1)); - VERIFY_IS_APPROX((2*m2).block(r0,c0,r1,c1), (2*refMat2).block(r0,c0,r1,c1)); - - if(m2.nonZeros()>0) - { - VERIFY_IS_APPROX(m2, refMat2); - SparseMatrixType m3(rows, cols); - DenseMatrix refMat3(rows, cols); refMat3.setZero(); - Index n = internal::random(1,10); - for(Index k=0; k(0,outer-1); - Index o2 = internal::random(0,outer-1); - if(SparseMatrixType::IsRowMajor) - { - m3.innerVector(o1) = m2.row(o2); - refMat3.row(o1) = refMat2.row(o2); - } - else - { - m3.innerVector(o1) = m2.col(o2); - refMat3.col(o1) = refMat2.col(o2); - } - if(internal::random()) - m3.makeCompressed(); - } - if(m3.nonZeros()>0) - VERIFY_IS_APPROX(m3, refMat3); - } - } -} - -void test_sparse_block() -{ - for(int i = 0; i < g_repeat; i++) { - int r = Eigen::internal::random(1,200), c = Eigen::internal::random(1,200); - if(Eigen::internal::random(0,4) == 0) { - r = c; // check square matrices in 25% of tries - } - EIGEN_UNUSED_VARIABLE(r+c); - CALL_SUBTEST_1(( sparse_block(SparseMatrix(1, 1)) )); - CALL_SUBTEST_1(( sparse_block(SparseMatrix(8, 8)) )); - CALL_SUBTEST_1(( sparse_block(SparseMatrix(r, c)) )); - CALL_SUBTEST_2(( sparse_block(SparseMatrix, ColMajor>(r, c)) )); - CALL_SUBTEST_2(( sparse_block(SparseMatrix, RowMajor>(r, c)) )); - - CALL_SUBTEST_3(( sparse_block(SparseMatrix(r, c)) )); - CALL_SUBTEST_3(( sparse_block(SparseMatrix(r, c)) )); - - r = Eigen::internal::random(1,100); - c = Eigen::internal::random(1,100); - if(Eigen::internal::random(0,4) == 0) { - r = c; // check square matrices in 25% of tries - } - - CALL_SUBTEST_4(( sparse_block(SparseMatrix(short(r), short(c))) )); - CALL_SUBTEST_4(( sparse_block(SparseMatrix(short(r), short(c))) )); - } -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_permutations.cpp b/testbed/nanogui/ext/eigen/test/sparse_permutations.cpp deleted file mode 100644 index b82cceff..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_permutations.cpp +++ /dev/null @@ -1,236 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011-2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - - -static long int nb_transposed_copies; -#define EIGEN_SPARSE_TRANSPOSED_COPY_PLUGIN {nb_transposed_copies++;} -#define VERIFY_TRANSPOSITION_COUNT(XPR,N) {\ - nb_transposed_copies = 0; \ - XPR; \ - if(nb_transposed_copies!=N) std::cerr << "nb_transposed_copies == " << nb_transposed_copies << "\n"; \ - VERIFY( (#XPR) && nb_transposed_copies==N ); \ - } - -#include "sparse.h" - -template -bool is_sorted(const T& mat) { - for(Index k = 0; k=it.index()) - return false; - prev = it.index(); - } - } - return true; -} - -template -typename internal::nested_eval::type eval(const T &xpr) -{ - VERIFY( int(internal::nested_eval::type::Flags&RowMajorBit) == int(internal::evaluator::Flags&RowMajorBit) ); - return xpr; -} - -template void sparse_permutations(const SparseMatrixType& ref) -{ - const Index rows = ref.rows(); - const Index cols = ref.cols(); - typedef typename SparseMatrixType::Scalar Scalar; - typedef typename SparseMatrixType::StorageIndex StorageIndex; - typedef SparseMatrix OtherSparseMatrixType; - typedef Matrix DenseMatrix; - typedef Matrix VectorI; -// bool IsRowMajor1 = SparseMatrixType::IsRowMajor; -// bool IsRowMajor2 = OtherSparseMatrixType::IsRowMajor; - - double density = (std::max)(8./(rows*cols), 0.01); - - SparseMatrixType mat(rows, cols), up(rows,cols), lo(rows,cols); - OtherSparseMatrixType res; - DenseMatrix mat_d = DenseMatrix::Zero(rows, cols), up_sym_d, lo_sym_d, res_d; - - initSparse(density, mat_d, mat, 0); - - up = mat.template triangularView(); - lo = mat.template triangularView(); - - up_sym_d = mat_d.template selfadjointView(); - lo_sym_d = mat_d.template selfadjointView(); - - VERIFY_IS_APPROX(mat, mat_d); - VERIFY_IS_APPROX(up, DenseMatrix(mat_d.template triangularView())); - VERIFY_IS_APPROX(lo, DenseMatrix(mat_d.template triangularView())); - - PermutationMatrix p, p_null; - VectorI pi; - randomPermutationVector(pi, cols); - p.indices() = pi; - - VERIFY( is_sorted( ::eval(mat*p) )); - VERIFY( is_sorted( res = mat*p )); - VERIFY_TRANSPOSITION_COUNT( ::eval(mat*p), 0); - //VERIFY_TRANSPOSITION_COUNT( res = mat*p, IsRowMajor ? 1 : 0 ); - res_d = mat_d*p; - VERIFY(res.isApprox(res_d) && "mat*p"); - - VERIFY( is_sorted( ::eval(p*mat) )); - VERIFY( is_sorted( res = p*mat )); - VERIFY_TRANSPOSITION_COUNT( ::eval(p*mat), 0); - res_d = p*mat_d; - VERIFY(res.isApprox(res_d) && "p*mat"); - - VERIFY( is_sorted( (mat*p).eval() )); - VERIFY( is_sorted( res = mat*p.inverse() )); - VERIFY_TRANSPOSITION_COUNT( ::eval(mat*p.inverse()), 0); - res_d = mat*p.inverse(); - VERIFY(res.isApprox(res_d) && "mat*inv(p)"); - - VERIFY( is_sorted( (p*mat+p*mat).eval() )); - VERIFY( is_sorted( res = p.inverse()*mat )); - VERIFY_TRANSPOSITION_COUNT( ::eval(p.inverse()*mat), 0); - res_d = p.inverse()*mat_d; - VERIFY(res.isApprox(res_d) && "inv(p)*mat"); - - VERIFY( is_sorted( (p * mat * p.inverse()).eval() )); - VERIFY( is_sorted( res = mat.twistedBy(p) )); - VERIFY_TRANSPOSITION_COUNT( ::eval(p * mat * p.inverse()), 0); - res_d = (p * mat_d) * p.inverse(); - VERIFY(res.isApprox(res_d) && "p*mat*inv(p)"); - - - VERIFY( is_sorted( res = mat.template selfadjointView().twistedBy(p_null) )); - res_d = up_sym_d; - VERIFY(res.isApprox(res_d) && "full selfadjoint upper to full"); - - VERIFY( is_sorted( res = mat.template selfadjointView().twistedBy(p_null) )); - res_d = lo_sym_d; - VERIFY(res.isApprox(res_d) && "full selfadjoint lower to full"); - - - VERIFY( is_sorted( res = up.template selfadjointView().twistedBy(p_null) )); - res_d = up_sym_d; - VERIFY(res.isApprox(res_d) && "upper selfadjoint to full"); - - VERIFY( is_sorted( res = lo.template selfadjointView().twistedBy(p_null) )); - res_d = lo_sym_d; - VERIFY(res.isApprox(res_d) && "lower selfadjoint full"); - - - VERIFY( is_sorted( res = mat.template selfadjointView() )); - res_d = up_sym_d; - VERIFY(res.isApprox(res_d) && "full selfadjoint upper to full"); - - VERIFY( is_sorted( res = mat.template selfadjointView() )); - res_d = lo_sym_d; - VERIFY(res.isApprox(res_d) && "full selfadjoint lower to full"); - - VERIFY( is_sorted( res = up.template selfadjointView() )); - res_d = up_sym_d; - VERIFY(res.isApprox(res_d) && "upper selfadjoint to full"); - - VERIFY( is_sorted( res = lo.template selfadjointView() )); - res_d = lo_sym_d; - VERIFY(res.isApprox(res_d) && "lower selfadjoint full"); - - - res.template selfadjointView() = mat.template selfadjointView(); - res_d = up_sym_d.template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint upper to upper"); - - res.template selfadjointView() = mat.template selfadjointView(); - res_d = up_sym_d.template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint upper to lower"); - - res.template selfadjointView() = mat.template selfadjointView(); - res_d = lo_sym_d.template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint lower to upper"); - - res.template selfadjointView() = mat.template selfadjointView(); - res_d = lo_sym_d.template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint lower to lower"); - - - - res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); - res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to upper"); - - res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); - res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to upper"); - - res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); - res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to lower"); - - res.template selfadjointView() = mat.template selfadjointView().twistedBy(p); - res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to lower"); - - - res.template selfadjointView() = up.template selfadjointView().twistedBy(p); - res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to upper"); - - res.template selfadjointView() = lo.template selfadjointView().twistedBy(p); - res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to upper"); - - res.template selfadjointView() = lo.template selfadjointView().twistedBy(p); - res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to lower"); - - res.template selfadjointView() = up.template selfadjointView().twistedBy(p); - res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView(); - VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to lower"); - - - VERIFY( is_sorted( res = mat.template selfadjointView().twistedBy(p) )); - res_d = (p * up_sym_d) * p.inverse(); - VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to full"); - - VERIFY( is_sorted( res = mat.template selfadjointView().twistedBy(p) )); - res_d = (p * lo_sym_d) * p.inverse(); - VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to full"); - - VERIFY( is_sorted( res = up.template selfadjointView().twistedBy(p) )); - res_d = (p * up_sym_d) * p.inverse(); - VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to full"); - - VERIFY( is_sorted( res = lo.template selfadjointView().twistedBy(p) )); - res_d = (p * lo_sym_d) * p.inverse(); - VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to full"); -} - -template void sparse_permutations_all(int size) -{ - CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); - CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); - CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); - CALL_SUBTEST(( sparse_permutations(SparseMatrix(size,size)) )); -} - -void test_sparse_permutations() -{ - for(int i = 0; i < g_repeat; i++) { - int s = Eigen::internal::random(1,50); - CALL_SUBTEST_1(( sparse_permutations_all(s) )); - CALL_SUBTEST_2(( sparse_permutations_all >(s) )); - } - - VERIFY((internal::is_same,OnTheRight,false,SparseShape>::ReturnType, - internal::nested_eval,PermutationMatrix,AliasFreeProduct>,1>::type>::value)); - - VERIFY((internal::is_same,OnTheLeft,false,SparseShape>::ReturnType, - internal::nested_eval,SparseMatrix,AliasFreeProduct>,1>::type>::value)); -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_product.cpp b/testbed/nanogui/ext/eigen/test/sparse_product.cpp deleted file mode 100644 index c1edd26e..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_product.cpp +++ /dev/null @@ -1,381 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -static long int nb_temporaries; - -inline void on_temporary_creation() { - // here's a great place to set a breakpoint when debugging failures in this test! - nb_temporaries++; -} - -#define EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN { on_temporary_creation(); } - -#include "sparse.h" - -#define VERIFY_EVALUATION_COUNT(XPR,N) {\ - nb_temporaries = 0; \ - CALL_SUBTEST( XPR ); \ - if(nb_temporaries!=N) std::cerr << "nb_temporaries == " << nb_temporaries << "\n"; \ - VERIFY( (#XPR) && nb_temporaries==N ); \ - } - - - -template void sparse_product() -{ - typedef typename SparseMatrixType::StorageIndex StorageIndex; - Index n = 100; - const Index rows = internal::random(1,n); - const Index cols = internal::random(1,n); - const Index depth = internal::random(1,n); - typedef typename SparseMatrixType::Scalar Scalar; - enum { Flags = SparseMatrixType::Flags }; - - double density = (std::max)(8./(rows*cols), 0.2); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - typedef Matrix RowDenseVector; - typedef SparseVector ColSpVector; - typedef SparseVector RowSpVector; - - Scalar s1 = internal::random(); - Scalar s2 = internal::random(); - - // test matrix-matrix product - { - DenseMatrix refMat2 = DenseMatrix::Zero(rows, depth); - DenseMatrix refMat2t = DenseMatrix::Zero(depth, rows); - DenseMatrix refMat3 = DenseMatrix::Zero(depth, cols); - DenseMatrix refMat3t = DenseMatrix::Zero(cols, depth); - DenseMatrix refMat4 = DenseMatrix::Zero(rows, cols); - DenseMatrix refMat4t = DenseMatrix::Zero(cols, rows); - DenseMatrix refMat5 = DenseMatrix::Random(depth, cols); - DenseMatrix refMat6 = DenseMatrix::Random(rows, rows); - DenseMatrix dm4 = DenseMatrix::Zero(rows, rows); -// DenseVector dv1 = DenseVector::Random(rows); - SparseMatrixType m2 (rows, depth); - SparseMatrixType m2t(depth, rows); - SparseMatrixType m3 (depth, cols); - SparseMatrixType m3t(cols, depth); - SparseMatrixType m4 (rows, cols); - SparseMatrixType m4t(cols, rows); - SparseMatrixType m6(rows, rows); - initSparse(density, refMat2, m2); - initSparse(density, refMat2t, m2t); - initSparse(density, refMat3, m3); - initSparse(density, refMat3t, m3t); - initSparse(density, refMat4, m4); - initSparse(density, refMat4t, m4t); - initSparse(density, refMat6, m6); - -// int c = internal::random(0,depth-1); - - // sparse * sparse - VERIFY_IS_APPROX(m4=m2*m3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(m4=m2t.transpose()*m3, refMat4=refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(m4=m2t.transpose()*m3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose()); - VERIFY_IS_APPROX(m4=m2*m3t.transpose(), refMat4=refMat2*refMat3t.transpose()); - - VERIFY_IS_APPROX(m4 = m2*m3/s1, refMat4 = refMat2*refMat3/s1); - VERIFY_IS_APPROX(m4 = m2*m3*s1, refMat4 = refMat2*refMat3*s1); - VERIFY_IS_APPROX(m4 = s2*m2*m3*s1, refMat4 = s2*refMat2*refMat3*s1); - VERIFY_IS_APPROX(m4 = (m2+m2)*m3, refMat4 = (refMat2+refMat2)*refMat3); - VERIFY_IS_APPROX(m4 = m2*m3.leftCols(cols/2), refMat4 = refMat2*refMat3.leftCols(cols/2)); - VERIFY_IS_APPROX(m4 = m2*(m3+m3).leftCols(cols/2), refMat4 = refMat2*(refMat3+refMat3).leftCols(cols/2)); - - VERIFY_IS_APPROX(m4=(m2*m3).pruned(0), refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(m4=(m2t.transpose()*m3).pruned(0), refMat4=refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(m4=(m2t.transpose()*m3t.transpose()).pruned(0), refMat4=refMat2t.transpose()*refMat3t.transpose()); - VERIFY_IS_APPROX(m4=(m2*m3t.transpose()).pruned(0), refMat4=refMat2*refMat3t.transpose()); - - // make sure the right product implementation is called: - if((!SparseMatrixType::IsRowMajor) && m2.rows()<=m3.cols()) - { - VERIFY_EVALUATION_COUNT(m4 = m2*m3, 3); // 1 temp for the result + 2 for transposing and get a sorted result. - VERIFY_EVALUATION_COUNT(m4 = (m2*m3).pruned(0), 1); - VERIFY_EVALUATION_COUNT(m4 = (m2*m3).eval().pruned(0), 4); - } - - // and that pruning is effective: - { - DenseMatrix Ad(2,2); - Ad << -1, 1, 1, 1; - SparseMatrixType As(Ad.sparseView()), B(2,2); - VERIFY_IS_EQUAL( (As*As.transpose()).eval().nonZeros(), 4); - VERIFY_IS_EQUAL( (Ad*Ad.transpose()).eval().sparseView().eval().nonZeros(), 2); - VERIFY_IS_EQUAL( (As*As.transpose()).pruned(1e-6).eval().nonZeros(), 2); - } - - // dense ?= sparse * sparse - VERIFY_IS_APPROX(dm4 =m2*m3, refMat4 =refMat2*refMat3); - VERIFY_IS_APPROX(dm4+=m2*m3, refMat4+=refMat2*refMat3); - VERIFY_IS_APPROX(dm4-=m2*m3, refMat4-=refMat2*refMat3); - VERIFY_IS_APPROX(dm4 =m2t.transpose()*m3, refMat4 =refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(dm4+=m2t.transpose()*m3, refMat4+=refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(dm4-=m2t.transpose()*m3, refMat4-=refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(dm4 =m2t.transpose()*m3t.transpose(), refMat4 =refMat2t.transpose()*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4+=m2t.transpose()*m3t.transpose(), refMat4+=refMat2t.transpose()*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4-=m2t.transpose()*m3t.transpose(), refMat4-=refMat2t.transpose()*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4 =m2*m3t.transpose(), refMat4 =refMat2*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4+=m2*m3t.transpose(), refMat4+=refMat2*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4-=m2*m3t.transpose(), refMat4-=refMat2*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4 = m2*m3*s1, refMat4 = refMat2*refMat3*s1); - - // test aliasing - m4 = m2; refMat4 = refMat2; - VERIFY_IS_APPROX(m4=m4*m3, refMat4=refMat4*refMat3); - - // sparse * dense matrix - VERIFY_IS_APPROX(dm4=m2*refMat3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=m2*refMat3t.transpose(), refMat4=refMat2*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4=m2t.transpose()*refMat3, refMat4=refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(dm4=m2t.transpose()*refMat3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose()); - - VERIFY_IS_APPROX(dm4=m2*refMat3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=dm4+m2*refMat3, refMat4=refMat4+refMat2*refMat3); - VERIFY_IS_APPROX(dm4+=m2*refMat3, refMat4+=refMat2*refMat3); - VERIFY_IS_APPROX(dm4-=m2*refMat3, refMat4-=refMat2*refMat3); - VERIFY_IS_APPROX(dm4.noalias()+=m2*refMat3, refMat4+=refMat2*refMat3); - VERIFY_IS_APPROX(dm4.noalias()-=m2*refMat3, refMat4-=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=m2*(refMat3+refMat3), refMat4=refMat2*(refMat3+refMat3)); - VERIFY_IS_APPROX(dm4=m2t.transpose()*(refMat3+refMat5)*0.5, refMat4=refMat2t.transpose()*(refMat3+refMat5)*0.5); - - // sparse * dense vector - VERIFY_IS_APPROX(dm4.col(0)=m2*refMat3.col(0), refMat4.col(0)=refMat2*refMat3.col(0)); - VERIFY_IS_APPROX(dm4.col(0)=m2*refMat3t.transpose().col(0), refMat4.col(0)=refMat2*refMat3t.transpose().col(0)); - VERIFY_IS_APPROX(dm4.col(0)=m2t.transpose()*refMat3.col(0), refMat4.col(0)=refMat2t.transpose()*refMat3.col(0)); - VERIFY_IS_APPROX(dm4.col(0)=m2t.transpose()*refMat3t.transpose().col(0), refMat4.col(0)=refMat2t.transpose()*refMat3t.transpose().col(0)); - - // dense * sparse - VERIFY_IS_APPROX(dm4=refMat2*m3, refMat4=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=dm4+refMat2*m3, refMat4=refMat4+refMat2*refMat3); - VERIFY_IS_APPROX(dm4+=refMat2*m3, refMat4+=refMat2*refMat3); - VERIFY_IS_APPROX(dm4-=refMat2*m3, refMat4-=refMat2*refMat3); - VERIFY_IS_APPROX(dm4.noalias()+=refMat2*m3, refMat4+=refMat2*refMat3); - VERIFY_IS_APPROX(dm4.noalias()-=refMat2*m3, refMat4-=refMat2*refMat3); - VERIFY_IS_APPROX(dm4=refMat2*m3t.transpose(), refMat4=refMat2*refMat3t.transpose()); - VERIFY_IS_APPROX(dm4=refMat2t.transpose()*m3, refMat4=refMat2t.transpose()*refMat3); - VERIFY_IS_APPROX(dm4=refMat2t.transpose()*m3t.transpose(), refMat4=refMat2t.transpose()*refMat3t.transpose()); - - // sparse * dense and dense * sparse outer product - { - Index c = internal::random(0,depth-1); - Index r = internal::random(0,rows-1); - Index c1 = internal::random(0,cols-1); - Index r1 = internal::random(0,depth-1); - DenseMatrix dm5 = DenseMatrix::Random(depth, cols); - - VERIFY_IS_APPROX( m4=m2.col(c)*dm5.col(c1).transpose(), refMat4=refMat2.col(c)*dm5.col(c1).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX( m4=m2.middleCols(c,1)*dm5.col(c1).transpose(), refMat4=refMat2.col(c)*dm5.col(c1).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(dm4=m2.col(c)*dm5.col(c1).transpose(), refMat4=refMat2.col(c)*dm5.col(c1).transpose()); - - VERIFY_IS_APPROX(m4=dm5.col(c1)*m2.col(c).transpose(), refMat4=dm5.col(c1)*refMat2.col(c).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(m4=dm5.col(c1)*m2.middleCols(c,1).transpose(), refMat4=dm5.col(c1)*refMat2.col(c).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(dm4=dm5.col(c1)*m2.col(c).transpose(), refMat4=dm5.col(c1)*refMat2.col(c).transpose()); - - VERIFY_IS_APPROX( m4=dm5.row(r1).transpose()*m2.col(c).transpose(), refMat4=dm5.row(r1).transpose()*refMat2.col(c).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(dm4=dm5.row(r1).transpose()*m2.col(c).transpose(), refMat4=dm5.row(r1).transpose()*refMat2.col(c).transpose()); - - VERIFY_IS_APPROX( m4=m2.row(r).transpose()*dm5.col(c1).transpose(), refMat4=refMat2.row(r).transpose()*dm5.col(c1).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX( m4=m2.middleRows(r,1).transpose()*dm5.col(c1).transpose(), refMat4=refMat2.row(r).transpose()*dm5.col(c1).transpose()); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(dm4=m2.row(r).transpose()*dm5.col(c1).transpose(), refMat4=refMat2.row(r).transpose()*dm5.col(c1).transpose()); - - VERIFY_IS_APPROX( m4=dm5.col(c1)*m2.row(r), refMat4=dm5.col(c1)*refMat2.row(r)); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX( m4=dm5.col(c1)*m2.middleRows(r,1), refMat4=dm5.col(c1)*refMat2.row(r)); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(dm4=dm5.col(c1)*m2.row(r), refMat4=dm5.col(c1)*refMat2.row(r)); - - VERIFY_IS_APPROX( m4=dm5.row(r1).transpose()*m2.row(r), refMat4=dm5.row(r1).transpose()*refMat2.row(r)); - VERIFY_IS_EQUAL(m4.nonZeros(), (refMat4.array()!=0).count()); - VERIFY_IS_APPROX(dm4=dm5.row(r1).transpose()*m2.row(r), refMat4=dm5.row(r1).transpose()*refMat2.row(r)); - } - - VERIFY_IS_APPROX(m6=m6*m6, refMat6=refMat6*refMat6); - - // sparse matrix * sparse vector - ColSpVector cv0(cols), cv1; - DenseVector dcv0(cols), dcv1; - initSparse(2*density,dcv0, cv0); - - RowSpVector rv0(depth), rv1; - RowDenseVector drv0(depth), drv1(rv1); - initSparse(2*density,drv0, rv0); - - VERIFY_IS_APPROX(cv1=m3*cv0, dcv1=refMat3*dcv0); - VERIFY_IS_APPROX(rv1=rv0*m3, drv1=drv0*refMat3); - VERIFY_IS_APPROX(cv1=m3t.adjoint()*cv0, dcv1=refMat3t.adjoint()*dcv0); - VERIFY_IS_APPROX(cv1=rv0*m3, dcv1=drv0*refMat3); - VERIFY_IS_APPROX(rv1=m3*cv0, drv1=refMat3*dcv0); - } - - // test matrix - diagonal product - { - DenseMatrix refM2 = DenseMatrix::Zero(rows, cols); - DenseMatrix refM3 = DenseMatrix::Zero(rows, cols); - DenseMatrix d3 = DenseMatrix::Zero(rows, cols); - DiagonalMatrix d1(DenseVector::Random(cols)); - DiagonalMatrix d2(DenseVector::Random(rows)); - SparseMatrixType m2(rows, cols); - SparseMatrixType m3(rows, cols); - initSparse(density, refM2, m2); - initSparse(density, refM3, m3); - VERIFY_IS_APPROX(m3=m2*d1, refM3=refM2*d1); - VERIFY_IS_APPROX(m3=m2.transpose()*d2, refM3=refM2.transpose()*d2); - VERIFY_IS_APPROX(m3=d2*m2, refM3=d2*refM2); - VERIFY_IS_APPROX(m3=d1*m2.transpose(), refM3=d1*refM2.transpose()); - - // also check with a SparseWrapper: - DenseVector v1 = DenseVector::Random(cols); - DenseVector v2 = DenseVector::Random(rows); - DenseVector v3 = DenseVector::Random(rows); - VERIFY_IS_APPROX(m3=m2*v1.asDiagonal(), refM3=refM2*v1.asDiagonal()); - VERIFY_IS_APPROX(m3=m2.transpose()*v2.asDiagonal(), refM3=refM2.transpose()*v2.asDiagonal()); - VERIFY_IS_APPROX(m3=v2.asDiagonal()*m2, refM3=v2.asDiagonal()*refM2); - VERIFY_IS_APPROX(m3=v1.asDiagonal()*m2.transpose(), refM3=v1.asDiagonal()*refM2.transpose()); - - VERIFY_IS_APPROX(m3=v2.asDiagonal()*m2*v1.asDiagonal(), refM3=v2.asDiagonal()*refM2*v1.asDiagonal()); - - VERIFY_IS_APPROX(v2=m2*v1.asDiagonal()*v1, refM2*v1.asDiagonal()*v1); - VERIFY_IS_APPROX(v3=v2.asDiagonal()*m2*v1, v2.asDiagonal()*refM2*v1); - - // evaluate to a dense matrix to check the .row() and .col() iterator functions - VERIFY_IS_APPROX(d3=m2*d1, refM3=refM2*d1); - VERIFY_IS_APPROX(d3=m2.transpose()*d2, refM3=refM2.transpose()*d2); - VERIFY_IS_APPROX(d3=d2*m2, refM3=d2*refM2); - VERIFY_IS_APPROX(d3=d1*m2.transpose(), refM3=d1*refM2.transpose()); - } - - // test self-adjoint and triangular-view products - { - DenseMatrix b = DenseMatrix::Random(rows, rows); - DenseMatrix x = DenseMatrix::Random(rows, rows); - DenseMatrix refX = DenseMatrix::Random(rows, rows); - DenseMatrix refUp = DenseMatrix::Zero(rows, rows); - DenseMatrix refLo = DenseMatrix::Zero(rows, rows); - DenseMatrix refS = DenseMatrix::Zero(rows, rows); - DenseMatrix refA = DenseMatrix::Zero(rows, rows); - SparseMatrixType mUp(rows, rows); - SparseMatrixType mLo(rows, rows); - SparseMatrixType mS(rows, rows); - SparseMatrixType mA(rows, rows); - initSparse(density, refA, mA); - do { - initSparse(density, refUp, mUp, ForceRealDiag|/*ForceNonZeroDiag|*/MakeUpperTriangular); - } while (refUp.isZero()); - refLo = refUp.adjoint(); - mLo = mUp.adjoint(); - refS = refUp + refLo; - refS.diagonal() *= 0.5; - mS = mUp + mLo; - // TODO be able to address the diagonal.... - for (int k=0; k()*b, refX=refS*b); - VERIFY_IS_APPROX(x=mLo.template selfadjointView()*b, refX=refS*b); - VERIFY_IS_APPROX(x=mS.template selfadjointView()*b, refX=refS*b); - - VERIFY_IS_APPROX(x.noalias()+=mUp.template selfadjointView()*b, refX+=refS*b); - VERIFY_IS_APPROX(x.noalias()-=mLo.template selfadjointView()*b, refX-=refS*b); - VERIFY_IS_APPROX(x.noalias()+=mS.template selfadjointView()*b, refX+=refS*b); - - // sparse selfadjointView with sparse matrices - SparseMatrixType mSres(rows,rows); - VERIFY_IS_APPROX(mSres = mLo.template selfadjointView()*mS, - refX = refLo.template selfadjointView()*refS); - VERIFY_IS_APPROX(mSres = mS * mLo.template selfadjointView(), - refX = refS * refLo.template selfadjointView()); - - // sparse triangularView with dense matrices - VERIFY_IS_APPROX(x=mA.template triangularView()*b, refX=refA.template triangularView()*b); - VERIFY_IS_APPROX(x=mA.template triangularView()*b, refX=refA.template triangularView()*b); - VERIFY_IS_APPROX(x=b*mA.template triangularView(), refX=b*refA.template triangularView()); - VERIFY_IS_APPROX(x=b*mA.template triangularView(), refX=b*refA.template triangularView()); - - // sparse triangularView with sparse matrices - VERIFY_IS_APPROX(mSres = mA.template triangularView()*mS, refX = refA.template triangularView()*refS); - VERIFY_IS_APPROX(mSres = mS * mA.template triangularView(), refX = refS * refA.template triangularView()); - VERIFY_IS_APPROX(mSres = mA.template triangularView()*mS, refX = refA.template triangularView()*refS); - VERIFY_IS_APPROX(mSres = mS * mA.template triangularView(), refX = refS * refA.template triangularView()); - } -} - -// New test for Bug in SparseTimeDenseProduct -template void sparse_product_regression_test() -{ - // This code does not compile with afflicted versions of the bug - SparseMatrixType sm1(3,2); - DenseMatrixType m2(2,2); - sm1.setZero(); - m2.setZero(); - - DenseMatrixType m3 = sm1*m2; - - - // This code produces a segfault with afflicted versions of another SparseTimeDenseProduct - // bug - - SparseMatrixType sm2(20000,2); - sm2.setZero(); - DenseMatrixType m4(sm2*m2); - - VERIFY_IS_APPROX( m4(0,0), 0.0 ); -} - -template -void bug_942() -{ - typedef Matrix Vector; - typedef SparseMatrix ColSpMat; - typedef SparseMatrix RowSpMat; - ColSpMat cmA(1,1); - cmA.insert(0,0) = 1; - - RowSpMat rmA(1,1); - rmA.insert(0,0) = 1; - - Vector d(1); - d[0] = 2; - - double res = 2; - - VERIFY_IS_APPROX( ( cmA*d.asDiagonal() ).eval().coeff(0,0), res ); - VERIFY_IS_APPROX( ( d.asDiagonal()*rmA ).eval().coeff(0,0), res ); - VERIFY_IS_APPROX( ( rmA*d.asDiagonal() ).eval().coeff(0,0), res ); - VERIFY_IS_APPROX( ( d.asDiagonal()*cmA ).eval().coeff(0,0), res ); -} - -void test_sparse_product() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( (sparse_product >()) ); - CALL_SUBTEST_1( (sparse_product >()) ); - CALL_SUBTEST_1( (bug_942()) ); - CALL_SUBTEST_2( (sparse_product, ColMajor > >()) ); - CALL_SUBTEST_2( (sparse_product, RowMajor > >()) ); - CALL_SUBTEST_3( (sparse_product >()) ); - CALL_SUBTEST_4( (sparse_product_regression_test, Matrix >()) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_ref.cpp b/testbed/nanogui/ext/eigen/test/sparse_ref.cpp deleted file mode 100644 index 5e960723..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_ref.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 20015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// This unit test cannot be easily written to work with EIGEN_DEFAULT_TO_ROW_MAJOR -#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR -#undef EIGEN_DEFAULT_TO_ROW_MAJOR -#endif - -static long int nb_temporaries; - -inline void on_temporary_creation() { - // here's a great place to set a breakpoint when debugging failures in this test! - nb_temporaries++; -} - -#define EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN { on_temporary_creation(); } - -#include "main.h" -#include - -#define VERIFY_EVALUATION_COUNT(XPR,N) {\ - nb_temporaries = 0; \ - CALL_SUBTEST( XPR ); \ - if(nb_temporaries!=N) std::cerr << "nb_temporaries == " << nb_temporaries << "\n"; \ - VERIFY( (#XPR) && nb_temporaries==N ); \ - } - -template void check_const_correctness(const PlainObjectType&) -{ - // verify that ref-to-const don't have LvalueBit - typedef typename internal::add_const::type ConstPlainObjectType; - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(internal::traits >::Flags & LvalueBit) ); - VERIFY( !(Ref::Flags & LvalueBit) ); - VERIFY( !(Ref::Flags & LvalueBit) ); -} - -template -EIGEN_DONT_INLINE void call_ref_1(Ref > a, const B &b) { VERIFY_IS_EQUAL(a.toDense(),b.toDense()); } - -template -EIGEN_DONT_INLINE void call_ref_2(const Ref >& a, const B &b) { VERIFY_IS_EQUAL(a.toDense(),b.toDense()); } - -template -EIGEN_DONT_INLINE void call_ref_3(const Ref, StandardCompressedFormat>& a, const B &b) { - VERIFY(a.isCompressed()); - VERIFY_IS_EQUAL(a.toDense(),b.toDense()); -} - -template -EIGEN_DONT_INLINE void call_ref_4(Ref > a, const B &b) { VERIFY_IS_EQUAL(a.toDense(),b.toDense()); } - -template -EIGEN_DONT_INLINE void call_ref_5(const Ref >& a, const B &b) { VERIFY_IS_EQUAL(a.toDense(),b.toDense()); } - -void call_ref() -{ - SparseMatrix A = MatrixXf::Random(10,10).sparseView(0.5,1); - SparseMatrix B = MatrixXf::Random(10,10).sparseView(0.5,1); - SparseMatrix C = MatrixXf::Random(10,10).sparseView(0.5,1); - C.reserve(VectorXi::Constant(C.outerSize(), 2)); - const SparseMatrix& Ac(A); - Block > Ab(A,0,1, 3,3); - const Block > Abc(A,0,1,3,3); - SparseVector vc = VectorXf::Random(10).sparseView(0.5,1); - SparseVector vr = VectorXf::Random(10).sparseView(0.5,1); - SparseMatrix AA = A*A; - - - VERIFY_EVALUATION_COUNT( call_ref_1(A, A), 0); -// VERIFY_EVALUATION_COUNT( call_ref_1(Ac, Ac), 0); // does not compile on purpose - VERIFY_EVALUATION_COUNT( call_ref_2(A, A), 0); - VERIFY_EVALUATION_COUNT( call_ref_3(A, A), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(A.transpose(), A.transpose()), 1); - VERIFY_EVALUATION_COUNT( call_ref_3(A.transpose(), A.transpose()), 1); - VERIFY_EVALUATION_COUNT( call_ref_2(Ac,Ac), 0); - VERIFY_EVALUATION_COUNT( call_ref_3(Ac,Ac), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(A+A,2*Ac), 1); - VERIFY_EVALUATION_COUNT( call_ref_3(A+A,2*Ac), 1); - VERIFY_EVALUATION_COUNT( call_ref_2(B, B), 1); - VERIFY_EVALUATION_COUNT( call_ref_3(B, B), 1); - VERIFY_EVALUATION_COUNT( call_ref_2(B.transpose(), B.transpose()), 0); - VERIFY_EVALUATION_COUNT( call_ref_3(B.transpose(), B.transpose()), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(A*A, AA), 3); - VERIFY_EVALUATION_COUNT( call_ref_3(A*A, AA), 3); - - VERIFY(!C.isCompressed()); - VERIFY_EVALUATION_COUNT( call_ref_3(C, C), 1); - - Ref > Ar(A); - VERIFY_IS_APPROX(Ar+Ar, A+A); - VERIFY_EVALUATION_COUNT( call_ref_1(Ar, A), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(Ar, A), 0); - - Ref > Br(B); - VERIFY_EVALUATION_COUNT( call_ref_1(Br.transpose(), Br.transpose()), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(Br, Br), 1); - VERIFY_EVALUATION_COUNT( call_ref_2(Br.transpose(), Br.transpose()), 0); - - Ref > Arc(A); -// VERIFY_EVALUATION_COUNT( call_ref_1(Arc, Arc), 0); // does not compile on purpose - VERIFY_EVALUATION_COUNT( call_ref_2(Arc, Arc), 0); - - VERIFY_EVALUATION_COUNT( call_ref_2(A.middleCols(1,3), A.middleCols(1,3)), 0); - - VERIFY_EVALUATION_COUNT( call_ref_2(A.col(2), A.col(2)), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(vc, vc), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(vr.transpose(), vr.transpose()), 0); - VERIFY_EVALUATION_COUNT( call_ref_2(vr, vr.transpose()), 0); - - VERIFY_EVALUATION_COUNT( call_ref_2(A.block(1,1,3,3), A.block(1,1,3,3)), 1); // should be 0 (allocate starts/nnz only) - - VERIFY_EVALUATION_COUNT( call_ref_4(vc, vc), 0); - VERIFY_EVALUATION_COUNT( call_ref_4(vr, vr.transpose()), 0); - VERIFY_EVALUATION_COUNT( call_ref_5(vc, vc), 0); - VERIFY_EVALUATION_COUNT( call_ref_5(vr, vr.transpose()), 0); - VERIFY_EVALUATION_COUNT( call_ref_4(A.col(2), A.col(2)), 0); - VERIFY_EVALUATION_COUNT( call_ref_5(A.col(2), A.col(2)), 0); - // VERIFY_EVALUATION_COUNT( call_ref_4(A.row(2), A.row(2).transpose()), 1); // does not compile on purpose - VERIFY_EVALUATION_COUNT( call_ref_5(A.row(2), A.row(2).transpose()), 1); -} - -void test_sparse_ref() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( check_const_correctness(SparseMatrix()) ); - CALL_SUBTEST_1( check_const_correctness(SparseMatrix()) ); - CALL_SUBTEST_2( call_ref() ); - - CALL_SUBTEST_3( check_const_correctness(SparseVector()) ); - CALL_SUBTEST_3( check_const_correctness(SparseVector()) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_solver.h b/testbed/nanogui/ext/eigen/test/sparse_solver.h deleted file mode 100644 index 5145bc3e..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_solver.h +++ /dev/null @@ -1,565 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse.h" -#include -#include - -template -void solve_with_guess(IterativeSolverBase& solver, const MatrixBase& b, const Guess& g, Result &x) { - if(internal::random()) - { - // With a temporary through evaluator - x = solver.derived().solveWithGuess(b,g) + Result::Zero(x.rows(), x.cols()); - } - else - { - // direct evaluation within x through Assignment - x = solver.derived().solveWithGuess(b.derived(),g); - } -} - -template -void solve_with_guess(SparseSolverBase& solver, const MatrixBase& b, const Guess& , Result& x) { - if(internal::random()) - x = solver.derived().solve(b) + Result::Zero(x.rows(), x.cols()); - else - x = solver.derived().solve(b); -} - -template -void solve_with_guess(SparseSolverBase& solver, const SparseMatrixBase& b, const Guess& , Result& x) { - x = solver.derived().solve(b); -} - -template -void check_sparse_solving(Solver& solver, const typename Solver::MatrixType& A, const Rhs& b, const DenseMat& dA, const DenseRhs& db) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef typename Mat::StorageIndex StorageIndex; - - DenseRhs refX = dA.householderQr().solve(db); - { - Rhs x(A.cols(), b.cols()); - Rhs oldb = b; - - solver.compute(A); - if (solver.info() != Success) - { - std::cerr << "ERROR | sparse solver testing, factorization failed (" << typeid(Solver).name() << ")\n"; - VERIFY(solver.info() == Success); - } - x = solver.solve(b); - if (solver.info() != Success) - { - std::cerr << "WARNING | sparse solver testing: solving failed (" << typeid(Solver).name() << ")\n"; - return; - } - VERIFY(oldb.isApprox(b) && "sparse solver testing: the rhs should not be modified!"); - VERIFY(x.isApprox(refX,test_precision())); - - x.setZero(); - solve_with_guess(solver, b, x, x); - VERIFY(solver.info() == Success && "solving failed when using analyzePattern/factorize API"); - VERIFY(oldb.isApprox(b) && "sparse solver testing: the rhs should not be modified!"); - VERIFY(x.isApprox(refX,test_precision())); - - x.setZero(); - // test the analyze/factorize API - solver.analyzePattern(A); - solver.factorize(A); - VERIFY(solver.info() == Success && "factorization failed when using analyzePattern/factorize API"); - x = solver.solve(b); - VERIFY(solver.info() == Success && "solving failed when using analyzePattern/factorize API"); - VERIFY(oldb.isApprox(b) && "sparse solver testing: the rhs should not be modified!"); - VERIFY(x.isApprox(refX,test_precision())); - - x.setZero(); - // test with Map - MappedSparseMatrix Am(A.rows(), A.cols(), A.nonZeros(), const_cast(A.outerIndexPtr()), const_cast(A.innerIndexPtr()), const_cast(A.valuePtr())); - solver.compute(Am); - VERIFY(solver.info() == Success && "factorization failed when using Map"); - DenseRhs dx(refX); - dx.setZero(); - Map xm(dx.data(), dx.rows(), dx.cols()); - Map bm(db.data(), db.rows(), db.cols()); - xm = solver.solve(bm); - VERIFY(solver.info() == Success && "solving failed when using Map"); - VERIFY(oldb.isApprox(bm) && "sparse solver testing: the rhs should not be modified!"); - VERIFY(xm.isApprox(refX,test_precision())); - } - - // if not too large, do some extra check: - if(A.rows()<2000) - { - // test initialization ctor - { - Rhs x(b.rows(), b.cols()); - Solver solver2(A); - VERIFY(solver2.info() == Success); - x = solver2.solve(b); - VERIFY(x.isApprox(refX,test_precision())); - } - - // test dense Block as the result and rhs: - { - DenseRhs x(refX.rows(), refX.cols()); - DenseRhs oldb(db); - x.setZero(); - x.block(0,0,x.rows(),x.cols()) = solver.solve(db.block(0,0,db.rows(),db.cols())); - VERIFY(oldb.isApprox(db) && "sparse solver testing: the rhs should not be modified!"); - VERIFY(x.isApprox(refX,test_precision())); - } - - // test uncompressed inputs - { - Mat A2 = A; - A2.reserve((ArrayXf::Random(A.outerSize())+2).template cast().eval()); - solver.compute(A2); - Rhs x = solver.solve(b); - VERIFY(x.isApprox(refX,test_precision())); - } - - // test expression as input - { - solver.compute(0.5*(A+A)); - Rhs x = solver.solve(b); - VERIFY(x.isApprox(refX,test_precision())); - - Solver solver2(0.5*(A+A)); - Rhs x2 = solver2.solve(b); - VERIFY(x2.isApprox(refX,test_precision())); - } - } -} - -template -void check_sparse_solving_real_cases(Solver& solver, const typename Solver::MatrixType& A, const Rhs& b, const typename Solver::MatrixType& fullA, const Rhs& refX) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef typename Mat::RealScalar RealScalar; - - Rhs x(A.cols(), b.cols()); - - solver.compute(A); - if (solver.info() != Success) - { - std::cerr << "ERROR | sparse solver testing, factorization failed (" << typeid(Solver).name() << ")\n"; - VERIFY(solver.info() == Success); - } - x = solver.solve(b); - - if (solver.info() != Success) - { - std::cerr << "WARNING | sparse solver testing, solving failed (" << typeid(Solver).name() << ")\n"; - return; - } - - RealScalar res_error = (fullA*x-b).norm()/b.norm(); - VERIFY( (res_error <= test_precision() ) && "sparse solver failed without noticing it"); - - - if(refX.size() != 0 && (refX - x).norm()/refX.norm() > test_precision()) - { - std::cerr << "WARNING | found solution is different from the provided reference one\n"; - } - -} -template -void check_sparse_determinant(Solver& solver, const typename Solver::MatrixType& A, const DenseMat& dA) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - - solver.compute(A); - if (solver.info() != Success) - { - std::cerr << "WARNING | sparse solver testing: factorization failed (check_sparse_determinant)\n"; - return; - } - - Scalar refDet = dA.determinant(); - VERIFY_IS_APPROX(refDet,solver.determinant()); -} -template -void check_sparse_abs_determinant(Solver& solver, const typename Solver::MatrixType& A, const DenseMat& dA) -{ - using std::abs; - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - - solver.compute(A); - if (solver.info() != Success) - { - std::cerr << "WARNING | sparse solver testing: factorization failed (check_sparse_abs_determinant)\n"; - return; - } - - Scalar refDet = abs(dA.determinant()); - VERIFY_IS_APPROX(refDet,solver.absDeterminant()); -} - -template -int generate_sparse_spd_problem(Solver& , typename Solver::MatrixType& A, typename Solver::MatrixType& halfA, DenseMat& dA, int maxSize = 300) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef Matrix DenseMatrix; - - int size = internal::random(1,maxSize); - double density = (std::max)(8./(size*size), 0.01); - - Mat M(size, size); - DenseMatrix dM(size, size); - - initSparse(density, dM, M, ForceNonZeroDiag); - - A = M * M.adjoint(); - dA = dM * dM.adjoint(); - - halfA.resize(size,size); - if(Solver::UpLo==(Lower|Upper)) - halfA = A; - else - halfA.template selfadjointView().rankUpdate(M); - - return size; -} - - -#ifdef TEST_REAL_CASES -template -inline std::string get_matrixfolder() -{ - std::string mat_folder = TEST_REAL_CASES; - if( internal::is_same >::value || internal::is_same >::value ) - mat_folder = mat_folder + static_cast("/complex/"); - else - mat_folder = mat_folder + static_cast("/real/"); - return mat_folder; -} -std::string sym_to_string(int sym) -{ - if(sym==Symmetric) return "Symmetric "; - if(sym==SPD) return "SPD "; - return ""; -} -template -std::string solver_stats(const IterativeSolverBase &solver) -{ - std::stringstream ss; - ss << solver.iterations() << " iters, error: " << solver.error(); - return ss.str(); -} -template -std::string solver_stats(const SparseSolverBase &/*solver*/) -{ - return ""; -} -#endif - -template void check_sparse_spd_solving(Solver& solver, int maxSize = 300, int maxRealWorldSize = 100000) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef typename Mat::StorageIndex StorageIndex; - typedef SparseMatrix SpMat; - typedef SparseVector SpVec; - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - - // generate the problem - Mat A, halfA; - DenseMatrix dA; - for (int i = 0; i < g_repeat; i++) { - int size = generate_sparse_spd_problem(solver, A, halfA, dA, maxSize); - - // generate the right hand sides - int rhsCols = internal::random(1,16); - double density = (std::max)(8./(size*rhsCols), 0.1); - SpMat B(size,rhsCols); - DenseVector b = DenseVector::Random(size); - DenseMatrix dB(size,rhsCols); - initSparse(density, dB, B, ForceNonZeroDiag); - SpVec c = B.col(0); - DenseVector dc = dB.col(0); - - CALL_SUBTEST( check_sparse_solving(solver, A, b, dA, b) ); - CALL_SUBTEST( check_sparse_solving(solver, halfA, b, dA, b) ); - CALL_SUBTEST( check_sparse_solving(solver, A, dB, dA, dB) ); - CALL_SUBTEST( check_sparse_solving(solver, halfA, dB, dA, dB) ); - CALL_SUBTEST( check_sparse_solving(solver, A, B, dA, dB) ); - CALL_SUBTEST( check_sparse_solving(solver, halfA, B, dA, dB) ); - CALL_SUBTEST( check_sparse_solving(solver, A, c, dA, dc) ); - CALL_SUBTEST( check_sparse_solving(solver, halfA, c, dA, dc) ); - - // check only once - if(i==0) - { - b = DenseVector::Zero(size); - check_sparse_solving(solver, A, b, dA, b); - } - } - - // First, get the folder -#ifdef TEST_REAL_CASES - // Test real problems with double precision only - if (internal::is_same::Real, double>::value) - { - std::string mat_folder = get_matrixfolder(); - MatrixMarketIterator it(mat_folder); - for (; it; ++it) - { - if (it.sym() == SPD){ - A = it.matrix(); - if(A.diagonal().size() <= maxRealWorldSize) - { - DenseVector b = it.rhs(); - DenseVector refX = it.refX(); - PermutationMatrix pnull; - halfA.resize(A.rows(), A.cols()); - if(Solver::UpLo == (Lower|Upper)) - halfA = A; - else - halfA.template selfadjointView() = A.template triangularView().twistedBy(pnull); - - std::cout << "INFO | Testing " << sym_to_string(it.sym()) << "sparse problem " << it.matname() - << " (" << A.rows() << "x" << A.cols() << ") using " << typeid(Solver).name() << "..." << std::endl; - CALL_SUBTEST( check_sparse_solving_real_cases(solver, A, b, A, refX) ); - std::string stats = solver_stats(solver); - if(stats.size()>0) - std::cout << "INFO | " << stats << std::endl; - CALL_SUBTEST( check_sparse_solving_real_cases(solver, halfA, b, A, refX) ); - } - else - { - std::cout << "INFO | Skip sparse problem \"" << it.matname() << "\" (too large)" << std::endl; - } - } - } - } -#else - EIGEN_UNUSED_VARIABLE(maxRealWorldSize); -#endif -} - -template void check_sparse_spd_determinant(Solver& solver) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef Matrix DenseMatrix; - - // generate the problem - Mat A, halfA; - DenseMatrix dA; - generate_sparse_spd_problem(solver, A, halfA, dA, 30); - - for (int i = 0; i < g_repeat; i++) { - check_sparse_determinant(solver, A, dA); - check_sparse_determinant(solver, halfA, dA ); - } -} - -template -Index generate_sparse_square_problem(Solver&, typename Solver::MatrixType& A, DenseMat& dA, int maxSize = 300, int options = ForceNonZeroDiag) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - - Index size = internal::random(1,maxSize); - double density = (std::max)(8./(size*size), 0.01); - - A.resize(size,size); - dA.resize(size,size); - - initSparse(density, dA, A, options); - - return size; -} - - -struct prune_column { - Index m_col; - prune_column(Index col) : m_col(col) {} - template - bool operator()(Index, Index col, const Scalar&) const { - return col != m_col; - } -}; - - -template void check_sparse_square_solving(Solver& solver, int maxSize = 300, int maxRealWorldSize = 100000, bool checkDeficient = false) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef SparseMatrix SpMat; - typedef SparseVector SpVec; - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - - int rhsCols = internal::random(1,16); - - Mat A; - DenseMatrix dA; - for (int i = 0; i < g_repeat; i++) { - Index size = generate_sparse_square_problem(solver, A, dA, maxSize); - - A.makeCompressed(); - DenseVector b = DenseVector::Random(size); - DenseMatrix dB(size,rhsCols); - SpMat B(size,rhsCols); - double density = (std::max)(8./(size*rhsCols), 0.1); - initSparse(density, dB, B, ForceNonZeroDiag); - B.makeCompressed(); - SpVec c = B.col(0); - DenseVector dc = dB.col(0); - CALL_SUBTEST(check_sparse_solving(solver, A, b, dA, b)); - CALL_SUBTEST(check_sparse_solving(solver, A, dB, dA, dB)); - CALL_SUBTEST(check_sparse_solving(solver, A, B, dA, dB)); - CALL_SUBTEST(check_sparse_solving(solver, A, c, dA, dc)); - - // check only once - if(i==0) - { - b = DenseVector::Zero(size); - check_sparse_solving(solver, A, b, dA, b); - } - // regression test for Bug 792 (structurally rank deficient matrices): - if(checkDeficient && size>1) { - Index col = internal::random(0,int(size-1)); - A.prune(prune_column(col)); - solver.compute(A); - VERIFY_IS_EQUAL(solver.info(), NumericalIssue); - } - } - - // First, get the folder -#ifdef TEST_REAL_CASES - // Test real problems with double precision only - if (internal::is_same::Real, double>::value) - { - std::string mat_folder = get_matrixfolder(); - MatrixMarketIterator it(mat_folder); - for (; it; ++it) - { - A = it.matrix(); - if(A.diagonal().size() <= maxRealWorldSize) - { - DenseVector b = it.rhs(); - DenseVector refX = it.refX(); - std::cout << "INFO | Testing " << sym_to_string(it.sym()) << "sparse problem " << it.matname() - << " (" << A.rows() << "x" << A.cols() << ") using " << typeid(Solver).name() << "..." << std::endl; - CALL_SUBTEST(check_sparse_solving_real_cases(solver, A, b, A, refX)); - std::string stats = solver_stats(solver); - if(stats.size()>0) - std::cout << "INFO | " << stats << std::endl; - } - else - { - std::cout << "INFO | SKIP sparse problem \"" << it.matname() << "\" (too large)" << std::endl; - } - } - } -#else - EIGEN_UNUSED_VARIABLE(maxRealWorldSize); -#endif - -} - -template void check_sparse_square_determinant(Solver& solver) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef Matrix DenseMatrix; - - for (int i = 0; i < g_repeat; i++) { - // generate the problem - Mat A; - DenseMatrix dA; - - int size = internal::random(1,30); - dA.setRandom(size,size); - - dA = (dA.array().abs()<0.3).select(0,dA); - dA.diagonal() = (dA.diagonal().array()==0).select(1,dA.diagonal()); - A = dA.sparseView(); - A.makeCompressed(); - - check_sparse_determinant(solver, A, dA); - } -} - -template void check_sparse_square_abs_determinant(Solver& solver) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef Matrix DenseMatrix; - - for (int i = 0; i < g_repeat; i++) { - // generate the problem - Mat A; - DenseMatrix dA; - generate_sparse_square_problem(solver, A, dA, 30); - A.makeCompressed(); - check_sparse_abs_determinant(solver, A, dA); - } -} - -template -void generate_sparse_leastsquare_problem(Solver&, typename Solver::MatrixType& A, DenseMat& dA, int maxSize = 300, int options = ForceNonZeroDiag) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - - int rows = internal::random(1,maxSize); - int cols = internal::random(1,rows); - double density = (std::max)(8./(rows*cols), 0.01); - - A.resize(rows,cols); - dA.resize(rows,cols); - - initSparse(density, dA, A, options); -} - -template void check_sparse_leastsquare_solving(Solver& solver) -{ - typedef typename Solver::MatrixType Mat; - typedef typename Mat::Scalar Scalar; - typedef SparseMatrix SpMat; - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - - int rhsCols = internal::random(1,16); - - Mat A; - DenseMatrix dA; - for (int i = 0; i < g_repeat; i++) { - generate_sparse_leastsquare_problem(solver, A, dA); - - A.makeCompressed(); - DenseVector b = DenseVector::Random(A.rows()); - DenseMatrix dB(A.rows(),rhsCols); - SpMat B(A.rows(),rhsCols); - double density = (std::max)(8./(A.rows()*rhsCols), 0.1); - initSparse(density, dB, B, ForceNonZeroDiag); - B.makeCompressed(); - check_sparse_solving(solver, A, b, dA, b); - check_sparse_solving(solver, A, dB, dA, dB); - check_sparse_solving(solver, A, B, dA, dB); - - // check only once - if(i==0) - { - b = DenseVector::Zero(A.rows()); - check_sparse_solving(solver, A, b, dA, b); - } - } -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_solvers.cpp b/testbed/nanogui/ext/eigen/test/sparse_solvers.cpp deleted file mode 100644 index 3a8873d4..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_solvers.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse.h" - -template void -initSPD(double density, - Matrix& refMat, - SparseMatrix& sparseMat) -{ - Matrix aux(refMat.rows(),refMat.cols()); - initSparse(density,refMat,sparseMat); - refMat = refMat * refMat.adjoint(); - for (int k=0; k<2; ++k) - { - initSparse(density,aux,sparseMat,ForceNonZeroDiag); - refMat += aux * aux.adjoint(); - } - sparseMat.setZero(); - for (int j=0 ; j void sparse_solvers(int rows, int cols) -{ - double density = (std::max)(8./(rows*cols), 0.01); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - // Scalar eps = 1e-6; - - DenseVector vec1 = DenseVector::Random(rows); - - std::vector zeroCoords; - std::vector nonzeroCoords; - - // test triangular solver - { - DenseVector vec2 = vec1, vec3 = vec1; - SparseMatrix m2(rows, cols); - DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); - - // lower - dense - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords); - VERIFY_IS_APPROX(refMat2.template triangularView().solve(vec2), - m2.template triangularView().solve(vec3)); - - // upper - dense - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords); - VERIFY_IS_APPROX(refMat2.template triangularView().solve(vec2), - m2.template triangularView().solve(vec3)); - VERIFY_IS_APPROX(refMat2.conjugate().template triangularView().solve(vec2), - m2.conjugate().template triangularView().solve(vec3)); - { - SparseMatrix cm2(m2); - //Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr - MappedSparseMatrix mm2(rows, cols, cm2.nonZeros(), cm2.outerIndexPtr(), cm2.innerIndexPtr(), cm2.valuePtr()); - VERIFY_IS_APPROX(refMat2.conjugate().template triangularView().solve(vec2), - mm2.conjugate().template triangularView().solve(vec3)); - } - - // lower - transpose - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords); - VERIFY_IS_APPROX(refMat2.transpose().template triangularView().solve(vec2), - m2.transpose().template triangularView().solve(vec3)); - - // upper - transpose - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular, &zeroCoords, &nonzeroCoords); - VERIFY_IS_APPROX(refMat2.transpose().template triangularView().solve(vec2), - m2.transpose().template triangularView().solve(vec3)); - - SparseMatrix matB(rows, rows); - DenseMatrix refMatB = DenseMatrix::Zero(rows, rows); - - // lower - sparse - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular); - initSparse(density, refMatB, matB); - refMat2.template triangularView().solveInPlace(refMatB); - m2.template triangularView().solveInPlace(matB); - VERIFY_IS_APPROX(matB.toDense(), refMatB); - - // upper - sparse - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeUpperTriangular); - initSparse(density, refMatB, matB); - refMat2.template triangularView().solveInPlace(refMatB); - m2.template triangularView().solveInPlace(matB); - VERIFY_IS_APPROX(matB, refMatB); - - // test deprecated API - initSparse(density, refMat2, m2, ForceNonZeroDiag|MakeLowerTriangular, &zeroCoords, &nonzeroCoords); - VERIFY_IS_APPROX(refMat2.template triangularView().solve(vec2), - m2.template triangularView().solve(vec3)); - } -} - -void test_sparse_solvers() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1(sparse_solvers(8, 8) ); - int s = internal::random(1,300); - CALL_SUBTEST_2(sparse_solvers >(s,s) ); - CALL_SUBTEST_1(sparse_solvers(s,s) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/sparse_vector.cpp b/testbed/nanogui/ext/eigen/test/sparse_vector.cpp deleted file mode 100644 index b3e1dda2..00000000 --- a/testbed/nanogui/ext/eigen/test/sparse_vector.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "sparse.h" - -template void sparse_vector(int rows, int cols) -{ - double densityMat = (std::max)(8./(rows*cols), 0.01); - double densityVec = (std::max)(8./(rows), 0.1); - typedef Matrix DenseMatrix; - typedef Matrix DenseVector; - typedef SparseVector SparseVectorType; - typedef SparseMatrix SparseMatrixType; - Scalar eps = 1e-6; - - SparseMatrixType m1(rows,rows); - SparseVectorType v1(rows), v2(rows), v3(rows); - DenseMatrix refM1 = DenseMatrix::Zero(rows, rows); - DenseVector refV1 = DenseVector::Random(rows), - refV2 = DenseVector::Random(rows), - refV3 = DenseVector::Random(rows); - - std::vector zerocoords, nonzerocoords; - initSparse(densityVec, refV1, v1, &zerocoords, &nonzerocoords); - initSparse(densityMat, refM1, m1); - - initSparse(densityVec, refV2, v2); - initSparse(densityVec, refV3, v3); - - Scalar s1 = internal::random(); - - // test coeff and coeffRef - for (unsigned int i=0; i(0,rows-1); - Scalar v = internal::random(); - v4.coeffRef(i) += v; - v5.coeffRef(i) += v; - } - VERIFY_IS_APPROX(v4,v5); - } - - v1.coeffRef(nonzerocoords[0]) = Scalar(5); - refV1.coeffRef(nonzerocoords[0]) = Scalar(5); - VERIFY_IS_APPROX(v1, refV1); - - VERIFY_IS_APPROX(v1+v2, refV1+refV2); - VERIFY_IS_APPROX(v1+v2+v3, refV1+refV2+refV3); - - VERIFY_IS_APPROX(v1*s1-v2, refV1*s1-refV2); - - VERIFY_IS_APPROX(v1*=s1, refV1*=s1); - VERIFY_IS_APPROX(v1/=s1, refV1/=s1); - - VERIFY_IS_APPROX(v1+=v2, refV1+=refV2); - VERIFY_IS_APPROX(v1-=v2, refV1-=refV2); - - VERIFY_IS_APPROX(v1.dot(v2), refV1.dot(refV2)); - VERIFY_IS_APPROX(v1.dot(refV2), refV1.dot(refV2)); - - VERIFY_IS_APPROX(m1*v2, refM1*refV2); - VERIFY_IS_APPROX(v1.dot(m1*v2), refV1.dot(refM1*refV2)); - { - int i = internal::random(0,rows-1); - VERIFY_IS_APPROX(v1.dot(m1.col(i)), refV1.dot(refM1.col(i))); - } - - - VERIFY_IS_APPROX(v1.squaredNorm(), refV1.squaredNorm()); - - VERIFY_IS_APPROX(v1.blueNorm(), refV1.blueNorm()); - - // test aliasing - VERIFY_IS_APPROX((v1 = -v1), (refV1 = -refV1)); - VERIFY_IS_APPROX((v1 = v1.transpose()), (refV1 = refV1.transpose().eval())); - VERIFY_IS_APPROX((v1 += -v1), (refV1 += -refV1)); - - // sparse matrix to sparse vector - SparseMatrixType mv1; - VERIFY_IS_APPROX((mv1=v1),v1); - VERIFY_IS_APPROX(mv1,(v1=mv1)); - VERIFY_IS_APPROX(mv1,(v1=mv1.transpose())); - - // check copy to dense vector with transpose - refV3.resize(0); - VERIFY_IS_APPROX(refV3 = v1.transpose(),v1.toDense()); - VERIFY_IS_APPROX(DenseVector(v1),v1.toDense()); - - // test conservative resize - { - std::vector inc; - if(rows > 3) - inc.push_back(-3); - inc.push_back(0); - inc.push_back(3); - inc.push_back(1); - inc.push_back(10); - - for(std::size_t i = 0; i< inc.size(); i++) { - StorageIndex incRows = inc[i]; - SparseVectorType vec1(rows); - DenseVector refVec1 = DenseVector::Zero(rows); - initSparse(densityVec, refVec1, vec1); - - vec1.conservativeResize(rows+incRows); - refVec1.conservativeResize(rows+incRows); - if (incRows > 0) refVec1.tail(incRows).setZero(); - - VERIFY_IS_APPROX(vec1, refVec1); - - // Insert new values - if (incRows > 0) - vec1.insert(vec1.rows()-1) = refVec1(refVec1.rows()-1) = 1; - - VERIFY_IS_APPROX(vec1, refVec1); - } - } - -} - -void test_sparse_vector() -{ - for(int i = 0; i < g_repeat; i++) { - int r = Eigen::internal::random(1,500), c = Eigen::internal::random(1,500); - if(Eigen::internal::random(0,4) == 0) { - r = c; // check square matrices in 25% of tries - } - EIGEN_UNUSED_VARIABLE(r+c); - - CALL_SUBTEST_1(( sparse_vector(8, 8) )); - CALL_SUBTEST_2(( sparse_vector, int>(r, c) )); - CALL_SUBTEST_1(( sparse_vector(r, c) )); - CALL_SUBTEST_1(( sparse_vector(r, c) )); - } -} - diff --git a/testbed/nanogui/ext/eigen/test/sparselu.cpp b/testbed/nanogui/ext/eigen/test/sparselu.cpp deleted file mode 100644 index bd000baf..00000000 --- a/testbed/nanogui/ext/eigen/test/sparselu.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Désiré Nuentsa-Wakam -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// SparseLU solve does not accept column major matrices for the destination. -// However, as expected, the generic check_sparse_square_solving routines produces row-major -// rhs and destination matrices when compiled with EIGEN_DEFAULT_TO_ROW_MAJOR - -#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR -#undef EIGEN_DEFAULT_TO_ROW_MAJOR -#endif - -#include "sparse_solver.h" -#include -#include - -template void test_sparselu_T() -{ - SparseLU /*, COLAMDOrdering*/ > sparselu_colamd; // COLAMDOrdering is the default - SparseLU, AMDOrdering > sparselu_amd; - SparseLU, NaturalOrdering > sparselu_natural; - - check_sparse_square_solving(sparselu_colamd, 300, 100000, true); - check_sparse_square_solving(sparselu_amd, 300, 10000, true); - check_sparse_square_solving(sparselu_natural, 300, 2000, true); - - check_sparse_square_abs_determinant(sparselu_colamd); - check_sparse_square_abs_determinant(sparselu_amd); - - check_sparse_square_determinant(sparselu_colamd); - check_sparse_square_determinant(sparselu_amd); -} - -void test_sparselu() -{ - CALL_SUBTEST_1(test_sparselu_T()); - CALL_SUBTEST_2(test_sparselu_T()); - CALL_SUBTEST_3(test_sparselu_T >()); - CALL_SUBTEST_4(test_sparselu_T >()); -} diff --git a/testbed/nanogui/ext/eigen/test/sparseqr.cpp b/testbed/nanogui/ext/eigen/test/sparseqr.cpp deleted file mode 100644 index e8605fd2..00000000 --- a/testbed/nanogui/ext/eigen/test/sparseqr.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Desire Nuentsa Wakam -// Copyright (C) 2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -#include "sparse.h" -#include - -template -int generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows = 300, int maxCols = 150) -{ - eigen_assert(maxRows >= maxCols); - typedef typename MatrixType::Scalar Scalar; - int rows = internal::random(1,maxRows); - int cols = internal::random(1,maxCols); - double density = (std::max)(8./(rows*cols), 0.01); - - A.resize(rows,cols); - dA.resize(rows,cols); - initSparse(density, dA, A,ForceNonZeroDiag); - A.makeCompressed(); - int nop = internal::random(0, internal::random(0,1) > 0.5 ? cols/2 : 0); - for(int k=0; k(0,cols-1); - int j1 = internal::random(0,cols-1); - Scalar s = internal::random(); - A.col(j0) = s * A.col(j1); - dA.col(j0) = s * dA.col(j1); - } - -// if(rows void test_sparseqr_scalar() -{ - typedef SparseMatrix MatrixType; - typedef Matrix DenseMat; - typedef Matrix DenseVector; - MatrixType A; - DenseMat dA; - DenseVector refX,x,b; - SparseQR > solver; - generate_sparse_rectangular_problem(A,dA); - - b = dA * DenseVector::Random(A.cols()); - solver.compute(A); - if(internal::random(0,1)>0.5f) - solver.factorize(A); // this checks that calling analyzePattern is not needed if the pattern do not change. - if (solver.info() != Success) - { - std::cerr << "sparse QR factorization failed\n"; - exit(0); - return; - } - x = solver.solve(b); - if (solver.info() != Success) - { - std::cerr << "sparse QR factorization failed\n"; - exit(0); - return; - } - - VERIFY_IS_APPROX(A * x, b); - - //Compare with a dense QR solver - ColPivHouseholderQR dqr(dA); - refX = dqr.solve(b); - - VERIFY_IS_EQUAL(dqr.rank(), solver.rank()); - if(solver.rank()==A.cols()) // full rank - VERIFY_IS_APPROX(x, refX); -// else -// VERIFY((dA * refX - b).norm() * 2 > (A * x - b).norm() ); - - // Compute explicitly the matrix Q - MatrixType Q, QtQ, idM; - Q = solver.matrixQ(); - //Check ||Q' * Q - I || - QtQ = Q * Q.adjoint(); - idM.resize(Q.rows(), Q.rows()); idM.setIdentity(); - VERIFY(idM.isApprox(QtQ)); - - // Q to dense - DenseMat dQ; - dQ = solver.matrixQ(); - VERIFY_IS_APPROX(Q, dQ); -} -void test_sparseqr() -{ - for(int i=0; i()); - CALL_SUBTEST_2(test_sparseqr_scalar >()); - } -} - diff --git a/testbed/nanogui/ext/eigen/test/special_numbers.cpp b/testbed/nanogui/ext/eigen/test/special_numbers.cpp deleted file mode 100644 index 2f1b704b..00000000 --- a/testbed/nanogui/ext/eigen/test/special_numbers.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2013 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void special_numbers() -{ - typedef Matrix MatType; - int rows = internal::random(1,300); - int cols = internal::random(1,300); - - Scalar nan = std::numeric_limits::quiet_NaN(); - Scalar inf = std::numeric_limits::infinity(); - Scalar s1 = internal::random(); - - MatType m1 = MatType::Random(rows,cols), - mnan = MatType::Random(rows,cols), - minf = MatType::Random(rows,cols), - mboth = MatType::Random(rows,cols); - - int n = internal::random(1,10); - for(int k=0; k(0,rows-1), internal::random(0,cols-1)) = nan; - minf(internal::random(0,rows-1), internal::random(0,cols-1)) = inf; - } - mboth = mnan + minf; - - VERIFY(!m1.hasNaN()); - VERIFY(m1.allFinite()); - - VERIFY(mnan.hasNaN()); - VERIFY((s1*mnan).hasNaN()); - VERIFY(!minf.hasNaN()); - VERIFY(!(2*minf).hasNaN()); - VERIFY(mboth.hasNaN()); - VERIFY(mboth.array().hasNaN()); - - VERIFY(!mnan.allFinite()); - VERIFY(!minf.allFinite()); - VERIFY(!(minf-mboth).allFinite()); - VERIFY(!mboth.allFinite()); - VERIFY(!mboth.array().allFinite()); -} - -void test_special_numbers() -{ - for(int i = 0; i < 10*g_repeat; i++) { - CALL_SUBTEST_1( special_numbers() ); - CALL_SUBTEST_1( special_numbers() ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/spqr_support.cpp b/testbed/nanogui/ext/eigen/test/spqr_support.cpp deleted file mode 100644 index 81e63b6a..00000000 --- a/testbed/nanogui/ext/eigen/test/spqr_support.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2012 Desire Nuentsa Wakam -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed - -#define EIGEN_NO_DEBUG_SMALL_PRODUCT_BLOCKS -#include "sparse.h" -#include - - -template -int generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows = 300, int maxCols = 300) -{ - eigen_assert(maxRows >= maxCols); - typedef typename MatrixType::Scalar Scalar; - int rows = internal::random(1,maxRows); - int cols = internal::random(1,rows); - double density = (std::max)(8./(rows*cols), 0.01); - - A.resize(rows,cols); - dA.resize(rows,cols); - initSparse(density, dA, A,ForceNonZeroDiag); - A.makeCompressed(); - return rows; -} - -template void test_spqr_scalar() -{ - typedef SparseMatrix MatrixType; - MatrixType A; - Matrix dA; - typedef Matrix DenseVector; - DenseVector refX,x,b; - SPQR solver; - generate_sparse_rectangular_problem(A,dA); - - Index m = A.rows(); - b = DenseVector::Random(m); - solver.compute(A); - if (solver.info() != Success) - { - std::cerr << "sparse QR factorization failed\n"; - exit(0); - return; - } - x = solver.solve(b); - if (solver.info() != Success) - { - std::cerr << "sparse QR factorization failed\n"; - exit(0); - return; - } - //Compare with a dense solver - refX = dA.colPivHouseholderQr().solve(b); - VERIFY(x.isApprox(refX,test_precision())); -} -void test_spqr_support() -{ - CALL_SUBTEST_1(test_spqr_scalar()); - CALL_SUBTEST_2(test_spqr_scalar >()); -} diff --git a/testbed/nanogui/ext/eigen/test/stable_norm.cpp b/testbed/nanogui/ext/eigen/test/stable_norm.cpp deleted file mode 100644 index c3eb5ff3..00000000 --- a/testbed/nanogui/ext/eigen/test/stable_norm.cpp +++ /dev/null @@ -1,192 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009-2014 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template EIGEN_DONT_INLINE T copy(const T& x) -{ - return x; -} - -template void stable_norm(const MatrixType& m) -{ - /* this test covers the following files: - StableNorm.h - */ - using std::sqrt; - using std::abs; - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - - bool complex_real_product_ok = true; - - // Check the basic machine-dependent constants. - { - int ibeta, it, iemin, iemax; - - ibeta = std::numeric_limits::radix; // base for floating-point numbers - it = std::numeric_limits::digits; // number of base-beta digits in mantissa - iemin = std::numeric_limits::min_exponent; // minimum exponent - iemax = std::numeric_limits::max_exponent; // maximum exponent - - VERIFY( (!(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5) || (it<=4 && ibeta <= 3 ) || it<2)) - && "the stable norm algorithm cannot be guaranteed on this computer"); - - Scalar inf = std::numeric_limits::infinity(); - if(NumTraits::IsComplex && (numext::isnan)(inf*RealScalar(1)) ) - { - complex_real_product_ok = false; - static bool first = true; - if(first) - std::cerr << "WARNING: compiler mess up complex*real product, " << inf << " * " << 1.0 << " = " << inf*RealScalar(1) << std::endl; - first = false; - } - } - - - Index rows = m.rows(); - Index cols = m.cols(); - - // get a non-zero random factor - Scalar factor = internal::random(); - while(numext::abs2(factor)(); - Scalar big = factor * ((std::numeric_limits::max)() * RealScalar(1e-4)); - - factor = internal::random(); - while(numext::abs2(factor)(); - Scalar small = factor * ((std::numeric_limits::min)() * RealScalar(1e4)); - - MatrixType vzero = MatrixType::Zero(rows, cols), - vrand = MatrixType::Random(rows, cols), - vbig(rows, cols), - vsmall(rows,cols); - - vbig.fill(big); - vsmall.fill(small); - - VERIFY_IS_MUCH_SMALLER_THAN(vzero.norm(), static_cast(1)); - VERIFY_IS_APPROX(vrand.stableNorm(), vrand.norm()); - VERIFY_IS_APPROX(vrand.blueNorm(), vrand.norm()); - VERIFY_IS_APPROX(vrand.hypotNorm(), vrand.norm()); - - RealScalar size = static_cast(m.size()); - - // test numext::isfinite - VERIFY(!(numext::isfinite)( std::numeric_limits::infinity())); - VERIFY(!(numext::isfinite)(sqrt(-abs(big)))); - - // test overflow - VERIFY((numext::isfinite)(sqrt(size)*abs(big))); - VERIFY_IS_NOT_APPROX(sqrt(copy(vbig.squaredNorm())), abs(sqrt(size)*big)); // here the default norm must fail - VERIFY_IS_APPROX(vbig.stableNorm(), sqrt(size)*abs(big)); - VERIFY_IS_APPROX(vbig.blueNorm(), sqrt(size)*abs(big)); - VERIFY_IS_APPROX(vbig.hypotNorm(), sqrt(size)*abs(big)); - - // test underflow - VERIFY((numext::isfinite)(sqrt(size)*abs(small))); - VERIFY_IS_NOT_APPROX(sqrt(copy(vsmall.squaredNorm())), abs(sqrt(size)*small)); // here the default norm must fail - VERIFY_IS_APPROX(vsmall.stableNorm(), sqrt(size)*abs(small)); - VERIFY_IS_APPROX(vsmall.blueNorm(), sqrt(size)*abs(small)); - VERIFY_IS_APPROX(vsmall.hypotNorm(), sqrt(size)*abs(small)); - - // Test compilation of cwise() version - VERIFY_IS_APPROX(vrand.colwise().stableNorm(), vrand.colwise().norm()); - VERIFY_IS_APPROX(vrand.colwise().blueNorm(), vrand.colwise().norm()); - VERIFY_IS_APPROX(vrand.colwise().hypotNorm(), vrand.colwise().norm()); - VERIFY_IS_APPROX(vrand.rowwise().stableNorm(), vrand.rowwise().norm()); - VERIFY_IS_APPROX(vrand.rowwise().blueNorm(), vrand.rowwise().norm()); - VERIFY_IS_APPROX(vrand.rowwise().hypotNorm(), vrand.rowwise().norm()); - - // test NaN, +inf, -inf - MatrixType v; - Index i = internal::random(0,rows-1); - Index j = internal::random(0,cols-1); - - // NaN - { - v = vrand; - v(i,j) = std::numeric_limits::quiet_NaN(); - VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY((numext::isnan)(v.squaredNorm())); - VERIFY(!(numext::isfinite)(v.norm())); VERIFY((numext::isnan)(v.norm())); - VERIFY(!(numext::isfinite)(v.stableNorm())); VERIFY((numext::isnan)(v.stableNorm())); - VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY((numext::isnan)(v.blueNorm())); - VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY((numext::isnan)(v.hypotNorm())); - } - - // +inf - { - v = vrand; - v(i,j) = std::numeric_limits::infinity(); - VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); - VERIFY(!(numext::isfinite)(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!(numext::isfinite)(v.stableNorm())); - if(complex_real_product_ok){ - VERIFY(isPlusInf(v.stableNorm())); - } - VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); - VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); - } - - // -inf - { - v = vrand; - v(i,j) = -std::numeric_limits::infinity(); - VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); - VERIFY(!(numext::isfinite)(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!(numext::isfinite)(v.stableNorm())); - if(complex_real_product_ok) { - VERIFY(isPlusInf(v.stableNorm())); - } - VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); - VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); - } - - // mix - { - Index i2 = internal::random(0,rows-1); - Index j2 = internal::random(0,cols-1); - v = vrand; - v(i,j) = -std::numeric_limits::infinity(); - v(i2,j2) = std::numeric_limits::quiet_NaN(); - VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY((numext::isnan)(v.squaredNorm())); - VERIFY(!(numext::isfinite)(v.norm())); VERIFY((numext::isnan)(v.norm())); - VERIFY(!(numext::isfinite)(v.stableNorm())); VERIFY((numext::isnan)(v.stableNorm())); - VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY((numext::isnan)(v.blueNorm())); - VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY((numext::isnan)(v.hypotNorm())); - } - - // stableNormalize[d] - { - VERIFY_IS_APPROX(vrand.stableNormalized(), vrand.normalized()); - MatrixType vcopy(vrand); - vcopy.stableNormalize(); - VERIFY_IS_APPROX(vcopy, vrand.normalized()); - VERIFY_IS_APPROX((vrand.stableNormalized()).norm(), RealScalar(1)); - VERIFY_IS_APPROX(vcopy.norm(), RealScalar(1)); - VERIFY_IS_APPROX((vbig.stableNormalized()).norm(), RealScalar(1)); - VERIFY_IS_APPROX((vsmall.stableNormalized()).norm(), RealScalar(1)); - RealScalar big_scaling = ((std::numeric_limits::max)() * RealScalar(1e-4)); - VERIFY_IS_APPROX(vbig/big_scaling, (vbig.stableNorm() * vbig.stableNormalized()).eval()/big_scaling); - VERIFY_IS_APPROX(vsmall, vsmall.stableNorm() * vsmall.stableNormalized()); - } -} - -void test_stable_norm() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( stable_norm(Matrix()) ); - CALL_SUBTEST_2( stable_norm(Vector4d()) ); - CALL_SUBTEST_3( stable_norm(VectorXd(internal::random(10,2000))) ); - CALL_SUBTEST_4( stable_norm(VectorXf(internal::random(10,2000))) ); - CALL_SUBTEST_5( stable_norm(VectorXcd(internal::random(10,2000))) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/stddeque.cpp b/testbed/nanogui/ext/eigen/test/stddeque.cpp deleted file mode 100644 index bb4b476f..00000000 --- a/testbed/nanogui/ext/eigen/test/stddeque.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// Copyright (C) 2010 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template -void check_stddeque_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - - Index rows = m.rows(); - Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - std::deque > v(10, MatrixType(rows,cols)), w(20, y); - v.front() = x; - w.front() = w.back(); - VERIFY_IS_APPROX(w.front(), w.back()); - v = w; - - typename std::deque >::iterator vi = v.begin(); - typename std::deque >::iterator wi = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*vi, *wi); - ++vi; - ++wi; - } - - v.resize(21); - v.back() = x; - VERIFY_IS_APPROX(v.back(), x); - v.resize(22,y); - VERIFY_IS_APPROX(v.back(), y); - v.push_back(x); - VERIFY_IS_APPROX(v.back(), x); -} - -template -void check_stddeque_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - std::deque > v(10), w(20, y); - v.front() = x; - w.front() = w.back(); - VERIFY_IS_APPROX(w.front(), w.back()); - v = w; - - typename std::deque >::iterator vi = v.begin(); - typename std::deque >::iterator wi = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*vi, *wi); - ++vi; - ++wi; - } - - v.resize(21); - v.back() = x; - VERIFY_IS_APPROX(v.back(), x); - v.resize(22,y); - VERIFY_IS_APPROX(v.back(), y); - v.push_back(x); - VERIFY_IS_APPROX(v.back(), x); -} - -template -void check_stddeque_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - std::deque > v(10), w(20, y); - v.front() = x; - w.front() = w.back(); - VERIFY_IS_APPROX(w.front(), w.back()); - v = w; - - typename std::deque >::iterator vi = v.begin(); - typename std::deque >::iterator wi = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*vi, *wi); - ++vi; - ++wi; - } - - v.resize(21); - v.back() = x; - VERIFY_IS_APPROX(v.back(), x); - v.resize(22,y); - VERIFY_IS_APPROX(v.back(), y); - v.push_back(x); - VERIFY_IS_APPROX(v.back(), x); -} - -void test_stddeque() -{ - // some non vectorizable fixed sizes - CALL_SUBTEST_1(check_stddeque_matrix(Vector2f())); - CALL_SUBTEST_1(check_stddeque_matrix(Matrix3f())); - CALL_SUBTEST_2(check_stddeque_matrix(Matrix3d())); - - // some vectorizable fixed sizes - CALL_SUBTEST_1(check_stddeque_matrix(Matrix2f())); - CALL_SUBTEST_1(check_stddeque_matrix(Vector4f())); - CALL_SUBTEST_1(check_stddeque_matrix(Matrix4f())); - CALL_SUBTEST_2(check_stddeque_matrix(Matrix4d())); - - // some dynamic sizes - CALL_SUBTEST_3(check_stddeque_matrix(MatrixXd(1,1))); - CALL_SUBTEST_3(check_stddeque_matrix(VectorXd(20))); - CALL_SUBTEST_3(check_stddeque_matrix(RowVectorXf(20))); - CALL_SUBTEST_3(check_stddeque_matrix(MatrixXcf(10,10))); - - // some Transform - CALL_SUBTEST_4(check_stddeque_transform(Affine2f())); - CALL_SUBTEST_4(check_stddeque_transform(Affine3f())); - CALL_SUBTEST_4(check_stddeque_transform(Affine3d())); - - // some Quaternion - CALL_SUBTEST_5(check_stddeque_quaternion(Quaternionf())); - CALL_SUBTEST_5(check_stddeque_quaternion(Quaterniond())); -} diff --git a/testbed/nanogui/ext/eigen/test/stddeque_overload.cpp b/testbed/nanogui/ext/eigen/test/stddeque_overload.cpp deleted file mode 100644 index 4da618bb..00000000 --- a/testbed/nanogui/ext/eigen/test/stddeque_overload.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// Copyright (C) 2010 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include -#include - -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Vector4f) - -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix2f) -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix4f) -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix4d) - -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Affine3f) -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Affine3d) - -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Quaternionf) -EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Quaterniond) - -template -void check_stddeque_matrix(const MatrixType& m) -{ - typename MatrixType::Index rows = m.rows(); - typename MatrixType::Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - std::deque v(10, MatrixType(rows,cols)), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - - // do a lot of push_back such that the deque gets internally resized - // (with memory reallocation) - MatrixType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -void check_stddeque_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - std::deque v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - - // do a lot of push_back such that the deque gets internally resized - // (with memory reallocation) - TransformType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -void check_stddeque_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - std::deque v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - - // do a lot of push_back such that the deque gets internally resized - // (with memory reallocation) - QuaternionType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -// Copyright (C) 2010 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template -void check_stdlist_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - - Index rows = m.rows(); - Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - std::list > v(10, MatrixType(rows,cols)), w(20, y); - v.front() = x; - w.front() = w.back(); - VERIFY_IS_APPROX(w.front(), w.back()); - v = w; - - typename std::list >::iterator vi = v.begin(); - typename std::list >::iterator wi = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*vi, *wi); - ++vi; - ++wi; - } - - v.resize(21); - v.back() = x; - VERIFY_IS_APPROX(v.back(), x); - v.resize(22,y); - VERIFY_IS_APPROX(v.back(), y); - v.push_back(x); - VERIFY_IS_APPROX(v.back(), x); -} - -template -void check_stdlist_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - std::list > v(10), w(20, y); - v.front() = x; - w.front() = w.back(); - VERIFY_IS_APPROX(w.front(), w.back()); - v = w; - - typename std::list >::iterator vi = v.begin(); - typename std::list >::iterator wi = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*vi, *wi); - ++vi; - ++wi; - } - - v.resize(21); - v.back() = x; - VERIFY_IS_APPROX(v.back(), x); - v.resize(22,y); - VERIFY_IS_APPROX(v.back(), y); - v.push_back(x); - VERIFY_IS_APPROX(v.back(), x); -} - -template -void check_stdlist_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - std::list > v(10), w(20, y); - v.front() = x; - w.front() = w.back(); - VERIFY_IS_APPROX(w.front(), w.back()); - v = w; - - typename std::list >::iterator vi = v.begin(); - typename std::list >::iterator wi = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*vi, *wi); - ++vi; - ++wi; - } - - v.resize(21); - v.back() = x; - VERIFY_IS_APPROX(v.back(), x); - v.resize(22,y); - VERIFY_IS_APPROX(v.back(), y); - v.push_back(x); - VERIFY_IS_APPROX(v.back(), x); -} - -void test_stdlist() -{ - // some non vectorizable fixed sizes - CALL_SUBTEST_1(check_stdlist_matrix(Vector2f())); - CALL_SUBTEST_1(check_stdlist_matrix(Matrix3f())); - CALL_SUBTEST_2(check_stdlist_matrix(Matrix3d())); - - // some vectorizable fixed sizes - CALL_SUBTEST_1(check_stdlist_matrix(Matrix2f())); - CALL_SUBTEST_1(check_stdlist_matrix(Vector4f())); - CALL_SUBTEST_1(check_stdlist_matrix(Matrix4f())); - CALL_SUBTEST_2(check_stdlist_matrix(Matrix4d())); - - // some dynamic sizes - CALL_SUBTEST_3(check_stdlist_matrix(MatrixXd(1,1))); - CALL_SUBTEST_3(check_stdlist_matrix(VectorXd(20))); - CALL_SUBTEST_3(check_stdlist_matrix(RowVectorXf(20))); - CALL_SUBTEST_3(check_stdlist_matrix(MatrixXcf(10,10))); - - // some Transform - CALL_SUBTEST_4(check_stdlist_transform(Affine2f())); - CALL_SUBTEST_4(check_stdlist_transform(Affine3f())); - CALL_SUBTEST_4(check_stdlist_transform(Affine3d())); - - // some Quaternion - CALL_SUBTEST_5(check_stdlist_quaternion(Quaternionf())); - CALL_SUBTEST_5(check_stdlist_quaternion(Quaterniond())); -} diff --git a/testbed/nanogui/ext/eigen/test/stdlist_overload.cpp b/testbed/nanogui/ext/eigen/test/stdlist_overload.cpp deleted file mode 100644 index bb910bd4..00000000 --- a/testbed/nanogui/ext/eigen/test/stdlist_overload.cpp +++ /dev/null @@ -1,192 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// Copyright (C) 2010 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include -#include - -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Vector4f) - -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Matrix2f) -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Matrix4f) -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Matrix4d) - -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Affine3f) -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Affine3d) - -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Quaternionf) -EIGEN_DEFINE_STL_LIST_SPECIALIZATION(Quaterniond) - -template -typename Container::iterator get(Container & c, Position position) -{ - typename Container::iterator it = c.begin(); - std::advance(it, position); - return it; -} - -template -void set(Container & c, Position position, const Value & value) -{ - typename Container::iterator it = c.begin(); - std::advance(it, position); - *it = value; -} - -template -void check_stdlist_matrix(const MatrixType& m) -{ - typename MatrixType::Index rows = m.rows(); - typename MatrixType::Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - std::list v(10, MatrixType(rows,cols)), w(20, y); - typename std::list::iterator itv = get(v, 5); - typename std::list::iterator itw = get(w, 6); - *itv = x; - *itw = *itv; - VERIFY_IS_APPROX(*itw, *itv); - v = w; - itv = v.begin(); - itw = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*itw, *itv); - ++itv; - ++itw; - } - - v.resize(21); - set(v, 20, x); - VERIFY_IS_APPROX(*get(v, 20), x); - v.resize(22,y); - VERIFY_IS_APPROX(*get(v, 21), y); - v.push_back(x); - VERIFY_IS_APPROX(*get(v, 22), x); - - // do a lot of push_back such that the list gets internally resized - // (with memory reallocation) - MatrixType* ref = &(*get(w, 0)); - for(int i=0; i<30 || ((ref==&(*get(w, 0))) && i<300); ++i) - v.push_back(*get(w, i%w.size())); - for(unsigned int i=23; i -void check_stdlist_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - std::list v(10), w(20, y); - typename std::list::iterator itv = get(v, 5); - typename std::list::iterator itw = get(w, 6); - *itv = x; - *itw = *itv; - VERIFY_IS_APPROX(*itw, *itv); - v = w; - itv = v.begin(); - itw = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*itw, *itv); - ++itv; - ++itw; - } - - v.resize(21); - set(v, 20, x); - VERIFY_IS_APPROX(*get(v, 20), x); - v.resize(22,y); - VERIFY_IS_APPROX(*get(v, 21), y); - v.push_back(x); - VERIFY_IS_APPROX(*get(v, 22), x); - - // do a lot of push_back such that the list gets internally resized - // (with memory reallocation) - TransformType* ref = &(*get(w, 0)); - for(int i=0; i<30 || ((ref==&(*get(w, 0))) && i<300); ++i) - v.push_back(*get(w, i%w.size())); - for(unsigned int i=23; imatrix()==get(w, (i-23)%w.size())->matrix()); - } -} - -template -void check_stdlist_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - std::list v(10), w(20, y); - typename std::list::iterator itv = get(v, 5); - typename std::list::iterator itw = get(w, 6); - *itv = x; - *itw = *itv; - VERIFY_IS_APPROX(*itw, *itv); - v = w; - itv = v.begin(); - itw = w.begin(); - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(*itw, *itv); - ++itv; - ++itw; - } - - v.resize(21); - set(v, 20, x); - VERIFY_IS_APPROX(*get(v, 20), x); - v.resize(22,y); - VERIFY_IS_APPROX(*get(v, 21), y); - v.push_back(x); - VERIFY_IS_APPROX(*get(v, 22), x); - - // do a lot of push_back such that the list gets internally resized - // (with memory reallocation) - QuaternionType* ref = &(*get(w, 0)); - for(int i=0; i<30 || ((ref==&(*get(w, 0))) && i<300); ++i) - v.push_back(*get(w, i%w.size())); - for(unsigned int i=23; icoeffs()==get(w, (i-23)%w.size())->coeffs()); - } -} - -void test_stdlist_overload() -{ - // some non vectorizable fixed sizes - CALL_SUBTEST_1(check_stdlist_matrix(Vector2f())); - CALL_SUBTEST_1(check_stdlist_matrix(Matrix3f())); - CALL_SUBTEST_2(check_stdlist_matrix(Matrix3d())); - - // some vectorizable fixed sizes - CALL_SUBTEST_1(check_stdlist_matrix(Matrix2f())); - CALL_SUBTEST_1(check_stdlist_matrix(Vector4f())); - CALL_SUBTEST_1(check_stdlist_matrix(Matrix4f())); - CALL_SUBTEST_2(check_stdlist_matrix(Matrix4d())); - - // some dynamic sizes - CALL_SUBTEST_3(check_stdlist_matrix(MatrixXd(1,1))); - CALL_SUBTEST_3(check_stdlist_matrix(VectorXd(20))); - CALL_SUBTEST_3(check_stdlist_matrix(RowVectorXf(20))); - CALL_SUBTEST_3(check_stdlist_matrix(MatrixXcf(10,10))); - - // some Transform - CALL_SUBTEST_4(check_stdlist_transform(Affine2f())); // does not need the specialization (2+1)^2 = 9 - CALL_SUBTEST_4(check_stdlist_transform(Affine3f())); - CALL_SUBTEST_4(check_stdlist_transform(Affine3d())); - - // some Quaternion - CALL_SUBTEST_5(check_stdlist_quaternion(Quaternionf())); - CALL_SUBTEST_5(check_stdlist_quaternion(Quaterniond())); -} diff --git a/testbed/nanogui/ext/eigen/test/stdvector.cpp b/testbed/nanogui/ext/eigen/test/stdvector.cpp deleted file mode 100644 index 50cb3341..00000000 --- a/testbed/nanogui/ext/eigen/test/stdvector.cpp +++ /dev/null @@ -1,148 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include -#include - -template -void check_stdvector_matrix(const MatrixType& m) -{ - typename MatrixType::Index rows = m.rows(); - typename MatrixType::Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - std::vector > v(10, MatrixType(rows,cols)), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((internal::UIntPtr)&(v[22]) == (internal::UIntPtr)&(v[21]) + sizeof(MatrixType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - MatrixType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -void check_stdvector_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - std::vector > v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((internal::UIntPtr)&(v[22]) == (internal::UIntPtr)&(v[21]) + sizeof(TransformType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - TransformType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -void check_stdvector_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - std::vector > v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((internal::UIntPtr)&(v[22]) == (internal::UIntPtr)&(v[21]) + sizeof(QuaternionType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - QuaternionType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -// Copyright (C) 2010 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include -#include - -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector4f) - -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix2f) -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix4f) -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix4d) - -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Affine3f) -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Affine3d) - -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Quaternionf) -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Quaterniond) - -template -void check_stdvector_matrix(const MatrixType& m) -{ - typename MatrixType::Index rows = m.rows(); - typename MatrixType::Index cols = m.cols(); - MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols); - std::vector v(10, MatrixType(rows,cols)), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((internal::UIntPtr)&(v[22]) == (internal::UIntPtr)&(v[21]) + sizeof(MatrixType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - MatrixType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -void check_stdvector_transform(const TransformType&) -{ - typedef typename TransformType::MatrixType MatrixType; - TransformType x(MatrixType::Random()), y(MatrixType::Random()); - std::vector v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((internal::UIntPtr)&(v[22]) == (internal::UIntPtr)&(v[21]) + sizeof(TransformType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - TransformType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -void check_stdvector_quaternion(const QuaternionType&) -{ - typedef typename QuaternionType::Coefficients Coefficients; - QuaternionType x(Coefficients::Random()), y(Coefficients::Random()); - std::vector v(10), w(20, y); - v[5] = x; - w[6] = v[5]; - VERIFY_IS_APPROX(w[6], v[5]); - v = w; - for(int i = 0; i < 20; i++) - { - VERIFY_IS_APPROX(w[i], v[i]); - } - - v.resize(21); - v[20] = x; - VERIFY_IS_APPROX(v[20], x); - v.resize(22,y); - VERIFY_IS_APPROX(v[21], y); - v.push_back(x); - VERIFY_IS_APPROX(v[22], x); - VERIFY((internal::UIntPtr)&(v[22]) == (internal::UIntPtr)&(v[21]) + sizeof(QuaternionType)); - - // do a lot of push_back such that the vector gets internally resized - // (with memory reallocation) - QuaternionType* ref = &w[0]; - for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) - v.push_back(w[i%w.size()]); - for(unsigned int i=23; i -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_DEBUG_SMALL_PRODUCT_BLOCKS -#include "sparse_solver.h" - -#include - -void test_superlu_support() -{ - SuperLU > superlu_double_colmajor; - SuperLU > > superlu_cplxdouble_colmajor; - CALL_SUBTEST_1( check_sparse_square_solving(superlu_double_colmajor) ); - CALL_SUBTEST_2( check_sparse_square_solving(superlu_cplxdouble_colmajor) ); - CALL_SUBTEST_1( check_sparse_square_determinant(superlu_double_colmajor) ); - CALL_SUBTEST_2( check_sparse_square_determinant(superlu_cplxdouble_colmajor) ); -} diff --git a/testbed/nanogui/ext/eigen/test/svd_common.h b/testbed/nanogui/ext/eigen/test/svd_common.h deleted file mode 100644 index 605d5dfe..00000000 --- a/testbed/nanogui/ext/eigen/test/svd_common.h +++ /dev/null @@ -1,483 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2014 Gael Guennebaud -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef SVD_DEFAULT -#error a macro SVD_DEFAULT(MatrixType) must be defined prior to including svd_common.h -#endif - -#ifndef SVD_FOR_MIN_NORM -#error a macro SVD_FOR_MIN_NORM(MatrixType) must be defined prior to including svd_common.h -#endif - -#include "svd_fill.h" - -// Check that the matrix m is properly reconstructed and that the U and V factors are unitary -// The SVD must have already been computed. -template -void svd_check_full(const MatrixType& m, const SvdType& svd) -{ - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef Matrix MatrixUType; - typedef Matrix MatrixVType; - - MatrixType sigma = MatrixType::Zero(rows,cols); - sigma.diagonal() = svd.singularValues().template cast(); - MatrixUType u = svd.matrixU(); - MatrixVType v = svd.matrixV(); - RealScalar scaling = m.cwiseAbs().maxCoeff(); - if(scaling<(std::numeric_limits::min)()) - { - VERIFY(sigma.cwiseAbs().maxCoeff() <= (std::numeric_limits::min)()); - } - else - { - VERIFY_IS_APPROX(m/scaling, u * (sigma/scaling) * v.adjoint()); - } - VERIFY_IS_UNITARY(u); - VERIFY_IS_UNITARY(v); -} - -// Compare partial SVD defined by computationOptions to a full SVD referenceSvd -template -void svd_compare_to_full(const MatrixType& m, - unsigned int computationOptions, - const SvdType& referenceSvd) -{ - typedef typename MatrixType::RealScalar RealScalar; - Index rows = m.rows(); - Index cols = m.cols(); - Index diagSize = (std::min)(rows, cols); - RealScalar prec = test_precision(); - - SvdType svd(m, computationOptions); - - VERIFY_IS_APPROX(svd.singularValues(), referenceSvd.singularValues()); - - if(computationOptions & (ComputeFullV|ComputeThinV)) - { - VERIFY( (svd.matrixV().adjoint()*svd.matrixV()).isIdentity(prec) ); - VERIFY_IS_APPROX( svd.matrixV().leftCols(diagSize) * svd.singularValues().asDiagonal() * svd.matrixV().leftCols(diagSize).adjoint(), - referenceSvd.matrixV().leftCols(diagSize) * referenceSvd.singularValues().asDiagonal() * referenceSvd.matrixV().leftCols(diagSize).adjoint()); - } - - if(computationOptions & (ComputeFullU|ComputeThinU)) - { - VERIFY( (svd.matrixU().adjoint()*svd.matrixU()).isIdentity(prec) ); - VERIFY_IS_APPROX( svd.matrixU().leftCols(diagSize) * svd.singularValues().cwiseAbs2().asDiagonal() * svd.matrixU().leftCols(diagSize).adjoint(), - referenceSvd.matrixU().leftCols(diagSize) * referenceSvd.singularValues().cwiseAbs2().asDiagonal() * referenceSvd.matrixU().leftCols(diagSize).adjoint()); - } - - // The following checks are not critical. - // For instance, with Dived&Conquer SVD, if only the factor 'V' is computedt then different matrix-matrix product implementation will be used - // and the resulting 'V' factor might be significantly different when the SVD decomposition is not unique, especially with single precision float. - ++g_test_level; - if(computationOptions & ComputeFullU) VERIFY_IS_APPROX(svd.matrixU(), referenceSvd.matrixU()); - if(computationOptions & ComputeThinU) VERIFY_IS_APPROX(svd.matrixU(), referenceSvd.matrixU().leftCols(diagSize)); - if(computationOptions & ComputeFullV) VERIFY_IS_APPROX(svd.matrixV().cwiseAbs(), referenceSvd.matrixV().cwiseAbs()); - if(computationOptions & ComputeThinV) VERIFY_IS_APPROX(svd.matrixV(), referenceSvd.matrixV().leftCols(diagSize)); - --g_test_level; -} - -// -template -void svd_least_square(const MatrixType& m, unsigned int computationOptions) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - - typedef Matrix RhsType; - typedef Matrix SolutionType; - - RhsType rhs = RhsType::Random(rows, internal::random(1, cols)); - SvdType svd(m, computationOptions); - - if(internal::is_same::value) svd.setThreshold(1e-8); - else if(internal::is_same::value) svd.setThreshold(2e-4); - - SolutionType x = svd.solve(rhs); - - RealScalar residual = (m*x-rhs).norm(); - RealScalar rhs_norm = rhs.norm(); - if(!test_isMuchSmallerThan(residual,rhs.norm())) - { - // ^^^ If the residual is very small, then we have an exact solution, so we are already good. - - // evaluate normal equation which works also for least-squares solutions - if(internal::is_same::value || svd.rank()==m.diagonal().size()) - { - using std::sqrt; - // This test is not stable with single precision. - // This is probably because squaring m signicantly affects the precision. - if(internal::is_same::value) ++g_test_level; - - VERIFY_IS_APPROX(m.adjoint()*(m*x),m.adjoint()*rhs); - - if(internal::is_same::value) --g_test_level; - } - - // Check that there is no significantly better solution in the neighborhood of x - for(Index k=0;k::epsilon())*x.row(k); - RealScalar residual_y = (m*y-rhs).norm(); - VERIFY( test_isMuchSmallerThan(abs(residual_y-residual), rhs_norm) || residual < residual_y ); - if(internal::is_same::value) ++g_test_level; - VERIFY( test_isApprox(residual_y,residual) || residual < residual_y ); - if(internal::is_same::value) --g_test_level; - - y.row(k) = (RealScalar(1)-2*NumTraits::epsilon())*x.row(k); - residual_y = (m*y-rhs).norm(); - VERIFY( test_isMuchSmallerThan(abs(residual_y-residual), rhs_norm) || residual < residual_y ); - if(internal::is_same::value) ++g_test_level; - VERIFY( test_isApprox(residual_y,residual) || residual < residual_y ); - if(internal::is_same::value) --g_test_level; - } - } -} - -// check minimal norm solutions, the inoput matrix m is only used to recover problem size -template -void svd_min_norm(const MatrixType& m, unsigned int computationOptions) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::Index Index; - Index cols = m.cols(); - - enum { - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - - typedef Matrix SolutionType; - - // generate a full-rank m x n problem with m MatrixType2; - typedef Matrix RhsType2; - typedef Matrix MatrixType2T; - Index rank = RankAtCompileTime2==Dynamic ? internal::random(1,cols) : Index(RankAtCompileTime2); - MatrixType2 m2(rank,cols); - int guard = 0; - do { - m2.setRandom(); - } while(SVD_FOR_MIN_NORM(MatrixType2)(m2).setThreshold(test_precision()).rank()!=rank && (++guard)<10); - VERIFY(guard<10); - - RhsType2 rhs2 = RhsType2::Random(rank); - // use QR to find a reference minimal norm solution - HouseholderQR qr(m2.adjoint()); - Matrix tmp = qr.matrixQR().topLeftCorner(rank,rank).template triangularView().adjoint().solve(rhs2); - tmp.conservativeResize(cols); - tmp.tail(cols-rank).setZero(); - SolutionType x21 = qr.householderQ() * tmp; - // now check with SVD - SVD_FOR_MIN_NORM(MatrixType2) svd2(m2, computationOptions); - SolutionType x22 = svd2.solve(rhs2); - VERIFY_IS_APPROX(m2*x21, rhs2); - VERIFY_IS_APPROX(m2*x22, rhs2); - VERIFY_IS_APPROX(x21, x22); - - // Now check with a rank deficient matrix - typedef Matrix MatrixType3; - typedef Matrix RhsType3; - Index rows3 = RowsAtCompileTime3==Dynamic ? internal::random(rank+1,2*cols) : Index(RowsAtCompileTime3); - Matrix C = Matrix::Random(rows3,rank); - MatrixType3 m3 = C * m2; - RhsType3 rhs3 = C * rhs2; - SVD_FOR_MIN_NORM(MatrixType3) svd3(m3, computationOptions); - SolutionType x3 = svd3.solve(rhs3); - VERIFY_IS_APPROX(m3*x3, rhs3); - VERIFY_IS_APPROX(m3*x21, rhs3); - VERIFY_IS_APPROX(m2*x3, rhs2); - VERIFY_IS_APPROX(x21, x3); -} - -// Check full, compare_to_full, least_square, and min_norm for all possible compute-options -template -void svd_test_all_computation_options(const MatrixType& m, bool full_only) -{ -// if (QRPreconditioner == NoQRPreconditioner && m.rows() != m.cols()) -// return; - SvdType fullSvd(m, ComputeFullU|ComputeFullV); - CALL_SUBTEST(( svd_check_full(m, fullSvd) )); - CALL_SUBTEST(( svd_least_square(m, ComputeFullU | ComputeFullV) )); - CALL_SUBTEST(( svd_min_norm(m, ComputeFullU | ComputeFullV) )); - - #if defined __INTEL_COMPILER - // remark #111: statement is unreachable - #pragma warning disable 111 - #endif - if(full_only) - return; - - CALL_SUBTEST(( svd_compare_to_full(m, ComputeFullU, fullSvd) )); - CALL_SUBTEST(( svd_compare_to_full(m, ComputeFullV, fullSvd) )); - CALL_SUBTEST(( svd_compare_to_full(m, 0, fullSvd) )); - - if (MatrixType::ColsAtCompileTime == Dynamic) { - // thin U/V are only available with dynamic number of columns - CALL_SUBTEST(( svd_compare_to_full(m, ComputeFullU|ComputeThinV, fullSvd) )); - CALL_SUBTEST(( svd_compare_to_full(m, ComputeThinV, fullSvd) )); - CALL_SUBTEST(( svd_compare_to_full(m, ComputeThinU|ComputeFullV, fullSvd) )); - CALL_SUBTEST(( svd_compare_to_full(m, ComputeThinU , fullSvd) )); - CALL_SUBTEST(( svd_compare_to_full(m, ComputeThinU|ComputeThinV, fullSvd) )); - - CALL_SUBTEST(( svd_least_square(m, ComputeFullU | ComputeThinV) )); - CALL_SUBTEST(( svd_least_square(m, ComputeThinU | ComputeFullV) )); - CALL_SUBTEST(( svd_least_square(m, ComputeThinU | ComputeThinV) )); - - CALL_SUBTEST(( svd_min_norm(m, ComputeFullU | ComputeThinV) )); - CALL_SUBTEST(( svd_min_norm(m, ComputeThinU | ComputeFullV) )); - CALL_SUBTEST(( svd_min_norm(m, ComputeThinU | ComputeThinV) )); - - // test reconstruction - typedef typename MatrixType::Index Index; - Index diagSize = (std::min)(m.rows(), m.cols()); - SvdType svd(m, ComputeThinU | ComputeThinV); - VERIFY_IS_APPROX(m, svd.matrixU().leftCols(diagSize) * svd.singularValues().asDiagonal() * svd.matrixV().leftCols(diagSize).adjoint()); - } -} - - -// work around stupid msvc error when constructing at compile time an expression that involves -// a division by zero, even if the numeric type has floating point -template -EIGEN_DONT_INLINE Scalar zero() { return Scalar(0); } - -// workaround aggressive optimization in ICC -template EIGEN_DONT_INLINE T sub(T a, T b) { return a - b; } - -// all this function does is verify we don't iterate infinitely on nan/inf values -template -void svd_inf_nan() -{ - SvdType svd; - typedef typename MatrixType::Scalar Scalar; - Scalar some_inf = Scalar(1) / zero(); - VERIFY(sub(some_inf, some_inf) != sub(some_inf, some_inf)); - svd.compute(MatrixType::Constant(10,10,some_inf), ComputeFullU | ComputeFullV); - - Scalar nan = std::numeric_limits::quiet_NaN(); - VERIFY(nan != nan); - svd.compute(MatrixType::Constant(10,10,nan), ComputeFullU | ComputeFullV); - - MatrixType m = MatrixType::Zero(10,10); - m(internal::random(0,9), internal::random(0,9)) = some_inf; - svd.compute(m, ComputeFullU | ComputeFullV); - - m = MatrixType::Zero(10,10); - m(internal::random(0,9), internal::random(0,9)) = nan; - svd.compute(m, ComputeFullU | ComputeFullV); - - // regression test for bug 791 - m.resize(3,3); - m << 0, 2*NumTraits::epsilon(), 0.5, - 0, -0.5, 0, - nan, 0, 0; - svd.compute(m, ComputeFullU | ComputeFullV); - - m.resize(4,4); - m << 1, 0, 0, 0, - 0, 3, 1, 2e-308, - 1, 0, 1, nan, - 0, nan, nan, 0; - svd.compute(m, ComputeFullU | ComputeFullV); -} - -// Regression test for bug 286: JacobiSVD loops indefinitely with some -// matrices containing denormal numbers. -template -void svd_underoverflow() -{ -#if defined __INTEL_COMPILER -// shut up warning #239: floating point underflow -#pragma warning push -#pragma warning disable 239 -#endif - Matrix2d M; - M << -7.90884e-313, -4.94e-324, - 0, 5.60844e-313; - SVD_DEFAULT(Matrix2d) svd; - svd.compute(M,ComputeFullU|ComputeFullV); - CALL_SUBTEST( svd_check_full(M,svd) ); - - // Check all 2x2 matrices made with the following coefficients: - VectorXd value_set(9); - value_set << 0, 1, -1, 5.60844e-313, -5.60844e-313, 4.94e-324, -4.94e-324, -4.94e-223, 4.94e-223; - Array4i id(0,0,0,0); - int k = 0; - do - { - M << value_set(id(0)), value_set(id(1)), value_set(id(2)), value_set(id(3)); - svd.compute(M,ComputeFullU|ComputeFullV); - CALL_SUBTEST( svd_check_full(M,svd) ); - - id(k)++; - if(id(k)>=value_set.size()) - { - while(k<3 && id(k)>=value_set.size()) id(++k)++; - id.head(k).setZero(); - k=0; - } - - } while((id -void svd_all_trivial_2x2( void (*cb)(const MatrixType&,bool) ) -{ - MatrixType M; - VectorXd value_set(3); - value_set << 0, 1, -1; - Array4i id(0,0,0,0); - int k = 0; - do - { - M << value_set(id(0)), value_set(id(1)), value_set(id(2)), value_set(id(3)); - - cb(M,false); - - id(k)++; - if(id(k)>=value_set.size()) - { - while(k<3 && id(k)>=value_set.size()) id(++k)++; - id.head(k).setZero(); - k=0; - } - - } while((id -void svd_preallocate() -{ - Vector3f v(3.f, 2.f, 1.f); - MatrixXf m = v.asDiagonal(); - - internal::set_is_malloc_allowed(false); - VERIFY_RAISES_ASSERT(VectorXf tmp(10);) - SVD_DEFAULT(MatrixXf) svd; - internal::set_is_malloc_allowed(true); - svd.compute(m); - VERIFY_IS_APPROX(svd.singularValues(), v); - - SVD_DEFAULT(MatrixXf) svd2(3,3); - internal::set_is_malloc_allowed(false); - svd2.compute(m); - internal::set_is_malloc_allowed(true); - VERIFY_IS_APPROX(svd2.singularValues(), v); - VERIFY_RAISES_ASSERT(svd2.matrixU()); - VERIFY_RAISES_ASSERT(svd2.matrixV()); - svd2.compute(m, ComputeFullU | ComputeFullV); - VERIFY_IS_APPROX(svd2.matrixU(), Matrix3f::Identity()); - VERIFY_IS_APPROX(svd2.matrixV(), Matrix3f::Identity()); - internal::set_is_malloc_allowed(false); - svd2.compute(m); - internal::set_is_malloc_allowed(true); - - SVD_DEFAULT(MatrixXf) svd3(3,3,ComputeFullU|ComputeFullV); - internal::set_is_malloc_allowed(false); - svd2.compute(m); - internal::set_is_malloc_allowed(true); - VERIFY_IS_APPROX(svd2.singularValues(), v); - VERIFY_IS_APPROX(svd2.matrixU(), Matrix3f::Identity()); - VERIFY_IS_APPROX(svd2.matrixV(), Matrix3f::Identity()); - internal::set_is_malloc_allowed(false); - svd2.compute(m, ComputeFullU|ComputeFullV); - internal::set_is_malloc_allowed(true); -} - -template -void svd_verify_assert(const MatrixType& m) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::Index Index; - Index rows = m.rows(); - Index cols = m.cols(); - - enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime - }; - - typedef Matrix RhsType; - RhsType rhs(rows); - SvdType svd; - VERIFY_RAISES_ASSERT(svd.matrixU()) - VERIFY_RAISES_ASSERT(svd.singularValues()) - VERIFY_RAISES_ASSERT(svd.matrixV()) - VERIFY_RAISES_ASSERT(svd.solve(rhs)) - MatrixType a = MatrixType::Zero(rows, cols); - a.setZero(); - svd.compute(a, 0); - VERIFY_RAISES_ASSERT(svd.matrixU()) - VERIFY_RAISES_ASSERT(svd.matrixV()) - svd.singularValues(); - VERIFY_RAISES_ASSERT(svd.solve(rhs)) - - if (ColsAtCompileTime == Dynamic) - { - svd.compute(a, ComputeThinU); - svd.matrixU(); - VERIFY_RAISES_ASSERT(svd.matrixV()) - VERIFY_RAISES_ASSERT(svd.solve(rhs)) - svd.compute(a, ComputeThinV); - svd.matrixV(); - VERIFY_RAISES_ASSERT(svd.matrixU()) - VERIFY_RAISES_ASSERT(svd.solve(rhs)) - } - else - { - VERIFY_RAISES_ASSERT(svd.compute(a, ComputeThinU)) - VERIFY_RAISES_ASSERT(svd.compute(a, ComputeThinV)) - } -} - -#undef SVD_DEFAULT -#undef SVD_FOR_MIN_NORM diff --git a/testbed/nanogui/ext/eigen/test/svd_fill.h b/testbed/nanogui/ext/eigen/test/svd_fill.h deleted file mode 100644 index 3877c0c7..00000000 --- a/testbed/nanogui/ext/eigen/test/svd_fill.h +++ /dev/null @@ -1,119 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014-2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -template -Array four_denorms(); - -template<> -Array4f four_denorms() { return Array4f(5.60844e-39f, -5.60844e-39f, 4.94e-44f, -4.94e-44f); } -template<> -Array4d four_denorms() { return Array4d(5.60844e-313, -5.60844e-313, 4.94e-324, -4.94e-324); } -template -Array four_denorms() { return four_denorms().cast(); } - -template -void svd_fill_random(MatrixType &m, int Option = 0) -{ - using std::pow; - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::RealScalar RealScalar; - typedef typename MatrixType::Index Index; - Index diagSize = (std::min)(m.rows(), m.cols()); - RealScalar s = std::numeric_limits::max_exponent10/4; - s = internal::random(1,s); - Matrix d = Matrix::Random(diagSize); - for(Index k=0; k(-s,s)); - - bool dup = internal::random(0,10) < 3; - bool unit_uv = internal::random(0,10) < (dup?7:3); // if we duplicate some diagonal entries, then increase the chance to preserve them using unitary U and V factors - - // duplicate some singular values - if(dup) - { - Index n = internal::random(0,d.size()-1); - for(Index i=0; i(0,d.size()-1)) = d(internal::random(0,d.size()-1)); - } - - Matrix U(m.rows(),diagSize); - Matrix VT(diagSize,m.cols()); - if(unit_uv) - { - // in very rare cases let's try with a pure diagonal matrix - if(internal::random(0,10) < 1) - { - U.setIdentity(); - VT.setIdentity(); - } - else - { - createRandomPIMatrixOfRank(diagSize,U.rows(), U.cols(), U); - createRandomPIMatrixOfRank(diagSize,VT.rows(), VT.cols(), VT); - } - } - else - { - U.setRandom(); - VT.setRandom(); - } - - Matrix samples(9); - samples << 0, four_denorms(), - -RealScalar(1)/NumTraits::highest(), RealScalar(1)/NumTraits::highest(), (std::numeric_limits::min)(), pow((std::numeric_limits::min)(),0.8); - - if(Option==Symmetric) - { - m = U * d.asDiagonal() * U.transpose(); - - // randomly nullify some rows/columns - { - Index count = internal::random(-diagSize,diagSize); - for(Index k=0; k(0,diagSize-1); - m.row(i).setZero(); - m.col(i).setZero(); - } - if(count<0) - // (partly) cancel some coeffs - if(!(dup && unit_uv)) - { - - Index n = internal::random(0,m.size()-1); - for(Index k=0; k(0,m.rows()-1); - Index j = internal::random(0,m.cols()-1); - m(j,i) = m(i,j) = samples(internal::random(0,samples.size()-1)); - if(NumTraits::IsComplex) - *(&numext::real_ref(m(j,i))+1) = *(&numext::real_ref(m(i,j))+1) = samples.real()(internal::random(0,samples.size()-1)); - } - } - } - } - else - { - m = U * d.asDiagonal() * VT; - // (partly) cancel some coeffs - if(!(dup && unit_uv)) - { - Index n = internal::random(0,m.size()-1); - for(Index k=0; k(0,m.rows()-1); - Index j = internal::random(0,m.cols()-1); - m(i,j) = samples(internal::random(0,samples.size()-1)); - if(NumTraits::IsComplex) - *(&numext::real_ref(m(i,j))+1) = samples.real()(internal::random(0,samples.size()-1)); - } - } - } -} - diff --git a/testbed/nanogui/ext/eigen/test/swap.cpp b/testbed/nanogui/ext/eigen/test/swap.cpp deleted file mode 100644 index f76e3624..00000000 --- a/testbed/nanogui/ext/eigen/test/swap.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_STATIC_ASSERT -#include "main.h" - -template -struct other_matrix_type -{ - typedef int type; -}; - -template -struct other_matrix_type > -{ - typedef Matrix<_Scalar, _Rows, _Cols, _Options^RowMajor, _MaxRows, _MaxCols> type; -}; - -template void swap(const MatrixType& m) -{ - typedef typename other_matrix_type::type OtherMatrixType; - typedef typename MatrixType::Scalar Scalar; - - eigen_assert((!internal::is_same::value)); - typename MatrixType::Index rows = m.rows(); - typename MatrixType::Index cols = m.cols(); - - // construct 3 matrix guaranteed to be distinct - MatrixType m1 = MatrixType::Random(rows,cols); - MatrixType m2 = MatrixType::Random(rows,cols) + Scalar(100) * MatrixType::Identity(rows,cols); - OtherMatrixType m3 = OtherMatrixType::Random(rows,cols) + Scalar(200) * OtherMatrixType::Identity(rows,cols); - - MatrixType m1_copy = m1; - MatrixType m2_copy = m2; - OtherMatrixType m3_copy = m3; - - // test swapping 2 matrices of same type - Scalar *d1=m1.data(), *d2=m2.data(); - m1.swap(m2); - VERIFY_IS_APPROX(m1,m2_copy); - VERIFY_IS_APPROX(m2,m1_copy); - if(MatrixType::SizeAtCompileTime==Dynamic) - { - VERIFY(m1.data()==d2); - VERIFY(m2.data()==d1); - } - m1 = m1_copy; - m2 = m2_copy; - - // test swapping 2 matrices of different types - m1.swap(m3); - VERIFY_IS_APPROX(m1,m3_copy); - VERIFY_IS_APPROX(m3,m1_copy); - m1 = m1_copy; - m3 = m3_copy; - - // test swapping matrix with expression - m1.swap(m2.block(0,0,rows,cols)); - VERIFY_IS_APPROX(m1,m2_copy); - VERIFY_IS_APPROX(m2,m1_copy); - m1 = m1_copy; - m2 = m2_copy; - - // test swapping two expressions of different types - m1.transpose().swap(m3.transpose()); - VERIFY_IS_APPROX(m1,m3_copy); - VERIFY_IS_APPROX(m3,m1_copy); - m1 = m1_copy; - m3 = m3_copy; - - if(m1.rows()>1) - { - // test assertion on mismatching size -- matrix case - VERIFY_RAISES_ASSERT(m1.swap(m1.row(0))); - // test assertion on mismatching size -- xpr case - VERIFY_RAISES_ASSERT(m1.row(0).swap(m1)); - } -} - -void test_swap() -{ - int s = internal::random(1,EIGEN_TEST_MAX_SIZE); - CALL_SUBTEST_1( swap(Matrix3f()) ); // fixed size, no vectorization - CALL_SUBTEST_2( swap(Matrix4d()) ); // fixed size, possible vectorization - CALL_SUBTEST_3( swap(MatrixXd(s,s)) ); // dyn size, no vectorization - CALL_SUBTEST_4( swap(MatrixXf(s,s)) ); // dyn size, possible vectorization - TEST_SET_BUT_UNUSED_VARIABLE(s) -} diff --git a/testbed/nanogui/ext/eigen/test/symbolic_index.cpp b/testbed/nanogui/ext/eigen/test/symbolic_index.cpp deleted file mode 100644 index 1db85144..00000000 --- a/testbed/nanogui/ext/eigen/test/symbolic_index.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2017 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifdef EIGEN_TEST_PART_2 -#define EIGEN_MAX_CPP_VER 03 -#endif - -#include "main.h" - -template -bool match(const T& xpr, std::string ref, std::string str_xpr = "") { - EIGEN_UNUSED_VARIABLE(str_xpr); - std::stringstream str; - str << xpr; - if(!(str.str() == ref)) - std::cout << str_xpr << "\n" << xpr << "\n\n"; - return str.str() == ref; -} - -#define MATCH(X,R) match(X, R, #X) - -template -typename internal::enable_if::value,bool>::type -is_same_fixed(const T1& a, const T2& b) -{ - return (Index(a) == Index(b)); -} - -template -bool is_same_seq(const T1& a, const T2& b) -{ - bool ok = a.first()==b.first() && a.size() == b.size() && Index(a.incrObject())==Index(b.incrObject());; - if(!ok) - { - std::cerr << "seqN(" << a.first() << ", " << a.size() << ", " << Index(a.incrObject()) << ") != "; - std::cerr << "seqN(" << b.first() << ", " << b.size() << ", " << Index(b.incrObject()) << ")\n"; - } - return ok; -} - -template -typename internal::enable_if::value,bool>::type -is_same_type(const T1&, const T2&) -{ - return true; -} - -template -bool is_same_symb(const T1& a, const T2& b, Index size) -{ - using Eigen::placeholders::last; - return a.eval(last=size-1) == b.eval(last=size-1); -} - - -#define VERIFY_EQ_INT(A,B) VERIFY_IS_APPROX(int(A),int(B)) - -void check_symbolic_index() -{ - using Eigen::placeholders::last; - using Eigen::placeholders::end; - - Index size=100; - - // First, let's check FixedInt arithmetic: - VERIFY( is_same_type( (fix<5>()-fix<3>())*fix<9>()/(-fix<3>()), fix<-(5-3)*9/3>() ) ); - VERIFY( is_same_type( (fix<5>()-fix<3>())*fix<9>()/fix<2>(), fix<(5-3)*9/2>() ) ); - VERIFY( is_same_type( fix<9>()/fix<2>(), fix<9/2>() ) ); - VERIFY( is_same_type( fix<9>()%fix<2>(), fix<9%2>() ) ); - VERIFY( is_same_type( fix<9>()&fix<2>(), fix<9&2>() ) ); - VERIFY( is_same_type( fix<9>()|fix<2>(), fix<9|2>() ) ); - VERIFY( is_same_type( fix<9>()/2, int(9/2) ) ); - - VERIFY( is_same_symb( end-1, last, size) ); - VERIFY( is_same_symb( end-fix<1>, last, size) ); - - VERIFY_IS_EQUAL( ( (last*5-2)/3 ).eval(last=size-1), ((size-1)*5-2)/3 ); - VERIFY_IS_EQUAL( ( (last*fix<5>-fix<2>)/fix<3> ).eval(last=size-1), ((size-1)*5-2)/3 ); - VERIFY_IS_EQUAL( ( -last*end ).eval(last=size-1), -(size-1)*size ); - VERIFY_IS_EQUAL( ( end-3*last ).eval(last=size-1), size- 3*(size-1) ); - VERIFY_IS_EQUAL( ( (end-3*last)/end ).eval(last=size-1), (size- 3*(size-1))/size ); - -#if EIGEN_HAS_CXX14 - { - struct x_tag {}; static const Symbolic::SymbolExpr x; - struct y_tag {}; static const Symbolic::SymbolExpr y; - struct z_tag {}; static const Symbolic::SymbolExpr z; - - VERIFY_IS_APPROX( int(((x+3)/y+z).eval(x=6,y=3,z=-13)), (6+3)/3+(-13) ); - } -#endif -} - -void test_symbolic_index() -{ - CALL_SUBTEST_1( check_symbolic_index() ); - CALL_SUBTEST_2( check_symbolic_index() ); -} diff --git a/testbed/nanogui/ext/eigen/test/triangular.cpp b/testbed/nanogui/ext/eigen/test/triangular.cpp deleted file mode 100644 index b9685648..00000000 --- a/testbed/nanogui/ext/eigen/test/triangular.cpp +++ /dev/null @@ -1,247 +0,0 @@ -// This file is triangularView of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - - - -template void triangular_square(const MatrixType& m) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix VectorType; - - RealScalar largerEps = 10*test_precision(); - - typename MatrixType::Index rows = m.rows(); - typename MatrixType::Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - m4(rows, cols), - r1(rows, cols), - r2(rows, cols); - VectorType v2 = VectorType::Random(rows); - - MatrixType m1up = m1.template triangularView(); - MatrixType m2up = m2.template triangularView(); - - if (rows*cols>1) - { - VERIFY(m1up.isUpperTriangular()); - VERIFY(m2up.transpose().isLowerTriangular()); - VERIFY(!m2.isLowerTriangular()); - } - -// VERIFY_IS_APPROX(m1up.transpose() * m2, m1.upper().transpose().lower() * m2); - - // test overloaded operator+= - r1.setZero(); - r2.setZero(); - r1.template triangularView() += m1; - r2 += m1up; - VERIFY_IS_APPROX(r1,r2); - - // test overloaded operator= - m1.setZero(); - m1.template triangularView() = m2.transpose() + m2; - m3 = m2.transpose() + m2; - VERIFY_IS_APPROX(m3.template triangularView().transpose().toDenseMatrix(), m1); - - // test overloaded operator= - m1.setZero(); - m1.template triangularView() = m2.transpose() + m2; - VERIFY_IS_APPROX(m3.template triangularView().toDenseMatrix(), m1); - - VERIFY_IS_APPROX(m3.template triangularView().conjugate().toDenseMatrix(), - m3.conjugate().template triangularView().toDenseMatrix()); - - m1 = MatrixType::Random(rows, cols); - for (int i=0; i(); - - Transpose trm4(m4); - // test back and forward subsitution with a vector as the rhs - m3 = m1.template triangularView(); - VERIFY(v2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView().solve(v2)), largerEps)); - m3 = m1.template triangularView(); - VERIFY(v2.isApprox(m3.transpose() * (m1.transpose().template triangularView().solve(v2)), largerEps)); - m3 = m1.template triangularView(); - VERIFY(v2.isApprox(m3 * (m1.template triangularView().solve(v2)), largerEps)); - m3 = m1.template triangularView(); - VERIFY(v2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView().solve(v2)), largerEps)); - - // test back and forward substitution with a matrix as the rhs - m3 = m1.template triangularView(); - VERIFY(m2.isApprox(m3.adjoint() * (m1.adjoint().template triangularView().solve(m2)), largerEps)); - m3 = m1.template triangularView(); - VERIFY(m2.isApprox(m3.transpose() * (m1.transpose().template triangularView().solve(m2)), largerEps)); - m3 = m1.template triangularView(); - VERIFY(m2.isApprox(m3 * (m1.template triangularView().solve(m2)), largerEps)); - m3 = m1.template triangularView(); - VERIFY(m2.isApprox(m3.conjugate() * (m1.conjugate().template triangularView().solve(m2)), largerEps)); - - // check M * inv(L) using in place API - m4 = m3; - m1.transpose().template triangularView().solveInPlace(trm4); - VERIFY_IS_APPROX(m4 * m1.template triangularView(), m3); - - // check M * inv(U) using in place API - m3 = m1.template triangularView(); - m4 = m3; - m3.transpose().template triangularView().solveInPlace(trm4); - VERIFY_IS_APPROX(m4 * m1.template triangularView(), m3); - - // check solve with unit diagonal - m3 = m1.template triangularView(); - VERIFY(m2.isApprox(m3 * (m1.template triangularView().solve(m2)), largerEps)); - -// VERIFY(( m1.template triangularView() -// * m2.template triangularView()).isUpperTriangular()); - - // test swap - m1.setOnes(); - m2.setZero(); - m2.template triangularView().swap(m1); - m3.setZero(); - m3.template triangularView().setOnes(); - VERIFY_IS_APPROX(m2,m3); - - m1.setRandom(); - m3 = m1.template triangularView(); - Matrix m5(cols, internal::random(1,20)); m5.setRandom(); - Matrix m6(internal::random(1,20), rows); m6.setRandom(); - VERIFY_IS_APPROX(m1.template triangularView() * m5, m3*m5); - VERIFY_IS_APPROX(m6*m1.template triangularView(), m6*m3); - - m1up = m1.template triangularView(); - VERIFY_IS_APPROX(m1.template selfadjointView().template triangularView().toDenseMatrix(), m1up); - VERIFY_IS_APPROX(m1up.template selfadjointView().template triangularView().toDenseMatrix(), m1up); - VERIFY_IS_APPROX(m1.template selfadjointView().template triangularView().toDenseMatrix(), m1up.adjoint()); - VERIFY_IS_APPROX(m1up.template selfadjointView().template triangularView().toDenseMatrix(), m1up.adjoint()); - - VERIFY_IS_APPROX(m1.template selfadjointView().diagonal(), m1.diagonal()); - -} - - -template void triangular_rect(const MatrixType& m) -{ - typedef const typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; - - Index rows = m.rows(); - Index cols = m.cols(); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2 = MatrixType::Random(rows, cols), - m3(rows, cols), - m4(rows, cols), - r1(rows, cols), - r2(rows, cols); - - MatrixType m1up = m1.template triangularView(); - MatrixType m2up = m2.template triangularView(); - - if (rows>1 && cols>1) - { - VERIFY(m1up.isUpperTriangular()); - VERIFY(m2up.transpose().isLowerTriangular()); - VERIFY(!m2.isLowerTriangular()); - } - - // test overloaded operator+= - r1.setZero(); - r2.setZero(); - r1.template triangularView() += m1; - r2 += m1up; - VERIFY_IS_APPROX(r1,r2); - - // test overloaded operator= - m1.setZero(); - m1.template triangularView() = 3 * m2; - m3 = 3 * m2; - VERIFY_IS_APPROX(m3.template triangularView().toDenseMatrix(), m1); - - - m1.setZero(); - m1.template triangularView() = 3 * m2; - VERIFY_IS_APPROX(m3.template triangularView().toDenseMatrix(), m1); - - m1.setZero(); - m1.template triangularView() = 3 * m2; - VERIFY_IS_APPROX(m3.template triangularView().toDenseMatrix(), m1); - - - m1.setZero(); - m1.template triangularView() = 3 * m2; - VERIFY_IS_APPROX(m3.template triangularView().toDenseMatrix(), m1); - m1.setRandom(); - m2 = m1.template triangularView(); - VERIFY(m2.isUpperTriangular()); - VERIFY(!m2.isLowerTriangular()); - m2 = m1.template triangularView(); - VERIFY(m2.isUpperTriangular()); - VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1))); - m2 = m1.template triangularView(); - VERIFY(m2.isUpperTriangular()); - m2.diagonal().array() -= Scalar(1); - VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1))); - m2 = m1.template triangularView(); - VERIFY(m2.isLowerTriangular()); - VERIFY(!m2.isUpperTriangular()); - m2 = m1.template triangularView(); - VERIFY(m2.isLowerTriangular()); - VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1))); - m2 = m1.template triangularView(); - VERIFY(m2.isLowerTriangular()); - m2.diagonal().array() -= Scalar(1); - VERIFY(m2.diagonal().isMuchSmallerThan(RealScalar(1))); - // test swap - m1.setOnes(); - m2.setZero(); - m2.template triangularView().swap(m1); - m3.setZero(); - m3.template triangularView().setOnes(); - VERIFY_IS_APPROX(m2,m3); -} - -void bug_159() -{ - Matrix3d m = Matrix3d::Random().triangularView(); - EIGEN_UNUSED_VARIABLE(m) -} - -void test_triangular() -{ - int maxsize = (std::min)(EIGEN_TEST_MAX_SIZE,20); - for(int i = 0; i < g_repeat ; i++) - { - int r = internal::random(2,maxsize); TEST_SET_BUT_UNUSED_VARIABLE(r) - int c = internal::random(2,maxsize); TEST_SET_BUT_UNUSED_VARIABLE(c) - - CALL_SUBTEST_1( triangular_square(Matrix()) ); - CALL_SUBTEST_2( triangular_square(Matrix()) ); - CALL_SUBTEST_3( triangular_square(Matrix3d()) ); - CALL_SUBTEST_4( triangular_square(Matrix,8, 8>()) ); - CALL_SUBTEST_5( triangular_square(MatrixXcd(r,r)) ); - CALL_SUBTEST_6( triangular_square(Matrix(r, r)) ); - - CALL_SUBTEST_7( triangular_rect(Matrix()) ); - CALL_SUBTEST_8( triangular_rect(Matrix()) ); - CALL_SUBTEST_9( triangular_rect(MatrixXcf(r, c)) ); - CALL_SUBTEST_5( triangular_rect(MatrixXcd(r, c)) ); - CALL_SUBTEST_6( triangular_rect(Matrix(r, c)) ); - } - - CALL_SUBTEST_1( bug_159() ); -} diff --git a/testbed/nanogui/ext/eigen/test/umeyama.cpp b/testbed/nanogui/ext/eigen/test/umeyama.cpp deleted file mode 100644 index 2e809243..00000000 --- a/testbed/nanogui/ext/eigen/test/umeyama.cpp +++ /dev/null @@ -1,183 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Hauke Heibel -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -#include -#include - -#include // required for MatrixBase::determinant -#include // required for SVD - -using namespace Eigen; - -// Constructs a random matrix from the unitary group U(size). -template -Eigen::Matrix randMatrixUnitary(int size) -{ - typedef T Scalar; - typedef Eigen::Matrix MatrixType; - - MatrixType Q; - - int max_tries = 40; - double is_unitary = false; - - while (!is_unitary && max_tries > 0) - { - // initialize random matrix - Q = MatrixType::Random(size, size); - - // orthogonalize columns using the Gram-Schmidt algorithm - for (int col = 0; col < size; ++col) - { - typename MatrixType::ColXpr colVec = Q.col(col); - for (int prevCol = 0; prevCol < col; ++prevCol) - { - typename MatrixType::ColXpr prevColVec = Q.col(prevCol); - colVec -= colVec.dot(prevColVec)*prevColVec; - } - Q.col(col) = colVec.normalized(); - } - - // this additional orthogonalization is not necessary in theory but should enhance - // the numerical orthogonality of the matrix - for (int row = 0; row < size; ++row) - { - typename MatrixType::RowXpr rowVec = Q.row(row); - for (int prevRow = 0; prevRow < row; ++prevRow) - { - typename MatrixType::RowXpr prevRowVec = Q.row(prevRow); - rowVec -= rowVec.dot(prevRowVec)*prevRowVec; - } - Q.row(row) = rowVec.normalized(); - } - - // final check - is_unitary = Q.isUnitary(); - --max_tries; - } - - if (max_tries == 0) - eigen_assert(false && "randMatrixUnitary: Could not construct unitary matrix!"); - - return Q; -} - -// Constructs a random matrix from the special unitary group SU(size). -template -Eigen::Matrix randMatrixSpecialUnitary(int size) -{ - typedef T Scalar; - - typedef Eigen::Matrix MatrixType; - - // initialize unitary matrix - MatrixType Q = randMatrixUnitary(size); - - // tweak the first column to make the determinant be 1 - Q.col(0) *= numext::conj(Q.determinant()); - - return Q; -} - -template -void run_test(int dim, int num_elements) -{ - using std::abs; - typedef typename internal::traits::Scalar Scalar; - typedef Matrix MatrixX; - typedef Matrix VectorX; - - // MUST be positive because in any other case det(cR_t) may become negative for - // odd dimensions! - const Scalar c = abs(internal::random()); - - MatrixX R = randMatrixSpecialUnitary(dim); - VectorX t = Scalar(50)*VectorX::Random(dim,1); - - MatrixX cR_t = MatrixX::Identity(dim+1,dim+1); - cR_t.block(0,0,dim,dim) = c*R; - cR_t.block(0,dim,dim,1) = t; - - MatrixX src = MatrixX::Random(dim+1, num_elements); - src.row(dim) = Matrix::Constant(num_elements, Scalar(1)); - - MatrixX dst = cR_t*src; - - MatrixX cR_t_umeyama = umeyama(src.block(0,0,dim,num_elements), dst.block(0,0,dim,num_elements)); - - const Scalar error = ( cR_t_umeyama*src - dst ).norm() / dst.norm(); - VERIFY(error < Scalar(40)*std::numeric_limits::epsilon()); -} - -template -void run_fixed_size_test(int num_elements) -{ - using std::abs; - typedef Matrix MatrixX; - typedef Matrix HomMatrix; - typedef Matrix FixedMatrix; - typedef Matrix FixedVector; - - const int dim = Dimension; - - // MUST be positive because in any other case det(cR_t) may become negative for - // odd dimensions! - // Also if c is to small compared to t.norm(), problem is ill-posed (cf. Bug 744) - const Scalar c = internal::random(0.5, 2.0); - - FixedMatrix R = randMatrixSpecialUnitary(dim); - FixedVector t = Scalar(32)*FixedVector::Random(dim,1); - - HomMatrix cR_t = HomMatrix::Identity(dim+1,dim+1); - cR_t.block(0,0,dim,dim) = c*R; - cR_t.block(0,dim,dim,1) = t; - - MatrixX src = MatrixX::Random(dim+1, num_elements); - src.row(dim) = Matrix::Constant(num_elements, Scalar(1)); - - MatrixX dst = cR_t*src; - - Block src_block(src,0,0,dim,num_elements); - Block dst_block(dst,0,0,dim,num_elements); - - HomMatrix cR_t_umeyama = umeyama(src_block, dst_block); - - const Scalar error = ( cR_t_umeyama*src - dst ).squaredNorm(); - - VERIFY(error < Scalar(16)*std::numeric_limits::epsilon()); -} - -void test_umeyama() -{ - for (int i=0; i(40,500); - - // works also for dimensions bigger than 3... - for (int dim=2; dim<8; ++dim) - { - CALL_SUBTEST_1(run_test(dim, num_elements)); - CALL_SUBTEST_2(run_test(dim, num_elements)); - } - - CALL_SUBTEST_3((run_fixed_size_test(num_elements))); - CALL_SUBTEST_4((run_fixed_size_test(num_elements))); - CALL_SUBTEST_5((run_fixed_size_test(num_elements))); - - CALL_SUBTEST_6((run_fixed_size_test(num_elements))); - CALL_SUBTEST_7((run_fixed_size_test(num_elements))); - CALL_SUBTEST_8((run_fixed_size_test(num_elements))); - } - - // Those two calls don't compile and result in meaningful error messages! - // umeyama(MatrixXcf(),MatrixXcf()); - // umeyama(MatrixXcd(),MatrixXcd()); -} diff --git a/testbed/nanogui/ext/eigen/test/umfpack_support.cpp b/testbed/nanogui/ext/eigen/test/umfpack_support.cpp deleted file mode 100644 index 37ab11f0..00000000 --- a/testbed/nanogui/ext/eigen/test/umfpack_support.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define EIGEN_NO_DEBUG_SMALL_PRODUCT_BLOCKS -#include "sparse_solver.h" - -#include - -template void test_umfpack_support_T() -{ - UmfPackLU > umfpack_colmajor; - UmfPackLU > umfpack_rowmajor; - - check_sparse_square_solving(umfpack_colmajor); - check_sparse_square_solving(umfpack_rowmajor); - - check_sparse_square_determinant(umfpack_colmajor); - check_sparse_square_determinant(umfpack_rowmajor); -} - -void test_umfpack_support() -{ - CALL_SUBTEST_1(test_umfpack_support_T()); - CALL_SUBTEST_2(test_umfpack_support_T >()); -} - diff --git a/testbed/nanogui/ext/eigen/test/unalignedassert.cpp b/testbed/nanogui/ext/eigen/test/unalignedassert.cpp deleted file mode 100644 index 731a0897..00000000 --- a/testbed/nanogui/ext/eigen/test/unalignedassert.cpp +++ /dev/null @@ -1,180 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#if defined(EIGEN_TEST_PART_1) - // default -#elif defined(EIGEN_TEST_PART_2) - #define EIGEN_MAX_STATIC_ALIGN_BYTES 16 - #define EIGEN_MAX_ALIGN_BYTES 16 -#elif defined(EIGEN_TEST_PART_3) - #define EIGEN_MAX_STATIC_ALIGN_BYTES 32 - #define EIGEN_MAX_ALIGN_BYTES 32 -#elif defined(EIGEN_TEST_PART_4) - #define EIGEN_MAX_STATIC_ALIGN_BYTES 64 - #define EIGEN_MAX_ALIGN_BYTES 64 -#endif - -#include "main.h" - -typedef Matrix Vector6f; -typedef Matrix Vector8f; -typedef Matrix Vector12f; - -typedef Matrix Vector5d; -typedef Matrix Vector6d; -typedef Matrix Vector7d; -typedef Matrix Vector8d; -typedef Matrix Vector9d; -typedef Matrix Vector10d; -typedef Matrix Vector12d; - -struct TestNew1 -{ - MatrixXd m; // good: m will allocate its own array, taking care of alignment. - TestNew1() : m(20,20) {} -}; - -struct TestNew2 -{ - Matrix3d m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be 16-byte aligned, - // 8-byte alignment is good enough here, which we'll get automatically -}; - -struct TestNew3 -{ - Vector2f m; // good: m's size isn't a multiple of 16 bytes, so m doesn't have to be 16-byte aligned -}; - -struct TestNew4 -{ - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - Vector2d m; - float f; // make the struct have sizeof%16!=0 to make it a little more tricky when we allow an array of 2 such objects -}; - -struct TestNew5 -{ - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - float f; // try the f at first -- the EIGEN_ALIGN_MAX attribute of m should make that still work - Matrix4f m; -}; - -struct TestNew6 -{ - Matrix m; // good: no alignment requested - float f; -}; - -template struct Depends -{ - EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(Align) - Vector2d m; - float f; -}; - -template -void check_unalignedassert_good() -{ - T *x, *y; - x = new T; - delete x; - y = new T[2]; - delete[] y; -} - -#if EIGEN_MAX_STATIC_ALIGN_BYTES>0 -template -void construct_at_boundary(int boundary) -{ - char buf[sizeof(T)+256]; - size_t _buf = reinterpret_cast(buf); - _buf += (EIGEN_MAX_ALIGN_BYTES - (_buf % EIGEN_MAX_ALIGN_BYTES)); // make 16/32/...-byte aligned - _buf += boundary; // make exact boundary-aligned - T *x = ::new(reinterpret_cast(_buf)) T; - x[0].setZero(); // just in order to silence warnings - x->~T(); -} -#endif - -void unalignedassert() -{ -#if EIGEN_MAX_STATIC_ALIGN_BYTES>0 - construct_at_boundary(4); - construct_at_boundary(4); - construct_at_boundary(16); - construct_at_boundary(4); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - construct_at_boundary(16); - construct_at_boundary(16); - construct_at_boundary(4); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - - construct_at_boundary(16); - construct_at_boundary(4); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - construct_at_boundary(4); - construct_at_boundary(16); - construct_at_boundary(4); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - construct_at_boundary(4); - construct_at_boundary(16); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - construct_at_boundary(4); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - - construct_at_boundary(16); - construct_at_boundary(4); - construct_at_boundary(EIGEN_MAX_ALIGN_BYTES); - construct_at_boundary(16); -#endif - - check_unalignedassert_good(); - check_unalignedassert_good(); - check_unalignedassert_good(); - - check_unalignedassert_good(); - check_unalignedassert_good(); - check_unalignedassert_good(); - check_unalignedassert_good >(); - -#if EIGEN_MAX_STATIC_ALIGN_BYTES>0 - if(EIGEN_MAX_ALIGN_BYTES>=16) - { - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - // Complexes are disabled because the compiler might aggressively vectorize - // the initialization of complex coeffs to 0 before we can check for alignedness - //VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - VERIFY_RAISES_ASSERT(construct_at_boundary(8)); - } - for(int b=8; b(b)); - if(b<64) VERIFY_RAISES_ASSERT(construct_at_boundary(b)); - if(b<32) VERIFY_RAISES_ASSERT(construct_at_boundary(b)); - if(b<32) VERIFY_RAISES_ASSERT(construct_at_boundary(b)); - if(b<128) VERIFY_RAISES_ASSERT(construct_at_boundary(b)); - //if(b<32) VERIFY_RAISES_ASSERT(construct_at_boundary(b)); - } -#endif -} - -void test_unalignedassert() -{ - CALL_SUBTEST(unalignedassert()); -} diff --git a/testbed/nanogui/ext/eigen/test/unalignedcount.cpp b/testbed/nanogui/ext/eigen/test/unalignedcount.cpp deleted file mode 100644 index d6ffeafd..00000000 --- a/testbed/nanogui/ext/eigen/test/unalignedcount.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -static int nb_load; -static int nb_loadu; -static int nb_store; -static int nb_storeu; - -#define EIGEN_DEBUG_ALIGNED_LOAD { nb_load++; } -#define EIGEN_DEBUG_UNALIGNED_LOAD { nb_loadu++; } -#define EIGEN_DEBUG_ALIGNED_STORE { nb_store++; } -#define EIGEN_DEBUG_UNALIGNED_STORE { nb_storeu++; } - -#define VERIFY_ALIGNED_UNALIGNED_COUNT(XPR,AL,UL,AS,US) {\ - nb_load = nb_loadu = nb_store = nb_storeu = 0; \ - XPR; \ - if(!(nb_load==AL && nb_loadu==UL && nb_store==AS && nb_storeu==US)) \ - std::cerr << " >> " << nb_load << ", " << nb_loadu << ", " << nb_store << ", " << nb_storeu << "\n"; \ - VERIFY( (#XPR) && nb_load==AL && nb_loadu==UL && nb_store==AS && nb_storeu==US ); \ - } - - -#include "main.h" - -void test_unalignedcount() -{ - #if defined(EIGEN_VECTORIZE_AVX) - VectorXf a(40), b(40); - VERIFY_ALIGNED_UNALIGNED_COUNT(a += b, 10, 0, 5, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) += b.segment(0,40), 5, 5, 5, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) -= b.segment(0,40), 5, 5, 5, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) *= 3.5, 5, 0, 5, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) /= 3.5, 5, 0, 5, 0); - #elif defined(EIGEN_VECTORIZE_SSE) - VectorXf a(40), b(40); - VERIFY_ALIGNED_UNALIGNED_COUNT(a += b, 20, 0, 10, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) += b.segment(0,40), 10, 10, 10, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) -= b.segment(0,40), 10, 10, 10, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) *= 3.5, 10, 0, 10, 0); - VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) /= 3.5, 10, 0, 10, 0); - #else - // The following line is to eliminate "variable not used" warnings - nb_load = nb_loadu = nb_store = nb_storeu = 0; - int a(0), b(0); - VERIFY(a==b); - #endif -} diff --git a/testbed/nanogui/ext/eigen/test/upperbidiagonalization.cpp b/testbed/nanogui/ext/eigen/test/upperbidiagonalization.cpp deleted file mode 100644 index 847b34b5..00000000 --- a/testbed/nanogui/ext/eigen/test/upperbidiagonalization.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2010 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" -#include - -template void upperbidiag(const MatrixType& m) -{ - const typename MatrixType::Index rows = m.rows(); - const typename MatrixType::Index cols = m.cols(); - - typedef Matrix RealMatrixType; - typedef Matrix TransposeMatrixType; - - MatrixType a = MatrixType::Random(rows,cols); - internal::UpperBidiagonalization ubd(a); - RealMatrixType b(rows, cols); - b.setZero(); - b.block(0,0,cols,cols) = ubd.bidiagonal(); - MatrixType c = ubd.householderU() * b * ubd.householderV().adjoint(); - VERIFY_IS_APPROX(a,c); - TransposeMatrixType d = ubd.householderV() * b.adjoint() * ubd.householderU().adjoint(); - VERIFY_IS_APPROX(a.adjoint(),d); -} - -void test_upperbidiagonalization() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( upperbidiag(MatrixXf(3,3)) ); - CALL_SUBTEST_2( upperbidiag(MatrixXd(17,12)) ); - CALL_SUBTEST_3( upperbidiag(MatrixXcf(20,20)) ); - CALL_SUBTEST_4( upperbidiag(Matrix,Dynamic,Dynamic,RowMajor>(16,15)) ); - CALL_SUBTEST_5( upperbidiag(Matrix()) ); - CALL_SUBTEST_6( upperbidiag(Matrix()) ); - CALL_SUBTEST_7( upperbidiag(Matrix()) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/vectorization_logic.cpp b/testbed/nanogui/ext/eigen/test/vectorization_logic.cpp deleted file mode 100644 index 83c1439a..00000000 --- a/testbed/nanogui/ext/eigen/test/vectorization_logic.cpp +++ /dev/null @@ -1,419 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifdef EIGEN_TEST_PART_1 -#define EIGEN_UNALIGNED_VECTORIZE 1 -#endif - -#ifdef EIGEN_TEST_PART_2 -#define EIGEN_UNALIGNED_VECTORIZE 0 -#endif - -#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR -#undef EIGEN_DEFAULT_TO_ROW_MAJOR -#endif -#define EIGEN_DEBUG_ASSIGN -#include "main.h" -#include - -using internal::demangle_flags; -using internal::demangle_traversal; -using internal::demangle_unrolling; - -template -bool test_assign(const Dst&, const Src&, int traversal, int unrolling) -{ - typedef internal::copy_using_evaluator_traits,internal::evaluator, internal::assign_op > traits; - bool res = traits::Traversal==traversal; - if(unrolling==InnerUnrolling+CompleteUnrolling) - res = res && (int(traits::Unrolling)==InnerUnrolling || int(traits::Unrolling)==CompleteUnrolling); - else - res = res && int(traits::Unrolling)==unrolling; - if(!res) - { - std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl; - std::cerr << " " << demangle_flags(internal::evaluator::Flags) << std::endl; - std::cerr << "Dst: " << demangle_flags(Dst::Flags) << std::endl; - std::cerr << " " << demangle_flags(internal::evaluator::Flags) << std::endl; - traits::debug(); - std::cerr << " Expected Traversal == " << demangle_traversal(traversal) - << " got " << demangle_traversal(traits::Traversal) << "\n"; - std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling) - << " got " << demangle_unrolling(traits::Unrolling) << "\n"; - } - return res; -} - -template -bool test_assign(int traversal, int unrolling) -{ - typedef internal::copy_using_evaluator_traits,internal::evaluator, internal::assign_op > traits; - bool res = traits::Traversal==traversal && traits::Unrolling==unrolling; - if(!res) - { - std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl; - std::cerr << " " << demangle_flags(internal::evaluator::Flags) << std::endl; - std::cerr << "Dst: " << demangle_flags(Dst::Flags) << std::endl; - std::cerr << " " << demangle_flags(internal::evaluator::Flags) << std::endl; - traits::debug(); - std::cerr << " Expected Traversal == " << demangle_traversal(traversal) - << " got " << demangle_traversal(traits::Traversal) << "\n"; - std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling) - << " got " << demangle_unrolling(traits::Unrolling) << "\n"; - } - return res; -} - -template -bool test_redux(const Xpr&, int traversal, int unrolling) -{ - typedef typename Xpr::Scalar Scalar; - typedef internal::redux_traits,internal::redux_evaluator > traits; - - bool res = traits::Traversal==traversal && traits::Unrolling==unrolling; - if(!res) - { - std::cerr << demangle_flags(Xpr::Flags) << std::endl; - std::cerr << demangle_flags(internal::evaluator::Flags) << std::endl; - traits::debug(); - - std::cerr << " Expected Traversal == " << demangle_traversal(traversal) - << " got " << demangle_traversal(traits::Traversal) << "\n"; - std::cerr << " Expected Unrolling == " << demangle_unrolling(unrolling) - << " got " << demangle_unrolling(traits::Unrolling) << "\n"; - } - return res; -} - -template::Vectorizable> -struct vectorization_logic -{ - typedef internal::packet_traits PacketTraits; - - typedef typename internal::packet_traits::type PacketType; - typedef typename internal::unpacket_traits::half HalfPacketType; - enum { - PacketSize = internal::unpacket_traits::size, - HalfPacketSize = internal::unpacket_traits::size - }; - static void run() - { - - typedef Matrix Vector1; - typedef Matrix VectorX; - typedef Matrix MatrixXX; - typedef Matrix Matrix11; - typedef Matrix Matrix22; - typedef Matrix Matrix44; - typedef Matrix Matrix44u; - typedef Matrix Matrix44c; - typedef Matrix Matrix44r; - - typedef Matrix Matrix1; - - typedef Matrix Matrix1u; - - // this type is made such that it can only be vectorized when viewed as a linear 1D vector - typedef Matrix Matrix3; - - #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT - VERIFY(test_assign(Vector1(),Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1()+Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().template cast(), - InnerVectorizedTraversal,CompleteUnrolling)); - - - VERIFY(test_assign(Vector1(),Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1()+Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), - InnerVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix44(),Matrix44()+Matrix44(), - InnerVectorizedTraversal,InnerUnrolling)); - - VERIFY(test_assign(Matrix44u(),Matrix44()+Matrix44(), - EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearTraversal, - EIGEN_UNALIGNED_VECTORIZE ? InnerUnrolling : NoUnrolling)); - - VERIFY(test_assign(Matrix1(),Matrix1()+Matrix1(), - (Matrix1::InnerSizeAtCompileTime % PacketSize)==0 ? InnerVectorizedTraversal : LinearVectorizedTraversal, - CompleteUnrolling)); - - VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), - EIGEN_UNALIGNED_VECTORIZE ? ((Matrix1::InnerSizeAtCompileTime % PacketSize)==0 ? InnerVectorizedTraversal : LinearVectorizedTraversal) - : LinearTraversal, CompleteUnrolling)); - - VERIFY(test_assign(Matrix44c().col(1),Matrix44c().col(2)+Matrix44c().col(3), - InnerVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix44r().row(2),Matrix44r().row(1)+Matrix44r().row(1), - InnerVectorizedTraversal,CompleteUnrolling)); - - if(PacketSize>1) - { - typedef Matrix Matrix33c; - typedef Matrix Vector3; - VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), - LinearTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector3(),Vector3()+Vector3(), - EIGEN_UNALIGNED_VECTORIZE ? (HalfPacketSize==1 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : (HalfPacketSize==1 ? InnerVectorizedTraversal : LinearTraversal), CompleteUnrolling)); - VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), - EIGEN_UNALIGNED_VECTORIZE ? (HalfPacketSize==1 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : (HalfPacketSize==1 ? SliceVectorizedTraversal : LinearTraversal), - ((!EIGEN_UNALIGNED_VECTORIZE) && HalfPacketSize==1) ? NoUnrolling : CompleteUnrolling)); - - VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix(),Matrix()+Matrix(), - HalfPacketSize==1 ? InnerVectorizedTraversal : - EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : - LinearTraversal, - NoUnrolling)); - - VERIFY(test_assign(Matrix11(), Matrix11()+Matrix11(),InnerVectorizedTraversal,CompleteUnrolling)); - - - VERIFY(test_assign(Matrix11(),Matrix().template block(2,3)+Matrix().template block(8,4), - (EIGEN_UNALIGNED_VECTORIZE) ? InnerVectorizedTraversal : DefaultTraversal, CompleteUnrolling|InnerUnrolling)); - - VERIFY(test_assign(Vector1(),Matrix11()*Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()), - InnerVectorizedTraversal,InnerUnrolling+CompleteUnrolling)); - } - - VERIFY(test_redux(Vector1(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix3(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix44(), - LinearVectorizedTraversal,NoUnrolling)); - - VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?4:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:4>(1,2), - DefaultTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix44c().template block<2*PacketSize,1>(1,2), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix44r().template block<1,2*PacketSize>(2,1), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY((test_assign< - Map >, - Matrix22 - >(InnerVectorizedTraversal,CompleteUnrolling))); - - VERIFY((test_assign< - Map, AlignedMax, InnerStride<3*PacketSize> >, - Matrix - >(DefaultTraversal,PacketSize>=8?InnerUnrolling:CompleteUnrolling))); - - VERIFY((test_assign(Matrix11(), Matrix()*Matrix(), - InnerVectorizedTraversal, CompleteUnrolling))); - #endif - - VERIFY(test_assign(MatrixXX(10,10),MatrixXX(20,20).block(10,10,2,3), - SliceVectorizedTraversal,NoUnrolling)); - - VERIFY(test_redux(VectorX(10), - LinearVectorizedTraversal,NoUnrolling)); - } -}; - -template struct vectorization_logic -{ - static void run() {} -}; - -template::type>::half, - typename internal::packet_traits::type>::value > -struct vectorization_logic_half -{ - typedef internal::packet_traits PacketTraits; - typedef typename internal::unpacket_traits::type>::half PacketType; - enum { - PacketSize = internal::unpacket_traits::size - }; - static void run() - { - - typedef Matrix Vector1; - typedef Matrix Matrix11; - typedef Matrix Matrix57; - typedef Matrix Matrix35; - typedef Matrix Matrix57u; -// typedef Matrix Matrix44; -// typedef Matrix Matrix44u; -// typedef Matrix Matrix44c; -// typedef Matrix Matrix44r; - - typedef Matrix Matrix1; - - typedef Matrix Matrix1u; - - // this type is made such that it can only be vectorized when viewed as a linear 1D vector - typedef Matrix Matrix3; - - #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT - VERIFY(test_assign(Vector1(),Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1()+Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().template segment(0).derived(), - EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Scalar(2.1)*Vector1()-Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),(Scalar(2.1)*Vector1().template segment(0)-Vector1().template segment(0)).derived(), - EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().template cast(), - InnerVectorizedTraversal,CompleteUnrolling)); - - - VERIFY(test_assign(Vector1(),Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1()+Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), - InnerVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix57(),Matrix57()+Matrix57(), - InnerVectorizedTraversal,InnerUnrolling)); - - VERIFY(test_assign(Matrix57u(),Matrix57()+Matrix57(), - EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearTraversal, - EIGEN_UNALIGNED_VECTORIZE ? InnerUnrolling : NoUnrolling)); - - VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), - EIGEN_UNALIGNED_VECTORIZE ? ((Matrix1::InnerSizeAtCompileTime % PacketSize)==0 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : LinearTraversal,CompleteUnrolling)); - - if(PacketSize>1) - { - typedef Matrix Matrix33c; - VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), - LinearTraversal,CompleteUnrolling)); - VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), - EIGEN_UNALIGNED_VECTORIZE ? (PacketSize==1 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : LinearTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()), - PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix(),Matrix()+Matrix(), - EIGEN_UNALIGNED_VECTORIZE ? (PacketSize==1 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : LinearTraversal, - NoUnrolling)); - - VERIFY(test_assign(Matrix11(),Matrix().template block(2,3)+Matrix().template block(8,4), - EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : DefaultTraversal,PacketSize>4?InnerUnrolling:CompleteUnrolling)); - - VERIFY(test_assign(Vector1(),Matrix11()*Vector1(), - InnerVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()), - InnerVectorizedTraversal,InnerUnrolling+CompleteUnrolling)); - } - - VERIFY(test_redux(Vector1(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix3(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix35(), - LinearVectorizedTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix57().template block(1,0), - DefaultTraversal,CompleteUnrolling)); - - VERIFY((test_assign< - Map, AlignedMax, InnerStride<3*PacketSize> >, - Matrix - >(DefaultTraversal,CompleteUnrolling))); - - VERIFY((test_assign(Matrix57(), Matrix()*Matrix(), - InnerVectorizedTraversal, InnerUnrolling|CompleteUnrolling))); - #endif - } -}; - -template struct vectorization_logic_half -{ - static void run() {} -}; - -void test_vectorization_logic() -{ - -#ifdef EIGEN_VECTORIZE - - CALL_SUBTEST( vectorization_logic::run() ); - CALL_SUBTEST( vectorization_logic::run() ); - CALL_SUBTEST( vectorization_logic::run() ); - CALL_SUBTEST( vectorization_logic >::run() ); - CALL_SUBTEST( vectorization_logic >::run() ); - - CALL_SUBTEST( vectorization_logic_half::run() ); - CALL_SUBTEST( vectorization_logic_half::run() ); - CALL_SUBTEST( vectorization_logic_half::run() ); - CALL_SUBTEST( vectorization_logic_half >::run() ); - CALL_SUBTEST( vectorization_logic_half >::run() ); - - if(internal::packet_traits::Vectorizable) - { - VERIFY(test_assign(Matrix(),Matrix()+Matrix(), - EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix(), - EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : DefaultTraversal,CompleteUnrolling)); - } - - if(internal::packet_traits::Vectorizable) - { - VERIFY(test_assign(Matrix(),Matrix()+Matrix(), - EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); - - VERIFY(test_redux(Matrix(), - EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : DefaultTraversal,CompleteUnrolling)); - } -#endif // EIGEN_VECTORIZE - -} diff --git a/testbed/nanogui/ext/eigen/test/vectorwiseop.cpp b/testbed/nanogui/ext/eigen/test/vectorwiseop.cpp deleted file mode 100644 index f3ab561e..00000000 --- a/testbed/nanogui/ext/eigen/test/vectorwiseop.cpp +++ /dev/null @@ -1,252 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// Copyright (C) 2015 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#define TEST_ENABLE_TEMPORARY_TRACKING -#define EIGEN_NO_STATIC_ASSERT - -#include "main.h" - -template void vectorwiseop_array(const ArrayType& m) -{ - typedef typename ArrayType::Index Index; - typedef typename ArrayType::Scalar Scalar; - typedef Array ColVectorType; - typedef Array RowVectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - ArrayType m1 = ArrayType::Random(rows, cols), - m2(rows, cols), - m3(rows, cols); - - ColVectorType colvec = ColVectorType::Random(rows); - RowVectorType rowvec = RowVectorType::Random(cols); - - // test addition - - m2 = m1; - m2.colwise() += colvec; - VERIFY_IS_APPROX(m2, m1.colwise() + colvec); - VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec); - - VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose()); - VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose()); - - m2 = m1; - m2.rowwise() += rowvec; - VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec); - VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec); - - VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose()); - VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose()); - - // test substraction - - m2 = m1; - m2.colwise() -= colvec; - VERIFY_IS_APPROX(m2, m1.colwise() - colvec); - VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec); - - VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose()); - VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose()); - - m2 = m1; - m2.rowwise() -= rowvec; - VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec); - VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec); - - VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose()); - VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose()); - - // test multiplication - - m2 = m1; - m2.colwise() *= colvec; - VERIFY_IS_APPROX(m2, m1.colwise() * colvec); - VERIFY_IS_APPROX(m2.col(c), m1.col(c) * colvec); - - VERIFY_RAISES_ASSERT(m2.colwise() *= colvec.transpose()); - VERIFY_RAISES_ASSERT(m1.colwise() * colvec.transpose()); - - m2 = m1; - m2.rowwise() *= rowvec; - VERIFY_IS_APPROX(m2, m1.rowwise() * rowvec); - VERIFY_IS_APPROX(m2.row(r), m1.row(r) * rowvec); - - VERIFY_RAISES_ASSERT(m2.rowwise() *= rowvec.transpose()); - VERIFY_RAISES_ASSERT(m1.rowwise() * rowvec.transpose()); - - // test quotient - - m2 = m1; - m2.colwise() /= colvec; - VERIFY_IS_APPROX(m2, m1.colwise() / colvec); - VERIFY_IS_APPROX(m2.col(c), m1.col(c) / colvec); - - VERIFY_RAISES_ASSERT(m2.colwise() /= colvec.transpose()); - VERIFY_RAISES_ASSERT(m1.colwise() / colvec.transpose()); - - m2 = m1; - m2.rowwise() /= rowvec; - VERIFY_IS_APPROX(m2, m1.rowwise() / rowvec); - VERIFY_IS_APPROX(m2.row(r), m1.row(r) / rowvec); - - VERIFY_RAISES_ASSERT(m2.rowwise() /= rowvec.transpose()); - VERIFY_RAISES_ASSERT(m1.rowwise() / rowvec.transpose()); - - m2 = m1; - // yes, there might be an aliasing issue there but ".rowwise() /=" - // is supposed to evaluate " m2.colwise().sum()" into a temporary to avoid - // evaluating the reduction multiple times - if(ArrayType::RowsAtCompileTime>2 || ArrayType::RowsAtCompileTime==Dynamic) - { - m2.rowwise() /= m2.colwise().sum(); - VERIFY_IS_APPROX(m2, m1.rowwise() / m1.colwise().sum()); - } - - // all/any - Array mb(rows,cols); - mb = (m1.real()<=0.7).colwise().all(); - VERIFY( (mb.col(c) == (m1.real().col(c)<=0.7).all()).all() ); - mb = (m1.real()<=0.7).rowwise().all(); - VERIFY( (mb.row(r) == (m1.real().row(r)<=0.7).all()).all() ); - - mb = (m1.real()>=0.7).colwise().any(); - VERIFY( (mb.col(c) == (m1.real().col(c)>=0.7).any()).all() ); - mb = (m1.real()>=0.7).rowwise().any(); - VERIFY( (mb.row(r) == (m1.real().row(r)>=0.7).any()).all() ); -} - -template void vectorwiseop_matrix(const MatrixType& m) -{ - typedef typename MatrixType::Index Index; - typedef typename MatrixType::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef Matrix ColVectorType; - typedef Matrix RowVectorType; - typedef Matrix RealColVectorType; - typedef Matrix RealRowVectorType; - - Index rows = m.rows(); - Index cols = m.cols(); - Index r = internal::random(0, rows-1), - c = internal::random(0, cols-1); - - MatrixType m1 = MatrixType::Random(rows, cols), - m2(rows, cols), - m3(rows, cols); - - ColVectorType colvec = ColVectorType::Random(rows); - RowVectorType rowvec = RowVectorType::Random(cols); - RealColVectorType rcres; - RealRowVectorType rrres; - - // test addition - - m2 = m1; - m2.colwise() += colvec; - VERIFY_IS_APPROX(m2, m1.colwise() + colvec); - VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec); - - if(rows>1) - { - VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose()); - VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose()); - } - - m2 = m1; - m2.rowwise() += rowvec; - VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec); - VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec); - - if(cols>1) - { - VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose()); - VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose()); - } - - // test substraction - - m2 = m1; - m2.colwise() -= colvec; - VERIFY_IS_APPROX(m2, m1.colwise() - colvec); - VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec); - - if(rows>1) - { - VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose()); - VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose()); - } - - m2 = m1; - m2.rowwise() -= rowvec; - VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec); - VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec); - - if(cols>1) - { - VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose()); - VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose()); - } - - // test norm - rrres = m1.colwise().norm(); - VERIFY_IS_APPROX(rrres(c), m1.col(c).norm()); - rcres = m1.rowwise().norm(); - VERIFY_IS_APPROX(rcres(r), m1.row(r).norm()); - - VERIFY_IS_APPROX(m1.cwiseAbs().colwise().sum(), m1.colwise().template lpNorm<1>()); - VERIFY_IS_APPROX(m1.cwiseAbs().rowwise().sum(), m1.rowwise().template lpNorm<1>()); - VERIFY_IS_APPROX(m1.cwiseAbs().colwise().maxCoeff(), m1.colwise().template lpNorm()); - VERIFY_IS_APPROX(m1.cwiseAbs().rowwise().maxCoeff(), m1.rowwise().template lpNorm()); - - // regression for bug 1158 - VERIFY_IS_APPROX(m1.cwiseAbs().colwise().sum().x(), m1.col(0).cwiseAbs().sum()); - - // test normalized - m2 = m1.colwise().normalized(); - VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized()); - m2 = m1.rowwise().normalized(); - VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized()); - - // test normalize - m2 = m1; - m2.colwise().normalize(); - VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized()); - m2 = m1; - m2.rowwise().normalize(); - VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized()); - - // test with partial reduction of products - Matrix m1m1 = m1 * m1.transpose(); - VERIFY_IS_APPROX( (m1 * m1.transpose()).colwise().sum(), m1m1.colwise().sum()); - Matrix tmp(rows); - VERIFY_EVALUATION_COUNT( tmp = (m1 * m1.transpose()).colwise().sum(), 1); - - m2 = m1.rowwise() - (m1.colwise().sum()/RealScalar(m1.rows())).eval(); - m1 = m1.rowwise() - (m1.colwise().sum()/RealScalar(m1.rows())); - VERIFY_IS_APPROX( m1, m2 ); - VERIFY_EVALUATION_COUNT( m2 = (m1.rowwise() - m1.colwise().sum()/RealScalar(m1.rows())), (MatrixType::RowsAtCompileTime!=1 ? 1 : 0) ); -} - -void test_vectorwiseop() -{ - CALL_SUBTEST_1( vectorwiseop_array(Array22cd()) ); - CALL_SUBTEST_2( vectorwiseop_array(Array()) ); - CALL_SUBTEST_3( vectorwiseop_array(ArrayXXf(3, 4)) ); - CALL_SUBTEST_4( vectorwiseop_matrix(Matrix4cf()) ); - CALL_SUBTEST_5( vectorwiseop_matrix(Matrix()) ); - CALL_SUBTEST_6( vectorwiseop_matrix(MatrixXd(internal::random(1,EIGEN_TEST_MAX_SIZE), internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_7( vectorwiseop_matrix(VectorXd(internal::random(1,EIGEN_TEST_MAX_SIZE))) ); - CALL_SUBTEST_7( vectorwiseop_matrix(RowVectorXd(internal::random(1,EIGEN_TEST_MAX_SIZE))) ); -} diff --git a/testbed/nanogui/ext/eigen/test/visitor.cpp b/testbed/nanogui/ext/eigen/test/visitor.cpp deleted file mode 100644 index 844170ec..00000000 --- a/testbed/nanogui/ext/eigen/test/visitor.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - -template void matrixVisitor(const MatrixType& p) -{ - typedef typename MatrixType::Scalar Scalar; - typedef typename MatrixType::Index Index; - - Index rows = p.rows(); - Index cols = p.cols(); - - // construct a random matrix where all coefficients are different - MatrixType m; - m = MatrixType::Random(rows, cols); - for(Index i = 0; i < m.size(); i++) - for(Index i2 = 0; i2 < i; i2++) - while(m(i) == m(i2)) // yes, == - m(i) = internal::random(); - - Scalar minc = Scalar(1000), maxc = Scalar(-1000); - Index minrow=0,mincol=0,maxrow=0,maxcol=0; - for(Index j = 0; j < cols; j++) - for(Index i = 0; i < rows; i++) - { - if(m(i,j) < minc) - { - minc = m(i,j); - minrow = i; - mincol = j; - } - if(m(i,j) > maxc) - { - maxc = m(i,j); - maxrow = i; - maxcol = j; - } - } - Index eigen_minrow, eigen_mincol, eigen_maxrow, eigen_maxcol; - Scalar eigen_minc, eigen_maxc; - eigen_minc = m.minCoeff(&eigen_minrow,&eigen_mincol); - eigen_maxc = m.maxCoeff(&eigen_maxrow,&eigen_maxcol); - VERIFY(minrow == eigen_minrow); - VERIFY(maxrow == eigen_maxrow); - VERIFY(mincol == eigen_mincol); - VERIFY(maxcol == eigen_maxcol); - VERIFY_IS_APPROX(minc, eigen_minc); - VERIFY_IS_APPROX(maxc, eigen_maxc); - VERIFY_IS_APPROX(minc, m.minCoeff()); - VERIFY_IS_APPROX(maxc, m.maxCoeff()); - - eigen_maxc = (m.adjoint()*m).maxCoeff(&eigen_maxrow,&eigen_maxcol); - eigen_maxc = (m.adjoint()*m).eval().maxCoeff(&maxrow,&maxcol); - VERIFY(maxrow == eigen_maxrow); - VERIFY(maxcol == eigen_maxcol); -} - -template void vectorVisitor(const VectorType& w) -{ - typedef typename VectorType::Scalar Scalar; - typedef typename VectorType::Index Index; - - Index size = w.size(); - - // construct a random vector where all coefficients are different - VectorType v; - v = VectorType::Random(size); - for(Index i = 0; i < size; i++) - for(Index i2 = 0; i2 < i; i2++) - while(v(i) == v(i2)) // yes, == - v(i) = internal::random(); - - Scalar minc = v(0), maxc = v(0); - Index minidx=0, maxidx=0; - for(Index i = 0; i < size; i++) - { - if(v(i) < minc) - { - minc = v(i); - minidx = i; - } - if(v(i) > maxc) - { - maxc = v(i); - maxidx = i; - } - } - Index eigen_minidx, eigen_maxidx; - Scalar eigen_minc, eigen_maxc; - eigen_minc = v.minCoeff(&eigen_minidx); - eigen_maxc = v.maxCoeff(&eigen_maxidx); - VERIFY(minidx == eigen_minidx); - VERIFY(maxidx == eigen_maxidx); - VERIFY_IS_APPROX(minc, eigen_minc); - VERIFY_IS_APPROX(maxc, eigen_maxc); - VERIFY_IS_APPROX(minc, v.minCoeff()); - VERIFY_IS_APPROX(maxc, v.maxCoeff()); - - Index idx0 = internal::random(0,size-1); - Index idx1 = eigen_minidx; - Index idx2 = eigen_maxidx; - VectorType v1(v), v2(v); - v1(idx0) = v1(idx1); - v2(idx0) = v2(idx2); - v1.minCoeff(&eigen_minidx); - v2.maxCoeff(&eigen_maxidx); - VERIFY(eigen_minidx == (std::min)(idx0,idx1)); - VERIFY(eigen_maxidx == (std::min)(idx0,idx2)); -} - -void test_visitor() -{ - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( matrixVisitor(Matrix()) ); - CALL_SUBTEST_2( matrixVisitor(Matrix2f()) ); - CALL_SUBTEST_3( matrixVisitor(Matrix4d()) ); - CALL_SUBTEST_4( matrixVisitor(MatrixXd(8, 12)) ); - CALL_SUBTEST_5( matrixVisitor(Matrix(20, 20)) ); - CALL_SUBTEST_6( matrixVisitor(MatrixXi(8, 12)) ); - } - for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_7( vectorVisitor(Vector4f()) ); - CALL_SUBTEST_7( vectorVisitor(Matrix()) ); - CALL_SUBTEST_8( vectorVisitor(VectorXd(10)) ); - CALL_SUBTEST_9( vectorVisitor(RowVectorXd(10)) ); - CALL_SUBTEST_10( vectorVisitor(VectorXf(33)) ); - } -} diff --git a/testbed/nanogui/ext/eigen/test/zerosized.cpp b/testbed/nanogui/ext/eigen/test/zerosized.cpp deleted file mode 100644 index 477ff007..00000000 --- a/testbed/nanogui/ext/eigen/test/zerosized.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2011 Benoit Jacob -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#include "main.h" - - -template void zeroReduction(const MatrixType& m) { - // Reductions that must hold for zero sized objects - VERIFY(m.all()); - VERIFY(!m.any()); - VERIFY(m.prod()==1); - VERIFY(m.sum()==0); - VERIFY(m.count()==0); - VERIFY(m.allFinite()); - VERIFY(!m.hasNaN()); -} - - -template void zeroSizedMatrix() -{ - MatrixType t1; - typedef typename MatrixType::Scalar Scalar; - - if (MatrixType::SizeAtCompileTime == Dynamic || MatrixType::SizeAtCompileTime == 0) - { - zeroReduction(t1); - if (MatrixType::RowsAtCompileTime == Dynamic) - VERIFY(t1.rows() == 0); - if (MatrixType::ColsAtCompileTime == Dynamic) - VERIFY(t1.cols() == 0); - - if (MatrixType::RowsAtCompileTime == Dynamic && MatrixType::ColsAtCompileTime == Dynamic) - { - - MatrixType t2(0, 0), t3(t1); - VERIFY(t2.rows() == 0); - VERIFY(t2.cols() == 0); - - zeroReduction(t2); - VERIFY(t1==t2); - } - } - - if(MatrixType::MaxColsAtCompileTime!=0 && MatrixType::MaxRowsAtCompileTime!=0) - { - Index rows = MatrixType::RowsAtCompileTime==Dynamic ? internal::random(1,10) : Index(MatrixType::RowsAtCompileTime); - Index cols = MatrixType::ColsAtCompileTime==Dynamic ? internal::random(1,10) : Index(MatrixType::ColsAtCompileTime); - MatrixType m(rows,cols); - zeroReduction(m.template block<0,MatrixType::ColsAtCompileTime>(0,0,0,cols)); - zeroReduction(m.template block(0,0,rows,0)); - zeroReduction(m.template block<0,1>(0,0)); - zeroReduction(m.template block<1,0>(0,0)); - Matrix prod = m.template block(0,0,rows,0) * m.template block<0,MatrixType::ColsAtCompileTime>(0,0,0,cols); - VERIFY(prod.rows()==rows && prod.cols()==cols); - VERIFY(prod.isZero()); - prod = m.template block<1,0>(0,0) * m.template block<0,1>(0,0); - VERIFY(prod.size()==1); - VERIFY(prod.isZero()); - } -} - -template void zeroSizedVector() -{ - VectorType t1; - - if (VectorType::SizeAtCompileTime == Dynamic || VectorType::SizeAtCompileTime==0) - { - zeroReduction(t1); - VERIFY(t1.size() == 0); - VectorType t2(DenseIndex(0)); // DenseIndex disambiguates with 0-the-null-pointer (error with gcc 4.4 and MSVC8) - VERIFY(t2.size() == 0); - zeroReduction(t2); - - VERIFY(t1==t2); - } -} - -void test_zerosized() -{ - zeroSizedMatrix(); - zeroSizedMatrix(); - zeroSizedMatrix >(); - zeroSizedMatrix(); - zeroSizedMatrix >(); - zeroSizedMatrix >(); - zeroSizedMatrix >(); - zeroSizedMatrix >(); - zeroSizedMatrix >(); - zeroSizedMatrix >(); - - zeroSizedVector(); - zeroSizedVector(); - zeroSizedVector(); - zeroSizedVector >(); - zeroSizedVector >(); -} diff --git a/testbed/nanogui/ext/eigen/unsupported/CMakeLists.txt b/testbed/nanogui/ext/eigen/unsupported/CMakeLists.txt deleted file mode 100644 index 9a566610..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -add_subdirectory(Eigen) -add_subdirectory(doc EXCLUDE_FROM_ALL) -if(BUILD_TESTING) - if(EIGEN_LEAVE_TEST_IN_ALL_TARGET) - add_subdirectory(test) # can't do EXCLUDE_FROM_ALL here, breaks CTest - else() - add_subdirectory(test EXCLUDE_FROM_ALL) - endif() -endif() diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/AdolcForward b/testbed/nanogui/ext/eigen/unsupported/Eigen/AdolcForward deleted file mode 100644 index 15f5f073..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/AdolcForward +++ /dev/null @@ -1,156 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ADLOC_FORWARD -#define EIGEN_ADLOC_FORWARD - -//-------------------------------------------------------------------------------- -// -// This file provides support for adolc's adouble type in forward mode. -// ADOL-C is a C++ automatic differentiation library, -// see https://projects.coin-or.org/ADOL-C for more information. -// -// Note that the maximal number of directions is controlled by -// the preprocessor token NUMBER_DIRECTIONS. The default is 2. -// -//-------------------------------------------------------------------------------- - -#define ADOLC_TAPELESS -#ifndef NUMBER_DIRECTIONS -# define NUMBER_DIRECTIONS 2 -#endif -#include - -// adolc defines some very stupid macros: -#if defined(malloc) -# undef malloc -#endif - -#if defined(calloc) -# undef calloc -#endif - -#if defined(realloc) -# undef realloc -#endif - -#include - -namespace Eigen { - -/** - * \defgroup AdolcForward_Module Adolc forward module - * This module provides support for adolc's adouble type in forward mode. - * ADOL-C is a C++ automatic differentiation library, - * see https://projects.coin-or.org/ADOL-C for more information. - * It mainly consists in: - * - a struct Eigen::NumTraits specialization - * - overloads of internal::* math function for adtl::adouble type. - * - * Note that the maximal number of directions is controlled by - * the preprocessor token NUMBER_DIRECTIONS. The default is 2. - * - * \code - * #include - * \endcode - */ - //@{ - -} // namespace Eigen - -// Eigen's require a few additional functions which must be defined in the same namespace -// than the custom scalar type own namespace -namespace adtl { - -inline const adouble& conj(const adouble& x) { return x; } -inline const adouble& real(const adouble& x) { return x; } -inline adouble imag(const adouble&) { return 0.; } -inline adouble abs(const adouble& x) { return fabs(x); } -inline adouble abs2(const adouble& x) { return x*x; } - -} - -namespace Eigen { - -template<> struct NumTraits - : NumTraits -{ - typedef adtl::adouble Real; - typedef adtl::adouble NonInteger; - typedef adtl::adouble Nested; - enum { - IsComplex = 0, - IsInteger = 0, - IsSigned = 1, - RequireInitialization = 1, - ReadCost = 1, - AddCost = 1, - MulCost = 1 - }; -}; - -template class AdolcForwardJacobian : public Functor -{ - typedef adtl::adouble ActiveScalar; -public: - - AdolcForwardJacobian() : Functor() {} - AdolcForwardJacobian(const Functor& f) : Functor(f) {} - - // forward constructors - template - AdolcForwardJacobian(const T0& a0) : Functor(a0) {} - template - AdolcForwardJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {} - template - AdolcForwardJacobian(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2) {} - - typedef typename Functor::InputType InputType; - typedef typename Functor::ValueType ValueType; - typedef typename Functor::JacobianType JacobianType; - - typedef Matrix ActiveInput; - typedef Matrix ActiveValue; - - void operator() (const InputType& x, ValueType* v, JacobianType* _jac) const - { - eigen_assert(v!=0); - if (!_jac) - { - Functor::operator()(x, v); - return; - } - - JacobianType& jac = *_jac; - - ActiveInput ax = x.template cast(); - ActiveValue av(jac.rows()); - - for (int j=0; j -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ALIGNED_VECTOR3 -#define EIGEN_ALIGNED_VECTOR3 - -#include - -namespace Eigen { - -/** - * \defgroup AlignedVector3_Module Aligned vector3 module - * - * \code - * #include - * \endcode - */ - //@{ - - -/** \class AlignedVector3 - * - * \brief A vectorization friendly 3D vector - * - * This class represents a 3D vector internally using a 4D vector - * such that vectorization can be seamlessly enabled. Of course, - * the same result can be achieved by directly using a 4D vector. - * This class makes this process simpler. - * - */ -// TODO specialize Cwise -template class AlignedVector3; - -namespace internal { -template struct traits > - : traits > -{ -}; -} - -template class AlignedVector3 - : public MatrixBase > -{ - typedef Matrix<_Scalar,4,1> CoeffType; - CoeffType m_coeffs; - public: - - typedef MatrixBase > Base; - EIGEN_DENSE_PUBLIC_INTERFACE(AlignedVector3) - using Base::operator*; - - inline Index rows() const { return 3; } - inline Index cols() const { return 1; } - - Scalar* data() { return m_coeffs.data(); } - const Scalar* data() const { return m_coeffs.data(); } - Index innerStride() const { return 1; } - Index outerStride() const { return 3; } - - inline const Scalar& coeff(Index row, Index col) const - { return m_coeffs.coeff(row, col); } - - inline Scalar& coeffRef(Index row, Index col) - { return m_coeffs.coeffRef(row, col); } - - inline const Scalar& coeff(Index index) const - { return m_coeffs.coeff(index); } - - inline Scalar& coeffRef(Index index) - { return m_coeffs.coeffRef(index);} - - - inline AlignedVector3(const Scalar& x, const Scalar& y, const Scalar& z) - : m_coeffs(x, y, z, Scalar(0)) - {} - - inline AlignedVector3(const AlignedVector3& other) - : Base(), m_coeffs(other.m_coeffs) - {} - - template - struct generic_assign_selector {}; - - template struct generic_assign_selector - { - inline static void run(AlignedVector3& dest, const XprType& src) - { - dest.m_coeffs = src; - } - }; - - template struct generic_assign_selector - { - inline static void run(AlignedVector3& dest, const XprType& src) - { - dest.m_coeffs.template head<3>() = src; - dest.m_coeffs.w() = Scalar(0); - } - }; - - template - inline AlignedVector3(const MatrixBase& other) - { - generic_assign_selector::run(*this,other.derived()); - } - - inline AlignedVector3& operator=(const AlignedVector3& other) - { m_coeffs = other.m_coeffs; return *this; } - - template - inline AlignedVector3& operator=(const MatrixBase& other) - { - generic_assign_selector::run(*this,other.derived()); - return *this; - } - - inline AlignedVector3 operator+(const AlignedVector3& other) const - { return AlignedVector3(m_coeffs + other.m_coeffs); } - - inline AlignedVector3& operator+=(const AlignedVector3& other) - { m_coeffs += other.m_coeffs; return *this; } - - inline AlignedVector3 operator-(const AlignedVector3& other) const - { return AlignedVector3(m_coeffs - other.m_coeffs); } - - inline AlignedVector3 operator-=(const AlignedVector3& other) - { m_coeffs -= other.m_coeffs; return *this; } - - inline AlignedVector3 operator*(const Scalar& s) const - { return AlignedVector3(m_coeffs * s); } - - inline friend AlignedVector3 operator*(const Scalar& s,const AlignedVector3& vec) - { return AlignedVector3(s * vec.m_coeffs); } - - inline AlignedVector3& operator*=(const Scalar& s) - { m_coeffs *= s; return *this; } - - inline AlignedVector3 operator/(const Scalar& s) const - { return AlignedVector3(m_coeffs / s); } - - inline AlignedVector3& operator/=(const Scalar& s) - { m_coeffs /= s; return *this; } - - inline Scalar dot(const AlignedVector3& other) const - { - eigen_assert(m_coeffs.w()==Scalar(0)); - eigen_assert(other.m_coeffs.w()==Scalar(0)); - return m_coeffs.dot(other.m_coeffs); - } - - inline void normalize() - { - m_coeffs /= norm(); - } - - inline AlignedVector3 normalized() const - { - return AlignedVector3(m_coeffs / norm()); - } - - inline Scalar sum() const - { - eigen_assert(m_coeffs.w()==Scalar(0)); - return m_coeffs.sum(); - } - - inline Scalar squaredNorm() const - { - eigen_assert(m_coeffs.w()==Scalar(0)); - return m_coeffs.squaredNorm(); - } - - inline Scalar norm() const - { - using std::sqrt; - return sqrt(squaredNorm()); - } - - inline AlignedVector3 cross(const AlignedVector3& other) const - { - return AlignedVector3(m_coeffs.cross3(other.m_coeffs)); - } - - template - inline bool isApprox(const MatrixBase& other, const RealScalar& eps=NumTraits::dummy_precision()) const - { - return m_coeffs.template head<3>().isApprox(other,eps); - } - - CoeffType& coeffs() { return m_coeffs; } - const CoeffType& coeffs() const { return m_coeffs; } -}; - -namespace internal { - -template -struct eval, Dense> -{ - typedef const AlignedVector3<_Scalar>& type; -}; - -template -struct evaluator > - : evaluator > -{ - typedef AlignedVector3 XprType; - typedef evaluator > Base; - - evaluator(const XprType &m) : Base(m.coeffs()) {} -}; - -} - -//@} - -} - -#endif // EIGEN_ALIGNED_VECTOR3 diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/ArpackSupport b/testbed/nanogui/ext/eigen/unsupported/Eigen/ArpackSupport deleted file mode 100644 index 37a2799e..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/ArpackSupport +++ /dev/null @@ -1,31 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ARPACKSUPPORT_MODULE_H -#define EIGEN_ARPACKSUPPORT_MODULE_H - -#include - -#include - -/** \defgroup ArpackSupport_Module Arpack support module - * - * This module provides a wrapper to Arpack, a library for sparse eigenvalue decomposition. - * - * \code - * #include - * \endcode - */ - -#include -#include "src/Eigenvalues/ArpackSelfAdjointEigenSolver.h" - -#include - -#endif // EIGEN_ARPACKSUPPORT_MODULE_H -/* vim: set filetype=cpp et sw=2 ts=2 ai: */ diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/AutoDiff b/testbed/nanogui/ext/eigen/unsupported/Eigen/AutoDiff deleted file mode 100644 index abf5b7d6..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/AutoDiff +++ /dev/null @@ -1,40 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2009 Gael Guennebaud -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_AUTODIFF_MODULE -#define EIGEN_AUTODIFF_MODULE - -namespace Eigen { - -/** - * \defgroup AutoDiff_Module Auto Diff module - * - * This module features forward automatic differentation via a simple - * templated scalar type wrapper AutoDiffScalar. - * - * Warning : this should NOT be confused with numerical differentiation, which - * is a different method and has its own module in Eigen : \ref NumericalDiff_Module. - * - * \code - * #include - * \endcode - */ -//@{ - -} - -#include "src/AutoDiff/AutoDiffScalar.h" -// #include "src/AutoDiff/AutoDiffVector.h" -#include "src/AutoDiff/AutoDiffJacobian.h" - -namespace Eigen { -//@} -} - -#endif // EIGEN_AUTODIFF_MODULE diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/BVH b/testbed/nanogui/ext/eigen/unsupported/Eigen/BVH deleted file mode 100644 index 0161a540..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/BVH +++ /dev/null @@ -1,95 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2009 Ilya Baran -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_BVH_MODULE_H -#define EIGEN_BVH_MODULE_H - -#include -#include -#include -#include -#include - -namespace Eigen { - -/** - * \defgroup BVH_Module BVH module - * \brief This module provides generic bounding volume hierarchy algorithms - * and reference tree implementations. - * - * - * \code - * #include - * \endcode - * - * A bounding volume hierarchy (BVH) can accelerate many geometric queries. This module provides a generic implementation - * of the two basic algorithms over a BVH: intersection of a query object against all objects in the hierarchy and minimization - * of a function over the objects in the hierarchy. It also provides intersection and minimization over a cartesian product of - * two BVH's. A BVH accelerates intersection by using the fact that if a query object does not intersect a volume, then it cannot - * intersect any object contained in that volume. Similarly, a BVH accelerates minimization because the minimum of a function - * over a volume is no greater than the minimum of a function over any object contained in it. - * - * Some sample queries that can be written in terms of intersection are: - * - Determine all points where a ray intersects a triangle mesh - * - Given a set of points, determine which are contained in a query sphere - * - Given a set of spheres, determine which contain the query point - * - Given a set of disks, determine if any is completely contained in a query rectangle (represent each 2D disk as a point \f$(x,y,r)\f$ - * in 3D and represent the rectangle as a pyramid based on the original rectangle and shrinking in the \f$r\f$ direction) - * - Given a set of points, count how many pairs are \f$d\pm\epsilon\f$ apart (done by looking at the cartesian product of the set - * of points with itself) - * - * Some sample queries that can be written in terms of function minimization over a set of objects are: - * - Find the intersection between a ray and a triangle mesh closest to the ray origin (function is infinite off the ray) - * - Given a polyline and a query point, determine the closest point on the polyline to the query - * - Find the diameter of a point cloud (done by looking at the cartesian product and using negative distance as the function) - * - Determine how far two meshes are from colliding (this is also a cartesian product query) - * - * This implementation decouples the basic algorithms both from the type of hierarchy (and the types of the bounding volumes) and - * from the particulars of the query. To enable abstraction from the BVH, the BVH is required to implement a generic mechanism - * for traversal. To abstract from the query, the query is responsible for keeping track of results. - * - * To be used in the algorithms, a hierarchy must implement the following traversal mechanism (see KdBVH for a sample implementation): \code - typedef Volume //the type of bounding volume - typedef Object //the type of object in the hierarchy - typedef Index //a reference to a node in the hierarchy--typically an int or a pointer - typedef VolumeIterator //an iterator type over node children--returns Index - typedef ObjectIterator //an iterator over object (leaf) children--returns const Object & - Index getRootIndex() const //returns the index of the hierarchy root - const Volume &getVolume(Index index) const //returns the bounding volume of the node at given index - void getChildren(Index index, VolumeIterator &outVBegin, VolumeIterator &outVEnd, - ObjectIterator &outOBegin, ObjectIterator &outOEnd) const - //getChildren takes a node index and makes [outVBegin, outVEnd) range over its node children - //and [outOBegin, outOEnd) range over its object children - \endcode - * - * To use the hierarchy, call BVIntersect or BVMinimize, passing it a BVH (or two, for cartesian product) and a minimizer or intersector. - * For an intersection query on a single BVH, the intersector encapsulates the query and must provide two functions: - * \code - bool intersectVolume(const Volume &volume) //returns true if the query intersects the volume - bool intersectObject(const Object &object) //returns true if the intersection search should terminate immediately - \endcode - * The guarantee that BVIntersect provides is that intersectObject will be called on every object whose bounding volume - * intersects the query (but possibly on other objects too) unless the search is terminated prematurely. It is the - * responsibility of the intersectObject function to keep track of the results in whatever manner is appropriate. - * The cartesian product intersection and the BVMinimize queries are similar--see their individual documentation. - * - * The following is a simple but complete example for how to use the BVH to accelerate the search for a closest red-blue point pair: - * \include BVH_Example.cpp - * Output: \verbinclude BVH_Example.out - */ -} - -//@{ - -#include "src/BVH/BVAlgorithms.h" -#include "src/BVH/KdBVH.h" - -//@} - -#endif // EIGEN_BVH_MODULE_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CMakeLists.txt b/testbed/nanogui/ext/eigen/unsupported/Eigen/CMakeLists.txt deleted file mode 100644 index 631a0601..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -set(Eigen_HEADERS - AdolcForward - AlignedVector3 - ArpackSupport - AutoDiff - BVH - EulerAngles - FFT - IterativeSolvers - KroneckerProduct - LevenbergMarquardt - MatrixFunctions - MoreVectorization - MPRealSupport - NonLinearOptimization - NumericalDiff - OpenGLSupport - Polynomials - Skyline - SparseExtra - SpecialFunctions - Splines - ) - -install(FILES - ${Eigen_HEADERS} - DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen COMPONENT Devel - ) - -install(DIRECTORY src DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen COMPONENT Devel FILES_MATCHING PATTERN "*.h") - -add_subdirectory(CXX11) diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/CMakeLists.txt b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/CMakeLists.txt deleted file mode 100644 index 385ed240..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set(Eigen_CXX11_HEADERS Tensor TensorSymmetry ThreadPool) - -install(FILES - ${Eigen_CXX11_HEADERS} - DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/CXX11 COMPONENT Devel - ) - -install(DIRECTORY src DESTINATION ${INCLUDE_INSTALL_DIR}/unsupported/Eigen/CXX11 COMPONENT Devel FILES_MATCHING PATTERN "*.h") diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/Tensor b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/Tensor deleted file mode 100644 index 39916092..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/Tensor +++ /dev/null @@ -1,159 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// Copyright (C) 2013 Christian Seiler -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -//#ifndef EIGEN_CXX11_TENSOR_MODULE -//#define EIGEN_CXX11_TENSOR_MODULE - -#include "../../../Eigen/Core" - -#if defined(EIGEN_USE_SYCL) -#undef min -#undef max -#undef isnan -#undef isinf -#undef isfinite -#include -#include -#include -#include -#include -#endif - -#include - -#include "../SpecialFunctions" -#include "src/util/CXX11Meta.h" -#include "src/util/MaxSizeVector.h" - -/** \defgroup CXX11_Tensor_Module Tensor Module - * - * This module provides a Tensor class for storing arbitrarily indexed - * objects. - * - * \code - * #include - * \endcode - */ - -#include -#include -#include - -#ifdef _WIN32 -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#include -#else -#include -#include -#endif - -#if __cplusplus > 199711 || EIGEN_COMP_MSVC >= 1900 -#include -#endif - -#ifdef _WIN32 -#include -#elif defined(__APPLE__) -#include -#else -#include -#endif - -#if defined(EIGEN_USE_LIBXSMM) -#include "libxsmm.h" -#endif - -#ifdef EIGEN_USE_THREADS -#include "ThreadPool" -#endif - -#ifdef EIGEN_USE_GPU -#include -#include -#if __cplusplus >= 201103L -#include -#include -#endif -#endif - -#include "src/Tensor/TensorMacros.h" -#include "src/Tensor/TensorForwardDeclarations.h" -#include "src/Tensor/TensorMeta.h" -#include "src/Tensor/TensorFunctors.h" -#include "src/Tensor/TensorCostModel.h" -#include "src/Tensor/TensorDeviceDefault.h" -#include "src/Tensor/TensorDeviceThreadPool.h" -#include "src/Tensor/TensorDeviceCuda.h" -#include "src/Tensor/TensorDeviceSycl.h" -#include "src/Tensor/TensorIndexList.h" -#include "src/Tensor/TensorDimensionList.h" -#include "src/Tensor/TensorDimensions.h" -#include "src/Tensor/TensorInitializer.h" -#include "src/Tensor/TensorTraits.h" -#include "src/Tensor/TensorRandom.h" -#include "src/Tensor/TensorUInt128.h" -#include "src/Tensor/TensorIntDiv.h" -#include "src/Tensor/TensorGlobalFunctions.h" - -#include "src/Tensor/TensorBase.h" - -#include "src/Tensor/TensorEvaluator.h" -#include "src/Tensor/TensorExpr.h" -#include "src/Tensor/TensorReduction.h" -#include "src/Tensor/TensorReductionCuda.h" -#include "src/Tensor/TensorArgMax.h" -#include "src/Tensor/TensorConcatenation.h" -#include "src/Tensor/TensorContractionMapper.h" -#include "src/Tensor/TensorContractionBlocking.h" -#include "src/Tensor/TensorContraction.h" -#include "src/Tensor/TensorContractionThreadPool.h" -#include "src/Tensor/TensorContractionCuda.h" -#include "src/Tensor/TensorConversion.h" -#include "src/Tensor/TensorConvolution.h" -#include "src/Tensor/TensorFFT.h" -#include "src/Tensor/TensorPatch.h" -#include "src/Tensor/TensorImagePatch.h" -#include "src/Tensor/TensorVolumePatch.h" -#include "src/Tensor/TensorBroadcasting.h" -#include "src/Tensor/TensorChipping.h" -#include "src/Tensor/TensorInflation.h" -#include "src/Tensor/TensorLayoutSwap.h" -#include "src/Tensor/TensorMorphing.h" -#include "src/Tensor/TensorPadding.h" -#include "src/Tensor/TensorReverse.h" -#include "src/Tensor/TensorShuffling.h" -#include "src/Tensor/TensorStriding.h" -#include "src/Tensor/TensorCustomOp.h" -#include "src/Tensor/TensorEvalTo.h" -#include "src/Tensor/TensorForcedEval.h" -#include "src/Tensor/TensorGenerator.h" -#include "src/Tensor/TensorAssign.h" -#include "src/Tensor/TensorScan.h" - -#include "src/Tensor/TensorSycl.h" -#include "src/Tensor/TensorExecutor.h" -#include "src/Tensor/TensorDevice.h" - -#include "src/Tensor/TensorStorage.h" -#include "src/Tensor/Tensor.h" -#include "src/Tensor/TensorFixedSize.h" -#include "src/Tensor/TensorMap.h" -#include "src/Tensor/TensorRef.h" - -#include "src/Tensor/TensorIO.h" - -#include - -//#endif // EIGEN_CXX11_TENSOR_MODULE diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/TensorSymmetry b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/TensorSymmetry deleted file mode 100644 index fb1b0c0f..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/TensorSymmetry +++ /dev/null @@ -1,42 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2013 Christian Seiler -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSORSYMMETRY_MODULE -#define EIGEN_CXX11_TENSORSYMMETRY_MODULE - -#include - -#include - -#include "src/util/CXX11Meta.h" - -/** \defgroup CXX11_TensorSymmetry_Module Tensor Symmetry Module - * - * This module provides a classes that allow for the definition of - * symmetries w.r.t. tensor indices. - * - * Including this module will implicitly include the Tensor module. - * - * \code - * #include - * \endcode - */ - -#include "src/TensorSymmetry/util/TemplateGroupTheory.h" -#include "src/TensorSymmetry/Symmetry.h" -#include "src/TensorSymmetry/StaticSymmetry.h" -#include "src/TensorSymmetry/DynamicSymmetry.h" - -#include - -#endif // EIGEN_CXX11_TENSORSYMMETRY_MODULE - -/* - * kate: space-indent on; indent-width 2; mixedindent off; indent-mode cstyle; - */ diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/ThreadPool b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/ThreadPool deleted file mode 100644 index c3461419..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/ThreadPool +++ /dev/null @@ -1,78 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_THREADPOOL_MODULE -#define EIGEN_CXX11_THREADPOOL_MODULE - -#include "../../../Eigen/Core" - -#include - -/** \defgroup CXX11_ThreadPool_Module C++11 ThreadPool Module - * - * This module provides 2 threadpool implementations - * - a simple reference implementation - * - a faster non blocking implementation - * - * This module requires C++11. - * - * \code - * #include - * \endcode - */ - - -// The code depends on CXX11, so only include the module if the -// compiler supports it. -#if __cplusplus > 199711L || EIGEN_COMP_MSVC >= 1900 -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/util/CXX11Meta.h" -#include "src/util/MaxSizeVector.h" - -#include "src/ThreadPool/ThreadLocal.h" -#include "src/ThreadPool/ThreadYield.h" -#include "src/ThreadPool/ThreadCancel.h" -#include "src/ThreadPool/EventCount.h" -#include "src/ThreadPool/RunQueue.h" -#include "src/ThreadPool/ThreadPoolInterface.h" -#include "src/ThreadPool/ThreadEnvironment.h" -#include "src/ThreadPool/SimpleThreadPool.h" -#include "src/ThreadPool/NonBlockingThreadPool.h" - - -// Use the more efficient NonBlockingThreadPool by default. -namespace Eigen { -#ifndef EIGEN_USE_SIMPLE_THREAD_POOL -template using ThreadPoolTempl = NonBlockingThreadPoolTempl; -typedef NonBlockingThreadPool ThreadPool; -#else -template using ThreadPoolTempl = SimpleThreadPoolTempl; -typedef SimpleThreadPool ThreadPool; -#endif -} // namespace Eigen - -#endif - -#include - -#endif // EIGEN_CXX11_THREADPOOL_MODULE - diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md deleted file mode 100644 index 38cdb9c6..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md +++ /dev/null @@ -1,1755 +0,0 @@ -# Eigen Tensors - -Tensors are multidimensional arrays of elements. Elements are typically scalars, -but more complex types such as strings are also supported. - -[TOC] - -## Tensor Classes - -You can manipulate a tensor with one of the following classes. They all are in -the namespace ```::Eigen.``` - - -### Class Tensor - -This is the class to use to create a tensor and allocate memory for it. The -class is templatized with the tensor datatype, such as float or int, and the -tensor rank. The rank is the number of dimensions, for example rank 2 is a -matrix. - -Tensors of this class are resizable. For example, if you assign a tensor of a -different size to a Tensor, that tensor is resized to match its new value. - -#### Constructor Tensor(size0, size1, ...) - -Constructor for a Tensor. The constructor must be passed ```rank``` integers -indicating the sizes of the instance along each of the the ```rank``` -dimensions. - - // Create a tensor of rank 3 of sizes 2, 3, 4. This tensor owns - // memory to hold 24 floating point values (24 = 2 x 3 x 4). - Tensor t_3d(2, 3, 4); - - // Resize t_3d by assigning a tensor of different sizes, but same rank. - t_3d = Tensor(3, 4, 3); - -#### Constructor Tensor(size_array) - -Constructor where the sizes for the constructor are specified as an array of -values instead of an explicitly list of parameters. The array type to use is -```Eigen::array```. The array can be constructed automatically -from an initializer list. - - // Create a tensor of strings of rank 2 with sizes 5, 7. - Tensor t_2d({5, 7}); - - -### Class TensorFixedSize> - -Class to use for tensors of fixed size, where the size is known at compile -time. Fixed sized tensors can provide very fast computations because all their -dimensions are known by the compiler. FixedSize tensors are not resizable. - -If the total number of elements in a fixed size tensor is small enough the -tensor data is held onto the stack and does not cause heap allocation and free. - - // Create a 4 x 3 tensor of floats. - TensorFixedSize> t_4x3; - -### Class TensorMap> - -This is the class to use to create a tensor on top of memory allocated and -owned by another part of your code. It allows to view any piece of allocated -memory as a Tensor. Instances of this class do not own the memory where the -data are stored. - -A TensorMap is not resizable because it does not own the memory where its data -are stored. - -#### Constructor TensorMap>(data, size0, size1, ...) - -Constructor for a Tensor. The constructor must be passed a pointer to the -storage for the data, and "rank" size attributes. The storage has to be -large enough to hold all the data. - - // Map a tensor of ints on top of stack-allocated storage. - int storage[128]; // 2 x 4 x 2 x 8 = 128 - TensorMap> t_4d(storage, 2, 4, 2, 8); - - // The same storage can be viewed as a different tensor. - // You can also pass the sizes as an array. - TensorMap> t_2d(storage, 16, 8); - - // You can also map fixed-size tensors. Here we get a 1d view of - // the 2d fixed-size tensor. - Tensor> t_4x3; - TensorMap> t_12(t_4x3, 12); - - -#### Class TensorRef - -See Assigning to a TensorRef below. - -## Accessing Tensor Elements - -#### tensor(index0, index1...) - -Return the element at position ```(index0, index1...)``` in tensor -```tensor```. You must pass as many parameters as the rank of ```tensor```. -The expression can be used as an l-value to set the value of the element at the -specified position. The value returned is of the datatype of the tensor. - - // Set the value of the element at position (0, 1, 0); - Tensor t_3d(2, 3, 4); - t_3d(0, 1, 0) = 12.0f; - - // Initialize all elements to random values. - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < 3; ++j) { - for (int k = 0; k < 4; ++k) { - t_3d(i, j, k) = ...some random value...; - } - } - } - - // Print elements of a tensor. - for (int i = 0; i < 2; ++i) { - LOG(INFO) << t_3d(i, 0, 0); - } - - -## TensorLayout - -The tensor library supports 2 layouts: ```ColMajor``` (the default) and -```RowMajor```. Only the default column major layout is currently fully -supported, and it is therefore not recommended to attempt to use the row major -layout at the moment. - -The layout of a tensor is optionally specified as part of its type. If not -specified explicitly column major is assumed. - - Tensor col_major; // equivalent to Tensor - TensorMap > row_major(data, ...); - -All the arguments to an expression must use the same layout. Attempting to mix -different layouts will result in a compilation error. - -It is possible to change the layout of a tensor or an expression using the -```swap_layout()``` method. Note that this will also reverse the order of the -dimensions. - - Tensor col_major(2, 4); - Tensor row_major(2, 4); - - Tensor col_major_result = col_major; // ok, layouts match - Tensor col_major_result = row_major; // will not compile - - // Simple layout swap - col_major_result = row_major.swap_layout(); - eigen_assert(col_major_result.dimension(0) == 4); - eigen_assert(col_major_result.dimension(1) == 2); - - // Swap the layout and preserve the order of the dimensions - array shuffle(1, 0); - col_major_result = row_major.swap_layout().shuffle(shuffle); - eigen_assert(col_major_result.dimension(0) == 2); - eigen_assert(col_major_result.dimension(1) == 4); - - -## Tensor Operations - -The Eigen Tensor library provides a vast library of operations on Tensors: -numerical operations such as addition and multiplication, geometry operations -such as slicing and shuffling, etc. These operations are available as methods -of the Tensor classes, and in some cases as operator overloads. For example -the following code computes the elementwise addition of two tensors: - - Tensor t1(2, 3, 4); - ...set some values in t1... - Tensor t2(2, 3, 4); - ...set some values in t2... - // Set t3 to the element wise sum of t1 and t2 - Tensor t3 = t1 + t2; - -While the code above looks easy enough, it is important to understand that the -expression ```t1 + t2``` is not actually adding the values of the tensors. The -expression instead constructs a "tensor operator" object of the class -TensorCwiseBinaryOp, which has references to the tensors -```t1``` and ```t2```. This is a small C++ object that knows how to add -```t1``` and ```t2```. It is only when the value of the expression is assigned -to the tensor ```t3``` that the addition is actually performed. Technically, -this happens through the overloading of ```operator=()``` in the Tensor class. - -This mechanism for computing tensor expressions allows for lazy evaluation and -optimizations which are what make the tensor library very fast. - -Of course, the tensor operators do nest, and the expression ```t1 + t2 * -0.3f``` is actually represented with the (approximate) tree of operators: - - TensorCwiseBinaryOp(t1, TensorCwiseUnaryOp(t2, 0.3f)) - - -### Tensor Operations and C++ "auto" - -Because Tensor operations create tensor operators, the C++ ```auto``` keyword -does not have its intuitive meaning. Consider these 2 lines of code: - - Tensor t3 = t1 + t2; - auto t4 = t1 + t2; - -In the first line we allocate the tensor ```t3``` and it will contain the -result of the addition of ```t1``` and ```t2```. In the second line, ```t4``` -is actually the tree of tensor operators that will compute the addition of -```t1``` and ```t2```. In fact, ```t4``` is *not* a tensor and you cannot get -the values of its elements: - - Tensor t3 = t1 + t2; - cout << t3(0, 0, 0); // OK prints the value of t1(0, 0, 0) + t2(0, 0, 0) - - auto t4 = t1 + t2; - cout << t4(0, 0, 0); // Compilation error! - -When you use ```auto``` you do not get a Tensor as a result but instead a -non-evaluated expression. So only use ```auto``` to delay evaluation. - -Unfortunately, there is no single underlying concrete type for holding -non-evaluated expressions, hence you have to use auto in the case when you do -want to hold non-evaluated expressions. - -When you need the results of set of tensor computations you have to assign the -result to a Tensor that will be capable of holding onto them. This can be -either a normal Tensor, a fixed size Tensor, or a TensorMap on an existing -piece of memory. All the following will work: - - auto t4 = t1 + t2; - - Tensor result = t4; // Could also be: result(t4); - cout << result(0, 0, 0); - - TensorMap result(, , ...) = t4; - cout << result(0, 0, 0); - - TensorFixedSize> result = t4; - cout << result(0, 0, 0); - -Until you need the results, you can keep the operation around, and even reuse -it for additional operations. As long as you keep the expression as an -operation, no computation is performed. - - // One way to compute exp((t1 + t2) * 0.2f); - auto t3 = t1 + t2; - auto t4 = t3 * 0.2f; - auto t5 = t4.exp(); - Tensor result = t5; - - // Another way, exactly as efficient as the previous one: - Tensor result = ((t1 + t2) * 0.2f).exp(); - -### Controlling When Expression are Evaluated - -There are several ways to control when expressions are evaluated: - -* Assignment to a Tensor, TensorFixedSize, or TensorMap. -* Use of the eval() method. -* Assignment to a TensorRef. - -#### Assigning to a Tensor, TensorFixedSize, or TensorMap. - -The most common way to evaluate an expression is to assign it to a Tensor. In -the example below, the ```auto``` declarations make the intermediate values -"Operations", not Tensors, and do not cause the expressions to be evaluated. -The assignment to the Tensor ```result``` causes the evaluation of all the -operations. - - auto t3 = t1 + t2; // t3 is an Operation. - auto t4 = t3 * 0.2f; // t4 is an Operation. - auto t5 = t4.exp(); // t5 is an Operation. - Tensor result = t5; // The operations are evaluated. - -If you know the ranks and sizes of the Operation value you can assign the -Operation to a TensorFixedSize instead of a Tensor, which is a bit more -efficient. - - // We know that the result is a 4x4x2 tensor! - TensorFixedSize result = t5; - -Simiarly, assigning an expression to a TensorMap causes its evaluation. Like -tensors of type TensorFixedSize, TensorMaps cannot be resized so they have to -have the rank and sizes of the expression that are assigned to them. - -#### Calling eval(). - -When you compute large composite expressions, you sometimes want to tell Eigen -that an intermediate value in the expression tree is worth evaluating ahead of -time. This is done by inserting a call to the ```eval()``` method of the -expression Operation. - - // The previous example could have been written: - Tensor result = ((t1 + t2) * 0.2f).exp(); - - // If you want to compute (t1 + t2) once ahead of time you can write: - Tensor result = ((t1 + t2).eval() * 0.2f).exp(); - -Semantically, calling ```eval()``` is equivalent to materializing the value of -the expression in a temporary Tensor of the right size. The code above in -effect does: - - // .eval() knows the size! - TensorFixedSize tmp = t1 + t2; - Tensor result = (tmp * 0.2f).exp(); - -Note that the return value of ```eval()``` is itself an Operation, so the -following code does not do what you may think: - - // Here t3 is an evaluation Operation. t3 has not been evaluated yet. - auto t3 = (t1 + t2).eval(); - - // You can use t3 in another expression. Still no evaluation. - auto t4 = (t3 * 0.2f).exp(); - - // The value is evaluated when you assign the Operation to a Tensor, using - // an intermediate tensor to represent t3.x - Tensor result = t4; - -While in the examples above calling ```eval()``` does not make a difference in -performance, in other cases it can make a huge difference. In the expression -below the ```broadcast()``` expression causes the ```X.maximum()``` expression -to be evaluated many times: - - Tensor<...> X ...; - Tensor<...> Y = ((X - X.maximum(depth_dim).reshape(dims2d).broadcast(bcast)) - * beta).exp(); - -Inserting a call to ```eval()``` between the ```maximum()``` and -```reshape()``` calls guarantees that maximum() is only computed once and -greatly speeds-up execution: - - Tensor<...> Y = - ((X - X.maximum(depth_dim).eval().reshape(dims2d).broadcast(bcast)) - * beta).exp(); - -In the other example below, the tensor ```Y``` is both used in the expression -and its assignment. This is an aliasing problem and if the evaluation is not -done in the right order Y will be updated incrementally during the evaluation -resulting in bogus results: - - Tensor<...> Y ...; - Y = Y / (Y.sum(depth_dim).reshape(dims2d).broadcast(bcast)); - -Inserting a call to ```eval()``` between the ```sum()``` and ```reshape()``` -expressions ensures that the sum is computed before any updates to ```Y``` are -done. - - Y = Y / (Y.sum(depth_dim).eval().reshape(dims2d).broadcast(bcast)); - -Note that an eval around the full right hand side expression is not needed -because the generated has to compute the i-th value of the right hand side -before assigning it to the left hand side. - -However, if you were assigning the expression value to a shuffle of ```Y``` -then you would need to force an eval for correctness by adding an ```eval()``` -call for the right hand side: - - Y.shuffle(...) = - (Y / (Y.sum(depth_dim).eval().reshape(dims2d).broadcast(bcast))).eval(); - - -#### Assigning to a TensorRef. - -If you need to access only a few elements from the value of an expression you -can avoid materializing the value in a full tensor by using a TensorRef. - -A TensorRef is a small wrapper class for any Eigen Operation. It provides -overloads for the ```()``` operator that let you access individual values in -the expression. TensorRef is convenient, because the Operation themselves do -not provide a way to access individual elements. - - // Create a TensorRef for the expression. The expression is not - // evaluated yet. - TensorRef > ref = ((t1 + t2) * 0.2f).exp(); - - // Use "ref" to access individual elements. The expression is evaluated - // on the fly. - float at_0 = ref(0, 0, 0); - cout << ref(0, 1, 0); - -Only use TensorRef when you need a subset of the values of the expression. -TensorRef only computes the values you access. However note that if you are -going to access all the values it will be much faster to materialize the -results in a Tensor first. - -In some cases, if the full Tensor result would be very large, you may save -memory by accessing it as a TensorRef. But not always. So don't count on it. - - -### Controlling How Expressions Are Evaluated - -The tensor library provides several implementations of the various operations -such as contractions and convolutions. The implementations are optimized for -different environments: single threaded on CPU, multi threaded on CPU, or on a -GPU using cuda. Additional implementations may be added later. - -You can choose which implementation to use with the ```device()``` call. If -you do not choose an implementation explicitly the default implementation that -uses a single thread on the CPU is used. - -The default implementation has been optimized for recent Intel CPUs, taking -advantage of SSE, AVX, and FMA instructions. Work is ongoing to tune the -library on ARM CPUs. Note that you need to pass compiler-dependent flags -to enable the use of SSE, AVX, and other instructions. - -For example, the following code adds two tensors using the default -single-threaded CPU implementation: - - Tensor a(30, 40); - Tensor b(30, 40); - Tensor c = a + b; - -To choose a different implementation you have to insert a ```device()``` call -before the assignment of the result. For technical C++ reasons this requires -that the Tensor for the result be declared on its own. This means that you -have to know the size of the result. - - Eigen::Tensor c(30, 40); - c.device(...) = a + b; - -The call to ```device()``` must be the last call on the left of the operator=. - -You must pass to the ```device()``` call an Eigen device object. There are -presently three devices you can use: DefaultDevice, ThreadPoolDevice and -GpuDevice. - - -#### Evaluating With the DefaultDevice - -This is exactly the same as not inserting a ```device()``` call. - - DefaultDevice my_device; - c.device(my_device) = a + b; - -#### Evaluating with a Thread Pool - - // Create the Eigen ThreadPoolDevice. - Eigen::ThreadPoolDevice my_device(4 /* number of threads to use */); - - // Now just use the device when evaluating expressions. - Eigen::Tensor c(30, 50); - c.device(my_device) = a.contract(b, dot_product_dims); - - -#### Evaluating On GPU - -This is presently a bit more complicated than just using a thread pool device. -You need to create a GPU device but you also need to explicitly allocate the -memory for tensors with cuda. - - -## API Reference - -### Datatypes - -In the documentation of the tensor methods and Operation we mention datatypes -that are tensor-type specific: - -#### ::Dimensions - -Acts like an array of ints. Has an ```int size``` attribute, and can be -indexed like an array to access individual values. Used to represent the -dimensions of a tensor. See ```dimensions()```. - -#### ::Index - -Acts like an ```int```. Used for indexing tensors along their dimensions. See -```operator()```, ```dimension()```, and ```size()```. - -#### ::Scalar - -Represents the datatype of individual tensor elements. For example, for a -```Tensor```, ```Scalar``` is the type ```float```. See -```setConstant()```. - -#### - -We use this pseudo type to indicate that a tensor Operation is returned by a -method. We indicate in the text the type and dimensions of the tensor that the -Operation returns after evaluation. - -The Operation will have to be evaluated, for example by assigning it to a -tensor, before you can access the values of the resulting tensor. You can also -access the values through a TensorRef. - - -## Built-in Tensor Methods - -These are usual C++ methods that act on tensors immediately. They are not -Operations which provide delayed evaluation of their results. Unless specified -otherwise, all the methods listed below are available on all tensor classes: -Tensor, TensorFixedSize, and TensorMap. - -## Metadata - -### int NumDimensions - -Constant value indicating the number of dimensions of a Tensor. This is also -known as the tensor "rank". - - Eigen::Tensor a(3, 4); - cout << "Dims " << a.NumDimensions; - => Dims 2 - -### Dimensions dimensions() - -Returns an array-like object representing the dimensions of the tensor. -The actual type of the dimensions() result is ::Dimensions. - - Eigen::Tensor a(3, 4); - const Eigen::Tensor::Dimensions& d = a.dimensions(); - cout << "Dim size: " << d.size << ", dim 0: " << d[0] - << ", dim 1: " << d[1]; - => Dim size: 2, dim 0: 3, dim 1: 4 - -If you use a C++11 compiler, you can use ```auto``` to simplify the code: - - const auto& d = a.dimensions(); - cout << "Dim size: " << d.size << ", dim 0: " << d[0] - << ", dim 1: " << d[1]; - => Dim size: 2, dim 0: 3, dim 1: 4 - -### Index dimension(Index n) - -Returns the n-th dimension of the tensor. The actual type of the -```dimension()``` result is ```::Index```, but you can -always use it like an int. - - Eigen::Tensor a(3, 4); - int dim1 = a.dimension(1); - cout << "Dim 1: " << dim1; - => Dim 1: 4 - -### Index size() - -Returns the total number of elements in the tensor. This is the product of all -the tensor dimensions. The actual type of the ```size()``` result is -```::Index```, but you can always use it like an int. - - Eigen::Tensor a(3, 4); - cout << "Size: " << a.size(); - => Size: 12 - - -### Getting Dimensions From An Operation - -A few operations provide ```dimensions()``` directly, -e.g. ```TensorReslicingOp```. Most operations defer calculating dimensions -until the operation is being evaluated. If you need access to the dimensions -of a deferred operation, you can wrap it in a TensorRef (see Assigning to a -TensorRef above), which provides ```dimensions()``` and ```dimension()``` as -above. - -TensorRef can also wrap the plain Tensor types, so this is a useful idiom in -templated contexts where the underlying object could be either a raw Tensor -or some deferred operation (e.g. a slice of a Tensor). In this case, the -template code can wrap the object in a TensorRef and reason about its -dimensionality while remaining agnostic to the underlying type. - - -## Constructors - -### Tensor - -Creates a tensor of the specified size. The number of arguments must be equal -to the rank of the tensor. The content of the tensor is not initialized. - - Eigen::Tensor a(3, 4); - cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl; - => NumRows: 3 NumCols: 4 - -### TensorFixedSize - -Creates a tensor of the specified size. The number of arguments in the Size<> -template parameter determines the rank of the tensor. The content of the tensor -is not initialized. - - Eigen::TensorFixedSize> a; - cout << "Rank: " << a.rank() << endl; - => Rank: 2 - cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl; - => NumRows: 3 NumCols: 4 - -### TensorMap - -Creates a tensor mapping an existing array of data. The data must not be freed -until the TensorMap is discarded, and the size of the data must be large enough -to accomodate of the coefficients of the tensor. - - float data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; - Eigen::TensorMap a(data, 3, 4); - cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl; - => NumRows: 3 NumCols: 4 - cout << "a(1, 2): " << a(1, 2) << endl; - => a(1, 2): 9 - - -## Contents Initialization - -When a new Tensor or a new TensorFixedSize are created, memory is allocated to -hold all the tensor elements, but the memory is not initialized. Similarly, -when a new TensorMap is created on top of non-initialized memory the memory its -contents are not initialized. - -You can use one of the methods below to initialize the tensor memory. These -have an immediate effect on the tensor and return the tensor itself as a -result. These are not tensor Operations which delay evaluation. - -### setConstant(const Scalar& val) - -Sets all elements of the tensor to the constant value ```val```. ```Scalar``` -is the type of data stored in the tensor. You can pass any value that is -convertible to that type. - -Returns the tensor itself in case you want to chain another call. - - a.setConstant(12.3f); - cout << "Constant: " << endl << a << endl << endl; - => - Constant: - 12.3 12.3 12.3 12.3 - 12.3 12.3 12.3 12.3 - 12.3 12.3 12.3 12.3 - -Note that ```setConstant()``` can be used on any tensor where the element type -has a copy constructor and an ```operator=()```: - - Eigen::Tensor a(2, 3); - a.setConstant("yolo"); - cout << "String tensor: " << endl << a << endl << endl; - => - String tensor: - yolo yolo yolo - yolo yolo yolo - - -### setZero() - -Fills the tensor with zeros. Equivalent to ```setConstant(Scalar(0))```. -Returns the tensor itself in case you want to chain another call. - - a.setZero(); - cout << "Zeros: " << endl << a << endl << endl; - => - Zeros: - 0 0 0 0 - 0 0 0 0 - 0 0 0 0 - - -### setValues({..initializer_list}) - -Fills the tensor with explicit values specified in a std::initializer_list. -The type of the initializer list depends on the type and rank of the tensor. - -If the tensor has rank N, the initializer list must be nested N times. The -most deeply nested lists must contains P scalars of the Tensor type where P is -the size of the last dimension of the Tensor. - -For example, for a ```TensorFixedSize``` the initializer list must -contains 2 lists of 3 floats each. - -```setValues()``` returns the tensor itself in case you want to chain another -call. - - Eigen::Tensor a(2, 3); - a.setValues({{0.0f, 1.0f, 2.0f}, {3.0f, 4.0f, 5.0f}}); - cout << "a" << endl << a << endl << endl; - => - a - 0 1 2 - 3 4 5 - -If a list is too short, the corresponding elements of the tensor will not be -changed. This is valid at each level of nesting. For example the following -code only sets the values of the first row of the tensor. - - Eigen::Tensor a(2, 3); - a.setConstant(1000); - a.setValues({{10, 20, 30}}); - cout << "a" << endl << a << endl << endl; - => - a - 10 20 30 - 1000 1000 1000 - -### setRandom() - -Fills the tensor with random values. Returns the tensor itself in case you -want to chain another call. - - a.setRandom(); - cout << "Random: " << endl << a << endl << endl; - => - Random: - 0.680375 0.59688 -0.329554 0.10794 - -0.211234 0.823295 0.536459 -0.0452059 - 0.566198 -0.604897 -0.444451 0.257742 - -You can customize ```setRandom()``` by providing your own random number -generator as a template argument: - - a.setRandom(); - -Here, ```MyRandomGenerator``` must be a struct with the following member -functions, where Scalar and Index are the same as ```::Scalar``` -and ```::Index```. - -See ```struct UniformRandomGenerator``` in TensorFunctors.h for an example. - - // Custom number generator for use with setRandom(). - struct MyRandomGenerator { - // Default and copy constructors. Both are needed - MyRandomGenerator() { } - MyRandomGenerator(const MyRandomGenerator& ) { } - - // Return a random value to be used. "element_location" is the - // location of the entry to set in the tensor, it can typically - // be ignored. - Scalar operator()(Eigen::DenseIndex element_location, - Eigen::DenseIndex /*unused*/ = 0) const { - return ; - } - - // Same as above but generates several numbers at a time. - typename internal::packet_traits::type packetOp( - Eigen::DenseIndex packet_location, Eigen::DenseIndex /*unused*/ = 0) const { - return ; - } - }; - -You can also use one of the 2 random number generators that are part of the -tensor library: -* UniformRandomGenerator -* NormalRandomGenerator - - -## Data Access - -The Tensor, TensorFixedSize, and TensorRef classes provide the following -accessors to access the tensor coefficients: - - const Scalar& operator()(const array& indices) - const Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) - Scalar& operator()(const array& indices) - Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) - -The number of indices must be equal to the rank of the tensor. Moreover, these -accessors are not available on tensor expressions. In order to access the -values of a tensor expression, the expression must either be evaluated or -wrapped in a TensorRef. - - -### Scalar* data() and const Scalar* data() const - -Returns a pointer to the storage for the tensor. The pointer is const if the -tensor was const. This allows direct access to the data. The layout of the -data depends on the tensor layout: RowMajor or ColMajor. - -This access is usually only needed for special cases, for example when mixing -Eigen Tensor code with other libraries. - -Scalar is the type of data stored in the tensor. - - Eigen::Tensor a(3, 4); - float* a_data = a.data(); - a_data[0] = 123.45f; - cout << "a(0, 0): " << a(0, 0); - => a(0, 0): 123.45 - - -## Tensor Operations - -All the methods documented below return non evaluated tensor ```Operations```. -These can be chained: you can apply another Tensor Operation to the value -returned by the method. - -The chain of Operation is evaluated lazily, typically when it is assigned to a -tensor. See "Controlling when Expression are Evaluated" for more details about -their evaluation. - -### constant(const Scalar& val) - -Returns a tensor of the same type and dimensions as the original tensor but -where all elements have the value ```val```. - -This is useful, for example, when you want to add or subtract a constant from a -tensor, or multiply every element of a tensor by a scalar. - - Eigen::Tensor a(2, 3); - a.setConstant(1.0f); - Eigen::Tensor b = a + a.constant(2.0f); - Eigen::Tensor c = b * b.constant(0.2f); - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - cout << "c" << endl << c << endl << endl; - => - a - 1 1 1 - 1 1 1 - - b - 3 3 3 - 3 3 3 - - c - 0.6 0.6 0.6 - 0.6 0.6 0.6 - -### random() - -Returns a tensor of the same type and dimensions as the current tensor -but where all elements have random values. - -This is for example useful to add random values to an existing tensor. -The generation of random values can be customized in the same manner -as for ```setRandom()```. - - Eigen::Tensor a(2, 3); - a.setConstant(1.0f); - Eigen::Tensor b = a + a.random(); - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - => - a - 1 1 1 - 1 1 1 - - b - 1.68038 1.5662 1.82329 - 0.788766 1.59688 0.395103 - - -## Unary Element Wise Operations - -All these operations take a single input tensor as argument and return a tensor -of the same type and dimensions as the tensor to which they are applied. The -requested operations are applied to each element independently. - -### operator-() - -Returns a tensor of the same type and dimensions as the original tensor -containing the opposite values of the original tensor. - - Eigen::Tensor a(2, 3); - a.setConstant(1.0f); - Eigen::Tensor b = -a; - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - => - a - 1 1 1 - 1 1 1 - - b - -1 -1 -1 - -1 -1 -1 - -### sqrt() - -Returns a tensor of the same type and dimensions as the original tensor -containing the square roots of the original tensor. - -### rsqrt() - -Returns a tensor of the same type and dimensions as the original tensor -containing the inverse square roots of the original tensor. - -### square() - -Returns a tensor of the same type and dimensions as the original tensor -containing the squares of the original tensor values. - -### inverse() - -Returns a tensor of the same type and dimensions as the original tensor -containing the inverse of the original tensor values. - -### exp() - -Returns a tensor of the same type and dimensions as the original tensor -containing the exponential of the original tensor. - -### log() - -Returns a tensor of the same type and dimensions as the original tensor -containing the natural logarithms of the original tensor. - -### abs() - -Returns a tensor of the same type and dimensions as the original tensor -containing the absolute values of the original tensor. - -### pow(Scalar exponent) - -Returns a tensor of the same type and dimensions as the original tensor -containing the coefficients of the original tensor to the power of the -exponent. - -The type of the exponent, Scalar, is always the same as the type of the -tensor coefficients. For example, only integer exponents can be used in -conjuntion with tensors of integer values. - -You can use cast() to lift this restriction. For example this computes -cubic roots of an int Tensor: - - Eigen::Tensor a(2, 3); - a.setValues({{0, 1, 8}, {27, 64, 125}}); - Eigen::Tensor b = a.cast().pow(1.0 / 3.0); - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - => - a - 0 1 8 - 27 64 125 - - b - 0 1 2 - 3 4 5 - -### operator * (Scalar scale) - -Multiplies all the coefficients of the input tensor by the provided scale. - -### cwiseMax(Scalar threshold) -TODO - -### cwiseMin(Scalar threshold) -TODO - -### unaryExpr(const CustomUnaryOp& func) -TODO - - -## Binary Element Wise Operations - -These operations take two input tensors as arguments. The 2 input tensors should -be of the same type and dimensions. The result is a tensor of the same -dimensions as the tensors to which they are applied, and unless otherwise -specified it is also of the same type. The requested operations are applied to -each pair of elements independently. - -### operator+(const OtherDerived& other) - -Returns a tensor of the same type and dimensions as the input tensors -containing the coefficient wise sums of the inputs. - -### operator-(const OtherDerived& other) - -Returns a tensor of the same type and dimensions as the input tensors -containing the coefficient wise differences of the inputs. - -### operator*(const OtherDerived& other) - -Returns a tensor of the same type and dimensions as the input tensors -containing the coefficient wise products of the inputs. - -### operator/(const OtherDerived& other) - -Returns a tensor of the same type and dimensions as the input tensors -containing the coefficient wise quotients of the inputs. - -This operator is not supported for integer types. - -### cwiseMax(const OtherDerived& other) - -Returns a tensor of the same type and dimensions as the input tensors -containing the coefficient wise maximums of the inputs. - -### cwiseMin(const OtherDerived& other) - -Returns a tensor of the same type and dimensions as the input tensors -containing the coefficient wise mimimums of the inputs. - -### Logical operators - -The following logical operators are supported as well: - -* operator&&(const OtherDerived& other) -* operator||(const OtherDerived& other) -* operator<(const OtherDerived& other) -* operator<=(const OtherDerived& other) -* operator>(const OtherDerived& other) -* operator>=(const OtherDerived& other) -* operator==(const OtherDerived& other) -* operator!=(const OtherDerived& other) - -They all return a tensor of boolean values. - - -## Selection (select(const ThenDerived& thenTensor, const ElseDerived& elseTensor) - -Selection is a coefficient-wise ternary operator that is the tensor equivalent -to the if-then-else operation. - - Tensor if = ...; - Tensor then = ...; - Tensor else = ...; - Tensor result = if.select(then, else); - -The 3 arguments must be of the same dimensions, which will also be the dimension -of the result. The 'if' tensor must be of type boolean, the 'then' and the -'else' tensor must be of the same type, which will also be the type of the -result. - -Each coefficient in the result is equal to the corresponding coefficient in the -'then' tensor if the corresponding value in the 'if' tensor is true. If not, the -resulting coefficient will come from the 'else' tensor. - - -## Contraction - -Tensor *contractions* are a generalization of the matrix product to the -multidimensional case. - - // Create 2 matrices using tensors of rank 2 - Eigen::Tensor a(2, 3); - a.setValues({{1, 2, 3}, {6, 5, 4}}); - Eigen::Tensor b(3, 2); - a.setValues({{1, 2}, {4, 5}, {5, 6}}); - - // Compute the traditional matrix product - array, 1> product_dims = { IndexPair(1, 0) }; - Eigen::Tensor AB = a.contract(b, product_dims); - - // Compute the product of the transpose of the matrices - array, 1> transpose_product_dims = { IndexPair(0, 1) }; - Eigen::Tensor AtBt = a.contract(b, transposed_product_dims); - - -## Reduction Operations - -A *Reduction* operation returns a tensor with fewer dimensions than the -original tensor. The values in the returned tensor are computed by applying a -*reduction operator* to slices of values from the original tensor. You specify -the dimensions along which the slices are made. - -The Eigen Tensor library provides a set of predefined reduction operators such -as ```maximum()``` and ```sum()``` and lets you define additional operators by -implementing a few methods from a reductor template. - -### Reduction Dimensions - -All reduction operations take a single parameter of type -```::Dimensions``` which can always be specified as an array of -ints. These are called the "reduction dimensions." The values are the indices -of the dimensions of the input tensor over which the reduction is done. The -parameter can have at most as many element as the rank of the input tensor; -each element must be less than the tensor rank, as it indicates one of the -dimensions to reduce. - -Each dimension of the input tensor should occur at most once in the reduction -dimensions as the implementation does not remove duplicates. - -The order of the values in the reduction dimensions does not affect the -results, but the code may execute faster if you list the dimensions in -increasing order. - -Example: Reduction along one dimension. - - // Create a tensor of 2 dimensions - Eigen::Tensor a(2, 3); - a.setValues({{1, 2, 3}, {6, 5, 4}}); - // Reduce it along the second dimension (1)... - Eigen::array dims({1 /* dimension to reduce */}); - // ...using the "maximum" operator. - // The result is a tensor with one dimension. The size of - // that dimension is the same as the first (non-reduced) dimension of a. - Eigen::Tensor b = a.maximum(dims); - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - => - a - 1 2 3 - 6 5 4 - - b - 3 - 6 - -Example: Reduction along two dimensions. - - Eigen::Tensor a(2, 3, 4); - a.setValues({{{0.0f, 1.0f, 2.0f, 3.0f}, - {7.0f, 6.0f, 5.0f, 4.0f}, - {8.0f, 9.0f, 10.0f, 11.0f}}, - {{12.0f, 13.0f, 14.0f, 15.0f}, - {19.0f, 18.0f, 17.0f, 16.0f}, - {20.0f, 21.0f, 22.0f, 23.0f}}}); - // The tensor a has 3 dimensions. We reduce along the - // first 2, resulting in a tensor with a single dimension - // of size 4 (the last dimension of a.) - // Note that we pass the array of reduction dimensions - // directly to the maximum() call. - Eigen::Tensor b = - a.maximum(Eigen::array({0, 1})); - cout << "b" << endl << b << endl << endl; - => - b - 20 - 21 - 22 - 23 - -#### Reduction along all dimensions - -As a special case, if you pass no parameter to a reduction operation the -original tensor is reduced along *all* its dimensions. The result is a -scalar, represented as a zero-dimension tensor. - - Eigen::Tensor a(2, 3, 4); - a.setValues({{{0.0f, 1.0f, 2.0f, 3.0f}, - {7.0f, 6.0f, 5.0f, 4.0f}, - {8.0f, 9.0f, 10.0f, 11.0f}}, - {{12.0f, 13.0f, 14.0f, 15.0f}, - {19.0f, 18.0f, 17.0f, 16.0f}, - {20.0f, 21.0f, 22.0f, 23.0f}}}); - // Reduce along all dimensions using the sum() operator. - Eigen::Tensor b = a.sum(); - cout << "b" << endl << b << endl << endl; - => - b - 276 - - -### sum(const Dimensions& new_dims) -### sum() - -Reduce a tensor using the sum() operator. The resulting values -are the sum of the reduced values. - -### mean(const Dimensions& new_dims) -### mean() - -Reduce a tensor using the mean() operator. The resulting values -are the mean of the reduced values. - -### maximum(const Dimensions& new_dims) -### maximum() - -Reduce a tensor using the maximum() operator. The resulting values are the -largest of the reduced values. - -### minimum(const Dimensions& new_dims) -### minimum() - -Reduce a tensor using the minimum() operator. The resulting values -are the smallest of the reduced values. - -### prod(const Dimensions& new_dims) -### prod() - -Reduce a tensor using the prod() operator. The resulting values -are the product of the reduced values. - -### all(const Dimensions& new_dims) -### all() -Reduce a tensor using the all() operator. Casts tensor to bool and then checks -whether all elements are true. Runs through all elements rather than -short-circuiting, so may be significantly inefficient. - -### any(const Dimensions& new_dims) -### any() -Reduce a tensor using the any() operator. Casts tensor to bool and then checks -whether any element is true. Runs through all elements rather than -short-circuiting, so may be significantly inefficient. - - -### reduce(const Dimensions& new_dims, const Reducer& reducer) - -Reduce a tensor using a user-defined reduction operator. See ```SumReducer``` -in TensorFunctors.h for information on how to implement a reduction operator. - - -## Scan Operations - -A *Scan* operation returns a tensor with the same dimensions as the original -tensor. The operation performs an inclusive scan along the specified -axis, which means it computes a running total along the axis for a given -reduction operation. -If the reduction operation corresponds to summation, then this computes the -prefix sum of the tensor along the given axis. - -Example: -dd a comment to this line - - // Create a tensor of 2 dimensions - Eigen::Tensor a(2, 3); - a.setValues({{1, 2, 3}, {4, 5, 6}}); - // Scan it along the second dimension (1) using summation - Eigen::Tensor b = a.cumsum(1); - // The result is a tensor with the same size as the input - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - => - a - 1 2 3 - 6 5 4 - - b - 1 3 6 - 4 9 15 - -### cumsum(const Index& axis) - -Perform a scan by summing consecutive entries. - -### cumprod(const Index& axis) - -Perform a scan by multiplying consecutive entries. - - -## Convolutions - -### convolve(const Kernel& kernel, const Dimensions& dims) - -Returns a tensor that is the output of the convolution of the input tensor with the kernel, -along the specified dimensions of the input tensor. The dimension size for dimensions of the output tensor -which were part of the convolution will be reduced by the formula: -output_dim_size = input_dim_size - kernel_dim_size + 1 (requires: input_dim_size >= kernel_dim_size). -The dimension sizes for dimensions that were not part of the convolution will remain the same. -Performance of the convolution can depend on the length of the stride(s) of the input tensor dimension(s) along which the -convolution is computed (the first dimension has the shortest stride for ColMajor, whereas RowMajor's shortest stride is -for the last dimension). - - // Compute convolution along the second and third dimension. - Tensor input(3, 3, 7, 11); - Tensor kernel(2, 2); - Tensor output(3, 2, 6, 11); - input.setRandom(); - kernel.setRandom(); - - Eigen::array dims({1, 2}); // Specify second and third dimension for convolution. - output = input.convolve(kernel, dims); - - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 2; ++j) { - for (int k = 0; k < 6; ++k) { - for (int l = 0; l < 11; ++l) { - const float result = output(i,j,k,l); - const float expected = input(i,j+0,k+0,l) * kernel(0,0) + - input(i,j+1,k+0,l) * kernel(1,0) + - input(i,j+0,k+1,l) * kernel(0,1) + - input(i,j+1,k+1,l) * kernel(1,1); - VERIFY_IS_APPROX(result, expected); - } - } - } - } - - -## Geometrical Operations - -These operations return a Tensor with different dimensions than the original -Tensor. They can be used to access slices of tensors, see them with different -dimensions, or pad tensors with additional data. - -### reshape(const Dimensions& new_dims) - -Returns a view of the input tensor that has been reshaped to the specified -new dimensions. The argument new_dims is an array of Index values. The -rank of the resulting tensor is equal to the number of elements in new_dims. - -The product of all the sizes in the new dimension array must be equal to -the number of elements in the input tensor. - - // Increase the rank of the input tensor by introducing a new dimension - // of size 1. - Tensor input(7, 11); - array three_dims{{7, 11, 1}}; - Tensor result = input.reshape(three_dims); - - // Decrease the rank of the input tensor by merging 2 dimensions; - array one_dim{{7 * 11}}; - Tensor result = input.reshape(one_dim); - -This operation does not move any data in the input tensor, so the resulting -contents of a reshaped Tensor depend on the data layout of the original Tensor. - -For example this is what happens when you ```reshape()``` a 2D ColMajor tensor -to one dimension: - - Eigen::Tensor a(2, 3); - a.setValues({{0.0f, 100.0f, 200.0f}, {300.0f, 400.0f, 500.0f}}); - Eigen::array one_dim({3 * 2}); - Eigen::Tensor b = a.reshape(one_dim); - cout << "b" << endl << b << endl; - => - b - 0 - 300 - 100 - 400 - 200 - 500 - -This is what happens when the 2D Tensor is RowMajor: - - Eigen::Tensor a(2, 3); - a.setValues({{0.0f, 100.0f, 200.0f}, {300.0f, 400.0f, 500.0f}}); - Eigen::array one_dim({3 * 2}); - Eigen::Tensor b = a.reshape(one_dim); - cout << "b" << endl << b << endl; - => - b - 0 - 100 - 200 - 300 - 400 - 500 - -The reshape operation is a lvalue. In other words, it can be used on the left -side of the assignment operator. - -The previous example can be rewritten as follow: - - Eigen::Tensor a(2, 3); - a.setValues({{0.0f, 100.0f, 200.0f}, {300.0f, 400.0f, 500.0f}}); - Eigen::array two_dim({2, 3}); - Eigen::Tensor b; - b.reshape(two_dim) = a; - cout << "b" << endl << b << endl; - => - b - 0 - 300 - 100 - 400 - 200 - 500 - -Note that "b" itself was not reshaped but that instead the assignment is done to -the reshape view of b. - - -### shuffle(const Shuffle& shuffle) - -Returns a copy of the input tensor whose dimensions have been -reordered according to the specified permutation. The argument shuffle -is an array of Index values. Its size is the rank of the input -tensor. It must contain a permutation of 0, 1, ..., rank - 1. The i-th -dimension of the output tensor equals to the size of the shuffle[i]-th -dimension of the input tensor. For example: - - // Shuffle all dimensions to the left by 1. - Tensor input(20, 30, 50); - // ... set some values in input. - Tensor output = input.shuffle({1, 2, 0}) - - eigen_assert(output.dimension(0) == 30); - eigen_assert(output.dimension(1) == 50); - eigen_assert(output.dimension(2) == 20); - -Indices into the output tensor are shuffled accordingly to formulate -indices into the input tensor. For example, one can assert in the above -code snippet that: - - eigen_assert(output(3, 7, 11) == input(11, 3, 7)); - -In general, one can assert that - - eigen_assert(output(..., indices[shuffle[i]], ...) == - input(..., indices[i], ...)) - -The shuffle operation results in a lvalue, which means that it can be assigned -to. In other words, it can be used on the left side of the assignment operator. - -Let's rewrite the previous example to take advantage of this feature: - - // Shuffle all dimensions to the left by 1. - Tensor input(20, 30, 50); - // ... set some values in input. - Tensor output(30, 50, 20); - output.shuffle({2, 0, 1}) = input; - - -### stride(const Strides& strides) - -Returns a view of the input tensor that strides (skips stride-1 -elements) along each of the dimensions. The argument strides is an -array of Index values. The dimensions of the resulting tensor are -ceil(input_dimensions[i] / strides[i]). - -For example this is what happens when you ```stride()``` a 2D tensor: - - Eigen::Tensor a(4, 3); - a.setValues({{0, 100, 200}, {300, 400, 500}, {600, 700, 800}, {900, 1000, 1100}}); - Eigen::array strides({3, 2}); - Eigen::Tensor b = a.stride(strides); - cout << "b" << endl << b << endl; - => - b - 0 200 - 900 1100 - -It is possible to assign a tensor to a stride: - Tensor input(20, 30, 50); - // ... set some values in input. - Tensor output(40, 90, 200); - output.stride({2, 3, 4}) = input; - - -### slice(const StartIndices& offsets, const Sizes& extents) - -Returns a sub-tensor of the given tensor. For each dimension i, the slice is -made of the coefficients stored between offset[i] and offset[i] + extents[i] in -the input tensor. - - Eigen::Tensor a(4, 3); - a.setValues({{0, 100, 200}, {300, 400, 500}, - {600, 700, 800}, {900, 1000, 1100}}); - Eigen::array offsets = {1, 0}; - Eigen::array extents = {2, 2}; - Eigen::Tensor slice = a.slice(offsets, extents); - cout << "a" << endl << a << endl; - => - a - 0 100 200 - 300 400 500 - 600 700 800 - 900 1000 1100 - cout << "slice" << endl << slice << endl; - => - slice - 300 400 - 600 700 - - -### chip(const Index offset, const Index dim) - -A chip is a special kind of slice. It is the subtensor at the given offset in -the dimension dim. The returned tensor has one fewer dimension than the input -tensor: the dimension dim is removed. - -For example, a matrix chip would be either a row or a column of the input -matrix. - - Eigen::Tensor a(4, 3); - a.setValues({{0, 100, 200}, {300, 400, 500}, - {600, 700, 800}, {900, 1000, 1100}}); - Eigen::Tensor row_3 = a.chip(2, 0); - Eigen::Tensor col_2 = a.chip(1, 1); - cout << "a" << endl << a << endl; - => - a - 0 100 200 - 300 400 500 - 600 700 800 - 900 1000 1100 - cout << "row_3" << endl << row_3 << endl; - => - row_3 - 600 700 800 - cout << "col_2" << endl << col_2 << endl; - => - col_2 - 100 400 700 1000 - -It is possible to assign values to a tensor chip since the chip operation is a -lvalue. For example: - - Eigen::Tensor a(3); - a.setValues({{100, 200, 300}}); - Eigen::Tensor b(2, 3); - b.setZero(); - b.chip(0, 0) = a; - cout << "a" << endl << a << endl; - => - a - 100 - 200 - 300 - cout << "b" << endl << b << endl; - => - b - 100 200 300 - 0 0 0 - - -### reverse(const ReverseDimensions& reverse) - -Returns a view of the input tensor that reverses the order of the coefficients -along a subset of the dimensions. The argument reverse is an array of boolean -values that indicates whether or not the order of the coefficients should be -reversed along each of the dimensions. This operation preserves the dimensions -of the input tensor. - -For example this is what happens when you ```reverse()``` the first dimension -of a 2D tensor: - - Eigen::Tensor a(4, 3); - a.setValues({{0, 100, 200}, {300, 400, 500}, - {600, 700, 800}, {900, 1000, 1100}}); - Eigen::array reverse({true, false}); - Eigen::Tensor b = a.reverse(reverse); - cout << "a" << endl << a << endl << "b" << endl << b << endl; - => - a - 0 100 200 - 300 400 500 - 600 700 800 - 900 1000 1100 - b - 900 1000 1100 - 600 700 800 - 300 400 500 - 0 100 200 - - -### broadcast(const Broadcast& broadcast) - -Returns a view of the input tensor in which the input is replicated one to many -times. -The broadcast argument specifies how many copies of the input tensor need to be -made in each of the dimensions. - - Eigen::Tensor a(2, 3); - a.setValues({{0, 100, 200}, {300, 400, 500}}); - Eigen::array bcast({3, 2}); - Eigen::Tensor b = a.broadcast(bcast); - cout << "a" << endl << a << endl << "b" << endl << b << endl; - => - a - 0 100 200 - 300 400 500 - b - 0 100 200 0 100 200 - 300 400 500 300 400 500 - 0 100 200 0 100 200 - 300 400 500 300 400 500 - 0 100 200 0 100 200 - 300 400 500 300 400 500 - -### concatenate(const OtherDerived& other, Axis axis) - -TODO - -### pad(const PaddingDimensions& padding) - -Returns a view of the input tensor in which the input is padded with zeros. - - Eigen::Tensor a(2, 3); - a.setValues({{0, 100, 200}, {300, 400, 500}}); - Eigen::array, 2> paddings; - paddings[0] = make_pair(0, 1); - paddings[1] = make_pair(2, 3); - Eigen::Tensor b = a.pad(paddings); - cout << "a" << endl << a << endl << "b" << endl << b << endl; - => - a - 0 100 200 - 300 400 500 - b - 0 0 0 0 - 0 0 0 0 - 0 100 200 0 - 300 400 500 0 - 0 0 0 0 - 0 0 0 0 - 0 0 0 0 - - -### extract_patches(const PatchDims& patch_dims) - -Returns a tensor of coefficient patches extracted from the input tensor, where -each patch is of dimension specified by 'patch_dims'. The returned tensor has -one greater dimension than the input tensor, which is used to index each patch. -The patch index in the output tensor depends on the data layout of the input -tensor: the patch index is the last dimension ColMajor layout, and the first -dimension in RowMajor layout. - -For example, given the following input tensor: - - Eigen::Tensor tensor(3,4); - tensor.setValues({{0.0f, 1.0f, 2.0f, 3.0f}, - {4.0f, 5.0f, 6.0f, 7.0f}, - {8.0f, 9.0f, 10.0f, 11.0f}}); - - cout << "tensor: " << endl << tensor << endl; -=> -tensor: - 0 1 2 3 - 4 5 6 7 - 8 9 10 11 - -Six 2x2 patches can be extracted and indexed using the following code: - - Eigen::Tensor patch; - Eigen::array patch_dims; - patch_dims[0] = 2; - patch_dims[1] = 2; - patch = tensor.extract_patches(patch_dims); - for (int k = 0; k < 6; ++k) { - cout << "patch index: " << k << endl; - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < 2; ++j) { - if (DataLayout == ColMajor) { - cout << patch(i, j, k) << " "; - } else { - cout << patch(k, i, j) << " "; - } - } - cout << endl; - } - } - -This code results in the following output when the data layout is ColMajor: - -patch index: 0 -0 1 -4 5 -patch index: 1 -4 5 -8 9 -patch index: 2 -1 2 -5 6 -patch index: 3 -5 6 -9 10 -patch index: 4 -2 3 -6 7 -patch index: 5 -6 7 -10 11 - -This code results in the following output when the data layout is RowMajor: -(NOTE: the set of patches is the same as in ColMajor, but are indexed differently). - -patch index: 0 -0 1 -4 5 -patch index: 1 -1 2 -5 6 -patch index: 2 -2 3 -6 7 -patch index: 3 -4 5 -8 9 -patch index: 4 -5 6 -9 10 -patch index: 5 -6 7 -10 11 - -### extract_image_patches(const Index patch_rows, const Index patch_cols, - const Index row_stride, const Index col_stride, - const PaddingType padding_type) - -Returns a tensor of coefficient image patches extracted from the input tensor, -which is expected to have dimensions ordered as follows (depending on the data -layout of the input tensor, and the number of additional dimensions 'N'): - -*) ColMajor -1st dimension: channels (of size d) -2nd dimension: rows (of size r) -3rd dimension: columns (of size c) -4th-Nth dimension: time (for video) or batch (for bulk processing). - -*) RowMajor (reverse order of ColMajor) -1st-Nth dimension: time (for video) or batch (for bulk processing). -N+1'th dimension: columns (of size c) -N+2'th dimension: rows (of size r) -N+3'th dimension: channels (of size d) - -The returned tensor has one greater dimension than the input tensor, which is -used to index each patch. The patch index in the output tensor depends on the -data layout of the input tensor: the patch index is the 4'th dimension in -ColMajor layout, and the 4'th from the last dimension in RowMajor layout. - -For example, given the following input tensor with the following dimension -sizes: - *) depth: 2 - *) rows: 3 - *) columns: 5 - *) batch: 7 - - Tensor tensor(2,3,5,7); - Tensor tensor_row_major = tensor.swap_layout(); - -2x2 image patches can be extracted and indexed using the following code: - -*) 2D patch: ColMajor (patch indexed by second-to-last dimension) - Tensor twod_patch; - twod_patch = tensor.extract_image_patches<2, 2>(); - // twod_patch.dimension(0) == 2 - // twod_patch.dimension(1) == 2 - // twod_patch.dimension(2) == 2 - // twod_patch.dimension(3) == 3*5 - // twod_patch.dimension(4) == 7 - -*) 2D patch: RowMajor (patch indexed by the second dimension) - Tensor twod_patch_row_major; - twod_patch_row_major = tensor_row_major.extract_image_patches<2, 2>(); - // twod_patch_row_major.dimension(0) == 7 - // twod_patch_row_major.dimension(1) == 3*5 - // twod_patch_row_major.dimension(2) == 2 - // twod_patch_row_major.dimension(3) == 2 - // twod_patch_row_major.dimension(4) == 2 - -## Special Operations - -### cast() - -Returns a tensor of type T with the same dimensions as the original tensor. -The returned tensor contains the values of the original tensor converted to -type T. - - Eigen::Tensor a(2, 3); - Eigen::Tensor b = a.cast(); - -This can be useful for example if you need to do element-wise division of -Tensors of integers. This is not currently supported by the Tensor library -but you can easily cast the tensors to floats to do the division: - - Eigen::Tensor a(2, 3); - a.setValues({{0, 1, 2}, {3, 4, 5}}); - Eigen::Tensor b = - (a.cast() / a.constant(2).cast()).cast(); - cout << "a" << endl << a << endl << endl; - cout << "b" << endl << b << endl << endl; - => - a - 0 1 2 - 3 4 5 - - b - 0 0 1 - 1 2 2 - - -### eval() - -TODO - - -## Representation of scalar values - -Scalar values are often represented by tensors of size 1 and rank 0.For example -Tensor::maximum() currently returns a Tensor. Similarly, the inner -product of 2 1d tensors (through contractions) returns a 0d tensor. - -## Limitations - -* The number of tensor dimensions is currently limited to 250 when using a - compiler that supports cxx11. It is limited to only 5 for older compilers. -* The IndexList class requires a cxx11 compliant compiler. You can use an - array of indices instead if you don't have access to a modern compiler. -* On GPUs only floating point values are properly tested and optimized for. -* Complex and integer values are known to be broken on GPUs. If you try to use - them you'll most likely end up triggering a static assertion failure such as - EIGEN_STATIC_ASSERT(packetSize > 1, YOU_MADE_A_PROGRAMMING_MISTAKE) - - diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/Tensor.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/Tensor.h deleted file mode 100644 index 1940a969..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/Tensor.h +++ /dev/null @@ -1,527 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// Copyright (C) 2013 Christian Seiler -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_H -#define EIGEN_CXX11_TENSOR_TENSOR_H - -namespace Eigen { - -/** \class Tensor - * \ingroup CXX11_Tensor_Module - * - * \brief The tensor class. - * - * The %Tensor class is the work-horse for all \em dense tensors within Eigen. - * - * The %Tensor class encompasses only dynamic-size objects so far. - * - * The first two template parameters are required: - * \tparam Scalar_ \anchor tensor_tparam_scalar Numeric type, e.g. float, double, int or std::complex. - * User defined scalar types are supported as well (see \ref user_defined_scalars "here"). - * \tparam NumIndices_ Number of indices (i.e. rank of the tensor) - * - * The remaining template parameters are optional -- in most cases you don't have to worry about them. - * \tparam Options_ \anchor tensor_tparam_options A combination of either \b #RowMajor or \b #ColMajor, and of either - * \b #AutoAlign or \b #DontAlign. - * The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required - * for vectorization. It defaults to aligning tensors. Note that tensors currently do not support any operations that profit from vectorization. - * Support for such operations (i.e. adding two tensors etc.) is planned. - * - * You can access elements of tensors using normal subscripting: - * - * \code - * Eigen::Tensor t(10, 10, 10, 10); - * t(0, 1, 2, 3) = 42.0; - * \endcode - * - * This class can be extended with the help of the plugin mechanism described on the page - * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_TENSOR_PLUGIN. - * - * Some notes: - * - *
- *
Relation to other parts of Eigen:
- *
The midterm developement goal for this class is to have a similar hierarchy as Eigen uses for matrices, so that - * taking blocks or using tensors in expressions is easily possible, including an interface with the vector/matrix code - * by providing .asMatrix() and .asVector() (or similar) methods for rank 2 and 1 tensors. However, currently, the %Tensor - * class does not provide any of these features and is only available as a stand-alone class that just allows for - * coefficient access. Also, when fixed-size tensors are implemented, the number of template arguments is likely to - * change dramatically.
- *
- * - * \ref TopicStorageOrders - */ - -template -class Tensor : public TensorBase > -{ - public: - typedef Tensor Self; - typedef TensorBase > Base; - typedef typename Eigen::internal::nested::type Nested; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - typedef Scalar_ Scalar; - typedef typename NumTraits::Real RealScalar; - typedef typename Base::CoeffReturnType CoeffReturnType; - - enum { - IsAligned = bool(EIGEN_MAX_ALIGN_BYTES>0) & !(Options_&DontAlign), - Layout = Options_ & RowMajor ? RowMajor : ColMajor, - CoordAccess = true, - RawAccess = true - }; - - static const int Options = Options_; - static const int NumIndices = NumIndices_; - typedef DSizes Dimensions; - - protected: - TensorStorage m_storage; - -#ifdef EIGEN_HAS_SFINAE - template - struct isOfNormalIndex{ - static const bool is_array = internal::is_base_of, CustomIndices>::value; - static const bool is_int = NumTraits::IsInteger; - static const bool value = is_array | is_int; - }; -#endif - - public: - // Metadata - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return NumIndices; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const { return m_storage.dimensions()[n]; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_storage.dimensions(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_storage.size(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data() { return m_storage.data(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const { return m_storage.data(); } - - // This makes EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - // work, because that uses base().coeffRef() - and we don't yet - // implement a similar class hierarchy - inline Self& base() { return *this; } - inline const Self& base() const { return *this; } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - EIGEN_DEVICE_FUNC inline const Scalar& coeff(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return coeff(array{{firstIndex, secondIndex, otherIndices...}}); - } -#endif - - // normal indices - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(const array& indices) const - { - eigen_internal_assert(checkIndexRange(indices)); - return m_storage.data()[linearizedIndex(indices)]; - } - - // custom indices -#ifdef EIGEN_HAS_SFINAE - template::value) ) - > - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(CustomIndices& indices) const - { - return coeff(internal::customIndices2Array(indices)); - } -#endif - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff() const - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return m_storage.data()[0]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const - { - eigen_internal_assert(index >= 0 && index < size()); - return m_storage.data()[index]; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - inline Scalar& coeffRef(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return coeffRef(array{{firstIndex, secondIndex, otherIndices...}}); - } -#endif - - // normal indices - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(const array& indices) - { - eigen_internal_assert(checkIndexRange(indices)); - return m_storage.data()[linearizedIndex(indices)]; - } - - // custom indices -#ifdef EIGEN_HAS_SFINAE - template::value) ) - > - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(CustomIndices& indices) - { - return coeffRef(internal::customIndices2Array(indices)); - } -#endif - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef() - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return m_storage.data()[0]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) - { - eigen_internal_assert(index >= 0 && index < size()); - return m_storage.data()[index]; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - inline const Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return this->operator()(array{{firstIndex, secondIndex, otherIndices...}}); - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1) const - { - return coeff(array(i0, i1)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2) const - { - return coeff(array(i0, i1, i2)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3) const - { - return coeff(array(i0, i1, i2, i3)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) const - { - return coeff(array(i0, i1, i2, i3, i4)); - } -#endif - - // custom indices -#ifdef EIGEN_HAS_SFINAE - template::value) ) - > - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(CustomIndices& indices) const - { - return coeff(internal::customIndices2Array(indices)); - } -#endif - - // normal indices - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array& indices) const - { - return coeff(indices); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const - { - eigen_internal_assert(index >= 0 && index < size()); - return coeff(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()() const - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return coeff(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator[](Index index) const - { - // The bracket operator is only for vectors, use the parenthesis operator instead. - EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE); - return coeff(index); - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - inline Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return operator()(array{{firstIndex, secondIndex, otherIndices...}}); - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1) - { - return coeffRef(array(i0, i1)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2) - { - return coeffRef(array(i0, i1, i2)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2, Index i3) - { - return coeffRef(array(i0, i1, i2, i3)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) - { - return coeffRef(array(i0, i1, i2, i3, i4)); - } -#endif - - // normal indices - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const array& indices) - { - return coeffRef(indices); - } - - // custom indices -#ifdef EIGEN_HAS_SFINAE - template::value) ) - > - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(CustomIndices& indices) - { - return coeffRef(internal::customIndices2Array(indices)); - } -#endif - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index) - { - eigen_assert(index >= 0 && index < size()); - return coeffRef(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()() - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return coeffRef(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator[](Index index) - { - // The bracket operator is only for vectors, use the parenthesis operator instead - EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE) - return coeffRef(index); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Tensor() - : m_storage() - { - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Tensor(const Self& other) - : m_storage(other.m_storage) - { - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index firstDimension, IndexTypes... otherDimensions) - : m_storage(firstDimension, otherDimensions...) - { - // The number of dimensions used to construct a tensor must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - } -#else - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Tensor(Index dim1) - : m_storage(dim1, array(dim1)) - { - EIGEN_STATIC_ASSERT(1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2) - : m_storage(dim1*dim2, array(dim1, dim2)) - { - EIGEN_STATIC_ASSERT(2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3) - : m_storage(dim1*dim2*dim3, array(dim1, dim2, dim3)) - { - EIGEN_STATIC_ASSERT(3 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3, Index dim4) - : m_storage(dim1*dim2*dim3*dim4, array(dim1, dim2, dim3, dim4)) - { - EIGEN_STATIC_ASSERT(4 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index dim1, Index dim2, Index dim3, Index dim4, Index dim5) - : m_storage(dim1*dim2*dim3*dim4*dim5, array(dim1, dim2, dim3, dim4, dim5)) - { - EIGEN_STATIC_ASSERT(5 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - } -#endif - - /** Normal Dimension */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Tensor(const array& dimensions) - : m_storage(internal::array_prod(dimensions), dimensions) - { - EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Tensor(const TensorBase& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other.derived()); - resize(TensorEvaluator(assign, DefaultDevice()).dimensions()); - internal::TensorExecutor::run(assign, DefaultDevice()); - } - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Tensor(const TensorBase& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other.derived()); - resize(TensorEvaluator(assign, DefaultDevice()).dimensions()); - internal::TensorExecutor::run(assign, DefaultDevice()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Tensor& operator=(const Tensor& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - resize(TensorEvaluator(assign, DefaultDevice()).dimensions()); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Tensor& operator=(const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - resize(TensorEvaluator(assign, DefaultDevice()).dimensions()); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template EIGEN_DEVICE_FUNC - void resize(Index firstDimension, IndexTypes... otherDimensions) - { - // The number of dimensions used to resize a tensor must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - resize(array{{firstDimension, otherDimensions...}}); - } -#endif - - /** Normal Dimension */ - EIGEN_DEVICE_FUNC void resize(const array& dimensions) - { - int i; - Index size = Index(1); - for (i = 0; i < NumIndices; i++) { - internal::check_rows_cols_for_overflow::run(size, dimensions[i]); - size *= dimensions[i]; - } - #ifdef EIGEN_INITIALIZE_COEFFS - bool size_changed = size != this->size(); - m_storage.resize(size, dimensions); - if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - #else - m_storage.resize(size, dimensions); - #endif - } - - // Why this overload, DSizes is derived from array ??? // - EIGEN_DEVICE_FUNC void resize(const DSizes& dimensions) { - array dims; - for (int i = 0; i < NumIndices; ++i) { - dims[i] = dimensions[i]; - } - resize(dims); - } - - EIGEN_DEVICE_FUNC - void resize() - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - // Nothing to do: rank 0 tensors have fixed size - } - - /** Custom Dimension */ -#ifdef EIGEN_HAS_SFINAE - template::value) ) - > - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(CustomDimension& dimensions) - { - resize(internal::customIndices2Array(dimensions)); - } -#endif - -#ifndef EIGEN_EMULATE_CXX11_META_H - template - EIGEN_DEVICE_FUNC - void resize(const Sizes& dimensions) { - array dims; - for (int i = 0; i < NumIndices; ++i) { - dims[i] = static_cast(dimensions[i]); - } - resize(dims); - } -#else - template - EIGEN_DEVICE_FUNC - void resize(const Sizes& dimensions) { - array dims; - for (int i = 0; i < NumIndices; ++i) { - dims[i] = static_cast(dimensions[i]); - } - resize(dims); - } -#endif - - protected: - - bool checkIndexRange(const array& indices) const - { - using internal::array_apply_and_reduce; - using internal::array_zip_and_reduce; - using internal::greater_equal_zero_op; - using internal::logical_and_op; - using internal::lesser_op; - - return - // check whether the indices are all >= 0 - array_apply_and_reduce(indices) && - // check whether the indices fit in the dimensions - array_zip_and_reduce(indices, m_storage.dimensions()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index linearizedIndex(const array& indices) const - { - if (Options&RowMajor) { - return m_storage.dimensions().IndexOfRowMajor(indices); - } else { - return m_storage.dimensions().IndexOfColMajor(indices); - } - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h deleted file mode 100644 index d06f40cd..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h +++ /dev/null @@ -1,299 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Eugene Brevdo -// Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_ARG_MAX_H -#define EIGEN_CXX11_TENSOR_TENSOR_ARG_MAX_H - -namespace Eigen { -namespace internal { - -/** \class TensorIndexTuple - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor + Index Tuple class. - * - * - */ -template -struct traits > : public traits -{ - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef Tuple Scalar; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorIndexTupleOp& type; -}; - -template -struct nested, 1, - typename eval >::type> -{ - typedef TensorIndexTupleOp type; -}; - -} // end namespace internal - -template -class TensorIndexTupleOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - typedef Tuple CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIndexTupleOp(const XprType& expr) - : m_xpr(expr) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; -}; - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorIndexTupleOp XprType; - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - - typedef typename TensorEvaluator::Dimensions Dimensions; - static const int NumDims = internal::array_size::value; - - enum { - IsAligned = /*TensorEvaluator::IsAligned*/ false, - PacketAccess = /*TensorEvaluator::PacketAccess*/ false, - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device) { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { - return m_impl.dimensions(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return CoeffReturnType(index, m_impl.coeff(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, 1); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - protected: - TensorEvaluator m_impl; -}; - -namespace internal { - -/** \class TensorTupleIndex - * \ingroup CXX11_Tensor_Module - * - * \brief Converts to Tensor > and reduces to Tensor. - * - */ -template -struct traits > : public traits -{ - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef Index Scalar; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions - array_size::value; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorTupleReducerOp& type; -}; - -template -struct nested, 1, - typename eval >::type> -{ - typedef TensorTupleReducerOp type; -}; - -} // end namespace internal - -template -class TensorTupleReducerOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - typedef Index CoeffReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorTupleReducerOp(const XprType& expr, - const ReduceOp& reduce_op, - const int return_dim, - const Dims& reduce_dims) - : m_xpr(expr), m_reduce_op(reduce_op), m_return_dim(return_dim), m_reduce_dims(reduce_dims) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC - const ReduceOp& reduce_op() const { return m_reduce_op; } - - EIGEN_DEVICE_FUNC - const Dims& reduce_dims() const { return m_reduce_dims; } - - EIGEN_DEVICE_FUNC - int return_dim() const { return m_return_dim; } - - protected: - typename XprType::Nested m_xpr; - const ReduceOp m_reduce_op; - const int m_return_dim; - const Dims m_reduce_dims; -}; - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorTupleReducerOp XprType; - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename TensorIndexTupleOp::CoeffReturnType TupleType; - typedef typename TensorEvaluator >, Device>::Dimensions Dimensions; - typedef typename TensorEvaluator , Device>::Dimensions InputDimensions; - static const int NumDims = internal::array_size::value; - typedef array StrideDims; - - enum { - IsAligned = /*TensorEvaluator::IsAligned*/ false, - PacketAccess = /*TensorEvaluator::PacketAccess*/ false, - BlockAccess = false, - Layout = TensorEvaluator >, Device>::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_orig_impl(op.expression(), device), - m_impl(op.expression().index_tuples().reduce(op.reduce_dims(), op.reduce_op()), device), - m_return_dim(op.return_dim()) { - - gen_strides(m_orig_impl.dimensions(), m_strides); - if (Layout == static_cast(ColMajor)) { - const Index total_size = internal::array_prod(m_orig_impl.dimensions()); - m_stride_mod = (m_return_dim < NumDims - 1) ? m_strides[m_return_dim + 1] : total_size; - } else { - const Index total_size = internal::array_prod(m_orig_impl.dimensions()); - m_stride_mod = (m_return_dim > 0) ? m_strides[m_return_dim - 1] : total_size; - } - m_stride_div = m_strides[m_return_dim]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { - return m_impl.dimensions(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - const TupleType v = m_impl.coeff(index); - return (m_return_dim < 0) ? v.first : (v.first % m_stride_mod) / m_stride_div; - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - const double compute_cost = 1.0 + - (m_return_dim < 0 ? 0.0 : (TensorOpCost::ModCost() + TensorOpCost::DivCost())); - return m_orig_impl.costPerCoeff(vectorized) + - m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost); - } - - private: - EIGEN_DEVICE_FUNC void gen_strides(const InputDimensions& dims, StrideDims& strides) { - if (m_return_dim < 0) { - return; // Won't be using the strides. - } - eigen_assert(m_return_dim < NumDims && - "Asking to convert index to a dimension outside of the rank"); - - // Calculate m_stride_div and m_stride_mod, which are used to - // calculate the value of an index w.r.t. the m_return_dim. - if (Layout == static_cast(ColMajor)) { - strides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - strides[i] = strides[i-1] * dims[i-1]; - } - } else { - strides[NumDims-1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - strides[i] = strides[i+1] * dims[i+1]; - } - } - } - - protected: - TensorEvaluator, Device> m_orig_impl; - TensorEvaluator >, Device> m_impl; - const int m_return_dim; - StrideDims m_strides; - Index m_stride_mod; - Index m_stride_div; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_ARG_MAX_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h deleted file mode 100644 index 166be200..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h +++ /dev/null @@ -1,181 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_ASSIGN_H -#define EIGEN_CXX11_TENSOR_TENSOR_ASSIGN_H - -namespace Eigen { - -/** \class TensorAssign - * \ingroup CXX11_Tensor_Module - * - * \brief The tensor assignment class. - * - * This class is represents the assignment of the values resulting from the evaluation of - * the rhs expression to the memory locations denoted by the lhs expression. - */ -namespace internal { -template -struct traits > -{ - typedef typename LhsXprType::Scalar Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename promote_index_type::Index, - typename traits::Index>::type Index; - typedef typename LhsXprType::Nested LhsNested; - typedef typename RhsXprType::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - static const std::size_t NumDimensions = internal::traits::NumDimensions; - static const int Layout = internal::traits::Layout; - - enum { - Flags = 0 - }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorAssignOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorAssignOp type; -}; - -} // end namespace internal - - - -template -class TensorAssignOp : public TensorBase > -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename LhsXprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorAssignOp(LhsXprType& lhs, const RhsXprType& rhs) - : m_lhs_xpr(lhs), m_rhs_xpr(rhs) {} - - /** \returns the nested expressions */ - EIGEN_DEVICE_FUNC - typename internal::remove_all::type& - lhsExpression() const { return *((typename internal::remove_all::type*)&m_lhs_xpr); } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - rhsExpression() const { return m_rhs_xpr; } - - protected: - typename internal::remove_all::type& m_lhs_xpr; - const typename internal::remove_all::type& m_rhs_xpr; -}; - - -template -struct TensorEvaluator, Device> -{ - typedef TensorAssignOp XprType; - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef typename TensorEvaluator::Dimensions Dimensions; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - RawAccess = TensorEvaluator::RawAccess - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) : - m_leftImpl(op.lhsExpression(), device), - m_rightImpl(op.rhsExpression(), device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE); - } - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const - { - // The dimensions of the lhs and the rhs tensors should be equal to prevent - // overflows and ensure the result is fully initialized. - // TODO: use left impl instead if right impl dimensions are known at compile time. - return m_rightImpl.dimensions(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar*) { - eigen_assert(dimensions_match(m_leftImpl.dimensions(), m_rightImpl.dimensions())); - m_leftImpl.evalSubExprsIfNeeded(NULL); - // If the lhs provides raw access to its storage area (i.e. if m_leftImpl.data() returns a non - // null value), attempt to evaluate the rhs expression in place. Returns true iff in place - // evaluation isn't supported and the caller still needs to manually assign the values generated - // by the rhs to the lhs. - return m_rightImpl.evalSubExprsIfNeeded(m_leftImpl.data()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_leftImpl.cleanup(); - m_rightImpl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalScalar(Index i) { - m_leftImpl.coeffRef(i) = m_rightImpl.coeff(i); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalPacket(Index i) { - const int LhsStoreMode = TensorEvaluator::IsAligned ? Aligned : Unaligned; - const int RhsLoadMode = TensorEvaluator::IsAligned ? Aligned : Unaligned; - m_leftImpl.template writePacket(i, m_rightImpl.template packet(i)); - } - EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const - { - return m_leftImpl.coeff(index); - } - template - EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const - { - return m_leftImpl.template packet(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - // We assume that evalPacket or evalScalar is called to perform the - // assignment and account for the cost of the write here, but reduce left - // cost by one load because we are using m_leftImpl.coeffRef. - TensorOpCost left = m_leftImpl.costPerCoeff(vectorized); - return m_rightImpl.costPerCoeff(vectorized) + - TensorOpCost( - numext::maxi(0.0, left.bytes_loaded() - sizeof(CoeffReturnType)), - left.bytes_stored(), left.compute_cycles()) + - TensorOpCost(0, sizeof(CoeffReturnType), 0, vectorized, PacketSize); - } - - /// required by sycl in order to extract the accessor - const TensorEvaluator& left_impl() const { return m_leftImpl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& right_impl() const { return m_rightImpl; } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return m_leftImpl.data(); } - - private: - TensorEvaluator m_leftImpl; - TensorEvaluator m_rightImpl; -}; - -} - - -#endif // EIGEN_CXX11_TENSOR_TENSOR_ASSIGN_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h deleted file mode 100644 index fbe34082..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h +++ /dev/null @@ -1,1016 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_BASE_H -#define EIGEN_CXX11_TENSOR_TENSOR_BASE_H - -// clang-format off - -namespace Eigen { - -/** \class TensorBase - * \ingroup CXX11_Tensor_Module - * - * \brief The tensor base class. - * - * This class is the common parent of the Tensor and TensorMap class, thus - * making it possible to use either class interchangably in expressions. - */ - -template -class TensorBase -{ - public: - typedef internal::traits DerivedTraits; - typedef typename DerivedTraits::Scalar Scalar; - typedef typename DerivedTraits::Index Index; - typedef typename internal::remove_const::type CoeffReturnType; - static const int NumDimensions = DerivedTraits::NumDimensions; - - // Generic nullary operation support. - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseNullaryOp - nullaryExpr(const CustomNullaryOp& func) const { - return TensorCwiseNullaryOp(derived(), func); - } - - // Coefficient-wise nullary operators - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseNullaryOp, const Derived> - constant(const Scalar& value) const { - return nullaryExpr(internal::scalar_constant_op(value)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseNullaryOp, const Derived> - random() const { - return nullaryExpr(internal::UniformRandomGenerator()); - } - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseNullaryOp - random(const RandomGenerator& gen = RandomGenerator()) const { - return nullaryExpr(gen); - } - - // Tensor generation - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorGeneratorOp - generate(const Generator& generator) const { - return TensorGeneratorOp(derived(), generator); - } - - // Generic unary operation support. - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp - unaryExpr(const CustomUnaryOp& func) const { - return TensorCwiseUnaryOp(derived(), func); - } - - // Coefficient-wise unary operators - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - operator-() const { - return unaryExpr(internal::scalar_opposite_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - sqrt() const { - return unaryExpr(internal::scalar_sqrt_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - sign() const { - return unaryExpr(internal::scalar_sign_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - rsqrt() const { - return unaryExpr(internal::scalar_rsqrt_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - square() const { - return unaryExpr(internal::scalar_square_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - cube() const { - return unaryExpr(internal::scalar_cube_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - inverse() const { - return unaryExpr(internal::scalar_inverse_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - tanh() const { - return unaryExpr(internal::scalar_tanh_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - lgamma() const { - return unaryExpr(internal::scalar_lgamma_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - digamma() const { - return unaryExpr(internal::scalar_digamma_op()); - } - - // igamma(a = this, x = other) - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - igamma(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_igamma_op()); - } - - // igammac(a = this, x = other) - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - igammac(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_igammac_op()); - } - - // zeta(x = this, q = other) - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - zeta(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_zeta_op()); - } - - // polygamma(n = this, x = other) - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - polygamma(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_polygamma_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - erf() const { - return unaryExpr(internal::scalar_erf_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - erfc() const { - return unaryExpr(internal::scalar_erfc_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - sigmoid() const { - return unaryExpr(internal::scalar_sigmoid_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - exp() const { - return unaryExpr(internal::scalar_exp_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - expm1() const { - return unaryExpr(internal::scalar_expm1_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - log() const { - return unaryExpr(internal::scalar_log_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - log1p() const { - return unaryExpr(internal::scalar_log1p_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - abs() const { - return unaryExpr(internal::scalar_abs_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - conjugate() const { - return unaryExpr(internal::scalar_conjugate_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp >, const Derived> - pow(Scalar exponent) const { - return unaryExpr(internal::bind2nd_op >(exponent)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - real() const { - return unaryExpr(internal::scalar_real_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - imag() const { - return unaryExpr(internal::scalar_imag_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp >, const Derived> - operator+ (Scalar rhs) const { - return unaryExpr(internal::bind2nd_op >(rhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE friend - const TensorCwiseUnaryOp >, const Derived> - operator+ (Scalar lhs, const Derived& rhs) { - return rhs.unaryExpr(internal::bind1st_op >(lhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp >, const Derived> - operator- (Scalar rhs) const { - EIGEN_STATIC_ASSERT((NumTraits::IsSigned || internal::is_same >::value), YOU_MADE_A_PROGRAMMING_MISTAKE); - return unaryExpr(internal::bind2nd_op >(rhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE friend - const TensorCwiseUnaryOp >, const Derived> - operator- (Scalar lhs, const Derived& rhs) { - return rhs.unaryExpr(internal::bind1st_op >(lhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp >, const Derived> - operator* (Scalar rhs) const { - return unaryExpr(internal::bind2nd_op >(rhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE friend - const TensorCwiseUnaryOp >, const Derived> - operator* (Scalar lhs, const Derived& rhs) { - return rhs.unaryExpr(internal::bind1st_op >(lhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp >, const Derived> - operator/ (Scalar rhs) const { - return unaryExpr(internal::bind2nd_op >(rhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE friend - const TensorCwiseUnaryOp >, const Derived> - operator/ (Scalar lhs, const Derived& rhs) { - return rhs.unaryExpr(internal::bind1st_op >(lhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - operator% (Scalar rhs) const { - EIGEN_STATIC_ASSERT(NumTraits::IsInteger, YOU_MADE_A_PROGRAMMING_MISTAKE_TRY_MOD); - return unaryExpr(internal::scalar_mod_op(rhs)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - cwiseMax(Scalar threshold) const { - return cwiseMax(constant(threshold)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - cwiseMin(Scalar threshold) const { - return cwiseMin(constant(threshold)); - } - - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorConversionOp - cast() const { - return TensorConversionOp(derived()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - round() const { - return unaryExpr(internal::scalar_round_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - ceil() const { - return unaryExpr(internal::scalar_ceil_op()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - floor() const { - return unaryExpr(internal::scalar_floor_op()); - } - - // Generic binary operation support. - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp - binaryExpr(const OtherDerived& other, const CustomBinaryOp& func) const { - return TensorCwiseBinaryOp(derived(), other, func); - } - - // Coefficient-wise binary operators. - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator+(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_sum_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator-(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_difference_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator*(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_product_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator/(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_quotient_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - cwiseMax(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_max_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - cwiseMin(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_min_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp - operator&&(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_boolean_and_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp - operator||(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_boolean_or_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp - operator^(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_boolean_xor_op()); - } - - // Comparisons and tests. - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator<(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_cmp_op()); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator<=(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_cmp_op()); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator>(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_cmp_op()); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator>=(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_cmp_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator==(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_cmp_op()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCwiseBinaryOp, const Derived, const OtherDerived> - operator!=(const OtherDerived& other) const { - return binaryExpr(other.derived(), internal::scalar_cmp_op()); - } - - // comparisons and tests for Scalars - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - operator<(Scalar threshold) const { - return operator<(constant(threshold)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - operator<=(Scalar threshold) const { - return operator<=(constant(threshold)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - operator>(Scalar threshold) const { - return operator>(constant(threshold)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - operator>=(Scalar threshold) const { - return operator>=(constant(threshold)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - operator==(Scalar threshold) const { - return operator==(constant(threshold)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseBinaryOp, const Derived, const TensorCwiseNullaryOp, const Derived> > - operator!=(Scalar threshold) const { - return operator!=(constant(threshold)); - } - - // Checks - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - (isnan)() const { - return unaryExpr(internal::scalar_isnan_op()); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - (isinf)() const { - return unaryExpr(internal::scalar_isinf_op()); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const TensorCwiseUnaryOp, const Derived> - (isfinite)() const { - return unaryExpr(internal::scalar_isfinite_op()); - } - - // Coefficient-wise ternary operators. - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorSelectOp - select(const ThenDerived& thenTensor, const ElseDerived& elseTensor) const { - return TensorSelectOp(derived(), thenTensor.derived(), elseTensor.derived()); - } - - // Contractions. - typedef Eigen::IndexPair DimensionPair; - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorContractionOp - contract(const OtherDerived& other, const Dimensions& dims) const { - return TensorContractionOp(derived(), other.derived(), dims); - } - - // Convolutions. - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorConvolutionOp - convolve(const KernelDerived& kernel, const Dimensions& dims) const { - return TensorConvolutionOp(derived(), kernel.derived(), dims); - } - - // Fourier transforms - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorFFTOp - fft(const FFT& fft) const { - return TensorFFTOp(derived(), fft); - } - - // Scan. - typedef TensorScanOp, const Derived> TensorScanSumOp; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorScanSumOp - cumsum(const Index& axis, bool exclusive = false) const { - return TensorScanSumOp(derived(), axis, exclusive); - } - - typedef TensorScanOp, const Derived> TensorScanProdOp; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorScanProdOp - cumprod(const Index& axis, bool exclusive = false) const { - return TensorScanProdOp(derived(), axis, exclusive); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorScanOp - scan(const Index& axis, const Reducer& reducer, bool exclusive = false) const { - return TensorScanOp(derived(), axis, exclusive, reducer); - } - - // Reductions. - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const Dims, const Derived> - sum(const Dims& dims) const { - return TensorReductionOp, const Dims, const Derived>(derived(), dims, internal::SumReducer()); - } - - const TensorReductionOp, const DimensionList, const Derived> - sum() const { - DimensionList in_dims; - return TensorReductionOp, const DimensionList, const Derived>(derived(), in_dims, internal::SumReducer()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const Dims, const Derived> - mean(const Dims& dims) const { - return TensorReductionOp, const Dims, const Derived>(derived(), dims, internal::MeanReducer()); - } - - const TensorReductionOp, const DimensionList, const Derived> - mean() const { - DimensionList in_dims; - return TensorReductionOp, const DimensionList, const Derived>(derived(), in_dims, internal::MeanReducer()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const Dims, const Derived> - prod(const Dims& dims) const { - return TensorReductionOp, const Dims, const Derived>(derived(), dims, internal::ProdReducer()); - } - - const TensorReductionOp, const DimensionList, const Derived> - prod() const { - DimensionList in_dims; - return TensorReductionOp, const DimensionList, const Derived>(derived(), in_dims, internal::ProdReducer()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const Dims, const Derived> - maximum(const Dims& dims) const { - return TensorReductionOp, const Dims, const Derived>(derived(), dims, internal::MaxReducer()); - } - - const TensorReductionOp, const DimensionList, const Derived> - maximum() const { - DimensionList in_dims; - return TensorReductionOp, const DimensionList, const Derived>(derived(), in_dims, internal::MaxReducer()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const Dims, const Derived> - minimum(const Dims& dims) const { - return TensorReductionOp, const Dims, const Derived>(derived(), dims, internal::MinReducer()); - } - - const TensorReductionOp, const DimensionList, const Derived> - minimum() const { - DimensionList in_dims; - return TensorReductionOp, const DimensionList, const Derived>(derived(), in_dims, internal::MinReducer()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp > - all(const Dims& dims) const { - return cast().reduce(dims, internal::AndReducer()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const TensorConversionOp > - all() const { - DimensionList in_dims; - return cast().reduce(in_dims, internal::AndReducer()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp > - any(const Dims& dims) const { - return cast().reduce(dims, internal::OrReducer()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp, const TensorConversionOp > - any() const { - DimensionList in_dims; - return cast().reduce(in_dims, internal::OrReducer()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, - const array, const Derived> - argmax() const { - array in_dims; - for (int d = 0; d < NumDimensions; ++d) in_dims[d] = d; - return TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, - const array, - const Derived>(derived(), internal::ArgMaxTupleReducer >(), -1, in_dims); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMinTupleReducer >, - const array, const Derived> - argmin() const { - array in_dims; - for (int d = 0; d < NumDimensions; ++d) in_dims[d] = d; - return TensorTupleReducerOp< - internal::ArgMinTupleReducer >, - const array, - const Derived>(derived(), internal::ArgMinTupleReducer >(), -1, in_dims); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, - const array, const Derived> - argmax(const int return_dim) const { - array in_dims; - in_dims[0] = return_dim; - return TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, - const array, - const Derived>(derived(), internal::ArgMaxTupleReducer >(), return_dim, in_dims); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMinTupleReducer >, - const array, const Derived> - argmin(const int return_dim) const { - array in_dims; - in_dims[0] = return_dim; - return TensorTupleReducerOp< - internal::ArgMinTupleReducer >, - const array, - const Derived>(derived(), internal::ArgMinTupleReducer >(), return_dim, in_dims); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReductionOp - reduce(const Dims& dims, const Reducer& reducer) const { - return TensorReductionOp(derived(), dims, reducer); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorBroadcastingOp - broadcast(const Broadcast& broadcast) const { - return TensorBroadcastingOp(derived(), broadcast); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorConcatenationOp - concatenate(const OtherDerived& other, Axis axis) const { - return TensorConcatenationOp(derived(), other.derived(), axis); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorPatchOp - extract_patches(const PatchDims& patch_dims) const { - return TensorPatchOp(derived(), patch_dims); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorImagePatchOp - extract_image_patches(const Index patch_rows = 1, const Index patch_cols = 1, - const Index row_stride = 1, const Index col_stride = 1, - const Index in_row_stride = 1, const Index in_col_stride = 1, - const PaddingType padding_type = PADDING_SAME, const Scalar padding_value = Scalar(0)) const { - return TensorImagePatchOp(derived(), patch_rows, patch_cols, row_stride, col_stride, - in_row_stride, in_col_stride, 1, 1, padding_type, padding_value); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorImagePatchOp - extract_image_patches(const Index patch_rows, const Index patch_cols, - const Index row_stride, const Index col_stride, - const Index in_row_stride, const Index in_col_stride, - const Index row_inflate_stride, const Index col_inflate_stride, - const Index padding_top, const Index padding_bottom, - const Index padding_left,const Index padding_right, - const Scalar padding_value) const { - return TensorImagePatchOp(derived(), patch_rows, patch_cols, row_stride, col_stride, - in_row_stride, in_col_stride, row_inflate_stride, col_inflate_stride, - padding_top, padding_bottom, padding_left, padding_right, padding_value); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorVolumePatchOp - extract_volume_patches(const Index patch_planes, const Index patch_rows, const Index patch_cols, - const Index plane_stride = 1, const Index row_stride = 1, const Index col_stride = 1, - const PaddingType padding_type = PADDING_SAME, const Scalar padding_value = Scalar(0)) const { - return TensorVolumePatchOp(derived(), patch_planes, patch_rows, patch_cols, plane_stride, row_stride, col_stride, 1, 1, 1, 1, 1, 1, padding_type, padding_value); - } - - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorVolumePatchOp - extract_volume_patches(const Index patch_planes, const Index patch_rows, const Index patch_cols, - const Index plane_stride, const Index row_stride, const Index col_stride, - const Index plane_inflate_stride, const Index row_inflate_stride, const Index col_inflate_stride, - const Index padding_top_z, const Index padding_bottom_z, - const Index padding_top, const Index padding_bottom, - const Index padding_left, const Index padding_right, const Scalar padding_value = Scalar(0)) const { - return TensorVolumePatchOp(derived(), patch_planes, patch_rows, patch_cols, plane_stride, row_stride, col_stride, 1, 1, 1, plane_inflate_stride, row_inflate_stride, col_inflate_stride, padding_top_z, padding_bottom_z, padding_top, padding_bottom, padding_left, padding_right, padding_value); - } - - // Morphing operators. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorLayoutSwapOp - swap_layout() const { - return TensorLayoutSwapOp(derived()); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReshapingOp - reshape(const NewDimensions& newDimensions) const { - return TensorReshapingOp(derived(), newDimensions); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorSlicingOp - slice(const StartIndices& startIndices, const Sizes& sizes) const { - return TensorSlicingOp(derived(), startIndices, sizes); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorStridingSlicingOp - stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) const { - return TensorStridingSlicingOp(derived(), startIndices, stopIndices, strides); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorChippingOp - chip(const Index offset) const { - return TensorChippingOp(derived(), offset, DimId); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorChippingOp - chip(const Index offset, const Index dim) const { - return TensorChippingOp(derived(), offset, dim); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReverseOp - reverse(const ReverseDimensions& rev) const { - return TensorReverseOp(derived(), rev); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorPaddingOp - pad(const PaddingDimensions& padding) const { - return TensorPaddingOp(derived(), padding, internal::scalar_cast_op()(0)); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorPaddingOp - pad(const PaddingDimensions& padding, const Scalar padding_value) const { - return TensorPaddingOp(derived(), padding, padding_value); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorShufflingOp - shuffle(const Shuffle& shuffle) const { - return TensorShufflingOp(derived(), shuffle); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorStridingOp - stride(const Strides& strides) const { - return TensorStridingOp(derived(), strides); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorInflationOp - inflate(const Strides& strides) const { - return TensorInflationOp(derived(), strides); - } - - // Returns a tensor containing index/value tuples - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorIndexTupleOp - index_tuples() const { - return TensorIndexTupleOp(derived()); - } - - // Support for custom unary and binary operations - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCustomUnaryOp customOp(const CustomUnaryFunc& op) const { - return TensorCustomUnaryOp(derived(), op); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorCustomBinaryOp customOp(const OtherDerived& other, const CustomBinaryFunc& op) const { - return TensorCustomBinaryOp(derived(), other, op); - } - - // Force the evaluation of the expression. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorForcedEvalOp eval() const { - return TensorForcedEvalOp(derived()); - } - - protected: - template friend class Tensor; - template friend class TensorFixedSize; - template friend class TensorBase; - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast(this); } -}; - -template::value> -class TensorBase : public TensorBase { - public: - typedef internal::traits DerivedTraits; - typedef typename DerivedTraits::Scalar Scalar; - typedef typename DerivedTraits::Index Index; - typedef Scalar CoeffReturnType; - static const int NumDimensions = DerivedTraits::NumDimensions; - - template friend class Tensor; - template friend class TensorFixedSize; - template friend class TensorBase; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& setZero() { - return setConstant(Scalar(0)); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& setConstant(const Scalar& val) { - return derived() = this->constant(val); - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& setRandom() { - return derived() = this->random(); - } - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& setRandom() { - return derived() = this->template random(); - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& setValues( - const typename internal::Initializer::InitList& vals) { - TensorEvaluator eval(derived(), DefaultDevice()); - internal::initialize_tensor(eval, vals); - return derived(); - } -#endif // EIGEN_HAS_VARIADIC_TEMPLATES - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator+=(const OtherDerived& other) { - return derived() = derived() + other.derived(); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator-=(const OtherDerived& other) { - return derived() = derived() - other.derived(); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator*=(const OtherDerived& other) { - return derived() = derived() * other.derived(); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Derived& operator/=(const OtherDerived& other) { - return derived() = derived() / other.derived(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorLayoutSwapOp - swap_layout() const { - return TensorLayoutSwapOp(derived()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorLayoutSwapOp - swap_layout() { - return TensorLayoutSwapOp(derived()); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorConcatenationOp - concatenate(const OtherDerived& other, const Axis& axis) const { - return TensorConcatenationOp(derived(), other, axis); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorConcatenationOp - concatenate(const OtherDerived& other, const Axis& axis) { - return TensorConcatenationOp(derived(), other, axis); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReshapingOp - reshape(const NewDimensions& newDimensions) const { - return TensorReshapingOp(derived(), newDimensions); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorReshapingOp - reshape(const NewDimensions& newDimensions) { - return TensorReshapingOp(derived(), newDimensions); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorSlicingOp - slice(const StartIndices& startIndices, const Sizes& sizes) const { - return TensorSlicingOp(derived(), startIndices, sizes); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorSlicingOp - slice(const StartIndices& startIndices, const Sizes& sizes) { - return TensorSlicingOp(derived(), startIndices, sizes); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorStridingSlicingOp - stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) const { - return TensorStridingSlicingOp(derived(), startIndices, stopIndices, strides); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorStridingSlicingOp - stridedSlice(const StartIndices& startIndices, const StopIndices& stopIndices, const Strides& strides) { - return TensorStridingSlicingOp(derived(), startIndices, stopIndices, strides); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorChippingOp - chip(const Index offset) const { - return TensorChippingOp(derived(), offset, DimId); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorChippingOp - chip(const Index offset) { - return TensorChippingOp(derived(), offset, DimId); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorChippingOp - chip(const Index offset, const Index dim) const { - return TensorChippingOp(derived(), offset, dim); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorChippingOp - chip(const Index offset, const Index dim) { - return TensorChippingOp(derived(), offset, dim); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorReverseOp - reverse(const ReverseDimensions& rev) const { - return TensorReverseOp(derived(), rev); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorReverseOp - reverse(const ReverseDimensions& rev) { - return TensorReverseOp(derived(), rev); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorShufflingOp - shuffle(const Shuffle& shuffle) const { - return TensorShufflingOp(derived(), shuffle); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorShufflingOp - shuffle(const Shuffle& shuffle) { - return TensorShufflingOp(derived(), shuffle); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorStridingOp - stride(const Strides& strides) const { - return TensorStridingOp(derived(), strides); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorStridingOp - stride(const Strides& strides) { - return TensorStridingOp(derived(), strides); - } - - // Select the device on which to evaluate the expression. - template - TensorDevice device(const DeviceType& device) { - return TensorDevice(device, derived()); - } - - protected: - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Derived& derived() { return *static_cast(this); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast(this); } -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_BASE_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h deleted file mode 100644 index 23a74460..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h +++ /dev/null @@ -1,392 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_BROADCASTING_H -#define EIGEN_CXX11_TENSOR_TENSOR_BROADCASTING_H - -namespace Eigen { - -/** \class TensorBroadcasting - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor broadcasting class. - * - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorBroadcastingOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorBroadcastingOp type; -}; - -template -struct is_input_scalar { - static const bool value = false; -}; -template <> -struct is_input_scalar > { - static const bool value = true; -}; -#ifndef EIGEN_EMULATE_CXX11_META_H -template -struct is_input_scalar > { - static const bool value = (Sizes::total_size == 1); -}; -#endif - -} // end namespace internal - - - -template -class TensorBroadcastingOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBroadcastingOp(const XprType& expr, const Broadcast& broadcast) - : m_xpr(expr), m_broadcast(broadcast) {} - - EIGEN_DEVICE_FUNC - const Broadcast& broadcast() const { return m_broadcast; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const Broadcast m_broadcast; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorBroadcastingOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::Dimensions>::value; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename TensorEvaluator::Dimensions InputDimensions; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = true, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_broadcast(op.broadcast()),m_impl(op.expression(), device) - { - // The broadcasting op doesn't change the rank of the tensor. One can't broadcast a scalar - // and store the result in a scalar. Instead one should reshape the scalar into a a N-D - // tensor with N >= 1 of 1 element first and then broadcast. - EIGEN_STATIC_ASSERT((NumDims > 0), YOU_MADE_A_PROGRAMMING_MISTAKE); - const InputDimensions& input_dims = m_impl.dimensions(); - const Broadcast& broadcast = op.broadcast(); - for (int i = 0; i < NumDims; ++i) { - eigen_assert(input_dims[i] > 0); - m_dimensions[i] = input_dims[i] * broadcast[i]; - } - - if (static_cast(Layout) == static_cast(ColMajor)) { - m_inputStrides[0] = 1; - m_outputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1]; - m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1]; - } - } else { - m_inputStrides[NumDims-1] = 1; - m_outputStrides[NumDims-1] = 1; - for (int i = NumDims-2; i >= 0; --i) { - m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1]; - m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const - { - if (internal::is_input_scalar::type>::value) { - return m_impl.coeff(0); - } - - if (static_cast(Layout) == static_cast(ColMajor)) { - return coeffColMajor(index); - } else { - return coeffRowMajor(index); - } - } - - // TODO: attempt to speed this up. The integer divisions and modulo are slow - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffColMajor(Index index) const - { - Index inputIndex = 0; - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_outputStrides[i]; - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx < m_impl.dimensions()[i]); - inputIndex += idx * m_inputStrides[i]; - } else { - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx % m_impl.dimensions()[i] == 0); - } else { - inputIndex += (idx % m_impl.dimensions()[i]) * m_inputStrides[i]; - } - } - index -= idx * m_outputStrides[i]; - } - if (internal::index_statically_eq(0, 1)) { - eigen_assert(index < m_impl.dimensions()[0]); - inputIndex += index; - } else { - if (internal::index_statically_eq(0, 1)) { - eigen_assert(index % m_impl.dimensions()[0] == 0); - } else { - inputIndex += (index % m_impl.dimensions()[0]); - } - } - return m_impl.coeff(inputIndex); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffRowMajor(Index index) const - { - Index inputIndex = 0; - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_outputStrides[i]; - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx < m_impl.dimensions()[i]); - inputIndex += idx * m_inputStrides[i]; - } else { - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx % m_impl.dimensions()[i] == 0); - } else { - inputIndex += (idx % m_impl.dimensions()[i]) * m_inputStrides[i]; - } - } - index -= idx * m_outputStrides[i]; - } - if (internal::index_statically_eq(NumDims-1, 1)) { - eigen_assert(index < m_impl.dimensions()[NumDims-1]); - inputIndex += index; - } else { - if (internal::index_statically_eq(NumDims-1, 1)) { - eigen_assert(index % m_impl.dimensions()[NumDims-1] == 0); - } else { - inputIndex += (index % m_impl.dimensions()[NumDims-1]); - } - } - return m_impl.coeff(inputIndex); - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType packet(Index index) const - { - if (internal::is_input_scalar::type>::value) { - return internal::pset1(m_impl.coeff(0)); - } - - if (static_cast(Layout) == static_cast(ColMajor)) { - return packetColMajor(index); - } else { - return packetRowMajor(index); - } - } - - // Ignore the LoadMode and always use unaligned loads since we can't guarantee - // the alignment at compile time. - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetColMajor(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - const Index originalIndex = index; - - Index inputIndex = 0; - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_outputStrides[i]; - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx < m_impl.dimensions()[i]); - inputIndex += idx * m_inputStrides[i]; - } else { - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx % m_impl.dimensions()[i] == 0); - } else { - inputIndex += (idx % m_impl.dimensions()[i]) * m_inputStrides[i]; - } - } - index -= idx * m_outputStrides[i]; - } - Index innermostLoc; - if (internal::index_statically_eq(0, 1)) { - eigen_assert(index < m_impl.dimensions()[0]); - innermostLoc = index; - } else { - if (internal::index_statically_eq(0, 1)) { - eigen_assert(index % m_impl.dimensions()[0] == 0); - innermostLoc = 0; - } else { - innermostLoc = index % m_impl.dimensions()[0]; - } - } - inputIndex += innermostLoc; - - // Todo: this could be extended to the second dimension if we're not - // broadcasting alongside the first dimension, and so on. - if (innermostLoc + PacketSize <= m_impl.dimensions()[0]) { - return m_impl.template packet(inputIndex); - } else { - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - values[0] = m_impl.coeff(inputIndex); - for (int i = 1; i < PacketSize; ++i) { - values[i] = coeffColMajor(originalIndex+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetRowMajor(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - const Index originalIndex = index; - - Index inputIndex = 0; - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_outputStrides[i]; - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx < m_impl.dimensions()[i]); - inputIndex += idx * m_inputStrides[i]; - } else { - if (internal::index_statically_eq(i, 1)) { - eigen_assert(idx % m_impl.dimensions()[i] == 0); - } else { - inputIndex += (idx % m_impl.dimensions()[i]) * m_inputStrides[i]; - } - } - index -= idx * m_outputStrides[i]; - } - Index innermostLoc; - if (internal::index_statically_eq(NumDims-1, 1)) { - eigen_assert(index < m_impl.dimensions()[NumDims-1]); - innermostLoc = index; - } else { - if (internal::index_statically_eq(NumDims-1, 1)) { - eigen_assert(index % m_impl.dimensions()[NumDims-1] == 0); - innermostLoc = 0; - } else { - innermostLoc = index % m_impl.dimensions()[NumDims-1]; - } - } - inputIndex += innermostLoc; - - // Todo: this could be extended to the second dimension if we're not - // broadcasting alongside the first dimension, and so on. - if (innermostLoc + PacketSize <= m_impl.dimensions()[NumDims-1]) { - return m_impl.template packet(inputIndex); - } else { - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - values[0] = m_impl.coeff(inputIndex); - for (int i = 1; i < PacketSize; ++i) { - values[i] = coeffRowMajor(originalIndex+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - double compute_cost = TensorOpCost::AddCost(); - if (NumDims > 0) { - for (int i = NumDims - 1; i > 0; --i) { - compute_cost += TensorOpCost::DivCost(); - if (internal::index_statically_eq(i, 1)) { - compute_cost += - TensorOpCost::MulCost() + TensorOpCost::AddCost(); - } else { - if (!internal::index_statically_eq(i, 1)) { - compute_cost += TensorOpCost::MulCost() + - TensorOpCost::ModCost() + - TensorOpCost::AddCost(); - } - } - compute_cost += - TensorOpCost::MulCost() + TensorOpCost::AddCost(); - } - } - return m_impl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, compute_cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - const TensorEvaluator& impl() const { return m_impl; } - - Broadcast functor() const { return m_broadcast; } - - protected: - const Broadcast m_broadcast; - Dimensions m_dimensions; - array m_outputStrides; - array m_inputStrides; - TensorEvaluator m_impl; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_BROADCASTING_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h deleted file mode 100644 index c46a778b..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h +++ /dev/null @@ -1,400 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CHIPPING_H -#define EIGEN_CXX11_TENSOR_TENSOR_CHIPPING_H - -namespace Eigen { - -/** \class TensorKChippingReshaping - * \ingroup CXX11_Tensor_Module - * - * \brief A chip is a thin slice, corresponding to a column or a row in a 2-d tensor. - * - * - */ - -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions - 1; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorChippingOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorChippingOp type; -}; - -template -struct DimensionId -{ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DimensionId(DenseIndex dim) { - EIGEN_UNUSED_VARIABLE(dim); - eigen_assert(dim == DimId); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex actualDim() const { - return DimId; - } -}; -template <> -struct DimensionId -{ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DimensionId(DenseIndex dim) : actual_dim(dim) { - eigen_assert(dim >= 0); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex actualDim() const { - return actual_dim; - } - private: - const DenseIndex actual_dim; -}; - - -} // end namespace internal - - - -template -class TensorChippingOp : public TensorBase > -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorChippingOp(const XprType& expr, const Index offset, const Index dim) - : m_xpr(expr), m_offset(offset), m_dim(dim) { - } - - EIGEN_DEVICE_FUNC - const Index offset() const { return m_offset; } - EIGEN_DEVICE_FUNC - const Index dim() const { return m_dim.actualDim(); } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorChippingOp& operator = (const TensorChippingOp& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorChippingOp& operator = (const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - protected: - typename XprType::Nested m_xpr; - const Index m_offset; - const internal::DimensionId m_dim; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorChippingOp XprType; - static const int NumInputDims = internal::array_size::Dimensions>::value; - static const int NumDims = NumInputDims-1; - typedef typename XprType::Index Index; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - - enum { - // Alignment can't be guaranteed at compile time since it depends on the - // slice offsets. - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_dim(op.dim()), m_device(device), m_offset(op.offset()) - { - EIGEN_STATIC_ASSERT((NumInputDims >= 1), YOU_MADE_A_PROGRAMMING_MISTAKE); - eigen_assert(NumInputDims > m_dim.actualDim()); - - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - eigen_assert(op.offset() < input_dims[m_dim.actualDim()]); - - int j = 0; - for (int i = 0; i < NumInputDims; ++i) { - if (i != m_dim.actualDim()) { - m_dimensions[j] = input_dims[i]; - ++j; - } - } - - m_stride = 1; - m_inputStride = 1; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < m_dim.actualDim(); ++i) { - m_stride *= input_dims[i]; - m_inputStride *= input_dims[i]; - } - } else { - for (int i = NumInputDims-1; i > m_dim.actualDim(); --i) { - m_stride *= input_dims[i]; - m_inputStride *= input_dims[i]; - } - } - m_inputStride *= input_dims[m_dim.actualDim()]; - m_inputOffset = m_stride * op.offset(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_impl.coeff(srcCoeff(index)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - if ((static_cast(Layout) == static_cast(ColMajor) && m_dim.actualDim() == 0) || - (static_cast(Layout) == static_cast(RowMajor) && m_dim.actualDim() == NumInputDims-1)) { - // m_stride is equal to 1, so let's avoid the integer division. - eigen_assert(m_stride == 1); - Index inputIndex = index * m_inputStride + m_inputOffset; - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - for (int i = 0; i < PacketSize; ++i) { - values[i] = m_impl.coeff(inputIndex); - inputIndex += m_inputStride; - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } else if ((static_cast(Layout) == static_cast(ColMajor) && m_dim.actualDim() == NumInputDims - 1) || - (static_cast(Layout) == static_cast(RowMajor) && m_dim.actualDim() == 0)) { - // m_stride is aways greater than index, so let's avoid the integer division. - eigen_assert(m_stride > index); - return m_impl.template packet(index + m_inputOffset); - } else { - const Index idx = index / m_stride; - const Index rem = index - idx * m_stride; - if (rem + PacketSize <= m_stride) { - Index inputIndex = idx * m_inputStride + m_inputOffset + rem; - return m_impl.template packet(inputIndex); - } else { - // Cross the stride boundary. Fallback to slow path. - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - for (int i = 0; i < PacketSize; ++i) { - values[i] = coeff(index); - ++index; - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - double cost = 0; - if ((static_cast(Layout) == static_cast(ColMajor) && - m_dim.actualDim() == 0) || - (static_cast(Layout) == static_cast(RowMajor) && - m_dim.actualDim() == NumInputDims - 1)) { - cost += TensorOpCost::MulCost() + TensorOpCost::AddCost(); - } else if ((static_cast(Layout) == static_cast(ColMajor) && - m_dim.actualDim() == NumInputDims - 1) || - (static_cast(Layout) == static_cast(RowMajor) && - m_dim.actualDim() == 0)) { - cost += TensorOpCost::AddCost(); - } else { - cost += 3 * TensorOpCost::MulCost() + TensorOpCost::DivCost() + - 3 * TensorOpCost::AddCost(); - } - - return m_impl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType* data() const { - CoeffReturnType* result = const_cast(m_impl.data()); - if (((static_cast(Layout) == static_cast(ColMajor) && m_dim.actualDim() == NumDims) || - (static_cast(Layout) == static_cast(RowMajor) && m_dim.actualDim() == 0)) && - result) { - return result + m_inputOffset; - } else { - return NULL; - } - } - - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex dimId() const { - return m_dim.actualDim(); - } - - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const DenseIndex& offset() const { - return m_offset; - } - /// required by sycl in order to extract the accessor - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator& impl() const { return m_impl; } - - protected: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const - { - Index inputIndex; - if ((static_cast(Layout) == static_cast(ColMajor) && m_dim.actualDim() == 0) || - (static_cast(Layout) == static_cast(RowMajor) && m_dim.actualDim() == NumInputDims-1)) { - // m_stride is equal to 1, so let's avoid the integer division. - eigen_assert(m_stride == 1); - inputIndex = index * m_inputStride + m_inputOffset; - } else if ((static_cast(Layout) == static_cast(ColMajor) && m_dim.actualDim() == NumInputDims-1) || - (static_cast(Layout) == static_cast(RowMajor) && m_dim.actualDim() == 0)) { - // m_stride is aways greater than index, so let's avoid the integer division. - eigen_assert(m_stride > index); - inputIndex = index + m_inputOffset; - } else { - const Index idx = index / m_stride; - inputIndex = idx * m_inputStride + m_inputOffset; - index -= idx * m_stride; - inputIndex += index; - } - return inputIndex; - } - - Dimensions m_dimensions; - Index m_stride; - Index m_inputOffset; - Index m_inputStride; - TensorEvaluator m_impl; - const internal::DimensionId m_dim; - const Device& m_device; -// required by sycl - const DenseIndex m_offset; - -}; - - -// Eval as lvalue -template -struct TensorEvaluator, Device> - : public TensorEvaluator, Device> -{ - typedef TensorEvaluator, Device> Base; - typedef TensorChippingOp XprType; - static const int NumInputDims = internal::array_size::Dimensions>::value; - static const int NumDims = NumInputDims-1; - typedef typename XprType::Index Index; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : Base(op, device) - { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) - { - return this->m_impl.coeffRef(this->srcCoeff(index)); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketReturnType& x) - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - - if ((static_cast(this->Layout) == static_cast(ColMajor) && this->m_dim.actualDim() == 0) || - (static_cast(this->Layout) == static_cast(RowMajor) && this->m_dim.actualDim() == NumInputDims-1)) { - // m_stride is equal to 1, so let's avoid the integer division. - eigen_assert(this->m_stride == 1); - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - internal::pstore(values, x); - Index inputIndex = index * this->m_inputStride + this->m_inputOffset; - for (int i = 0; i < PacketSize; ++i) { - this->m_impl.coeffRef(inputIndex) = values[i]; - inputIndex += this->m_inputStride; - } - } else if ((static_cast(this->Layout) == static_cast(ColMajor) && this->m_dim.actualDim() == NumInputDims-1) || - (static_cast(this->Layout) == static_cast(RowMajor) && this->m_dim.actualDim() == 0)) { - // m_stride is aways greater than index, so let's avoid the integer division. - eigen_assert(this->m_stride > index); - this->m_impl.template writePacket(index + this->m_inputOffset, x); - } else { - const Index idx = index / this->m_stride; - const Index rem = index - idx * this->m_stride; - if (rem + PacketSize <= this->m_stride) { - const Index inputIndex = idx * this->m_inputStride + this->m_inputOffset + rem; - this->m_impl.template writePacket(inputIndex, x); - } else { - // Cross stride boundary. Fallback to slow path. - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - internal::pstore(values, x); - for (int i = 0; i < PacketSize; ++i) { - this->coeffRef(index) = values[i]; - ++index; - } - } - } - } -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CHIPPING_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h deleted file mode 100644 index 2c7ba961..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h +++ /dev/null @@ -1,367 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H - -namespace Eigen { - -/** \class TensorConcatenationOp - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor concatenation class. - * - * - */ -namespace internal { -template -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs are different. - typedef typename promote_storage_type::ret Scalar; - typedef typename promote_storage_type::StorageKind, - typename traits::StorageKind>::ret StorageKind; - typedef typename promote_index_type::Index, - typename traits::Index>::type Index; - typedef typename LhsXprType::Nested LhsNested; - typedef typename RhsXprType::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - static const int NumDimensions = traits::NumDimensions; - static const int Layout = traits::Layout; - enum { Flags = 0 }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorConcatenationOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorConcatenationOp type; -}; - -} // end namespace internal - - -template -class TensorConcatenationOp : public TensorBase, WriteAccessors> -{ - public: - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - typedef typename internal::nested::type Nested; - typedef typename internal::promote_storage_type::ret CoeffReturnType; - typedef typename NumTraits::Real RealScalar; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConcatenationOp(const LhsXprType& lhs, const RhsXprType& rhs, Axis axis) - : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_axis(axis) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - lhsExpression() const { return m_lhs_xpr; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - rhsExpression() const { return m_rhs_xpr; } - - EIGEN_DEVICE_FUNC const Axis& axis() const { return m_axis; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorConcatenationOp& operator = (const TensorConcatenationOp& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorConcatenationOp& operator = (const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - protected: - typename LhsXprType::Nested m_lhs_xpr; - typename RhsXprType::Nested m_rhs_xpr; - const Axis m_axis; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorConcatenationOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::Dimensions>::value; - static const int RightNumDims = internal::array_size::Dimensions>::value; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_leftImpl(op.lhsExpression(), device), m_rightImpl(op.rhsExpression(), device), m_axis(op.axis()) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout) || NumDims == 1), YOU_MADE_A_PROGRAMMING_MISTAKE); - EIGEN_STATIC_ASSERT((NumDims == RightNumDims), YOU_MADE_A_PROGRAMMING_MISTAKE); - EIGEN_STATIC_ASSERT((NumDims > 0), YOU_MADE_A_PROGRAMMING_MISTAKE); - - eigen_assert(0 <= m_axis && m_axis < NumDims); - const Dimensions& lhs_dims = m_leftImpl.dimensions(); - const Dimensions& rhs_dims = m_rightImpl.dimensions(); - { - int i = 0; - for (; i < m_axis; ++i) { - eigen_assert(lhs_dims[i] > 0); - eigen_assert(lhs_dims[i] == rhs_dims[i]); - m_dimensions[i] = lhs_dims[i]; - } - eigen_assert(lhs_dims[i] > 0); // Now i == m_axis. - eigen_assert(rhs_dims[i] > 0); - m_dimensions[i] = lhs_dims[i] + rhs_dims[i]; - for (++i; i < NumDims; ++i) { - eigen_assert(lhs_dims[i] > 0); - eigen_assert(lhs_dims[i] == rhs_dims[i]); - m_dimensions[i] = lhs_dims[i]; - } - } - - if (static_cast(Layout) == static_cast(ColMajor)) { - m_leftStrides[0] = 1; - m_rightStrides[0] = 1; - m_outputStrides[0] = 1; - - for (int j = 1; j < NumDims; ++j) { - m_leftStrides[j] = m_leftStrides[j-1] * lhs_dims[j-1]; - m_rightStrides[j] = m_rightStrides[j-1] * rhs_dims[j-1]; - m_outputStrides[j] = m_outputStrides[j-1] * m_dimensions[j-1]; - } - } else { - m_leftStrides[NumDims - 1] = 1; - m_rightStrides[NumDims - 1] = 1; - m_outputStrides[NumDims - 1] = 1; - - for (int j = NumDims - 2; j >= 0; --j) { - m_leftStrides[j] = m_leftStrides[j+1] * lhs_dims[j+1]; - m_rightStrides[j] = m_rightStrides[j+1] * rhs_dims[j+1]; - m_outputStrides[j] = m_outputStrides[j+1] * m_dimensions[j+1]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - // TODO(phli): Add short-circuit memcpy evaluation if underlying data are linear? - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) - { - m_leftImpl.evalSubExprsIfNeeded(NULL); - m_rightImpl.evalSubExprsIfNeeded(NULL); - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() - { - m_leftImpl.cleanup(); - m_rightImpl.cleanup(); - } - - // TODO(phli): attempt to speed this up. The integer divisions and modulo are slow. - // See CL/76180724 comments for more ideas. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - // Collect dimension-wise indices (subs). - array subs; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - subs[i] = index / m_outputStrides[i]; - index -= subs[i] * m_outputStrides[i]; - } - subs[0] = index; - } else { - for (int i = 0; i < NumDims - 1; ++i) { - subs[i] = index / m_outputStrides[i]; - index -= subs[i] * m_outputStrides[i]; - } - subs[NumDims - 1] = index; - } - - const Dimensions& left_dims = m_leftImpl.dimensions(); - if (subs[m_axis] < left_dims[m_axis]) { - Index left_index; - if (static_cast(Layout) == static_cast(ColMajor)) { - left_index = subs[0]; - for (int i = 1; i < NumDims; ++i) { - left_index += (subs[i] % left_dims[i]) * m_leftStrides[i]; - } - } else { - left_index = subs[NumDims - 1]; - for (int i = NumDims - 2; i >= 0; --i) { - left_index += (subs[i] % left_dims[i]) * m_leftStrides[i]; - } - } - return m_leftImpl.coeff(left_index); - } else { - subs[m_axis] -= left_dims[m_axis]; - const Dimensions& right_dims = m_rightImpl.dimensions(); - Index right_index; - if (static_cast(Layout) == static_cast(ColMajor)) { - right_index = subs[0]; - for (int i = 1; i < NumDims; ++i) { - right_index += (subs[i] % right_dims[i]) * m_rightStrides[i]; - } - } else { - right_index = subs[NumDims - 1]; - for (int i = NumDims - 2; i >= 0; --i) { - right_index += (subs[i] % right_dims[i]) * m_rightStrides[i]; - } - } - return m_rightImpl.coeff(right_index); - } - } - - // TODO(phli): Add a real vectorization. - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - const int packetSize = internal::unpacket_traits::size; - EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index + packetSize - 1 < dimensions().TotalSize()); - - EIGEN_ALIGN_MAX CoeffReturnType values[packetSize]; - for (int i = 0; i < packetSize; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - const double compute_cost = NumDims * (2 * TensorOpCost::AddCost() + - 2 * TensorOpCost::MulCost() + - TensorOpCost::DivCost() + - TensorOpCost::ModCost()); - const double lhs_size = m_leftImpl.dimensions().TotalSize(); - const double rhs_size = m_rightImpl.dimensions().TotalSize(); - return (lhs_size / (lhs_size + rhs_size)) * - m_leftImpl.costPerCoeff(vectorized) + - (rhs_size / (lhs_size + rhs_size)) * - m_rightImpl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, compute_cost); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& left_impl() const { return m_leftImpl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& right_impl() const { return m_rightImpl; } - /// required by sycl in order to extract the accessor - const Axis& axis() const { return m_axis; } - - protected: - Dimensions m_dimensions; - array m_outputStrides; - array m_leftStrides; - array m_rightStrides; - TensorEvaluator m_leftImpl; - TensorEvaluator m_rightImpl; - const Axis m_axis; -}; - -// Eval as lvalue -template - struct TensorEvaluator, Device> - : public TensorEvaluator, Device> -{ - typedef TensorEvaluator, Device> Base; - typedef TensorConcatenationOp XprType; - typedef typename Base::Dimensions Dimensions; - enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(XprType& op, const Device& device) - : Base(op, device) - { - EIGEN_STATIC_ASSERT((static_cast(Layout) == static_cast(ColMajor)), YOU_MADE_A_PROGRAMMING_MISTAKE); - } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) - { - // Collect dimension-wise indices (subs). - array subs; - for (int i = Base::NumDims - 1; i > 0; --i) { - subs[i] = index / this->m_outputStrides[i]; - index -= subs[i] * this->m_outputStrides[i]; - } - subs[0] = index; - - const Dimensions& left_dims = this->m_leftImpl.dimensions(); - if (subs[this->m_axis] < left_dims[this->m_axis]) { - Index left_index = subs[0]; - for (int i = 1; i < Base::NumDims; ++i) { - left_index += (subs[i] % left_dims[i]) * this->m_leftStrides[i]; - } - return this->m_leftImpl.coeffRef(left_index); - } else { - subs[this->m_axis] -= left_dims[this->m_axis]; - const Dimensions& right_dims = this->m_rightImpl.dimensions(); - Index right_index = subs[0]; - for (int i = 1; i < Base::NumDims; ++i) { - right_index += (subs[i] % right_dims[i]) * this->m_rightStrides[i]; - } - return this->m_rightImpl.coeffRef(right_index); - } - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketReturnType& x) - { - const int packetSize = internal::unpacket_traits::size; - EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index + packetSize - 1 < this->dimensions().TotalSize()); - - EIGEN_ALIGN_MAX CoeffReturnType values[packetSize]; - internal::pstore(values, x); - for (int i = 0; i < packetSize; ++i) { - coeffRef(index+i) = values[i]; - } - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h deleted file mode 100644 index bf4a476d..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h +++ /dev/null @@ -1,909 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_H - -namespace Eigen { - -/** \class TensorContraction - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor contraction class. - * - * - */ -namespace internal { -#if defined(EIGEN_VECTORIZE_AVX) && defined(EIGEN_USE_LIBXSMM) -template -void pack_simple(Scalar * dst, const Scalar * src, Index cols, Index rows, Index lddst, Index ldsrc) { - size_t psize = packet_traits::size; // Packet size - typedef typename packet_traits::type Packet; // Packet type - size_t alignment = psize*sizeof(Scalar); // Needed alignment - if (rows % psize == 0 && (lddst*sizeof(Scalar)) % alignment == 0 && - (ldsrc*sizeof(Scalar)) % alignment == 0 && - reinterpret_cast(src) % alignment == 0 && - reinterpret_cast(dst) % alignment == 0) { - // Optimized version using packets - size_t num_packets = rows / psize; - for (Index col = 0; col < cols; ++col) { - EIGEN_ASM_COMMENT("begin pack_simple inner copy"); - // Unrolled manually 4 times. - for (size_t i=0; i < num_packets/4; ++i) { - internal::pstore(dst, internal::pload(src)); - dst += psize; src += psize; - internal::pstore(dst, internal::pload(src)); - dst += psize; src += psize; - internal::pstore(dst, internal::pload(src)); - dst += psize; src += psize; - internal::pstore(dst, internal::pload(src)); - dst += psize; src += psize; - } - for (size_t i=0; i < num_packets%4; ++i) { - internal::pstore(dst, internal::pload(src)); - dst += psize; src += psize; - } - dst += lddst - num_packets*psize; - src += ldsrc - num_packets*psize; - EIGEN_ASM_COMMENT("end pack_simple inner copy"); - } - } else { - // Naive memcpy calls - for (Index col = 0; col < cols; ++col) { - memcpy(dst + col*lddst, src + col*ldsrc, rows*sizeof(Scalar)); - } - } -} - -template - struct libxsmm_wrapper { - libxsmm_wrapper() {} - libxsmm_wrapper(int, int, int, int, int, int, int, float, float, int) {} - void operator()(const LhsScalar*, const RhsScalar*, Scalar*) {} - void operator()(const LhsScalar*, const RhsScalar*, Scalar*, const LhsScalar*, const RhsScalar*, const Scalar*) {} - }; - - template<> - struct libxsmm_wrapper: public libxsmm_mmfunction { - libxsmm_wrapper(): libxsmm_mmfunction() {} - libxsmm_wrapper(int flags, int m, int n, int k, int lda, int ldb, int ldc, float alpha, float beta, int prefetch) : - libxsmm_mmfunction(flags, m, n, k, lda, ldb, ldc, alpha, beta, prefetch) {} - }; - - template<> - struct libxsmm_wrapper: public libxsmm_mmfunction { - libxsmm_wrapper(): libxsmm_mmfunction() {} - libxsmm_wrapper(int flags, int m, int n, int k, int lda, int ldb, int ldc, float alpha, float beta, int prefetch) : - libxsmm_mmfunction(flags, m, n, k, lda, ldb, ldc, alpha, beta, prefetch) {} - }; -#endif - - -template -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs are different. - typedef typename gebp_traits::type, - typename remove_const::type>::ResScalar Scalar; - - typedef typename promote_storage_type::StorageKind, - typename traits::StorageKind>::ret StorageKind; - typedef typename promote_index_type::Index, - typename traits::Index>::type Index; - typedef typename LhsXprType::Nested LhsNested; - typedef typename RhsXprType::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - - // From NumDims below. - static const int NumDimensions = traits::NumDimensions + traits::NumDimensions - 2 * array_size::value; - static const int Layout = traits::Layout; - - enum { - Flags = 0 - }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorContractionOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorContractionOp type; -}; - -template -struct traits, Device_> > { - typedef Indices_ Indices; - typedef LeftArgType_ LeftArgType; - typedef RightArgType_ RightArgType; - typedef Device_ Device; - - // From NumDims below. - static const int NumDimensions = traits::NumDimensions + traits::NumDimensions - 2 * array_size::value; -}; - -} // end namespace internal - -template -class TensorContractionOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename internal::gebp_traits::ResScalar CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorContractionOp( - const LhsXprType& lhs, const RhsXprType& rhs, const Indices& dims) - : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_indices(dims) {} - - EIGEN_DEVICE_FUNC - const Indices& indices() const { return m_indices; } - - /** \returns the nested expressions */ - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - lhsExpression() const { return m_lhs_xpr; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - rhsExpression() const { return m_rhs_xpr; } - - protected: - typename LhsXprType::Nested m_lhs_xpr; - typename RhsXprType::Nested m_rhs_xpr; - const Indices m_indices; -}; - - -template -struct TensorContractionEvaluatorBase -{ - typedef typename internal::traits::Indices Indices; - typedef typename internal::traits::LeftArgType LeftArgType; - typedef typename internal::traits::RightArgType RightArgType; - typedef typename internal::traits::Device Device; - - typedef TensorContractionOp XprType; - typedef typename internal::remove_const::type Scalar; - typedef typename XprType::Index Index; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - enum { - IsAligned = true, - PacketAccess = (internal::unpacket_traits::size > 1), - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = true - }; - - // Most of the code is assuming that both input tensors are ColMajor. If the - // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS: - // If we want to compute A * B = C, where A is LHS and B is RHS, the code - // will pretend B is LHS and A is RHS. - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), LeftArgType, RightArgType>::type EvalLeftArgType; - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), RightArgType, LeftArgType>::type EvalRightArgType; - - static const int LDims = - internal::array_size::Dimensions>::value; - static const int RDims = - internal::array_size::Dimensions>::value; - static const int ContractDims = internal::array_size::value; - static const int NumDims = LDims + RDims - 2 * ContractDims; - - typedef array contract_t; - typedef array left_nocontract_t; - typedef array right_nocontract_t; - - typedef DSizes Dimensions; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorContractionEvaluatorBase(const XprType& op, const Device& device) - : m_leftImpl(choose(Cond(Layout) == static_cast(ColMajor)>(), - op.lhsExpression(), op.rhsExpression()), device), - m_rightImpl(choose(Cond(Layout) == static_cast(ColMajor)>(), - op.rhsExpression(), op.lhsExpression()), device), - m_device(device), - m_result(NULL) { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == - static_cast(TensorEvaluator::Layout)), - YOU_MADE_A_PROGRAMMING_MISTAKE); - - - DSizes eval_left_dims; - DSizes eval_right_dims; - array, ContractDims> eval_op_indices; - if (static_cast(Layout) == static_cast(ColMajor)) { - // For ColMajor, we keep using the existing dimensions - for (int i = 0; i < LDims; i++) { - eval_left_dims[i] = m_leftImpl.dimensions()[i]; - } - for (int i = 0; i < RDims; i++) { - eval_right_dims[i] = m_rightImpl.dimensions()[i]; - } - // We keep the pairs of contracting indices. - for (int i = 0; i < ContractDims; i++) { - eval_op_indices[i].first = op.indices()[i].first; - eval_op_indices[i].second = op.indices()[i].second; - } - } else { - // For RowMajor, we need to reverse the existing dimensions - for (int i = 0; i < LDims; i++) { - eval_left_dims[i] = m_leftImpl.dimensions()[LDims - i - 1]; - } - for (int i = 0; i < RDims; i++) { - eval_right_dims[i] = m_rightImpl.dimensions()[RDims - i - 1]; - } - // We need to flip all the pairs of contracting indices as well as - // reversing the dimensions. - for (int i = 0; i < ContractDims; i++) { - eval_op_indices[i].first = LDims - 1 - op.indices()[ContractDims - 1 - i].second; - eval_op_indices[i].second = RDims - 1 - op.indices()[ContractDims - 1 - i].first; - } - } - - // Check for duplicate axes and make sure the first index in eval_op_indices - // is increasing. Using O(n^2) sorting is OK since ContractDims is small - for (int i = 0; i < ContractDims; i++) { - for (int j = i + 1; j < ContractDims; j++) { - eigen_assert(eval_op_indices[j].first != eval_op_indices[i].first && - eval_op_indices[j].second != eval_op_indices[i].second && - "contraction axes should be unique"); - if (eval_op_indices[j].first < eval_op_indices[i].first) { - numext::swap(eval_op_indices[j], eval_op_indices[i]); - } - } - } - - array lhs_strides; - lhs_strides[0] = 1; - for (int i = 0; i < LDims-1; ++i) { - lhs_strides[i+1] = lhs_strides[i] * eval_left_dims[i]; - } - - array rhs_strides; - rhs_strides[0] = 1; - for (int i = 0; i < RDims-1; ++i) { - rhs_strides[i+1] = rhs_strides[i] * eval_right_dims[i]; - } - - if (m_i_strides.size() > 0) m_i_strides[0] = 1; - if (m_j_strides.size() > 0) m_j_strides[0] = 1; - if (m_k_strides.size() > 0) m_k_strides[0] = 1; - - m_i_size = 1; - m_j_size = 1; - m_k_size = 1; - - // To compute the dimension, we simply concatenate the non-contracting - // dimensions of the left and then the right tensor. Additionally, we also - // compute the strides corresponding to the left non-contracting - // dimensions and right non-contracting dimensions. - m_lhs_inner_dim_contiguous = true; - int dim_idx = 0; - unsigned int nocontract_idx = 0; - - for (int i = 0; i < LDims; i++) { - // find if we are contracting on index i of left tensor - bool contracting = false; - for (int j = 0; j < ContractDims; j++) { - if (eval_op_indices[j].first == i) { - contracting = true; - break; - } - } - if (!contracting) { - // add dimension size to output dimensions - m_dimensions[dim_idx] = eval_left_dims[i]; - m_left_nocontract_strides[nocontract_idx] = lhs_strides[i]; - if (dim_idx != i) { - m_lhs_inner_dim_contiguous = false; - } - if (nocontract_idx+1 < internal::array_size::value) { - m_i_strides[nocontract_idx+1] = - m_i_strides[nocontract_idx] * eval_left_dims[i]; - } else { - m_i_size = m_i_strides[nocontract_idx] * eval_left_dims[i]; - } - dim_idx++; - nocontract_idx++; - } - } - - nocontract_idx = 0; - for (int i = 0; i < RDims; i++) { - bool contracting = false; - // find if we are contracting on index i of right tensor - for (int j = 0; j < ContractDims; j++) { - if (eval_op_indices[j].second == i) { - contracting = true; - break; - } - } - if (!contracting) { - m_dimensions[dim_idx] = eval_right_dims[i]; - if (nocontract_idx+1 < internal::array_size::value) { - m_j_strides[nocontract_idx+1] = - m_j_strides[nocontract_idx] * eval_right_dims[i]; - } else { - m_j_size = m_j_strides[nocontract_idx] * eval_right_dims[i]; - } - m_right_nocontract_strides[nocontract_idx] = rhs_strides[i]; - dim_idx++; - nocontract_idx++; - } - } - - // Now compute the strides corresponding to the contracting dimensions. We - // assumed above that non-contracting axes are represented in the same order - // in the matrix as they are in the tensor. This is not the case for - // contracting axes. As the contracting axes must be of the same size in - // each tensor, we'll only look at the first tensor here. - m_rhs_inner_dim_contiguous = true; - m_rhs_inner_dim_reordered = false; - for (int i = 0; i < ContractDims; i++) { - Index left = eval_op_indices[i].first; - Index right = eval_op_indices[i].second; - - Index size = eval_left_dims[left]; - eigen_assert(size == eval_right_dims[right] && - "Contraction axes must be same size"); - - if (i+1 < static_cast(internal::array_size::value)) { - m_k_strides[i+1] = m_k_strides[i] * size; - } else { - m_k_size = m_k_strides[i] * size; - } - m_left_contracting_strides[i] = lhs_strides[left]; - m_right_contracting_strides[i] = rhs_strides[right]; - - if (i > 0 && right < eval_op_indices[i-1].second) { - m_rhs_inner_dim_reordered = true; - } - if (right != i) { - m_rhs_inner_dim_contiguous = false; - } - } - - EnableXSMMIfPossible(eval_op_indices); - - // If the layout is RowMajor, we need to reverse the m_dimensions - if (static_cast(Layout) == static_cast(RowMajor)) { - for (int i = 0, j = NumDims - 1; i < j; i++, j--) { - numext::swap(m_dimensions[i], m_dimensions[j]); - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar * data) { - m_leftImpl.evalSubExprsIfNeeded(NULL); - m_rightImpl.evalSubExprsIfNeeded(NULL); - if (data) { - evalTo(data); - return false; - } else { - m_result = static_cast(m_device.allocate(dimensions().TotalSize() * sizeof(Scalar))); - evalTo(m_result); - return true; - } - } - - EIGEN_DEVICE_FUNC void evalTo(Scalar* buffer) const { - if (this->m_lhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_reordered) { - static_cast(this)->template evalProduct(buffer); - } - else { - static_cast(this)->template evalProduct(buffer); - } - } - else { - if (this->m_rhs_inner_dim_reordered) { - static_cast(this)->template evalProduct(buffer); - } - else { - static_cast(this)->template evalProduct(buffer); - } - } - } - else { - if (this->m_rhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_reordered) { - static_cast(this)->template evalProduct(buffer); - } - else { - static_cast(this)->template evalProduct(buffer); - } - } - else { - if (this->m_rhs_inner_dim_reordered) { - static_cast(this)->template evalProduct(buffer); - } - else { - static_cast(this)->template evalProduct(buffer); - } - } - } - } - - template - EIGEN_DEVICE_FUNC void evalGemv(Scalar* buffer) const { - const Index rows = m_i_size; - const Index cols = m_k_size; - - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - const Index lhs_packet_size = internal::unpacket_traits::size; - const Index rhs_packet_size = internal::unpacket_traits::size; - const int lhs_alignment = LeftEvaluator::IsAligned ? Aligned : Unaligned; - const int rhs_alignment = RightEvaluator::IsAligned ? Aligned : Unaligned; - typedef internal::TensorContractionInputMapper LhsMapper; - - typedef internal::TensorContractionInputMapper RhsMapper; - - LhsMapper lhs(m_leftImpl, m_left_nocontract_strides, m_i_strides, - m_left_contracting_strides, m_k_strides); - RhsMapper rhs(m_rightImpl, m_right_nocontract_strides, m_j_strides, - m_right_contracting_strides, m_k_strides); - - const Scalar alpha(1); - const Index resIncr(1); - - // zero out the result buffer (which must be of size at least rows * sizeof(Scalar) - m_device.memset(buffer, 0, rows * sizeof(Scalar)); - - internal::general_matrix_vector_product::run( - rows, cols, lhs, rhs, - buffer, resIncr, alpha); - } - - template - EIGEN_DEVICE_FUNC void evalGemm(Scalar* buffer) const { - #if defined(EIGEN_VECTORIZE_AVX) && defined(EIGEN_USE_LIBXSMM) - if (m_can_use_xsmm) { - evalGemmXSMM(buffer); - return; - } - #endif - - // columns in left side, rows in right side - const Index k = this->m_k_size; - - // rows in left side - const Index m = this->m_i_size; - - // columns in right side - const Index n = this->m_j_size; - - // zero out the result buffer (which must be of size at least m * n * sizeof(Scalar) - this->m_device.memset(buffer, 0, m * n * sizeof(Scalar)); - - // define mr, nr, and all of my data mapper types - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - typedef typename internal::gebp_traits Traits; - - const Index nr = Traits::nr; - const Index mr = Traits::mr; - - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - - const Index lhs_packet_size = internal::unpacket_traits::size; - const Index rhs_packet_size = internal::unpacket_traits::size; - - typedef internal::TensorContractionInputMapper LhsMapper; - - typedef internal::TensorContractionInputMapper RhsMapper; - - typedef internal::blas_data_mapper OutputMapper; - - // Declare GEBP packing and kernel structs - internal::gemm_pack_lhs pack_lhs; - internal::gemm_pack_rhs pack_rhs; - - internal::gebp_kernel gebp; - - // initialize data mappers - LhsMapper lhs(this->m_leftImpl, this->m_left_nocontract_strides, this->m_i_strides, - this->m_left_contracting_strides, this->m_k_strides); - - RhsMapper rhs(this->m_rightImpl, this->m_right_nocontract_strides, this->m_j_strides, - this->m_right_contracting_strides, this->m_k_strides); - - OutputMapper output(buffer, m); - - // Sizes of the blocks to load in cache. See the Goto paper for details. - internal::TensorContractionBlocking blocking(k, m, n, 1); - const Index kc = blocking.kc(); - const Index mc = numext::mini(m, blocking.mc()); - const Index nc = numext::mini(n, blocking.nc()); - const Index sizeA = mc * kc; - const Index sizeB = kc * nc; - - LhsScalar* blockA = static_cast(this->m_device.allocate(sizeA * sizeof(LhsScalar))); - RhsScalar* blockB = static_cast(this->m_device.allocate(sizeB * sizeof(RhsScalar))); - - for(Index i2=0; i2m_device.deallocate(blockA); - this->m_device.deallocate(blockB); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_leftImpl.cleanup(); - m_rightImpl.cleanup(); - - if (m_result != NULL) { - m_device.deallocate(m_result); - m_result = NULL; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - return m_result[index]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool) const { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const { - return internal::ploadt(m_result + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar* data() const { return m_result; } - -protected: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void EnableXSMMIfPossible(const array, ContractDims>& eval_op_indices) { - m_can_use_xsmm = false; - -#if defined(EIGEN_VECTORIZE_AVX) && defined(EIGEN_USE_LIBXSMM) - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - if (!std::is_same::value || - !std::is_same::value || - !(std::is_same::value || - std::is_same::value) || - m_leftImpl.data() == NULL || - m_rightImpl.data() == NULL) { - return; - } - - // Check if we can use faster matmul algorithms. For contraction to be - // equivalent to matmul, we need both lhs and rhs contracting dims sequences - // to be either a prefix or suffix of all dims. Also, the order of both - // must be the same, so we don't have to do reordering. - // For example: - // * OK: lhs 4D, rhs 4D, contraction: [(0, 2), (1, 3)] - // * BAD: lhs 3D, rhs 3D, contraction: [(1,1)] - // * BAD: lhs 3D, rhs 3D, contraction: [(0, 0), (2, 2)] - // * BAD: lhs 3D, rhs 3D, contraction: [(0, 2), (1, 1)] - // Depending if contraction dims are prefix or suffix of all dims we need to - // pre-transpose matrices in matmul algorithm: - // lhs: prefix -> transpose, suffix -> no transpose - // rhs: prefix -> no transpose, suffix -> transpose - // For example, for lhs 2D, rhs 2D, contraction [(1, 0)] is regular, - // non-transposed matmul. - if (ContractDims == 0) { - // This case is totally uninteresting, filter it out to avoid problems - // with iterations in further tests. - return; - } - - // Check if RHS dims list is increasing. LHS already is, so if not, the - // order is different and we cannot do matmul. - for (int i = 1; i < ContractDims; i++) { - if (eval_op_indices[i].second < eval_op_indices[i-1].second) { - return; - } - } - - // Check if no holes. - int diff; - for (int i = 1; i < ContractDims; i++) { - // LHS contract dims are sorted to form an increasing seq. - diff = eval_op_indices[i].first - eval_op_indices[i-1].first; - if (diff != 1) { - return; - } - // Now we may already assume RHS contract dims seq is increasing too. - diff = eval_op_indices[i].second - eval_op_indices[i-1].second; - if (diff != 1) { - return; - } - } - - // Check if suffix or prefix. - if (eval_op_indices[0].first != 0 && - eval_op_indices[ContractDims-1].first != LDims-1) { - return; - } - if (eval_op_indices[0].second != 0 && - eval_op_indices[ContractDims-1].second != RDims-1) { - return; - } - - m_can_use_xsmm = true; -#else - EIGEN_UNUSED_VARIABLE(eval_op_indices); -#endif - } - -#if defined(EIGEN_VECTORIZE_AVX) && defined(EIGEN_USE_LIBXSMM) - EIGEN_DEVICE_FUNC void evalGemmXSMM(Scalar* buffer) const { - // columns in left side, rows in right side - const Index k = this->m_k_size; - - // rows in left side - const Index m = this->m_i_size; - - // columns in right side - const Index n = this->m_j_size; - - const bool transposeA = !m_lhs_inner_dim_contiguous; - const bool transposeB = !m_rhs_inner_dim_contiguous; - - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - - internal::TensorXsmmContractionBlocking blocking( - k, m, n, 1, transposeA, transposeB); - - // Outer blocks sizes - const Index mc_outer = blocking.outer_m(); - const Index nc_outer = blocking.outer_n(); - const Index kc_outer = blocking.outer_k(); - // Inner blocks sizes - const Index mc = blocking.mc(); - const Index nc = blocking.nc(); - const Index kc = blocking.kc(); - // Decisions whether we should copy parts of matrices - const bool copyA = blocking.copyA(); - const bool copyB = blocking.copyB(); - - const LhsScalar* leftData = m_leftImpl.data(); - const RhsScalar* rightData = m_rightImpl.data(); - - const libxsmm_blasint stride_A = static_cast(transposeA ? k : m); - const libxsmm_blasint stride_B = static_cast(transposeB ? n : k); - const libxsmm_blasint stride_C = static_cast(m); - - const libxsmm_blasint stride_blockA = static_cast(mc); - // Use bigger stride to avoid hitting same cache line too often. - // This consistently gives +~0.5 Gflops. - const libxsmm_blasint stride_panelB = static_cast( - kc % 32 == 0 ? kc + 16 : kc - ); - - // Kernel for the general case (not edges) - internal::libxsmm_wrapper kernel; - - LhsScalar* blockA = NULL; - RhsScalar* panelB = NULL; - - if (copyA) { - blockA = static_cast(this->m_device.allocate(mc * kc * sizeof(LhsScalar))); - } - if (copyB) { - panelB = static_cast(this->m_device.allocate(nc_outer * stride_panelB * sizeof(RhsScalar))); - } - - const Index kernel_stride_A = copyA ? stride_blockA : stride_A; - const Index kernel_stride_B = copyB ? stride_panelB : stride_B; - kernel = internal::libxsmm_wrapper(0, mc, nc, kc, kernel_stride_A, kernel_stride_B, stride_C, 1, 1, blocking.prefetch()); - - // Outer blocking - for (Index ki_outer = 0; ki_outer < k; ki_outer += kc_outer) { - for (Index mi_outer = 0; mi_outer < m; mi_outer += mc_outer) { - for (Index ni_outer = 0; ni_outer < n; ni_outer += nc_outer) { - using numext::mini; - - Index actual_nc_outer = mini(ni_outer+nc_outer, n) - ni_outer; - - // Inner blocking - for (Index ki = ki_outer; ki < mini(ki_outer+kc_outer, k); ki += kc) { - const Index actual_kc = mini(ki_outer+kc_outer, mini(ki+kc, k)) - ki; - const float beta = ki == 0 ? 0 : 1; - - if (copyB) { - if (transposeB) { - libxsmm_otrans(panelB, rightData + ki*stride_B + ni_outer, sizeof(RhsScalar), actual_nc_outer, actual_kc, stride_B, stride_panelB); - } else { - internal::pack_simple(panelB, rightData + ni_outer*stride_B + ki, actual_nc_outer, actual_kc, stride_panelB, stride_B); - } - } - - for (Index mi = mi_outer; mi < mini(mi_outer+mc_outer, m); mi += mc) { - const Index actual_mc = mini(mi_outer+mc_outer, mini(mi+mc, m)) - mi; - - const LhsScalar* a = transposeA ? leftData + mi*stride_A + ki : - leftData + ki*stride_A + mi; - - if (copyA) { - if (transposeA) { - libxsmm_otrans(blockA, a, sizeof(LhsScalar), actual_kc, actual_mc, stride_A, stride_blockA); - } else { - internal::pack_simple(blockA, a, actual_kc, actual_mc, stride_blockA, stride_A); - } - } - const LhsScalar* actual_a = copyA ? blockA : a; - - for (Index ni = ni_outer; ni < mini(ni_outer+nc_outer, n); ni += nc) { - const Index actual_nc = mini(ni_outer+nc_outer, mini(ni+nc, n)) - ni; - - const RhsScalar* b = rightData + ni*stride_B + ki; - Scalar* c = buffer + ni*stride_C + mi; - const Scalar* cp = c + nc*stride_C; - - const RhsScalar* actual_b = copyB ? panelB + (ni-ni_outer)*stride_panelB : b; - const RhsScalar* bp = copyB ? panelB + nc*stride_panelB : b + nc*stride_B; - - if (actual_mc == mc && actual_kc == kc && actual_nc == nc && beta == 1) { - // Most used, cached kernel. - kernel(actual_a, actual_b, c, actual_a, bp, cp); - } else { - // Edges - use libxsmm kernel cache. - internal::libxsmm_wrapper(0, actual_mc, actual_nc, actual_kc, kernel_stride_A, kernel_stride_B, stride_C, 1, beta, blocking.prefetch())(actual_a, actual_b, c, actual_a, bp, cp); - } - } - } - } - } - } - } - - if (copyA) { - this->m_device.deallocate(blockA); - } - if (copyB) { - this->m_device.deallocate(panelB); - } - } -#endif - - // Prevent assignment - TensorContractionEvaluatorBase& operator = (const TensorContractionEvaluatorBase&); - Dimensions m_dimensions; - - contract_t m_k_strides; - contract_t m_left_contracting_strides; - contract_t m_right_contracting_strides; - - bool m_lhs_inner_dim_contiguous; - bool m_rhs_inner_dim_contiguous; - bool m_rhs_inner_dim_reordered; - - left_nocontract_t m_i_strides; - right_nocontract_t m_j_strides; - left_nocontract_t m_left_nocontract_strides; - right_nocontract_t m_right_nocontract_strides; - - Index m_i_size; - Index m_j_size; - Index m_k_size; - - TensorEvaluator m_leftImpl; - TensorEvaluator m_rightImpl; - const Device& m_device; - Scalar* m_result; - bool m_can_use_xsmm; -}; - - -// evaluator for default device -template -struct TensorEvaluator, Device> : - public TensorContractionEvaluatorBase< - TensorEvaluator, Device> > { - typedef TensorEvaluator, Device> Self; - typedef TensorContractionEvaluatorBase Base; - - typedef TensorContractionOp XprType; - typedef typename internal::remove_const::type Scalar; - typedef typename XprType::Index Index; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - enum { - Layout = TensorEvaluator::Layout - }; - - // Most of the code is assuming that both input tensors are ColMajor. If the - // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS: - // If we want to compute A * B = C, where A is LHS and B is RHS, the code - // will pretend B is LHS and A is RHS. - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), LeftArgType, RightArgType>::type EvalLeftArgType; - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), RightArgType, LeftArgType>::type EvalRightArgType; - - static const int LDims = - internal::array_size::Dimensions>::value; - static const int RDims = - internal::array_size::Dimensions>::value; - static const int ContractDims = internal::array_size::value; - - typedef array contract_t; - typedef array left_nocontract_t; - typedef array right_nocontract_t; - - static const int NumDims = LDims + RDims - 2 * ContractDims; - - // Could we use NumDimensions here? - typedef DSizes Dimensions; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) : - Base(op, device) { } - - template - EIGEN_DEVICE_FUNC void evalProduct(Scalar* buffer) const { - if (this->m_j_size == 1) { - this->template evalGemv(buffer); - return; - } - - this->template evalGemm(buffer); - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h deleted file mode 100644 index d34f9cae..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h +++ /dev/null @@ -1,190 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H - - -namespace Eigen { -namespace internal { - -enum { - ShardByRow = 0, - ShardByCol = 1 -}; - - -// Default Blocking Strategy -template -class TensorContractionBlocking { - public: - - typedef typename LhsMapper::Scalar LhsScalar; - typedef typename RhsMapper::Scalar RhsScalar; - - EIGEN_DEVICE_FUNC TensorContractionBlocking(Index k, Index m, Index n, Index num_threads = 1) : - kc_(k), mc_(m), nc_(n) - { - if (ShardingType == ShardByCol) { - computeProductBlockingSizes(kc_, mc_, nc_, num_threads); - } - else { - computeProductBlockingSizes(kc_, nc_, mc_, num_threads); - } - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index kc() const { return kc_; } - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index mc() const { return mc_; } - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index nc() const { return nc_; } - - private: - Index kc_; - Index mc_; - Index nc_; -}; - - - -#if defined(EIGEN_USE_LIBXSMM) -template -class TensorXsmmContractionBlocking { - public: - TensorXsmmContractionBlocking(Index k, Index m, Index n, - size_t max_num_threads = 1, bool transposeA = false, - bool transposeB = false): - k_(k), m_(m), n_(n), transposeA_(transposeA), - transposeB_(transposeB), num_threads_(max_num_threads) { -#ifdef EIGEN_TEST_SPECIFIC_BLOCKING_SIZES - if (EIGEN_TEST_SPECIFIC_BLOCKING_SIZES) { - mc_ = EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_M; - kc_ = EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_K; - nc_ = EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_N; - outer_m_ = EIGEN_TEST_SPECIFIC_OUTER_BLOCKING_SIZE_M; - outer_k_ = EIGEN_TEST_SPECIFIC_OUTER_BLOCKING_SIZE_K; - outer_n_ = EIGEN_TEST_SPECIFIC_OUTER_BLOCKING_SIZE_N; - copyA_ = EIGEN_TEST_SPECIFIC_BLOCKING_COPY_A; - copyB_ = EIGEN_TEST_SPECIFIC_BLOCKING_COPY_B; - outer_m_ = outer_m_ != 0 ? outer_m_ : m; - outer_k_ = outer_k_ != 0 ? outer_k_ : k; - outer_n_ = outer_n_ != 0 ? outer_n_ : n; - } -#else - // Defaults, possibly overriden per-platform. - copyA_ = true; - copyB_ = false; - - // If the matrix is small enough, don't do blocking, just call single xsmm - // kernel. - if (static_cast(m)*k*n <= LIBXSMM_THRESHOLD) { - mc_ = m; kc_ = k; nc_ = n; - outer_m_ = m; outer_k_ = k; outer_n_ = n; - copyA_ = false; copyB_ = false; - } else { - int arch = libxsmm_cpuid_x86(); - - if (arch == LIBXSMM_X86_AVX512_CORE) { - // skylake - mc_ = 64; kc_ = 64; nc_ = 24; - outer_m_ = 512; outer_k_ = 512; outer_n_ = 24*22; - // Hack to use this kernel architecture as the other one has performance - // issues (no hardware prefetching). - // TODO(nishantpatil): This should be removed if the issues are fixed, - // or this one becomes the default. - setenv("LIBXSMM_AVX512_CLASSIC_GEMM", "1", 1); - } else if (arch == LIBXSMM_X86_AVX2) { - // haswell - mc_ = 32; kc_ = 192; nc_ = 33; - outer_m_ = 512; outer_k_ = 3*192; outer_n_ = 33*16; - } else if (arch == LIBXSMM_X86_AVX) { - // ivybridge - mc_ = 32; kc_ = 192; nc_ = 48; - outer_m_ = 512; outer_k_ = 3*192; outer_n_ = 48*11; - } else { - // generic kernel size, usually performing well - mc_ = 32; kc_ = 128; nc_ = 32; - outer_m_ = 512; outer_k_ = 512; outer_n_ = 512; - } - - // Only copy if it makes the stride smaller. - copyA_ = copyA_ && (m > mc_); - copyB_ = copyB_ && (k > kc_); - } - - // We need to copy anyway if transposing - copyA_ = copyA_ || transposeA; - copyB_ = copyB_ || transposeB; - - // See libxsmm_gemm_prefetch_type definition in libxsmm_typedefs.h - prefetch_ = LIBXSMM_PREFETCH_AL2CL2BL2_VIA_C; - -#endif - - mc_ = mc_ > m ? m : mc_; - nc_ = nc_ > n ? n : nc_; - kc_ = kc_ > k ? k : kc_; - - size_t compute_parallelism = (m / mc_) * (n / nc_); - size_t pack_parallelism = 0; - if (copyA_) { - pack_parallelism += (m / mc_) * (k / kc_); - } - if (copyB_) { - pack_parallelism += (n / nc_) * (k / kc_); - } - size_t parallelism = numext::maxi(compute_parallelism, pack_parallelism); - - num_threads_ = numext::mini(num_threads_, - parallelism / MIN_JOBS_PER_THREAD); - num_threads_ = numext::maxi(num_threads_, 1); - - // For optimal performance outer block sizes should be multiplies of kernel - // sizes, or bigger than matrix size (=no outer blocking). - eigen_assert(outer_m_ % mc_ == 0 || outer_m_ >= m); - eigen_assert(outer_k_ % kc_ == 0 || outer_k_ >= k); - eigen_assert(outer_n_ % nc_ == 0 || outer_n_ >= n); - } - - EIGEN_ALWAYS_INLINE Index kc() const { return kc_; } - EIGEN_ALWAYS_INLINE Index mc() const { return mc_; } - EIGEN_ALWAYS_INLINE Index nc() const { return nc_; } - EIGEN_ALWAYS_INLINE Index outer_k() const { return outer_k_; } - EIGEN_ALWAYS_INLINE Index outer_m() const { return outer_m_; } - EIGEN_ALWAYS_INLINE Index outer_n() const { return outer_n_; } - EIGEN_ALWAYS_INLINE bool copyA() const { return copyA_; } - EIGEN_ALWAYS_INLINE bool copyB() const { return copyB_; } - EIGEN_ALWAYS_INLINE bool transposeA() const { return transposeA_; } - EIGEN_ALWAYS_INLINE bool transposeB() const { return transposeB_; } - EIGEN_ALWAYS_INLINE int num_threads() const { return num_threads_; } - EIGEN_ALWAYS_INLINE Index blocks_m() const { return divup(m_, mc_); } - EIGEN_ALWAYS_INLINE Index blocks_k() const { return divup(k_, kc_); } - EIGEN_ALWAYS_INLINE Index blocks_n() const { return divup(n_, nc_); } - EIGEN_ALWAYS_INLINE libxsmm_gemm_prefetch_type prefetch() const { - return prefetch_; - } - - private: - Index k_, m_, n_; - Index kc_, mc_, nc_; - Index outer_k_, outer_m_, outer_n_; - bool copyA_, copyB_, transposeA_, transposeB_; - size_t num_threads_; - - // Threshold for m*k*n to skip blocking and just call libxsmm - const double LIBXSMM_THRESHOLD = 80*80*80; - // For computing optimal number of threads - so that each thread gets at least - // that many jobs. - const double MIN_JOBS_PER_THREAD = 3; - libxsmm_gemm_prefetch_type prefetch_; -}; -#endif // EIGEN_USE_LIBXSMM - -} // end namespace internal -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h deleted file mode 100644 index c04b784a..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h +++ /dev/null @@ -1,1386 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014-2015 Benoit Steiner -// Copyright (C) 2015 Navdeep Jaitly -// Copyright (C) 2014 Eric Martin -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_CUDA_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_CUDA_H - -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) - -namespace Eigen { - -template -__device__ EIGEN_STRONG_INLINE void -EigenContractionKernelInternal(const LhsMapper lhs, const RhsMapper rhs, - const OutputMapper output, Scalar* lhs_shmem, Scalar* rhs_shmem, - const Index m_size, const Index n_size, const Index k_size) { - - const Index m_block_idx = blockIdx.x; - const Index n_block_idx = blockIdx.y; - - const Index base_m = 64 * m_block_idx; - const Index base_n = 64 * n_block_idx; - - // declare and initialize 64 registers for output 8x8 block - - // prefetch registers - Scalar lhs_pf0; - Scalar lhs_pf1; - Scalar lhs_pf2; - Scalar lhs_pf3; - Scalar lhs_pf4; - Scalar lhs_pf5; - Scalar lhs_pf6; - Scalar lhs_pf7; - - Scalar rhs_pf0; - Scalar rhs_pf1; - Scalar rhs_pf2; - Scalar rhs_pf3; - Scalar rhs_pf4; - Scalar rhs_pf5; - Scalar rhs_pf6; - Scalar rhs_pf7; - - // shared memory is formatted - // (contract idx in block, nocontract idx in block, block idx) - // where block idx is column major. This transposition limits the number of - // bank conflicts when reading the LHS. The core idea is that since the contracting - // index is shared by both sides, then the contracting index should be in threadIdx.x. - - // On the LHS, we pad each row inside of each block with an extra element. This makes - // each block 8 rows of 9 elements, which is 72 elements. This gives no bank conflicts - // on writes and very few 2-way conflicts on reads. There is an 8x8 grid of these blocks. - - // On the RHS we just add 8 padding elements to the end of each block. This gives no bank - // conflicts on writes and also none on reads. - - // storage indices - const Index lhs_store_idx_base = threadIdx.y * 72 + threadIdx.x * 9 + threadIdx.z; - const Index rhs_store_idx_base = threadIdx.y * 72 + threadIdx.z * 8 + threadIdx.x; - - const Index lhs_store_idx_0 = lhs_store_idx_base + 576 * 0; - const Index lhs_store_idx_1 = lhs_store_idx_base + 576 * 1; - const Index lhs_store_idx_2 = lhs_store_idx_base + 576 * 2; - const Index lhs_store_idx_3 = lhs_store_idx_base + 576 * 3; - const Index lhs_store_idx_4 = lhs_store_idx_base + 576 * 4; - const Index lhs_store_idx_5 = lhs_store_idx_base + 576 * 5; - const Index lhs_store_idx_6 = lhs_store_idx_base + 576 * 6; - const Index lhs_store_idx_7 = lhs_store_idx_base + 576 * 7; - - const Index rhs_store_idx_0 = rhs_store_idx_base + 576 * 0; - const Index rhs_store_idx_1 = rhs_store_idx_base + 576 * 1; - const Index rhs_store_idx_2 = rhs_store_idx_base + 576 * 2; - const Index rhs_store_idx_3 = rhs_store_idx_base + 576 * 3; - const Index rhs_store_idx_4 = rhs_store_idx_base + 576 * 4; - const Index rhs_store_idx_5 = rhs_store_idx_base + 576 * 5; - const Index rhs_store_idx_6 = rhs_store_idx_base + 576 * 6; - const Index rhs_store_idx_7 = rhs_store_idx_base + 576 * 7; - - // in the loading code, the following variables are important: - // threadIdx.x: the vertical position in an 8x8 block - // threadIdx.y: the vertical index of the 8x8 block in the grid - // threadIdx.z: the horizontal position in an 8x8 block - // k: the horizontal index of the 8x8 block in the grid - // - // The k parameter is implicit (it was the loop counter for a loop that went - // from 0 to <8, but now that loop is unrolled in the below code. - - const Index load_idx_vert = threadIdx.x + 8 * threadIdx.y; - const Index lhs_vert = base_m + load_idx_vert; - -#define prefetchIntoRegisters(base_k) \ - { \ - lhs_pf0 = conv(0); \ - lhs_pf1 = conv(0); \ - lhs_pf2 = conv(0); \ - lhs_pf3 = conv(0); \ - lhs_pf4 = conv(0); \ - lhs_pf5 = conv(0); \ - lhs_pf6 = conv(0); \ - lhs_pf7 = conv(0); \ - \ - rhs_pf0 = conv(0); \ - rhs_pf1 = conv(0); \ - rhs_pf2 = conv(0); \ - rhs_pf3 = conv(0); \ - rhs_pf4 = conv(0); \ - rhs_pf5 = conv(0); \ - rhs_pf6 = conv(0); \ - rhs_pf7 = conv(0); \ - \ - if (!needs_edge_check || lhs_vert < m_size) { \ - const Index lhs_horiz_0 = base_k + threadIdx.z + 0 * 8; \ - const Index lhs_horiz_1 = base_k + threadIdx.z + 1 * 8; \ - const Index lhs_horiz_2 = base_k + threadIdx.z + 2 * 8; \ - const Index lhs_horiz_3 = base_k + threadIdx.z + 3 * 8; \ - const Index lhs_horiz_4 = base_k + threadIdx.z + 4 * 8; \ - const Index lhs_horiz_5 = base_k + threadIdx.z + 5 * 8; \ - const Index lhs_horiz_6 = base_k + threadIdx.z + 6 * 8; \ - const Index lhs_horiz_7 = base_k + threadIdx.z + 7 * 8; \ - \ - if (!needs_edge_check || lhs_horiz_7 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - lhs_pf2 = lhs(lhs_vert, lhs_horiz_2); \ - lhs_pf3 = lhs(lhs_vert, lhs_horiz_3); \ - lhs_pf4 = lhs(lhs_vert, lhs_horiz_4); \ - lhs_pf5 = lhs(lhs_vert, lhs_horiz_5); \ - lhs_pf6 = lhs(lhs_vert, lhs_horiz_6); \ - lhs_pf7 = lhs(lhs_vert, lhs_horiz_7); \ - } else if (lhs_horiz_6 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - lhs_pf2 = lhs(lhs_vert, lhs_horiz_2); \ - lhs_pf3 = lhs(lhs_vert, lhs_horiz_3); \ - lhs_pf4 = lhs(lhs_vert, lhs_horiz_4); \ - lhs_pf5 = lhs(lhs_vert, lhs_horiz_5); \ - lhs_pf6 = lhs(lhs_vert, lhs_horiz_6); \ - } else if (lhs_horiz_5 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - lhs_pf2 = lhs(lhs_vert, lhs_horiz_2); \ - lhs_pf3 = lhs(lhs_vert, lhs_horiz_3); \ - lhs_pf4 = lhs(lhs_vert, lhs_horiz_4); \ - lhs_pf5 = lhs(lhs_vert, lhs_horiz_5); \ - } else if (lhs_horiz_4 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - lhs_pf2 = lhs(lhs_vert, lhs_horiz_2); \ - lhs_pf3 = lhs(lhs_vert, lhs_horiz_3); \ - lhs_pf4 = lhs(lhs_vert, lhs_horiz_4); \ - } else if (lhs_horiz_3 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - lhs_pf2 = lhs(lhs_vert, lhs_horiz_2); \ - lhs_pf3 = lhs(lhs_vert, lhs_horiz_3); \ - } else if (lhs_horiz_2 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - lhs_pf2 = lhs(lhs_vert, lhs_horiz_2); \ - } else if (lhs_horiz_1 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - lhs_pf1 = lhs(lhs_vert, lhs_horiz_1); \ - } else if (lhs_horiz_0 < k_size) { \ - lhs_pf0 = lhs(lhs_vert, lhs_horiz_0); \ - } \ - } \ - \ - const Index rhs_vert = base_k + load_idx_vert; \ - if (!needs_edge_check || rhs_vert < k_size) { \ - const Index rhs_horiz_0 = base_n + threadIdx.z + 0 * 8; \ - const Index rhs_horiz_1 = base_n + threadIdx.z + 1 * 8; \ - const Index rhs_horiz_2 = base_n + threadIdx.z + 2 * 8; \ - const Index rhs_horiz_3 = base_n + threadIdx.z + 3 * 8; \ - const Index rhs_horiz_4 = base_n + threadIdx.z + 4 * 8; \ - const Index rhs_horiz_5 = base_n + threadIdx.z + 5 * 8; \ - const Index rhs_horiz_6 = base_n + threadIdx.z + 6 * 8; \ - const Index rhs_horiz_7 = base_n + threadIdx.z + 7 * 8; \ - \ - if (rhs_horiz_7 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - rhs_pf2 = rhs(rhs_vert, rhs_horiz_2); \ - rhs_pf3 = rhs(rhs_vert, rhs_horiz_3); \ - rhs_pf4 = rhs(rhs_vert, rhs_horiz_4); \ - rhs_pf5 = rhs(rhs_vert, rhs_horiz_5); \ - rhs_pf6 = rhs(rhs_vert, rhs_horiz_6); \ - rhs_pf7 = rhs(rhs_vert, rhs_horiz_7); \ - } else if (rhs_horiz_6 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - rhs_pf2 = rhs(rhs_vert, rhs_horiz_2); \ - rhs_pf3 = rhs(rhs_vert, rhs_horiz_3); \ - rhs_pf4 = rhs(rhs_vert, rhs_horiz_4); \ - rhs_pf5 = rhs(rhs_vert, rhs_horiz_5); \ - rhs_pf6 = rhs(rhs_vert, rhs_horiz_6); \ - } else if (rhs_horiz_5 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - rhs_pf2 = rhs(rhs_vert, rhs_horiz_2); \ - rhs_pf3 = rhs(rhs_vert, rhs_horiz_3); \ - rhs_pf4 = rhs(rhs_vert, rhs_horiz_4); \ - rhs_pf5 = rhs(rhs_vert, rhs_horiz_5); \ - } else if (rhs_horiz_4 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - rhs_pf2 = rhs(rhs_vert, rhs_horiz_2); \ - rhs_pf3 = rhs(rhs_vert, rhs_horiz_3); \ - rhs_pf4 = rhs(rhs_vert, rhs_horiz_4); \ - } else if (rhs_horiz_3 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - rhs_pf2 = rhs(rhs_vert, rhs_horiz_2); \ - rhs_pf3 = rhs(rhs_vert, rhs_horiz_3); \ - } else if (rhs_horiz_2 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - rhs_pf2 = rhs(rhs_vert, rhs_horiz_2); \ - } else if (rhs_horiz_1 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - rhs_pf1 = rhs(rhs_vert, rhs_horiz_1); \ - } else if (rhs_horiz_0 < n_size) { \ - rhs_pf0 = rhs(rhs_vert, rhs_horiz_0); \ - } \ - } \ - } \ - -#define writeRegToShmem(_) \ - lhs_shmem[lhs_store_idx_0] = lhs_pf0; \ - rhs_shmem[rhs_store_idx_0] = rhs_pf0; \ - \ - lhs_shmem[lhs_store_idx_1] = lhs_pf1; \ - rhs_shmem[rhs_store_idx_1] = rhs_pf1; \ - \ - lhs_shmem[lhs_store_idx_2] = lhs_pf2; \ - rhs_shmem[rhs_store_idx_2] = rhs_pf2; \ - \ - lhs_shmem[lhs_store_idx_3] = lhs_pf3; \ - rhs_shmem[rhs_store_idx_3] = rhs_pf3; \ - \ - lhs_shmem[lhs_store_idx_4] = lhs_pf4; \ - rhs_shmem[rhs_store_idx_4] = rhs_pf4; \ - \ - lhs_shmem[lhs_store_idx_5] = lhs_pf5; \ - rhs_shmem[rhs_store_idx_5] = rhs_pf5; \ - \ - lhs_shmem[lhs_store_idx_6] = lhs_pf6; \ - rhs_shmem[rhs_store_idx_6] = rhs_pf6; \ - \ - lhs_shmem[lhs_store_idx_7] = lhs_pf7; \ - rhs_shmem[rhs_store_idx_7] = rhs_pf7; \ - - // declare and initialize result array -#define res(i, j) _res_##i##j -#define initResultRow(i) \ - Scalar res(i, 0) = conv(0); \ - Scalar res(i, 1) = conv(0); \ - Scalar res(i, 2) = conv(0); \ - Scalar res(i, 3) = conv(0); \ - Scalar res(i, 4) = conv(0); \ - Scalar res(i, 5) = conv(0); \ - Scalar res(i, 6) = conv(0); \ - Scalar res(i, 7) = conv(0); \ - - internal::scalar_cast_op conv; - initResultRow(0); - initResultRow(1); - initResultRow(2); - initResultRow(3); - initResultRow(4); - initResultRow(5); - initResultRow(6); - initResultRow(7); -#undef initResultRow - - for (Index base_k = 0; base_k < k_size; base_k += 64) { - // wait for previous iteration to finish with shmem. Despite common sense, - // the code is a bit faster with this here then at bottom of loop - __syncthreads(); - - prefetchIntoRegisters(base_k); - writeRegToShmem(); - - #undef prefetchIntoRegisters - #undef writeRegToShmem - - // wait for shared mem packing to be done before starting computation - __syncthreads(); - - // compute 8x8 matrix product by outer product. This involves packing one column - // of LHS and one row of RHS into registers (takes 16 registers). - -#define lcol(i) _lcol##i - Scalar lcol(0); - Scalar lcol(1); - Scalar lcol(2); - Scalar lcol(3); - Scalar lcol(4); - Scalar lcol(5); - Scalar lcol(6); - Scalar lcol(7); - -#define rrow(j) _rrow##j - Scalar rrow(0); - Scalar rrow(1); - Scalar rrow(2); - Scalar rrow(3); - Scalar rrow(4); - Scalar rrow(5); - Scalar rrow(6); - Scalar rrow(7); - - // Now x corresponds to k, y to m, and z to n - const Scalar* lhs_block = &lhs_shmem[threadIdx.x + 9 * threadIdx.y]; - const Scalar* rhs_block = &rhs_shmem[threadIdx.x + 8 * threadIdx.z]; - -#define lhs_element(i, j) lhs_block[72 * ((i) + 8 * (j))] -#define rhs_element(i, j) rhs_block[72 * ((i) + 8 * (j))] - -#define loadData(i, j) \ - lcol(0) = lhs_element(0, j); \ - rrow(0) = rhs_element(i, 0); \ - lcol(1) = lhs_element(1, j); \ - rrow(1) = rhs_element(i, 1); \ - lcol(2) = lhs_element(2, j); \ - rrow(2) = rhs_element(i, 2); \ - lcol(3) = lhs_element(3, j); \ - rrow(3) = rhs_element(i, 3); \ - lcol(4) = lhs_element(4, j); \ - rrow(4) = rhs_element(i, 4); \ - lcol(5) = lhs_element(5, j); \ - rrow(5) = rhs_element(i, 5); \ - lcol(6) = lhs_element(6, j); \ - rrow(6) = rhs_element(i, 6); \ - lcol(7) = lhs_element(7, j); \ - rrow(7) = rhs_element(i, 7); \ - -#define computeCol(j) \ - res(0, j) += lcol(0) * rrow(j); \ - res(1, j) += lcol(1) * rrow(j); \ - res(2, j) += lcol(2) * rrow(j); \ - res(3, j) += lcol(3) * rrow(j); \ - res(4, j) += lcol(4) * rrow(j); \ - res(5, j) += lcol(5) * rrow(j); \ - res(6, j) += lcol(6) * rrow(j); \ - res(7, j) += lcol(7) * rrow(j); \ - -#define computePass(i) \ - loadData(i, i); \ - \ - computeCol(0); \ - computeCol(1); \ - computeCol(2); \ - computeCol(3); \ - computeCol(4); \ - computeCol(5); \ - computeCol(6); \ - computeCol(7); \ - - computePass(0); - computePass(1); - computePass(2); - computePass(3); - computePass(4); - computePass(5); - computePass(6); - computePass(7); - -#undef lcol -#undef rrow -#undef lhs_element -#undef rhs_element -#undef loadData -#undef computeCol -#undef computePass - } // end loop over k - - // we've now iterated over all of the large (ie width 64) k blocks and - // accumulated results in registers. At this point thread (x, y, z) contains - // the sum across all big k blocks of the product of little k block of index (x, y) - // with block of index (y, z). To compute the final output, we need to reduce - // the 8 threads over y by summation. -#define shuffleInc(i, j, mask) res(i, j) += __shfl_xor(res(i, j), mask) - -#define reduceRow(i, mask) \ - shuffleInc(i, 0, mask); \ - shuffleInc(i, 1, mask); \ - shuffleInc(i, 2, mask); \ - shuffleInc(i, 3, mask); \ - shuffleInc(i, 4, mask); \ - shuffleInc(i, 5, mask); \ - shuffleInc(i, 6, mask); \ - shuffleInc(i, 7, mask); \ - -#define reduceMatrix(mask) \ - reduceRow(0, mask); \ - reduceRow(1, mask); \ - reduceRow(2, mask); \ - reduceRow(3, mask); \ - reduceRow(4, mask); \ - reduceRow(5, mask); \ - reduceRow(6, mask); \ - reduceRow(7, mask); \ - - // actually perform the reduction, now each thread of index (_, y, z) - // contains the correct values in its registers that belong in the output - // block - reduceMatrix(1); - reduceMatrix(2); - reduceMatrix(4); - -#undef shuffleInc -#undef reduceRow -#undef reduceMatrix - - // now we need to copy the 64 values into main memory. We can't split work - // among threads because all variables are in registers. There's 2 ways - // to do this: - // (1) have 1 thread do 64 writes from registers into global memory - // (2) have 1 thread do 64 writes into shared memory, and then 8 threads - // each do 8 writes into global memory. We can just overwrite the shared - // memory from the problem we just solved. - // (2) is slightly faster than (1) due to less branching and more ILP - - // TODO: won't yield much gain, but could just use currently unused shared mem - // and then we won't have to sync - // wait for shared mem to be out of use - __syncthreads(); - -#define writeResultShmem(i, j) \ - lhs_shmem[i + 8 * threadIdx.y + 64 * threadIdx.z + 512 * j] = res(i, j); \ - -#define writeRow(i) \ - writeResultShmem(i, 0); \ - writeResultShmem(i, 1); \ - writeResultShmem(i, 2); \ - writeResultShmem(i, 3); \ - writeResultShmem(i, 4); \ - writeResultShmem(i, 5); \ - writeResultShmem(i, 6); \ - writeResultShmem(i, 7); \ - - if (threadIdx.x == 0) { - writeRow(0); - writeRow(1); - writeRow(2); - writeRow(3); - writeRow(4); - writeRow(5); - writeRow(6); - writeRow(7); - } -#undef writeResultShmem -#undef writeRow - - const int max_i_write = numext::mini((int)((m_size - base_m - threadIdx.y + 7) / 8), 8); - const int max_j_write = numext::mini((int)((n_size - base_n - threadIdx.z + 7) / 8), 8); - - if (threadIdx.x < max_i_write) { - if (max_j_write == 8) { - // TODO: can i trade bank conflicts for coalesced writes? - Scalar val0 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 0]; - Scalar val1 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 1]; - Scalar val2 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 2]; - Scalar val3 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 3]; - Scalar val4 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 4]; - Scalar val5 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 5]; - Scalar val6 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 6]; - Scalar val7 = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * 7]; - - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 0) = val0; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 1) = val1; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 2) = val2; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 3) = val3; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 4) = val4; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 5) = val5; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 6) = val6; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * 7) = val7; - } else { -#pragma unroll 7 - for (int j = 0; j < max_j_write; j++) { - Scalar val = lhs_shmem[threadIdx.x + 8 * threadIdx.y + 64 * threadIdx.z + 512 * j]; - output(base_m + threadIdx.y + 8 * threadIdx.x, base_n + threadIdx.z + 8 * j) = val; - } - } - } -#undef res -} - - -template -__global__ void -__launch_bounds__(512) -EigenContractionKernel(const LhsMapper lhs, const RhsMapper rhs, - const OutputMapper output, - const Index m_size, const Index n_size, const Index k_size) { - __shared__ Scalar lhs_shmem[72 * 64]; - __shared__ Scalar rhs_shmem[72 * 64]; - - const Index m_block_idx = blockIdx.x; - const Index n_block_idx = blockIdx.y; - - const Index base_m = 64 * m_block_idx; - const Index base_n = 64 * n_block_idx; - - if (base_m + 63 < m_size && base_n + 63 < n_size) { - EigenContractionKernelInternal(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size); - } else { - EigenContractionKernelInternal(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size); - } -} - - -template -__device__ EIGEN_STRONG_INLINE void -EigenFloatContractionKernelInternal16x16(const LhsMapper lhs, const RhsMapper rhs, - const OutputMapper output, float2 lhs_shmem2[][16], - float2 rhs_shmem2[][8], const Index m_size, - const Index n_size, const Index k_size, - const Index base_m, const Index base_n) { - - // prefetch registers - float4 lhs_pf0, rhs_pf0; - - float4 results[4]; - for (int i=0; i < 4; i++) { - results[i].x = results[i].y = results[i].z = results[i].w = 0; - } - - -#define prefetch_lhs(reg, row, col) \ - if (!CHECK_LHS_BOUNDARY) { \ - if (col < k_size) { \ - reg =lhs.template loadPacket(row, col); \ - } \ - } else { \ - if (col < k_size) { \ - if (row + 3 < m_size) { \ - reg =lhs.template loadPacket(row, col); \ - } else if (row + 2 < m_size) { \ - reg.x =lhs(row + 0, col); \ - reg.y =lhs(row + 1, col); \ - reg.z =lhs(row + 2, col); \ - } else if (row + 1 < m_size) { \ - reg.x =lhs(row + 0, col); \ - reg.y =lhs(row + 1, col); \ - } else if (row < m_size) { \ - reg.x =lhs(row + 0, col); \ - } \ - } \ - } \ - - - Index lhs_vert = base_m+threadIdx.x*4; - - for (Index k = 0; k < k_size; k += 16) { - lhs_pf0 = internal::pset1(0); - rhs_pf0 = internal::pset1(0); - - Index lhs_horiz = threadIdx.y+k; - prefetch_lhs(lhs_pf0, lhs_vert, lhs_horiz) - - Index rhs_vert = k+(threadIdx.x%4)*4; - Index rhs_horiz0 = (threadIdx.x>>2)+threadIdx.y*4+base_n; - - if (!CHECK_RHS_BOUNDARY) { - if ((rhs_vert + 3) < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0 = rhs.template loadPacket(rhs_vert, rhs_horiz0); - } else if (rhs_vert + 2 < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf0.z = rhs(rhs_vert + 2, rhs_horiz0); - } else if (rhs_vert + 1 < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - } else if (rhs_vert < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - } - } else { - if (rhs_horiz0 < n_size) { - if ((rhs_vert + 3) < k_size) { - rhs_pf0 = rhs.template loadPacket(rhs_vert, rhs_horiz0); - } else if ((rhs_vert + 2) < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf0.z = rhs(rhs_vert + 2, rhs_horiz0); - } else if ((rhs_vert + 1) < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - } else if (rhs_vert < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - } - } - } - float x1, x2 ; - // the following can be a bitwise operation..... some day. - if((threadIdx.x%8) < 4) { - x1 = rhs_pf0.y; - x2 = rhs_pf0.w; - } else { - x1 = rhs_pf0.x; - x2 = rhs_pf0.z; - } - x1 = __shfl_xor(x1, 4); - x2 = __shfl_xor(x2, 4); - if((threadIdx.x%8) < 4) { - rhs_pf0.y = x1; - rhs_pf0.w = x2; - } else { - rhs_pf0.x = x1; - rhs_pf0.z = x2; - } - - // We have 64 features. - // Row 0 -> times (0, 4, 8, 12, 1, 5, 9, 13) for features 0, 1. - // Row 1 -> times (0, 4, 8, 12, 1, 5, 9, 13) for features 2, 3. - // ... - // Row 31 -> times (0, 4, 8, 12, 1, 5, 9, 13) for features 62, 63 - // Row 32 -> times (2, 6, 10, 14, 3, 7, 11, 15) for features 0, 1 - // ... - rhs_shmem2[(threadIdx.x>>3)+ threadIdx.y*2][threadIdx.x%8] = make_float2(rhs_pf0.x, rhs_pf0.y); - rhs_shmem2[(threadIdx.x>>3)+ threadIdx.y*2+32][threadIdx.x%8] = make_float2(rhs_pf0.z, rhs_pf0.w); - - // Row 0 (time 0) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), .. (60, 61) - // Row 1 (time 1) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), .. (60, 61) - // ... - // Row 15 (time 15) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), .. (60, 61) - // Row 16 (time 0) -> features (2, 3), (6, 7), .. (30, 31), (34, 35), .. (62, 63) - // ... - - lhs_shmem2[threadIdx.y][threadIdx.x] = make_float2(lhs_pf0.x, lhs_pf0.y); - lhs_shmem2[threadIdx.y+16][threadIdx.x] = make_float2(lhs_pf0.z, lhs_pf0.w); - - -#define add_vals(fl1, fl2, fr1, fr2)\ - results[0].x += fl1.x * fr1.x;\ - results[0].y += fl1.y * fr1.x;\ - results[0].z += fl2.x * fr1.x;\ - results[0].w += fl2.y * fr1.x;\ -\ - results[1].x += fl1.x * fr1.y;\ - results[1].y += fl1.y * fr1.y;\ - results[1].z += fl2.x * fr1.y;\ - results[1].w += fl2.y * fr1.y;\ -\ - results[2].x += fl1.x * fr2.x;\ - results[2].y += fl1.y * fr2.x;\ - results[2].z += fl2.x * fr2.x;\ - results[2].w += fl2.y * fr2.x;\ -\ - results[3].x += fl1.x * fr2.y;\ - results[3].y += fl1.y * fr2.y;\ - results[3].z += fl2.x * fr2.y;\ - results[3].w += fl2.y * fr2.y;\ - - __syncthreads(); - - // Do the multiplies. - #pragma unroll - for (int koff = 0; koff < 16; koff ++) { - // 32 x threads. - float2 fl1 = lhs_shmem2[koff][threadIdx.x]; - float2 fl2 = lhs_shmem2[koff + 16][threadIdx.x]; - - int start_feature = threadIdx.y * 4; - float2 fr1 = rhs_shmem2[(start_feature>>1) + 32*((koff%4)/2)][koff/4 + (koff%2)*4]; - float2 fr2 = rhs_shmem2[(start_feature>>1) + 1 + 32*((koff%4)/2)][koff/4 + (koff%2)*4]; - - add_vals(fl1, fl2, fr1, fr2) - } - __syncthreads(); - } - -#undef prefetch_lhs -#undef add_vals - - Index horiz_base = threadIdx.y*4+base_n; - if (!CHECK_LHS_BOUNDARY && !CHECK_RHS_BOUNDARY) { - for (int i = 0; i < 4; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } else if (!CHECK_RHS_BOUNDARY) { - // CHECK LHS - if (lhs_vert + 3 < m_size) { - for (int i = 0; i < 4; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } else if (lhs_vert + 2 < m_size) { - for (int i = 0; i < 4; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - } - } else if (lhs_vert + 1 < m_size) { - for (int i = 0; i < 4; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - } - } else if (lhs_vert < m_size) { - for (int i = 0; i < 4; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - } - } - } else if (!CHECK_LHS_BOUNDARY) { - // CHECK RHS - /* - int ncols_rem = fminf(n_size- horiz_base, 4); - for (int i = 0; i < ncols_rem; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - }*/ - for (int i = 0; i < 4; i++) { - if (horiz_base+i < n_size) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } - } else { - // CHECK both boundaries. - for (int i = 0; i < 4; i++) { - if (horiz_base+i < n_size) { - if (lhs_vert < m_size) - output(lhs_vert, horiz_base + i) = results[i].x; - if (lhs_vert + 1 < m_size) - output(lhs_vert + 1, horiz_base + i) = results[i].y; - if (lhs_vert + 2 < m_size) - output(lhs_vert + 2, horiz_base + i) = results[i].z; - if (lhs_vert + 3 < m_size) - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } - } -} - - -template -__device__ EIGEN_STRONG_INLINE void -EigenFloatContractionKernelInternal(const LhsMapper lhs, const RhsMapper rhs, - const OutputMapper output, float2 lhs_shmem2[][32], - float2 rhs_shmem2[][8], const Index m_size, - const Index n_size, const Index k_size, - const Index base_m, const Index base_n) { - - // prefetch registers - float4 lhs_pf0, lhs_pf1, lhs_pf2, lhs_pf3; - float4 rhs_pf0, rhs_pf1; - - float4 results[8]; - for (int i=0; i < 8; i++) { - results[i].x = results[i].y = results[i].z = results[i].w = 0; - } - - - Index lhs_vert = base_m+threadIdx.x*4+(threadIdx.y%4)*32; - for (Index k = 0; k < k_size; k += 32) { - lhs_pf0 = internal::pset1(0); - lhs_pf1 = internal::pset1(0); - lhs_pf2 = internal::pset1(0); - lhs_pf3 = internal::pset1(0); - - rhs_pf0 = internal::pset1(0); - rhs_pf1 = internal::pset1(0); - - if (!CHECK_LHS_BOUNDARY) { - if ((threadIdx.y/4+k+24) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - lhs_pf1 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+8)); - lhs_pf2 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+16)); - lhs_pf3 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+24)); - } else if ((threadIdx.y/4+k+16) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - lhs_pf1 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+8)); - lhs_pf2 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+16)); - } else if ((threadIdx.y/4+k+8) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - lhs_pf1 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+8)); - } else if ((threadIdx.y/4+k) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - } - } else { - // just CHECK_LHS_BOUNDARY - if (lhs_vert + 3 < m_size) { - if ((threadIdx.y/4+k+24) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - lhs_pf1 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+8)); - lhs_pf2 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+16)); - lhs_pf3 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+24)); - } else if ((threadIdx.y/4+k+16) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - lhs_pf1 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+8)); - lhs_pf2 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+16)); - } else if ((threadIdx.y/4+k+8) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - lhs_pf1 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k+8)); - } else if ((threadIdx.y/4+k) < k_size) { - lhs_pf0 =lhs.template loadPacket(lhs_vert, (threadIdx.y/4+k)); - } - } else if (lhs_vert + 2 < m_size) { - if ((threadIdx.y/4+k+24) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8)); - lhs_pf1.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+8)); - lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16)); - lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16)); - lhs_pf2.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+16)); - lhs_pf3.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+24)); - lhs_pf3.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+24)); - lhs_pf3.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+24)); - } else if ((threadIdx.y/4+k+16) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8)); - lhs_pf1.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+8)); - lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16)); - lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16)); - lhs_pf2.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+16)); - } else if ((threadIdx.y/4+k+8) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8)); - lhs_pf1.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+8)); - } else if ((threadIdx.y/4+k) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k)); - } - } else if (lhs_vert + 1 < m_size) { - if ((threadIdx.y/4+k+24) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8)); - lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16)); - lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16)); - lhs_pf3.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+24)); - lhs_pf3.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+24)); - } else if ((threadIdx.y/4+k+16) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8)); - lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16)); - lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16)); - } else if ((threadIdx.y/4+k+8) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8)); - } else if ((threadIdx.y/4+k) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k)); - } - } else if (lhs_vert < m_size) { - if ((threadIdx.y/4+k+24) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16)); - lhs_pf3.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+24)); - } else if ((threadIdx.y/4+k+16) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16)); - } else if ((threadIdx.y/4+k+8) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8)); - } else if ((threadIdx.y/4+k) < k_size) { - lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k)); - } - } - } - __syncthreads(); - Index rhs_vert = k+threadIdx.x*4; - Index rhs_horiz0 = threadIdx.y*2+base_n; - Index rhs_horiz1 = threadIdx.y*2+1+base_n; - if (!CHECK_RHS_BOUNDARY) { - if ((rhs_vert + 3) < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0 = rhs.template loadPacket(rhs_vert, rhs_horiz0); - rhs_pf1 = rhs.template loadPacket(rhs_vert, rhs_horiz1); - } else if (rhs_vert + 2 < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf0.z = rhs(rhs_vert + 2, rhs_horiz0); - rhs_pf1.x = rhs(rhs_vert, rhs_horiz1); - rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1); - rhs_pf1.z = rhs(rhs_vert + 2, rhs_horiz1); - } else if (rhs_vert + 1 < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf1.x = rhs(rhs_vert, rhs_horiz1); - rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1); - } else if (rhs_vert < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf1.x = rhs(rhs_vert, rhs_horiz1); - } - } else { - if (rhs_horiz1 < n_size) { - if ((rhs_vert + 3) < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0 = rhs.template loadPacket(rhs_vert, rhs_horiz0); - rhs_pf1 = rhs.template loadPacket(rhs_vert, rhs_horiz1); - } else if (rhs_vert + 2 < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf0.z = rhs(rhs_vert + 2, rhs_horiz0); - rhs_pf1.x = rhs(rhs_vert, rhs_horiz1); - rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1); - rhs_pf1.z = rhs(rhs_vert + 2, rhs_horiz1); - } else if (k+threadIdx.x*4 + 1 < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf1.x = rhs(rhs_vert, rhs_horiz1); - rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1); - } else if (k+threadIdx.x*4 < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf1.x = rhs(rhs_vert, rhs_horiz1); - } - } else if (rhs_horiz0 < n_size) { - if ((rhs_vert + 3) < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0 = rhs.template loadPacket(rhs_vert, rhs_horiz0); - } else if ((rhs_vert + 2) < k_size) { - // just CHECK_RHS_BOUNDARY - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - rhs_pf0.z = rhs(rhs_vert + 2, rhs_horiz0); - } else if ((rhs_vert + 1) < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0); - } else if (rhs_vert < k_size) { - rhs_pf0.x = rhs(rhs_vert, rhs_horiz0); - } - } - } - __syncthreads(); - // Loaded. Do computation - // Row 0 -> times (0, 4, 8, .. 28) for features 0, 1. - // Row 1 -> times (0, 4, 8, .. 28) for features 2, 3. - // .. - // Row 31 -> times (0, 4, 8, .. 28) for features 62, 63 - rhs_shmem2[threadIdx.y][threadIdx.x] = make_float2(rhs_pf0.x, rhs_pf1.x); - // Row 32 -> times (1, 5, 9, .. 29) for features 0, 1. - // Row 33 -> times (1, 5, 9, .. 29) for features 2, 3. - // .. - rhs_shmem2[threadIdx.y+32][threadIdx.x] = make_float2(rhs_pf0.y, rhs_pf1.y); - // Row 64 -> times (2, 6, 10, .. 30) for features 0, 1. - // Row 65 -> times (2, 6, 10, .. 30) for features 2, 3. - rhs_shmem2[threadIdx.y+64][threadIdx.x] = make_float2(rhs_pf0.z, rhs_pf1.z); - // Row 96 -> times (3, 7, 11, .. 31) for features 0, 1. - // Row 97 -> times (3, 7, 11, .. 31) for features 2, 3. - rhs_shmem2[threadIdx.y+96][threadIdx.x] = make_float2(rhs_pf0.w, rhs_pf1.w); - - // LHS. - // Row 0 (time 0) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), .. (60, 61) .. (124, 125) - // Row 1 (time 1) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), .. (60, 61) .. (124, 125) - // ... - // Row 8 (time 0) -> features (2, 3), (6, 7), .. (30, 31), (34, 35), .. (62, 63) .. (126, 127) - // Row 15 (time 7) -> features (2, 3), (6, 7), .. (30, 31), (34, 35), .. (62, 63) .. (126, 127) - - -#define add_vals(a_feat1, a_feat2, f1, f2, f3, f4)\ - results[0].x += a_feat1.x * f1.x;\ - results[1].x += a_feat1.x * f1.y;\ - results[2].x += a_feat1.x * f2.x;\ - results[3].x += a_feat1.x * f2.y;\ - results[4].x += a_feat1.x * f3.x;\ - results[5].x += a_feat1.x * f3.y;\ - results[6].x += a_feat1.x * f4.x;\ - results[7].x += a_feat1.x * f4.y;\ -\ - results[0].y += a_feat1.y * f1.x;\ - results[1].y += a_feat1.y * f1.y;\ - results[2].y += a_feat1.y * f2.x;\ - results[3].y += a_feat1.y * f2.y;\ - results[4].y += a_feat1.y * f3.x;\ - results[5].y += a_feat1.y * f3.y;\ - results[6].y += a_feat1.y * f4.x;\ - results[7].y += a_feat1.y * f4.y;\ -\ - results[0].z += a_feat2.x * f1.x;\ - results[1].z += a_feat2.x * f1.y;\ - results[2].z += a_feat2.x * f2.x;\ - results[3].z += a_feat2.x * f2.y;\ - results[4].z += a_feat2.x * f3.x;\ - results[5].z += a_feat2.x * f3.y;\ - results[6].z += a_feat2.x * f4.x;\ - results[7].z += a_feat2.x * f4.y;\ -\ - results[0].w += a_feat2.y * f1.x;\ - results[1].w += a_feat2.y * f1.y;\ - results[2].w += a_feat2.y * f2.x;\ - results[3].w += a_feat2.y * f2.y;\ - results[4].w += a_feat2.y * f3.x;\ - results[5].w += a_feat2.y * f3.y;\ - results[6].w += a_feat2.y * f4.x;\ - results[7].w += a_feat2.y * f4.y;\ - - lhs_shmem2[threadIdx.y/4][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf0.x, lhs_pf0.y); - lhs_shmem2[threadIdx.y/4+8][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf1.x, lhs_pf1.y); - lhs_shmem2[threadIdx.y/4+16][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf2.x, lhs_pf2.y); - lhs_shmem2[threadIdx.y/4+24][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf3.x, lhs_pf3.y); - - lhs_shmem2[threadIdx.y/4 + 32][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf0.z, lhs_pf0.w); - lhs_shmem2[threadIdx.y/4 + 40][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf1.z, lhs_pf1.w); - lhs_shmem2[threadIdx.y/4 + 48][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf2.z, lhs_pf2.w); - lhs_shmem2[threadIdx.y/4 + 56][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf3.z, lhs_pf3.w); - - __syncthreads(); - - // Do the multiplies. - #pragma unroll - for (int koff = 0; koff < 32; koff ++) { - float2 a3 = lhs_shmem2[koff][threadIdx.x + (threadIdx.y % 4) * 8]; - float2 a4 = lhs_shmem2[koff + 32][threadIdx.x + (threadIdx.y % 4) * 8]; - - // first feature is at (threadIdx.y/4) * 8 last is at start + 8. - int start_feature = (threadIdx.y / 4) * 8; - - float2 br1 = rhs_shmem2[start_feature/2 + (koff % 4) * 32][koff/4]; - float2 br2 = rhs_shmem2[start_feature/2 + 1 + (koff % 4) * 32][koff/4]; - float2 br3 = rhs_shmem2[start_feature/2 + 2 + (koff % 4) * 32][koff/4]; - float2 br4 = rhs_shmem2[start_feature/2 + 3 + (koff % 4) * 32][koff/4]; - - add_vals(a3, a4, br1, br2, br3, br4) - } - __syncthreads(); - } // end loop over k - - - __syncthreads(); - Index horiz_base = (threadIdx.y/4)*8+base_n; - if (!CHECK_LHS_BOUNDARY && !CHECK_RHS_BOUNDARY) { - for (int i = 0; i < 8; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } else if (!CHECK_RHS_BOUNDARY) { - if (lhs_vert + 3 < m_size) { - for (int i = 0; i < 8; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } else if (lhs_vert + 2 < m_size) { - for (int i = 0; i < 8; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - } - } else if (lhs_vert + 1 < m_size) { - for (int i = 0; i < 8; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - } - } else if (lhs_vert < m_size) { - for (int i = 0; i < 8; i++) { - output(lhs_vert, horiz_base + i) = results[i].x; - } - } - } else if (!CHECK_LHS_BOUNDARY) { - // CHECK BOUNDARY_B - for (int i = 0; i < 8; i++) { - if (horiz_base + i < n_size) { - output(lhs_vert, horiz_base + i) = results[i].x; - output(lhs_vert + 1, horiz_base + i) = results[i].y; - output(lhs_vert + 2, horiz_base + i) = results[i].z; - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } - } else { - // CHECK both boundaries. - for (int i = 0; i < 8; i++) { - if (horiz_base + i < n_size) { - if (lhs_vert < m_size) - output(lhs_vert, horiz_base + i) = results[i].x; - if (lhs_vert + 1 < m_size) - output(lhs_vert + 1, horiz_base + i) = results[i].y; - if (lhs_vert + 2 < m_size) - output(lhs_vert + 2, horiz_base + i) = results[i].z; - if (lhs_vert + 3 < m_size) - output(lhs_vert + 3, horiz_base + i) = results[i].w; - } - } - } -} - - -template -__global__ void -__launch_bounds__(256) -EigenFloatContractionKernel(const LhsMapper lhs, const RhsMapper rhs, - const OutputMapper output, - const Index m_size, const Index n_size, const Index k_size) { - __shared__ float2 lhs_shmem[64*32]; - __shared__ float2 rhs_shmem[128*8]; - - typedef float2 LHS_MEM[64][32]; - typedef float2 RHS_MEM[128][8]; - - const Index m_block_idx = blockIdx.x; - const Index n_block_idx = blockIdx.y; - - const Index base_m = 128 * m_block_idx; - const Index base_n = 64 * n_block_idx; - - bool check_rhs = (base_n + 63) >= n_size; - bool check_lhs128 = (base_m + 127) >= m_size; - - if (!check_rhs) { - if (!check_lhs128) { - // >= 128 rows left - EigenFloatContractionKernelInternal( - lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n); - } else { - EigenFloatContractionKernelInternal( - lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n); - } - } else { - if (!check_lhs128) { - // >= 128 rows left - EigenFloatContractionKernelInternal( - lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n); - } else { - EigenFloatContractionKernelInternal( - lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n); - } - } -} - -template -__global__ void -__launch_bounds__(256) -EigenFloatContractionKernel16x16(const LhsMapper lhs, const RhsMapper rhs, - const OutputMapper output, - const Index m_size, const Index n_size, const Index k_size) { - __shared__ float2 lhs_shmem[32][16]; - __shared__ float2 rhs_shmem[64][8]; - - const Index m_block_idx = blockIdx.x; - const Index n_block_idx = blockIdx.y; - - const Index base_m = 64 * m_block_idx; - const Index base_n = 64 * n_block_idx; - - if (base_m + 63 < m_size) { - if (base_n + 63 < n_size) { - EigenFloatContractionKernelInternal16x16(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n); - } else { - EigenFloatContractionKernelInternal16x16(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n); - } - } else { - if (base_n + 63 < n_size) { - EigenFloatContractionKernelInternal16x16(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n); - } else { - EigenFloatContractionKernelInternal16x16(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n); - } - } -} - - -template -struct TensorEvaluator, GpuDevice> : - public TensorContractionEvaluatorBase, GpuDevice> > { - - typedef GpuDevice Device; - - typedef TensorEvaluator, Device> Self; - typedef TensorContractionEvaluatorBase Base; - - typedef TensorContractionOp XprType; - typedef typename internal::remove_const::type Scalar; - typedef typename XprType::Index Index; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - enum { - Layout = TensorEvaluator::Layout, - }; - - // Most of the code is assuming that both input tensors are ColMajor. If the - // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS: - // If we want to compute A * B = C, where A is LHS and B is RHS, the code - // will pretend B is LHS and A is RHS. - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), LeftArgType, RightArgType>::type EvalLeftArgType; - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), RightArgType, LeftArgType>::type EvalRightArgType; - - static const int LDims = - internal::array_size::Dimensions>::value; - static const int RDims = - internal::array_size::Dimensions>::value; - static const int ContractDims = internal::array_size::value; - - typedef array left_dim_mapper_t; - typedef array right_dim_mapper_t; - - typedef array contract_t; - typedef array left_nocontract_t; - typedef array right_nocontract_t; - - static const int NumDims = LDims + RDims - 2 * ContractDims; - - typedef DSizes Dimensions; - - // typedefs needed in evalTo - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - - typedef typename LeftEvaluator::Dimensions LeftDimensions; - typedef typename RightEvaluator::Dimensions RightDimensions; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) : - Base(op, device) {} - - // We need to redefine this method to make nvcc happy - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* data) { - this->m_leftImpl.evalSubExprsIfNeeded(NULL); - this->m_rightImpl.evalSubExprsIfNeeded(NULL); - if (data) { - evalTo(data); - return false; - } else { - this->m_result = static_cast(this->m_device.allocate(this->dimensions().TotalSize() * sizeof(Scalar))); - evalTo(this->m_result); - return true; - } - } - - void evalTo(Scalar* buffer) const { - if (this->m_lhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - else { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - } - else { - if (this->m_rhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - else { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - } - } - - template struct LaunchKernels { - static void Run(const LhsMapper& lhs, const RhsMapper& rhs, const OutputMapper& output, Index m, Index n, Index k, const GpuDevice& device) { - const Index m_blocks = (m + 63) / 64; - const Index n_blocks = (n + 63) / 64; - const dim3 num_blocks(m_blocks, n_blocks, 1); - const dim3 block_size(8, 8, 8); - LAUNCH_CUDA_KERNEL((EigenContractionKernel), num_blocks, block_size, 0, device, lhs, rhs, output, m, n, k); - } - }; - - template struct LaunchKernels { - static void Run(const LhsMapper& lhs, const RhsMapper& rhs, const OutputMapper& output, Index m, Index n, Index k, const GpuDevice& device) { - if (m < 768 || n < 768) { - const Index m_blocks = (m + 63) / 64; - const Index n_blocks = (n + 63) / 64; - const dim3 num_blocks(m_blocks, n_blocks, 1); - const dim3 block_size(16, 16, 1); - LAUNCH_CUDA_KERNEL((EigenFloatContractionKernel16x16), num_blocks, block_size, 0, device, lhs, rhs, output, m, n, k); - } else { - const Index m_blocks = (m + 127) / 128; - const Index n_blocks = (n + 63) / 64; - const dim3 num_blocks(m_blocks, n_blocks, 1); - const dim3 block_size(8, 32, 1); - LAUNCH_CUDA_KERNEL((EigenFloatContractionKernel), num_blocks, block_size, 0, device, lhs, rhs, output, m, n, k); - } - } - }; - - template - void evalTyped(Scalar* buffer) const { - // columns in left side, rows in right side - const Index k = this->m_k_size; - EIGEN_UNUSED_VARIABLE(k) - - // rows in left side - const Index m = this->m_i_size; - - // columns in right side - const Index n = this->m_j_size; - - // zero out the result buffer (which must be of size at least m * n * sizeof(Scalar) - this->m_device.memset(buffer, 0, m * n * sizeof(Scalar)); - - typedef internal::TensorContractionInputMapper LhsMapper; - - typedef internal::TensorContractionInputMapper RhsMapper; - - typedef internal::blas_data_mapper OutputMapper; - - - // initialize data mappers - LhsMapper lhs(this->m_leftImpl, this->m_left_nocontract_strides, this->m_i_strides, - this->m_left_contracting_strides, this->m_k_strides); - - RhsMapper rhs(this->m_rightImpl, this->m_right_nocontract_strides, this->m_j_strides, - this->m_right_contracting_strides, this->m_k_strides); - - OutputMapper output(buffer, m); - - setCudaSharedMemConfig(cudaSharedMemBankSizeEightByte); - LaunchKernels::Run(lhs, rhs, output, m, n, k, this->m_device); - } -}; - -} // end namespace Eigen - -#endif // EIGEN_USE_GPU and __CUDACC__ -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_CUDA_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h deleted file mode 100644 index ab320a50..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h +++ /dev/null @@ -1,493 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_MAPPER_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_MAPPER_H - -namespace Eigen { - -namespace internal { - -enum { - Rhs = 0, - Lhs = 1 -}; - -/* - * Implementation of the Eigen blas_data_mapper class for tensors. - */ -/// The make pointer class is used by sycl in order to build the mapper class on the device. For other platform the default make pointer is used which -/// is scalar * for CoeffLoader. -template class MakePointer_ = MakePointer> struct CoeffLoader; -template class MakePointer_ = MakePointer> class BaseTensorContractionMapper; - -template class MakePointer_> struct CoeffLoader { - enum { - DirectOffsets = false - }; - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffLoader(const Tensor& tensor) : m_tensor(tensor) { } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index) { - eigen_assert(false && "unsupported"); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename Tensor::Scalar coeff(typename Tensor::Index index) const { return m_tensor.coeff(index); } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename Tensor::PacketReturnType packet(typename Tensor::Index index) const - { - return m_tensor.template packet(index); - } - - - private: - const Tensor m_tensor; -}; - -template class MakePointer_> struct CoeffLoader { - enum { - DirectOffsets = true - }; - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffLoader(const Tensor& tensor) : m_data(tensor.data()) {} - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index offset) { - m_data += offset; - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename Tensor::Scalar coeff(typename Tensor::Index index) const { return loadConstant(m_data+index); } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename Tensor::PacketReturnType packet(typename Tensor::Index index) const - { - return internal::ploadt_ro(m_data + index); - } - private: - typedef typename Tensor::Scalar Scalar; - - typename MakePointer_::Type m_data; -}; - -template class MakePointer_ = MakePointer> -class SimpleTensorContractionMapper { - public: - EIGEN_DEVICE_FUNC - SimpleTensorContractionMapper(const Tensor& tensor, - const nocontract_t& nocontract_strides, - const nocontract_t& ij_strides, - const contract_t& contract_strides, - const contract_t& k_strides) : - m_tensor(tensor), - m_nocontract_strides(nocontract_strides), - m_ij_strides(ij_strides), - m_contract_strides(contract_strides), - m_k_strides(k_strides) { } - - enum { - DirectOffsets = CoeffLoader::DirectOffsets - }; - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index offset) { - m_tensor.offsetBuffer(offset); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE void prefetch(Index /*i*/) { } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar operator()(Index row) const { - // column major assumption - return operator()(row, 0); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar operator()(Index row, Index col) const { - return m_tensor.coeff(computeIndex(row, col)); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index computeIndex(Index row, Index col) const { - const bool left = (side == Lhs); - Index nocontract_val = left ? row : col; - Index linidx = 0; - for (int i = static_cast(array_size::value) - 1; i > 0; i--) { - const Index idx = nocontract_val / m_ij_strides[i]; - linidx += idx * m_nocontract_strides[i]; - nocontract_val -= idx * m_ij_strides[i]; - } - if (array_size::value > array_size::value) { - if (side == Lhs && inner_dim_contiguous) { - eigen_assert(m_nocontract_strides[0] == 1); - linidx += nocontract_val; - } else { - linidx += nocontract_val * m_nocontract_strides[0]; - } - } - - Index contract_val = left ? col : row; - if(array_size::value > 0) { - for (int i = static_cast(array_size::value) - 1; i > 0; i--) { - const Index idx = contract_val / m_k_strides[i]; - linidx += idx * m_contract_strides[i]; - contract_val -= idx * m_k_strides[i]; - } - - if (side == Rhs && inner_dim_contiguous) { - eigen_assert(m_contract_strides[0] == 1); - linidx += contract_val; - } else { - linidx += contract_val * m_contract_strides[0]; - } - } - - return linidx; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE IndexPair computeIndexPair(Index row, Index col, const Index distance) const { - const bool left = (side == Lhs); - Index nocontract_val[2] = {left ? row : col, left ? row + distance : col}; - Index linidx[2] = {0, 0}; - if (array_size::value > array_size::value) { - for (int i = static_cast(array_size::value) - 1; i > 0; i--) { - const Index idx0 = nocontract_val[0] / m_ij_strides[i]; - const Index idx1 = nocontract_val[1] / m_ij_strides[i]; - linidx[0] += idx0 * m_nocontract_strides[i]; - linidx[1] += idx1 * m_nocontract_strides[i]; - nocontract_val[0] -= idx0 * m_ij_strides[i]; - nocontract_val[1] -= idx1 * m_ij_strides[i]; - } - if (side == Lhs && inner_dim_contiguous) { - eigen_assert(m_nocontract_strides[0] == 1); - linidx[0] += nocontract_val[0]; - linidx[1] += nocontract_val[1]; - } else { - linidx[0] += nocontract_val[0] * m_nocontract_strides[0]; - linidx[1] += nocontract_val[1] * m_nocontract_strides[0]; - } - } - - Index contract_val[2] = {left ? col : row, left ? col : row + distance}; - if (array_size::value> 0) { - for (int i = static_cast(array_size::value) - 1; i > 0; i--) { - const Index idx0 = contract_val[0] / m_k_strides[i]; - const Index idx1 = contract_val[1] / m_k_strides[i]; - linidx[0] += idx0 * m_contract_strides[i]; - linidx[1] += idx1 * m_contract_strides[i]; - contract_val[0] -= idx0 * m_k_strides[i]; - contract_val[1] -= idx1 * m_k_strides[i]; - } - - if (side == Rhs && inner_dim_contiguous) { - eigen_assert(m_contract_strides[0] == 1); - linidx[0] += contract_val[0]; - linidx[1] += contract_val[1]; - } else { - linidx[0] += contract_val[0] * m_contract_strides[0]; - linidx[1] += contract_val[1] * m_contract_strides[0]; - } - } - return IndexPair(linidx[0], linidx[1]); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index firstAligned(Index size) const { - // Only claim alignment when we can compute the actual stride (ie when we're - // dealing with the lhs with inner_dim_contiguous. This is because the - // matrix-vector product relies on the stride when dealing with aligned inputs. - return (Alignment == Aligned) && (side == Lhs) && inner_dim_contiguous ? 0 : size; - } - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index stride() const { - return ((side == Lhs) && inner_dim_contiguous && array_size::value > 0) ? m_contract_strides[0] : 1; - } - - protected: - CoeffLoader m_tensor; - const nocontract_t m_nocontract_strides; - const nocontract_t m_ij_strides; - const contract_t m_contract_strides; - const contract_t m_k_strides; -}; - -template class MakePointer_> -class BaseTensorContractionMapper : public SimpleTensorContractionMapper -{ - public: - typedef SimpleTensorContractionMapper ParentMapper; - - EIGEN_DEVICE_FUNC - BaseTensorContractionMapper(const Tensor& tensor, - const nocontract_t& nocontract_strides, - const nocontract_t& ij_strides, - const contract_t& contract_strides, - const contract_t& k_strides) : - ParentMapper(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) { } - - typedef typename Tensor::PacketReturnType Packet; - typedef typename unpacket_traits::half HalfPacket; - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PacketT load(Index i, Index j) const { - // whole method makes column major assumption - - // don't need to add offsets for now (because operator handles that) - // current code assumes packet size must be a multiple of 2 - EIGEN_STATIC_ASSERT(packet_size % 2 == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - - if (Tensor::PacketAccess && inner_dim_contiguous && !inner_dim_reordered) { - const Index index = this->computeIndex(i, j); - eigen_assert(this->computeIndex(i+packet_size-1, j) == index + packet_size-1); - return this->m_tensor.template packet(index); - } - - const IndexPair indexPair = this->computeIndexPair(i, j, packet_size - 1); - const Index first = indexPair.first; - const Index last = indexPair.second; - - // We can always do optimized packet reads from left hand side right now, because - // the vertical matrix dimension on the left hand side is never contracting. - // On the right hand side we need to check if the contracting dimensions may have - // been shuffled first. - if (Tensor::PacketAccess && - (side == Lhs || internal::array_size::value <= 1 || !inner_dim_reordered) && - (last - first) == (packet_size - 1)) { - - return this->m_tensor.template packet(first); - } - - EIGEN_ALIGN_MAX Scalar data[packet_size]; - - data[0] = this->m_tensor.coeff(first); - for (Index k = 1; k < packet_size - 1; k += 2) { - const IndexPair internal_pair = this->computeIndexPair(i + k, j, 1); - data[k] = this->m_tensor.coeff(internal_pair.first); - data[k + 1] = this->m_tensor.coeff(internal_pair.second); - } - data[packet_size - 1] = this->m_tensor.coeff(last); - - return pload(data); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Packet loadPacket(Index i, Index j) const { - return this->load(i,j); - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE HalfPacket loadHalfPacket(Index i, Index j) const { - // whole method makes column major assumption - - // don't need to add offsets for now (because operator handles that) - const Index half_packet_size = unpacket_traits::size; - if (half_packet_size == packet_size) { - return loadPacket(i, j); - } - EIGEN_ALIGN_MAX Scalar data[half_packet_size]; - for (Index k = 0; k < half_packet_size; k++) { - data[k] = operator()(i + k, j); - } - return pload(data); - } -}; - - -template class MakePointer_> -class BaseTensorContractionMapper : public SimpleTensorContractionMapper -{ - public: - typedef SimpleTensorContractionMapper ParentMapper; - - EIGEN_DEVICE_FUNC - BaseTensorContractionMapper(const Tensor& tensor, - const nocontract_t& nocontract_strides, - const nocontract_t& ij_strides, - const contract_t& contract_strides, - const contract_t& k_strides) : - ParentMapper(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) { } - - typedef typename Tensor::PacketReturnType Packet; - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Packet loadPacket(Index i, Index j) const { - EIGEN_ALIGN_MAX Scalar data[1]; - data[0] = this->m_tensor.coeff(this->computeIndex(i, j)); - return pload(data); - } - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PacketT load(Index i, Index j) const { - EIGEN_ALIGN_MAX Scalar data[1]; - data[0] = this->m_tensor.coeff(this->computeIndex(i, j)); - return pload(data); - } - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Packet loadHalfPacket(Index i, Index j) const { - return loadPacket(i, j); - } -}; - - -template class MakePointer_=MakePointer> -class TensorContractionSubMapper { - public: - typedef typename Tensor::PacketReturnType Packet; - typedef typename unpacket_traits::half HalfPacket; - - typedef BaseTensorContractionMapper ParentMapper; - typedef TensorContractionSubMapper Self; - typedef Self LinearMapper; - - enum { - // We can use direct offsets iff the parent mapper supports then and we can compute the strides. - // TODO: we should also enable direct offsets for the Rhs case. - UseDirectOffsets = ParentMapper::DirectOffsets && (side == Lhs) && inner_dim_contiguous && (array_size::value > 0) - }; - - EIGEN_DEVICE_FUNC TensorContractionSubMapper(const ParentMapper& base_mapper, Index vert_offset, Index horiz_offset) - : m_base_mapper(base_mapper), m_vert_offset(vert_offset), m_horiz_offset(horiz_offset) { - // Bake the offsets into the buffer used by the base mapper whenever possible. This avoids the need to recompute - // this offset every time we attempt to access a coefficient. - if (UseDirectOffsets) { - Index stride = m_base_mapper.stride(); - m_base_mapper.offsetBuffer(vert_offset + horiz_offset * stride); - } - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const { - if (UseDirectOffsets) { - return m_base_mapper(i, 0); - } - return m_base_mapper(i + m_vert_offset, m_horiz_offset); - } - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i, Index j) const { - if (UseDirectOffsets) { - return m_base_mapper(i, j); - } - return m_base_mapper(i + m_vert_offset, j + m_horiz_offset); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i) const { - if (UseDirectOffsets) { - return m_base_mapper.template loadPacket(i, 0); - } - return m_base_mapper.template loadPacket(i + m_vert_offset, m_horiz_offset); - } - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i, Index j) const { - if (UseDirectOffsets) { - return m_base_mapper.template loadPacket(i, j); - } - return m_base_mapper.template loadPacket(i + m_vert_offset, j + m_horiz_offset); - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT loadPacket(Index i, Index j) const { - if (UseDirectOffsets) { - return m_base_mapper.template load(i, j); - } - return m_base_mapper.template loadPacket(i + m_vert_offset, j + m_horiz_offset); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i) const { - if (UseDirectOffsets) { - return m_base_mapper.template loadHalfPacket(i, 0); - } - return m_base_mapper.template loadHalfPacket(i + m_vert_offset, m_horiz_offset); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const Packet& p) const { - if (UseDirectOffsets) { - m_base_mapper.storePacket(i, 0, p); - } - m_base_mapper.storePacket(i + m_vert_offset, m_horiz_offset, p); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const { - if (UseDirectOffsets) { - return LinearMapper(m_base_mapper, i, j); - } - return LinearMapper(m_base_mapper, i + m_vert_offset, j + m_horiz_offset); - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i) const { - EIGEN_STATIC_ASSERT((internal::is_same::value), YOU_MADE_A_PROGRAMMING_MISTAKE); - const int ActualAlignment = (AlignmentType == Aligned) && (Alignment == Aligned) ? Aligned : Unaligned; - if (UseDirectOffsets) { - return m_base_mapper.template loadPacket(i, 0); - } - return m_base_mapper.template loadPacket(i + m_vert_offset, m_horiz_offset); - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool aligned(Index) const { - return false; - } - - private: - ParentMapper m_base_mapper; - const Index m_vert_offset; - const Index m_horiz_offset; -}; - - -template class MakePointer_=MakePointer> -class TensorContractionInputMapper - : public BaseTensorContractionMapper { - - public: - typedef Scalar_ Scalar; - typedef BaseTensorContractionMapper Base; - typedef TensorContractionSubMapper SubMapper; - typedef SubMapper VectorMapper; - - EIGEN_DEVICE_FUNC TensorContractionInputMapper(const Tensor& tensor, - const nocontract_t& nocontract_strides, - const nocontract_t& ij_strides, - const contract_t& contract_strides, - const contract_t& k_strides) - : Base(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) { } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE SubMapper getSubMapper(Index i, Index j) const { - return SubMapper(*this, i, j); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const { - return VectorMapper(*this, i, j); - } -}; - - - -} // end namespace internal -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_MAPPER_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h deleted file mode 100644 index e87de0c5..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h +++ /dev/null @@ -1,400 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Mehdi Goli Codeplay Software Ltd. -// Ralph Potter Codeplay Software Ltd. -// Luke Iwanski Codeplay Software Ltd. -// Contact: -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -/***************************************************************** - * TensorSyclConvertToDeviceExpression.h - * - * \brief: - * TensorContractionsycl - * -*****************************************************************/ - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_SYCL_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_SYCL_H -namespace Eigen { - -template struct LaunchSyclKernels; -template -struct TensorEvaluator, const Eigen::SyclDevice> : - public TensorContractionEvaluatorBase, const Eigen::SyclDevice> > { - - typedef const Eigen::SyclDevice Device; - - typedef TensorEvaluator, Device> Self; - typedef TensorContractionEvaluatorBase Base; - typedef TensorContractionOp XprType; - typedef typename internal::remove_const::type Scalar; - typedef typename XprType::Index Index; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - enum { - Layout = TensorEvaluator::Layout, - }; - - // Most of the code is assuming that both input tensors are ColMajor. If the - // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS: - // If we want to compute A * B = C, where A is LHS and B is RHS, the code - // will pretend B is LHS and A is RHS. - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), LeftArgType, RightArgType>::type EvalLeftArgType; - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), RightArgType, LeftArgType>::type EvalRightArgType; - - static const int LDims = - internal::array_size::Dimensions>::value; - static const int RDims = - internal::array_size::Dimensions>::value; - static const int ContractDims = internal::array_size::value; - - typedef array left_dim_mapper_t; - typedef array right_dim_mapper_t; - - typedef array contract_t; - typedef array left_nocontract_t; - typedef array right_nocontract_t; - - static const int NumDims = LDims + RDims - 2 * ContractDims; - - typedef DSizes Dimensions; - - // typedefs needed in evalTo - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - - typedef typename LeftEvaluator::Dimensions LeftDimensions; - typedef typename RightEvaluator::Dimensions RightDimensions; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) : - Base(op, device) {} - - // We need to redefine this method to make nvcc happy - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* data) { - this->m_leftImpl.evalSubExprsIfNeeded(NULL); - this->m_rightImpl.evalSubExprsIfNeeded(NULL); - if (data) { - evalTo(data); - return false; - } else { - this->m_result = static_cast(this->m_device.allocate(this->dimensions().TotalSize() * sizeof(Scalar))); - evalTo(this->m_result); - return true; - } - } - const Eigen::SyclDevice& device() const {return this->m_device;} - void evalTo(Scalar* buffer) const { - // Here is the result - if (this->m_lhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - else { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - } - else { - if (this->m_rhs_inner_dim_contiguous) { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - else { - if (this->m_rhs_inner_dim_reordered) { - evalTyped(buffer); - } - else { - evalTyped(buffer); - } - } - } - } - - template - void evalTyped(Scalar* buffer) const { - // columns in left side, rows in right side - const Index k = this->m_k_size; - EIGEN_UNUSED_VARIABLE(k) - // rows in left side - const Index m = this->m_i_size; - // columns in right side - const Index n = this->m_j_size; - - // zero out the result buffer (which must be of size at least m * n * sizeof(Scalar) - this->m_device.memset(buffer, 0, m * n * sizeof(Scalar)); - LaunchSyclKernels::Run(*this, buffer, m, n, k, - this->m_k_strides, this->m_left_contracting_strides, this->m_right_contracting_strides, - this->m_i_strides, this->m_j_strides, this->m_left_nocontract_strides, this->m_right_nocontract_strides); - } - // required by sycl to construct the expr on the device. Returns original left_impl - const TensorEvaluator& left_impl() const { - return choose(Cond(Layout) == static_cast(ColMajor)>(), this->m_leftImpl, this->m_rightImpl); - } - // required by sycl to construct the expr on the device. Returns original right_impl - const TensorEvaluator& right_impl() const { - return choose(Cond(Layout) == static_cast(ColMajor)>(), this->m_rightImpl, this->m_leftImpl); - } -}; - -template struct KernelConstructor{ - typedef typename Eigen::internal::traits::_LhsNested LHSHostExpr; - typedef typename Eigen::internal::traits::_RhsNested RHSHostExpr; - typedef typename Eigen::TensorSycl::internal::createPlaceHolderExpression::Type LHSPlaceHolderExpr; - typedef typename Eigen::TensorSycl::internal::createPlaceHolderExpression::Type RHSPlaceHolderExpr; - LHSFunctorExpr lhs_functors; - RHSFunctorExpr rhs_functors; - LhsLocalAcc localLhs; - RhsLocalAcc localRhs; - OutAccessor out_res; - Index roundUpK, M, N, K; - ContractT m_k_strides, m_left_contracting_strides, m_right_contracting_strides; - LeftNocontractT m_i_strides, m_left_nocontract_strides; - RightNocontractT m_j_strides, m_right_nocontract_strides; - LHSTupleType left_tuple_of_accessors; - RHSTupleType right_tuple_of_accessors; - Device dev; - - - KernelConstructor(LHSFunctorExpr lhs_functors_, RHSFunctorExpr rhs_functors_, LhsLocalAcc localLhs_, RhsLocalAcc localRhs_, OutAccessor out_res_, - Index roundUpK_, Index M_, Index N_, Index K_, ContractT m_k_strides_, ContractT m_left_contracting_strides_, - ContractT m_right_contracting_strides_, LeftNocontractT m_i_strides_, RightNocontractT m_j_strides_, - LeftNocontractT m_left_nocontract_strides_, RightNocontractT m_right_nocontract_strides_, LHSTupleType left_tuple_of_accessors_, RHSTupleType right_tuple_of_accessors_, Device dev_) - :lhs_functors(lhs_functors_), rhs_functors(rhs_functors_), localLhs(localLhs_), localRhs(localRhs_), out_res(out_res_), roundUpK(roundUpK_), M(M_), N(N_), K(K_), - m_k_strides(m_k_strides_), m_left_contracting_strides(m_left_contracting_strides_), - m_right_contracting_strides(m_right_contracting_strides_), - m_i_strides(m_i_strides_), m_left_nocontract_strides(m_left_nocontract_strides_), - m_j_strides(m_j_strides_), m_right_nocontract_strides(m_right_nocontract_strides_), - left_tuple_of_accessors(left_tuple_of_accessors_), right_tuple_of_accessors(right_tuple_of_accessors_), dev(dev_){} - - void operator()(cl::sycl::nd_item<1> itemID) { - typedef typename Eigen::TensorSycl::internal::ConvertToDeviceExpression::Type DevExpr; - typedef typename Eigen::TensorSycl::internal::ConvertToDeviceExpression::Type LHSDevExpr; - typedef typename Eigen::TensorSycl::internal::ConvertToDeviceExpression::Type RHSDevExpr; - auto lhs_dev_expr = Eigen::TensorSycl::internal::createDeviceExpression(lhs_functors, left_tuple_of_accessors); - auto rhs_dev_expr = Eigen::TensorSycl::internal::createDeviceExpression(rhs_functors, right_tuple_of_accessors); - typedef decltype(lhs_dev_expr.expr) LeftArgType; - typedef decltype(rhs_dev_expr.expr) RightArgType; - typedef typename internal::conditional(Eigen::internal::traits::Layout) == static_cast(ColMajor), LeftArgType, RightArgType>::type EvalLeftArgType; - typedef typename internal::conditional(Eigen::internal::traits::Layout) == static_cast(ColMajor), RightArgType, LeftArgType>::type EvalRightArgType; - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - typedef internal::TensorContractionInputMapper LhsMapper; - - typedef internal::TensorContractionInputMapper RhsMapper; - // initialize data mappers must happen inside the kernel for device eval - LhsMapper lhs(LeftEvaluator(choose(Cond(Eigen::internal::traits::Layout) == static_cast(ColMajor)>(), - lhs_dev_expr.expr, rhs_dev_expr.expr), dev), m_left_nocontract_strides, m_i_strides, m_left_contracting_strides, m_k_strides); - RhsMapper rhs(RightEvaluator(choose(Cond(Eigen::internal::traits::Layout) == static_cast(ColMajor)>(), - rhs_dev_expr.expr, lhs_dev_expr.expr),dev), m_right_nocontract_strides, m_j_strides, m_right_contracting_strides, m_k_strides); - auto out_ptr = ConvertToActualTypeSycl(OutScalar, out_res); - // Matmul Kernel - // Thread identifiers - const Index mLocalThreadId = itemID.get_local(0); // Local ID row - const Index nLocalThreadId = itemID.get_local(1); // Local ID col - const Index mGroupId = itemID.get_group(0); // Work-group ID row - const Index nGroupId = itemID.get_group(1); // Work-group ID localCol - const Index linearLocalThreadId = nLocalThreadId*LocalThreadSizeM + mLocalThreadId; // linear local thread ID - // Allocate register space - float privateLhs; - float privateRhs[WorkLoadPerThreadN]; - float privateRes[WorkLoadPerThreadM][WorkLoadPerThreadN]; - // Initialise the privateResumulation registers - for (Index wLPTM=0; wLPTM(0); - } - // Tile Rhs - for (Index lPTR=0; lPTR(0); - - } - // Loop over all tiles - const Index numTiles = roundUpK/TileSizeDimK; - Index firstHalf=0; - do { - // Synchronise - itemID.barrier(cl::sycl::access::fence_space::local_space); - // Load the next tile of Lhs and Rhs into local memory - Index nextHalf = firstHalf + 1; - if (nextHalf < numTiles) { - // Tile A - for (Index lPTL=0; lPTL(0); - } - // Tile B - for (Index lPTR=0; lPTR(0); - } - } - // Loop over the values of a single tile - for (Index k=0; k struct LaunchSyclKernels { - -static const Index TileSizeDimM = 32ul; // Tile size for dimension M -static const Index TileSizeDimN = 32ul; // Tile size for dimension N -static const Index TileSizeDimK = 16ul; // Tile size for dimension K -static const Index WorkLoadPerThreadM = 4ul; // Work load per thread in dimension M -static const Index WorkLoadPerThreadN = 4ul; // work load per thread in dimension N -static const Index LocalThreadSizeM = (TileSizeDimM/WorkLoadPerThreadM); // Local thread size for the first dimension (M here) -static const Index LocalThreadSizeN = (TileSizeDimN/WorkLoadPerThreadN); // Local thread size for the second dimension (N here) -static const Index LoadPerThreadLhs = ((TileSizeDimK*WorkLoadPerThreadM*WorkLoadPerThreadN)/(TileSizeDimN)); // workload per thread for Lhs expression -static const Index LoadPerThreadRhs = ((TileSizeDimK*WorkLoadPerThreadM*WorkLoadPerThreadN)/(TileSizeDimM)); // workload per thread for Rhs expression - -// RoundUp function to make sure that the global threadId is divisable by local threadId -static Index RoundUp(Index x, Index y) { - return ((((x) + (y) - 1) / (y))*(y)); -} - -template< typename Self, typename OutScalar, typename ContractT, typename LeftNocontractT, typename RightNocontractT> - static void Run(const Self& self, OutScalar* buffer, Index M, Index N, Index K, - ContractT m_k_strides, ContractT m_left_contracting_strides, ContractT m_right_contracting_strides, - LeftNocontractT m_i_strides, RightNocontractT m_j_strides, LeftNocontractT m_left_nocontract_strides, RightNocontractT m_right_nocontract_strides){ - - typedef typename Self::XprType HostExpr; - typedef typename Eigen::internal::traits::_LhsNested LHSHostExpr; - typedef typename Eigen::internal::traits::_RhsNested RHSHostExpr; - typedef TensorEvaluator OrigLHSExpr; - typedef TensorEvaluator OrigRHSExpr; - typedef Eigen::TensorSycl::internal::FunctorExtractor LHSFunctorExpr; - typedef Eigen::TensorSycl::internal::FunctorExtractor RHSFunctorExpr; - // extract lhs functor list - LHSFunctorExpr lhs_functors = Eigen::TensorSycl::internal::extractFunctors(self.left_impl()); - // extract rhs functor list - RHSFunctorExpr rhs_functors = Eigen::TensorSycl::internal::extractFunctors(self.left_impl()); - - Index roundUpK = RoundUp(K, TileSizeDimK); - Index roundUpM = RoundUp(M, TileSizeDimM); - Index roundUpN = RoundUp(N, TileSizeDimN); - - self.device().sycl_queue().submit([&](cl::sycl::handler &cgh) { - /// work-around for gcc bug - typedef decltype(Eigen::TensorSycl::internal::createTupleOfAccessors(cgh, self.left_impl())) LHSTupleType; - /// work-around for gcc bug - typedef decltype(Eigen::TensorSycl::internal::createTupleOfAccessors(cgh, self.right_impl())) RHSTupleType; - // create lhs tuple of accessors - LHSTupleType left_tuple_of_accessors = Eigen::TensorSycl::internal::createTupleOfAccessors(cgh, self.left_impl()); - // create rhs tuple of accessors - RHSTupleType right_tuple_of_accessors = Eigen::TensorSycl::internal::createTupleOfAccessors(cgh, self.right_impl()); - - // Local memory for elements of Lhs - typedef cl::sycl::accessor LhsLocalAcc; - LhsLocalAcc localLhs(cl::sycl::range<1>(2* TileSizeDimM * TileSizeDimK), cgh); - // Local memory for elements of Rhs - typedef cl::sycl::accessor RhsLocalAcc; - RhsLocalAcc localRhs(cl::sycl::range<1>(2* TileSizeDimK * TileSizeDimN), cgh); - - typedef cl::sycl::accessor OutAccessor; - //OutScalar memory - OutAccessor out_res= self.device(). template get_sycl_accessor(cgh, buffer); - - // sycl parallel for - cgh.parallel_for(cl::sycl::nd_range<2>(cl::sycl::range<2>(roundUpM/WorkLoadPerThreadM, roundUpN/WorkLoadPerThreadN), - cl::sycl::range<2>(LocalThreadSizeM, LocalThreadSizeN)), - KernelConstructor(lhs_functors, rhs_functors, - localLhs, localRhs, out_res, roundUpK, M, N, K, m_k_strides, m_left_contracting_strides, m_right_contracting_strides,m_i_strides, m_j_strides, - m_left_nocontract_strides,m_right_nocontract_strides, left_tuple_of_accessors, right_tuple_of_accessors, Eigen::DefaultDevice())); - }); - self.device().asynchronousExec(); - } -}; - -} // end namespace Eigen -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_SYCL_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h deleted file mode 100644 index d30cc96a..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h +++ /dev/null @@ -1,1252 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_THREAD_POOL_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_THREAD_POOL_H - -// evaluator for thread pool device -#ifdef EIGEN_USE_THREADS - -namespace Eigen { - -#ifdef EIGEN_USE_SIMPLE_THREAD_POOL -namespace internal { - -template -struct packLhsArg { - LhsScalar* blockA; - const LhsMapper& lhs; - const Index m_start; - const Index k_start; - const Index mc; - const Index kc; -}; - -template -struct packRhsAndKernelArg { - const MaxSizeVector* blockAs; - RhsScalar* blockB; - const RhsMapper& rhs; - OutputMapper& output; - const Index m; - const Index k; - const Index n; - const Index mc; - const Index kc; - const Index nc; - const Index num_threads; - const Index num_blockAs; - const Index max_m; - const Index k_block_idx; - const Index m_block_idx; - const Index n_block_idx; - const Index m_blocks; - const Index n_blocks; - MaxSizeVector* kernel_notifications; - const MaxSizeVector* lhs_notifications; - const bool need_to_pack; -}; - -} // end namespace internal -#endif // EIGEN_USE_SIMPLE_THREAD_POOL - -template -struct TensorEvaluator, ThreadPoolDevice> : - public TensorContractionEvaluatorBase, ThreadPoolDevice> > { - - typedef ThreadPoolDevice Device; - - typedef TensorEvaluator, Device> Self; - typedef TensorContractionEvaluatorBase Base; - - typedef TensorContractionOp XprType; - typedef typename internal::remove_const::type Scalar; - typedef typename XprType::Index Index; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - enum { - Layout = TensorEvaluator::Layout, - }; - - // Most of the code is assuming that both input tensors are ColMajor. If the - // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS: - // If we want to compute A * B = C, where A is LHS and B is RHS, the code - // will pretend B is LHS and A is RHS. - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), LeftArgType, RightArgType>::type EvalLeftArgType; - typedef typename internal::conditional< - static_cast(Layout) == static_cast(ColMajor), RightArgType, LeftArgType>::type EvalRightArgType; - - static const int LDims = - internal::array_size::Dimensions>::value; - static const int RDims = - internal::array_size::Dimensions>::value; - static const int ContractDims = internal::array_size::value; - - typedef array left_dim_mapper_t; - typedef array right_dim_mapper_t; - - typedef array contract_t; - typedef array left_nocontract_t; - typedef array right_nocontract_t; - - static const int NumDims = LDims + RDims - 2 * ContractDims; - - typedef DSizes Dimensions; - - // typedefs needed in evalTo - typedef typename internal::remove_const::type LhsScalar; - typedef typename internal::remove_const::type RhsScalar; - typedef typename internal::gebp_traits Traits; - - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - - TensorEvaluator(const XprType& op, const Device& device) : - Base(op, device) {} - -#ifndef EIGEN_USE_SIMPLE_THREAD_POOL - template - void evalProduct(Scalar* buffer) const { - const Index m = this->m_i_size; - const Index n = this->m_j_size; - const Index k = this->m_k_size; - if (m == 0 || n == 0 || k == 0) return; - -#if defined(EIGEN_VECTORIZE_AVX) && defined(EIGEN_USE_LIBXSMM) - if (this->m_can_use_xsmm) { - bool transposeA = !this->m_lhs_inner_dim_contiguous; - bool transposeB = !this->m_rhs_inner_dim_contiguous; - internal::TensorXsmmContractionBlocking - blocking(k, m, n, this->m_device.numThreads(), transposeA, - transposeB); - - if (blocking.num_threads() == 1) { - this->evalGemmXSMM(buffer); - } else { - ContextXsmm(this, buffer, m, n, k, blocking).run(); - } - return; - } -#endif - - typedef - typename internal::remove_const::type - LhsScalar; - typedef - typename internal::remove_const::type - RhsScalar; - typedef typename internal::gebp_traits Traits; - typedef TensorEvaluator LeftEvaluator; - typedef TensorEvaluator RightEvaluator; - typedef internal::TensorContractionInputMapper< - LhsScalar, Index, internal::Lhs, LeftEvaluator, left_nocontract_t, - contract_t, internal::packet_traits::size, - lhs_inner_dim_contiguous, false, Unaligned> - LhsMapper; - typedef internal::TensorContractionInputMapper< - RhsScalar, Index, internal::Rhs, RightEvaluator, right_nocontract_t, - contract_t, internal::packet_traits::size, - rhs_inner_dim_contiguous, rhs_inner_dim_reordered, Unaligned> - RhsMapper; - typedef internal::blas_data_mapper OutputMapper; - typedef internal::gemm_pack_lhs - LhsPacker; - typedef internal::gemm_pack_rhs< - RhsScalar, Index, typename RhsMapper::SubMapper, Traits::nr, ColMajor> - RhsPacker; - typedef internal::gebp_kernel - GebpKernel; - - - - // Compute a set of algorithm parameters: - // - kernel block sizes (bm, bn, bk) - // - task grain sizes (number of kernels executed per task: gm, gn) - // - number of threads - // - sharding by row/column - // - parallel packing or first lhs then rhs - // and some derived parameters: - // - number of tasks (nm, nn, nk) - // - number of kernels (nm0, nn0) - // Unfortunately, all these parameters are tightly interdependent. - // So in some cases we first compute approximate values, then compute other - // values based on these approximations and then refine the approximations. - - // There are lots of heuristics here. There is some reasoning behind them, - // but ultimately they are just tuned on contraction benchmarks for - // different input configurations, thread counts and instruction sets. - // So feel free to question any of them. - - // Compute whether we want to shard by row or by column. - // This is a first approximation, it will be refined later. Since we don't - // know number of threads yet we use 2, because what's we are most - // interested in at this point is whether it makes sense to use - // parallelization at all or not. - bool shard_by_col = shardByCol(m, n, 2); - - // First approximation of kernel blocking sizes. - // Again, we don't know number of threads yet, so we use 2. - Index bm, bn, bk; - if (shard_by_col) { - internal::TensorContractionBlocking - blocking(k, m, n, 2); - bm = blocking.mc(); - bn = blocking.nc(); - bk = blocking.kc(); - } else { - internal::TensorContractionBlocking - blocking(k, m, n, 2); - bm = blocking.mc(); - bn = blocking.nc(); - bk = blocking.kc(); - } - - // Compute optimal number of threads. - // Note: we use bk instead of k here because we are interested in amount of - // _parallelizable_ computations, and computations are not parallelizable - // across k dimension. - const TensorOpCost cost = - contractionCost(m, n, bm, bn, bk, shard_by_col, false); - int num_threads = TensorCostModel::numThreads( - static_cast(n) * m, cost, this->m_device.numThreads()); - - // TODO(dvyukov): this is a stop-gap to prevent regressions while the cost - // model is not tuned. Remove this when the cost model is tuned. - if (n == 1) num_threads = 1; - - if (num_threads == 1) { - // The single-threaded algorithm should be faster in this case. - if (n == 1) - this->template evalGemv(buffer); - else - this->template evalGemm(buffer); - return; - } - - // Now that we know number of threads, recalculate sharding and blocking. - shard_by_col = shardByCol(m, n, num_threads); - if (shard_by_col) { - internal::TensorContractionBlocking - blocking(k, m, n, num_threads); - bm = blocking.mc(); - bn = blocking.nc(); - bk = blocking.kc(); - } else { - internal::TensorContractionBlocking - blocking(k, m, n, num_threads); - bm = blocking.mc(); - bn = blocking.nc(); - bk = blocking.kc(); - } - - // Number of kernels for each dimension. - Index nm0 = divup(m, bm); - Index nn0 = divup(n, bn); - Index nk = divup(k, bk); - - // Calculate task grain size (number of kernels executed per task). - // This task size coarsening serves two purposes: - // 1. It reduces per-task overheads including synchronization overheads. - // 2. It allows to use caches better (reuse the same packed rhs in several - // consecutive kernels). - Index gm = 1; - Index gn = 1; - // If we are sharding by column, then we prefer to reduce rows first. - if (shard_by_col) { - gm = coarsenM(m, n, bm, bn, bk, gn, num_threads, shard_by_col); - gn = coarsenN(m, n, bm, bn, bk, gm, num_threads, shard_by_col); - } else { - gn = coarsenN(m, n, bm, bn, bk, gm, num_threads, shard_by_col); - gm = coarsenM(m, n, bm, bn, bk, gn, num_threads, shard_by_col); - } - // Number of tasks in each dimension. - Index nm = divup(nm0, gm); - Index nn = divup(nn0, gn); - - // Last by not least, decide whether we want to issue both lhs and rhs - // packing in parallel; or issue lhs packing first, and then issue rhs - // packing when lhs packing completes (for !shard_by_col lhs and rhs are - // swapped). Parallel packing allows more parallelism (for both packing and - // kernels), while sequential packing provides better locality (once - // a thread finishes rhs packing it proceed to kernels with that rhs). - // First, we are interested in parallel packing if there are few tasks. - bool parallel_pack = num_threads >= nm * nn; - // Also do parallel packing if all data fits into L2$. - if (m * bk * Index(sizeof(LhsScalar)) + n * bk * Index(sizeof(RhsScalar)) <= - l2CacheSize() * num_threads) - parallel_pack = true; - // But don't do it if we will use each rhs only once. Locality seems to be - // more important in this case. - if ((shard_by_col ? nm : nn) == 1) parallel_pack = false; - - LhsMapper lhs(this->m_leftImpl, this->m_left_nocontract_strides, - this->m_i_strides, this->m_left_contracting_strides, - this->m_k_strides); - - RhsMapper rhs(this->m_rightImpl, this->m_right_nocontract_strides, - this->m_j_strides, this->m_right_contracting_strides, - this->m_k_strides); - - Context(this->m_device, num_threads, lhs, rhs, buffer, m, n, - k, bm, bn, bk, nm, nn, nk, gm, gn, nm0, nn0, - shard_by_col, parallel_pack) - .run(); - } - - // Context coordinates a single parallel gemm operation. - template - class Context { - public: - Context(const Device& device, int num_threads, LhsMapper& lhs, - RhsMapper& rhs, Scalar* buffer, Index tm, Index tn, Index tk, Index bm, - Index bn, Index bk, Index nm, Index nn, Index nk, Index gm, - Index gn, Index nm0, Index nn0, bool shard_by_col, - bool parallel_pack) - : device_(device), - lhs_(lhs), - rhs_(rhs), - buffer_(buffer), - output_(buffer, tm), - num_threads_(num_threads), - shard_by_col_(shard_by_col), - parallel_pack_(parallel_pack), - m_(tm), - n_(tn), - k_(tk), - bm_(bm), - bn_(bn), - bk_(bk), - nm_(nm), - nn_(nn), - nk_(nk), - gm_(gm), - gn_(gn), - nm0_(nm0), - nn0_(nn0) - { - for (Index x = 0; x < P; x++) { - // Normal number of notifications for k slice switch is - // nm_ + nn_ + nm_ * nn_. However, first P - 1 slices will receive only - // nm_ + nn_ notifications, because they will not receive notifications - // from preceeding kernels. - state_switch_[x] = - x == 0 - ? 1 - : (parallel_pack_ ? nn_ + nm_ : (shard_by_col_ ? nn_ : nm_)) + - (x == P - 1 ? nm_ * nn_ : 0); - state_packing_ready_[x] = - parallel_pack_ ? 0 : (shard_by_col_ ? nm_ : nn_); - state_kernel_[x] = new std::atomic*[nm_]; - for (Index m = 0; m < nm_; m++) { - state_kernel_[x][m] = new std::atomic[nn_]; - // Kernels generally receive 3 notifications (previous kernel + 2 - // packing), but the first slice won't get notifications from previous - // kernels. - for (Index n = 0; n < nn_; n++) - state_kernel_[x][m][n].store( - (x == 0 ? 0 : 1) + (parallel_pack_ ? 2 : 1), - std::memory_order_relaxed); - } - } - - // Allocate memory for packed rhs/lhs matrices. - size_t align = numext::maxi(EIGEN_MAX_ALIGN_BYTES, 1); - size_t lhs_size = - divup(bm_ * bk_ * sizeof(LhsScalar), align) * align; - size_t rhs_size = - divup(bn_ * bk_ * sizeof(RhsScalar), align) * align; - packed_mem_ = static_cast(internal::aligned_malloc( - (nm0_ * lhs_size + nn0_ * rhs_size) * std::min(nk_, P - 1))); - char* mem = static_cast(packed_mem_); - for (Index x = 0; x < numext::mini(nk_, P - 1); x++) { - packed_lhs_[x].resize(nm0_); - for (Index m = 0; m < nm0_; m++) { - packed_lhs_[x][m] = reinterpret_cast(mem); - mem += lhs_size; - } - packed_rhs_[x].resize(nn0_); - for (Index n = 0; n < nn0_; n++) { - packed_rhs_[x][n] = reinterpret_cast(mem); - mem += rhs_size; - } - } - } - - ~Context() { - for (Index x = 0; x < P; x++) { - for (Index m = 0; m < nm_; m++) delete[] state_kernel_[x][m]; - delete[] state_kernel_[x]; - } - internal::aligned_free(packed_mem_); - } - - void run() { - // Kick off packing of the first slice. - signal_switch(0, 1); - // Wait for overall completion. - // TODO(dvyukov): this wait can lead to deadlock. - // If nthreads contractions are concurrently submitted from worker - // threads, this wait will block all worker threads and the system will - // deadlock. - done_.Wait(); - } - - private: - Notification done_; - const Device& device_; - LhsMapper& lhs_; - RhsMapper& rhs_; - Scalar* const buffer_; - OutputMapper output_; - const int num_threads_; - const bool shard_by_col_; - const bool parallel_pack_; - // Matrix sizes. - const Index m_; - const Index n_; - const Index k_; - // Block sizes. - const Index bm_; - const Index bn_; - const Index bk_; - // Number of tasks. - const Index nm_; - const Index nn_; - const Index nk_; - // Task grain sizes (number of kernels executed per task). - const Index gm_; - const Index gn_; - // Number of blocks (this is different from ni_/nn_ because of task size - // coarsening). - const Index nm0_; - const Index nn0_; - - // Parallelization strategy. - // - // Blocks related to the same k block can run in parallel because they write - // to different output blocks. So we parallelize within k slices, this - // gives us parallelism level of m x n. Before we can start any kernels - // related to k-th slice, we need to issue m lhs packing tasks and n rhs - // packing tasks. - // - // However, there is a bottleneck when we are finishing kernels for k-th - // slice (at the very end there is only 1 runnable kernel). To mitigate this - // bottleneck we allow kernels from k-th and k+1-th slices to run in - // parallel. Note that (m, n, k) and (m, n, k+1) kernels write to the same - // output block, so they must not run in parallel. - // - // This gives us the following dependency graph. - // On each k slice we have m x n kernel tasks, m lhs paking tasks and n rhs - // packing tasks. - // Kernel (m, n, k) can start when: - // - kernel (m, n, k-1) has finished - // - lhs packing (m, k) has finished - // - rhs packing (n, k) has finished - // Lhs/rhs packing can start when: - // - all k-1 packing has finished (artificially imposed to limit amount of - // parallel packing) - // - // On top of that we limit runnable tasks to two consecutive k slices. - // This is done to limit amount of memory we need for packed lhs/rhs - // (for each k slice we need m*bk + n*bk memory in packed_lhs_/packed_rhs_). - // - // state_switch_ tracks when we are ready to switch to the next k slice. - // state_kernel_[m][n] tracks when we are ready to kick off kernel (m, n). - // These variable are rolling over 3 consecutive k slices: first two we are - // actively executing + one to track completion of kernels in the second - // slice. - static const Index P = 3; - void* packed_mem_; - std::vector packed_lhs_[P - 1]; - std::vector packed_rhs_[P - 1]; - std::atomic** state_kernel_[P]; - // state_switch_ is frequently modified by worker threads, while other - // fields are read-only after constructor. Let's move it to a separate cache - // line to reduce cache-coherency traffic. - char pad_[128]; - std::atomic state_packing_ready_[P]; - std::atomic state_switch_[P]; - - void pack_lhs(Index m, Index k) { - const Index mend = m * gm_ + gm(m); - for (Index m1 = m * gm_; m1 < mend; m1++) - LhsPacker()(packed_lhs_[k % (P - 1)][m1], - lhs_.getSubMapper(m1 * bm_, k * bk_), bk(k), bm(m1)); - - if (!parallel_pack_ && shard_by_col_) { - signal_packing(k); - } else { - signal_switch(k + 1); - for (Index n = nn_ - 1; n >= 0; n--) signal_kernel(m, n, k, n == 0); - } - } - - void pack_rhs(Index n, Index k) { - const Index nend = n * gn_ + gn(n); - for (Index n1 = n * gn_; n1 < nend; n1++) { - if (k == 0) { - // Zero the output memory in parallel. - // On 10000x2x10000 mm zeroing can easily take half of time. - // Zero (bn x m) row. Safe to do here because all kernels that will - // write to this memory depend on completion of this task. - // Note: don't call device_.memset() here. device_.memset() blocks on - // thread pool worker thread, which can lead to underutilization and - // deadlocks. - memset(buffer_ + n1 * bn_ * m_, 0, bn(n1) * m_ * sizeof(Scalar)); - } - RhsPacker()(packed_rhs_[k % (P - 1)][n1], - rhs_.getSubMapper(k * bk_, n1 * bn_), bk(k), bn(n1)); - } - - if (parallel_pack_ || shard_by_col_) { - signal_switch(k + 1); - for (Index m = nm_ - 1; m >= 0; m--) signal_kernel(m, n, k, m == 0); - } else { - signal_packing(k); - } - } - - void kernel(Index m, Index n, Index k) { - // Note: order of iteration matters here. Iteration over m is innermost - // because we want to reuse the same packed rhs in consequetive tasks - // (rhs fits into L2$ while lhs only into L3$). - const Index nend = n * gn_ + gn(n); - const Index mend = m * gm_ + gm(m); - if (shard_by_col_) { - for (Index n1 = n * gn_; n1 < nend; n1++) { - for (Index m1 = m * gm_; m1 < mend; m1++) - GebpKernel()(output_.getSubMapper(m1 * bm_, n1 * bn_), - packed_lhs_[k % (P - 1)][m1], - packed_rhs_[k % (P - 1)][n1], bm(m1), bk(k), bn(n1), - Scalar(1), -1, -1, 0, 0); - } - } else { - for (Index m1 = m * gm_; m1 < mend; m1++) - for (Index n1 = n * gn_; n1 < nend; n1++) { - GebpKernel()(output_.getSubMapper(m1 * bm_, n1 * bn_), - packed_lhs_[k % (P - 1)][m1], - packed_rhs_[k % (P - 1)][n1], bm(m1), bk(k), bn(n1), - Scalar(1), -1, -1, 0, 0); - } - } - signal_kernel(m, n, k + 1, false); - signal_switch(k + 2); - } - - void signal_packing(Index k) { - eigen_assert(!parallel_pack_); - Index s = state_packing_ready_[k % P].fetch_sub(1); - eigen_assert(s > 0); - if (s != 1) return; - state_packing_ready_[k % P] = shard_by_col_ ? nm_ : nn_; - enqueue_packing(k, shard_by_col_); - } - - void signal_kernel(Index m, Index n, Index k, bool sync) { - std::atomic* state = &state_kernel_[k % P][m][n]; - Index s = state->load(); - eigen_assert(s > 0); - if (s != 1 && state->fetch_sub(1) != 1) return; - state->store(parallel_pack_ ? 3 : 2, std::memory_order_relaxed); - if (sync) - kernel(m, n, k); - else - device_.enqueueNoNotification([=]() { kernel(m, n, k); }); - } - - void signal_switch(Index k, Index v = 1) { - Index s = state_switch_[k % P].fetch_sub(v); - eigen_assert(s >= v); - if (s != v) return; - - // Ready to switch to the next k slice. - // Reset counter for the next iteration. - state_switch_[k % P] = - (parallel_pack_ ? nm_ + nn_ : (shard_by_col_ ? nn_ : nm_)) + - nm_ * nn_; - if (k < nk_) { - // Issue lhs/rhs packing. Their completion will in turn kick off - // kernels. - if (parallel_pack_) { - enqueue_packing(k, !shard_by_col_); - enqueue_packing(k, shard_by_col_); - } else if (shard_by_col_) { - enqueue_packing(k, false); - } else { - enqueue_packing(k, true); - } - - // Termination handling. - // Because kernel completion signals k + 2 switch, we need to finish nk - // + 2 slices without issuing any tasks on nk + 1 slice. So here we - // pretend that all nk + 1 packing tasks just finish instantly; so that - // nk + 2 switch only waits for completion of nk kernels. - } else if (k == nk_) { - signal_switch(k + 1, - parallel_pack_ ? nm_ + nn_ : (shard_by_col_ ? nn_ : nm_)); - } else { - done_.Notify(); - } - } - - // Enqueue all rhs/lhs packing for k-th slice. - void enqueue_packing(Index k, bool rhs) { - enqueue_packing_helper(0, rhs ? nn_ : nm_, k, rhs); - } - - void enqueue_packing_helper(Index start, Index end, Index k, bool rhs) { - if (end - start == 1) { - if (rhs) - pack_rhs(start, k); - else - pack_lhs(start, k); - } else { - Index mid = (start + end) / 2; - device_.enqueueNoNotification( - [=]() { enqueue_packing_helper(mid, end, k, rhs); }); - device_.enqueueNoNotification( - [=]() { enqueue_packing_helper(start, mid, k, rhs); }); - } - } - - // Block sizes with accounting for potentially incomplete last block. - Index bm(Index m) const { return m + 1 < nm0_ ? bm_ : m_ + bm_ - bm_ * nm0_; } - Index bn(Index n) const { return n + 1 < nn0_ ? bn_ : n_ + bn_ - bn_ * nn0_; } - Index bk(Index k) const { return k + 1 < nk_ ? bk_ : k_ + bk_ - bk_ * nk_; } - // Task grain sizes accounting for potentially incomplete last task. - Index gm(Index m) const { return m + 1 < nm_ ? gm_ : nm0_ + gm_ - gm_ * nm_; } - Index gn(Index n) const { return n + 1 < nn_ ? gn_ : nn0_ + gn_ - gn_ * nn_; } - - Context(const Context&) = delete; - void operator=(const Context&) = delete; - }; - - // Decide whether we want to shard m x n contraction by columns or by rows. - static bool shardByCol(Index m, Index n, Index num_threads) { - // Note: we are comparing both n and m against Traits::nr, it is not - // a mistake. We are trying to figure out how both n and m will fit into - // the main sharding dimension. - - // Sharding by column is the default - // ... unless there is enough data for vectorization over rows - if (m / num_threads >= Traits::nr && - // and not enough data for vectorization over columns - (n / num_threads < Traits::nr || - // ... or barely enough data for vectorization over columns, - // but it is not evenly dividable across threads - (n / num_threads < 4 * Traits::nr && - (n % (num_threads * Traits::nr)) != 0 && - // ... and it is evenly dividable across threads for rows - ((m % (num_threads * Traits::nr)) == 0 || - // .. or it is not evenly dividable for both dimensions but - // there is much more data over rows so that corner effects are - // mitigated. - (m / n >= 6))))) - return false; - // Wait, or if matrices are just substantially prolonged over the other - // dimension. - if (n / num_threads < 16 * Traits::nr && m > n * 32) return false; - return true; - } - - Index coarsenM(Index m, Index n, Index bm, Index bn, Index bk, Index gn, - int num_threads, bool shard_by_col) const { - Index gm = 1; - Index gm1 = 1; - Index nm0 = divup(m, bm); - Index nm1 = nm0; - for (;;) { - // Find the next candidate for m grain size. It needs to result in - // different number of blocks. E.g. if we have 10 kernels, we want to try - // 5 and 10, but not 6, 7, 8 and 9. - while (gm1 <= nm0 && nm1 == divup(nm0, gm1)) gm1++; - if (gm1 > nm0) break; - // Check the candidate. - int res = checkGrain(m, n, bm, bn, bk, gm1, gn, gm, gn, num_threads, - shard_by_col); - if (res < 0) break; - nm1 = divup(nm0, gm1); - if (res == 0) continue; - // Commit new grain size. - gm = gm1; - } - return gm; - } - - Index coarsenN(Index m, Index n, Index bm, Index bn, Index bk, Index gm, - int num_threads, bool shard_by_col) const { - Index gn = 1; - Index gn1 = 1; - Index nn0 = divup(n, bn); - Index nn1 = nn0; - for (;;) { - while (gn1 <= nn0 && nn1 == divup(nn0, gn1)) gn1++; - if (gn1 > nn0) break; - int res = checkGrain(m, n, bm, bn, bk, gm, gn1, gm, gn, num_threads, - shard_by_col); - if (res < 0) break; - nn1 = divup(nn0, gn1); - if (res == 0) continue; - gn = gn1; - } - return gn; - } - - // checkGrain checks whether grain (gm, gn) is suitable and is better than - // (oldgm, oldgn). - int checkGrain(Index m, Index n, Index bm, Index bn, Index bk, Index gm, - Index gn, Index oldgm, Index oldgn, int num_threads, - bool shard_by_col) const { - const TensorOpCost cost = - contractionCost(bm * gm, bn * gn, bm, bn, bk, shard_by_col, true); - double taskSize = TensorCostModel::taskSize( - static_cast(bm) * gm * bn * gn, cost); - // If the task is too small, then we agree on it regardless of anything - // else. Otherwise synchronization overheads will dominate. - if (taskSize < 1) return 1; - // If it is too large, then we reject it and all larger tasks. - if (taskSize > 2) return -1; - // Now we are in presumably good task size range. - // The main deciding factor here is parallelism. Consider that we have 12 - // kernels and 4 threads. Grains of 2, 3 and 4 all yield good task sizes. - // But 2/4 yield 6/3 tasks, which gives us parallelism of 0.75 (at most 3/4 - // of cores will be busy). While grain size 3 gives us 4 tasks, which gives - // us parallelism of 1 (we can load all cores). - Index nm0 = divup(m, bm); - Index nn0 = divup(n, bn); - Index new_tasks = divup(nm0, gm) * divup(nn0, gn); - double new_parallelism = static_cast(new_tasks) / - (divup(new_tasks, num_threads) * num_threads); - Index old_tasks = divup(nm0, oldgm) * divup(nn0, oldgn); - double old_parallelism = static_cast(old_tasks) / - (divup(old_tasks, num_threads) * num_threads); - if (new_parallelism > old_parallelism || new_parallelism == 1) return 1; - return 0; - } - -#else // EIGEN_USE_SIMPLE_THREAD_POOL - - template - void evalProduct(Scalar* buffer) const { - if (this->m_j_size == 1) { - this->template evalGemv(buffer); - return; - } - - evalGemm(buffer); - } - - template - void evalGemm(Scalar* buffer) const { - // columns in left side, rows in right side - const Index k = this->m_k_size; - - // rows in left side - const Index m = this->m_i_size; - - // columns in right side - const Index n = this->m_j_size; - - // zero out the result buffer (which must be of size at least m * n * sizeof(Scalar) - this->m_device.memset(buffer, 0, m * n * sizeof(Scalar)); - - - const int lhs_packet_size = internal::unpacket_traits::size; - const int rhs_packet_size = internal::unpacket_traits::size; - - typedef internal::TensorContractionInputMapper LhsMapper; - - typedef internal::TensorContractionInputMapper RhsMapper; - - typedef internal::blas_data_mapper OutputMapper; - - // TODO: packing could be faster sometimes if we supported row major tensor mappers - typedef internal::gemm_pack_lhs LhsPacker; - typedef internal::gemm_pack_rhs RhsPacker; - - // TODO: replace false, false with conjugate values? - typedef internal::gebp_kernel GebpKernel; - - typedef internal::packLhsArg packLArg; - typedef internal::packRhsAndKernelArg packRKArg; - - // initialize data mappers - LhsMapper lhs(this->m_leftImpl, this->m_left_nocontract_strides, this->m_i_strides, - this->m_left_contracting_strides, this->m_k_strides); - - RhsMapper rhs(this->m_rightImpl, this->m_right_nocontract_strides, this->m_j_strides, - this->m_right_contracting_strides, this->m_k_strides); - - OutputMapper output(buffer, m); - - // compute block sizes (which depend on number of threads) - const Index num_threads = this->m_device.numThreads(); - internal::TensorContractionBlocking blocking(k, m, n, num_threads); - Index mc = blocking.mc(); - Index nc = blocking.nc(); - Index kc = blocking.kc(); - eigen_assert(mc <= m); - eigen_assert(nc <= n); - eigen_assert(kc <= k); - -#define CEIL_DIV(a, b) (((a) + (b) - 1) / (b)) - const Index k_blocks = CEIL_DIV(k, kc); - const Index n_blocks = CEIL_DIV(n, nc); - const Index m_blocks = CEIL_DIV(m, mc); - const Index sizeA = mc * kc; - const Index sizeB = kc * nc; - - /* cout << "m: " << m << " n: " << n << " k: " << k << endl; - cout << "mc: " << mc << " nc: " << nc << " kc: " << kc << endl; - cout << "m_blocks: " << m_blocks << " n_blocks: " << n_blocks << " k_blocks: " << k_blocks << endl; - cout << "num threads: " << num_threads << endl; - */ - - // note: m_device.allocate should return 16 byte aligned pointers, but if blockA and blockB - // aren't 16 byte aligned segfaults will happen due to SIMD instructions - // note: You can get away with allocating just a single blockA and offsets and meet the - // the alignment requirements with the assumption that - // (Traits::mr * sizeof(ResScalar)) % 16 == 0 - const Index numBlockAs = numext::mini(num_threads, m_blocks); - MaxSizeVector blockAs(num_threads); - for (int i = 0; i < num_threads; i++) { - blockAs.push_back(static_cast(this->m_device.allocate(sizeA * sizeof(LhsScalar)))); - } - - // To circumvent alignment issues, I'm just going to separately allocate the memory for each thread - // TODO: is this too much memory to allocate? This simplifies coding a lot, but is wasteful. - // Other options: (1) reuse memory when a thread finishes. con: tricky - // (2) allocate block B memory in each thread. con: overhead - MaxSizeVector blockBs(n_blocks); - for (int i = 0; i < n_blocks; i++) { - blockBs.push_back(static_cast(this->m_device.allocate(sizeB * sizeof(RhsScalar)))); - } - - // lhs_notifications starts with all null Notifications - MaxSizeVector lhs_notifications(num_threads, nullptr); - - // this should really be numBlockAs * n_blocks; - const Index num_kernel_notifications = num_threads * n_blocks; - MaxSizeVector kernel_notifications(num_kernel_notifications, - nullptr); - - for (Index k_block_idx = 0; k_block_idx < k_blocks; k_block_idx++) { - const Index k_start = k_block_idx * kc; - // make sure we don't overshoot right edge of left matrix - const Index actual_kc = numext::mini(k_start + kc, k) - k_start; - - for (Index m_block_idx = 0; m_block_idx < m_blocks; m_block_idx += numBlockAs) { - const Index num_blocks = numext::mini(m_blocks-m_block_idx, numBlockAs); - - for (Index mt_block_idx = m_block_idx; mt_block_idx < m_block_idx+num_blocks; mt_block_idx++) { - const Index m_start = mt_block_idx * mc; - const Index actual_mc = numext::mini(m_start + mc, m) - m_start; - eigen_assert(actual_mc > 0); - - Index blockAId = (k_block_idx * m_blocks + mt_block_idx) % num_threads; - - for (int i = 0; i < n_blocks; ++i) { - Index notification_id = (blockAId * n_blocks + i); - // Wait for any current kernels using this slot to complete - // before using it. - if (kernel_notifications[notification_id]) { - wait_until_ready(kernel_notifications[notification_id]); - delete kernel_notifications[notification_id]; - } - kernel_notifications[notification_id] = new Notification(); - } - const packLArg arg = { - blockAs[blockAId], // blockA - lhs, // lhs - m_start, // m - k_start, // k - actual_mc, // mc - actual_kc, // kc - }; - - // Delete any existing notification since we may be - // replacing it. The algorithm should ensure that there are - // no existing waiters on this notification. - delete lhs_notifications[blockAId]; - lhs_notifications[blockAId] = - this->m_device.enqueue(&Self::packLhs, arg); - } - - // now start kernels. - const Index m_base_start = m_block_idx * mc; - const bool need_to_pack = m_block_idx == 0; - - for (Index n_block_idx = 0; n_block_idx < n_blocks; n_block_idx++) { - const Index n_start = n_block_idx * nc; - const Index actual_nc = numext::mini(n_start + nc, n) - n_start; - - // first make sure the previous kernels are all done before overwriting rhs. Also wait if - // we're going to start new k. In both cases need_to_pack is true. - if (need_to_pack) { - for (Index i = num_blocks; i < num_threads; ++i) { - Index blockAId = (k_block_idx * m_blocks + i + m_block_idx) % num_threads; - Index future_id = (blockAId * n_blocks + n_block_idx); - wait_until_ready(kernel_notifications[future_id]); - } - } - - packRKArg arg = { - &blockAs, // blockA - blockBs[n_block_idx], // blockB - rhs, // rhs - output, // output - m_base_start, // m - k_start, // k - n_start, // n - mc, // mc - actual_kc, // kc - actual_nc, // nc - num_threads, - numBlockAs, - m, - k_block_idx, - m_block_idx, - n_block_idx, // n_block_idx - m_blocks, // m_blocks - n_blocks, // n_blocks - &kernel_notifications, // kernel notifications - &lhs_notifications, // lhs notifications - need_to_pack, // need_to_pack - }; - - // We asynchronously kick off this function, which ends up - // notifying the appropriate kernel_notifications objects, - // which this thread waits on before exiting. - this->m_device.enqueueNoNotification(&Self::packRhsAndKernel, arg); - } - } - } - - // Make sure all the kernels are done. - for (size_t i = 0; i < kernel_notifications.size(); ++i) { - wait_until_ready(kernel_notifications[i]); - delete kernel_notifications[i]; - } - - // No need to wait for lhs notifications since they should have - // already been waited on. Just clean them up. - for (size_t i = 0; i < lhs_notifications.size(); ++i) { - delete lhs_notifications[i]; - } - - // deallocate all of the memory for both A and B's - for (size_t i = 0; i < blockAs.size(); i++) { - this->m_device.deallocate(blockAs[i]); - } - for (size_t i = 0; i < blockBs.size(); i++) { - this->m_device.deallocate(blockBs[i]); - } - -#undef CEIL_DIV - } - - /* - * Packs a LHS block of size (mt, kc) starting at lhs(m, k). Before packing - * the LHS block, check that all of the kernels that worked on the same - * mt_block_idx in the previous m_block are done. - */ - template - static void packLhs(const packLArg arg) { - // perform actual packing - LhsPacker pack_lhs; - pack_lhs(arg.blockA, arg.lhs.getSubMapper(arg.m_start, arg.k_start), arg.kc, arg.mc); - } - - /* - * Packs a RHS block of size (kc, nc) starting at (k, n) after checking that - * all kernels in the previous block are done. - * Then for each LHS future, we wait on the future and then call GEBP - * on the area packed by the future (which starts at - * blockA + future_idx * mt * kc) on the LHS and with the full packed - * RHS block. - * The output of this GEBP is written to output(m + i * mt, n). - */ - template - static void packRhsAndKernel(packRKArg arg) { - if (arg.need_to_pack) { - RhsPacker pack_rhs; - pack_rhs(arg.blockB, arg.rhs.getSubMapper(arg.k, arg.n), arg.kc, arg.nc); - } - - GebpKernel gebp; - for (Index mt_block_idx = 0; mt_block_idx < arg.num_blockAs; mt_block_idx++) { - const Index m_base_start = arg.m + arg.mc*mt_block_idx; - if (m_base_start < arg.max_m) { - Index blockAId = (arg.k_block_idx * arg.m_blocks + mt_block_idx + arg.m_block_idx) % arg.num_threads; - wait_until_ready((*arg.lhs_notifications)[blockAId]); - const Index actual_mc = numext::mini(m_base_start + arg.mc, arg.max_m) - m_base_start; - gebp(arg.output.getSubMapper(m_base_start, arg.n), - (*arg.blockAs)[blockAId], arg.blockB, - actual_mc, arg.kc, arg.nc, Scalar(1), -1, -1, 0, 0); - - // Notify that the kernel is done. - const Index set_idx = blockAId * arg.n_blocks + arg.n_block_idx; - (*arg.kernel_notifications)[set_idx]->Notify(); - } - } - } -#endif // EIGEN_USE_SIMPLE_THREAD_POOL - - TensorOpCost contractionCost(Index m, Index n, Index bm, Index bn, Index bk, - bool shard_by_col, bool prepacked) const { - const int packed_size = std::min(PacketType::size, - PacketType::size); - const int output_packet_size = internal::unpacket_traits::size; - const double kd = static_cast(bk); - // Peak VFMA bandwidth is 0.5. However if we have not enough data for - // vectorization bandwidth drops. The 4.0 and 2.0 bandwidth is determined - // experimentally. - double computeBandwidth = bk == 1 ? 4.0 : - (shard_by_col ? bn : bm) < Traits::nr || - (shard_by_col ? bm : bn) < Traits::mr ? 2.0 : 0.5; -#ifndef EIGEN_VECTORIZE_FMA - // Bandwidth of all of VFMA/MULPS/ADDPS is 0.5 on latest Intel processors. - // However for MULPS/ADDPS we have dependent sequence of 2 such instructions, - // so overall bandwidth is 1.0. - if (computeBandwidth == 0.5) computeBandwidth = 1.0; -#endif - // Computations. - TensorOpCost cost = TensorOpCost(0, 0, kd * computeBandwidth, true, packed_size); - // Output stores. - cost += TensorOpCost(0, sizeof(CoeffReturnType), 0, true, output_packet_size); - if (prepacked) { - // Packing and kernels are executed in different tasks. When we calculate - // task grain size we look only at kernel cost assuming that kernel - // is more expensive than packing. - return cost; - } - // Lhs/rhs loads + computations. - TensorOpCost lhsCost = this->m_leftImpl.costPerCoeff(true) * (kd / n); - TensorOpCost rhsCost = this->m_rightImpl.costPerCoeff(true) * (kd / m); - // Lhs packing memory cost does not contribute considerably to overall - // execution time because lhs is prefetched early and accessed sequentially. - if (shard_by_col) - lhsCost.dropMemoryCost(); - else - rhsCost.dropMemoryCost(); - return cost + lhsCost + rhsCost; - } - -#if defined(EIGEN_VECTORIZE_AVX) && defined(EIGEN_USE_LIBXSMM) - template - class ContextXsmm { - public: - ContextXsmm(const Self* self, Scalar* buffer, Index m, Index n, Index k, - const internal::TensorXsmmContractionBlocking& blocking): - device(self->m_device), - m(m), k(k), n(n), - stride_a(blocking.transposeA() ? k : m), - stride_b(blocking.transposeB() ? n : k), - stride_c(m), - bm(blocking.mc()), bk(blocking.kc()), bn(blocking.nc()), - blocks_m(blocking.blocks_m()), blocks_k(blocking.blocks_k()), - blocks_n(blocking.blocks_n()), - copyA(blocking.copyA()), copyB(blocking.copyB()), - transposeA(blocking.transposeA()), transposeB(blocking.transposeB()), - num_threads(blocking.num_threads()), - buffer(buffer), - leftData(self->m_leftImpl.data()), rightData(self->m_rightImpl.data()), - workers_done(blocking.num_threads()), - - packingA_jobs(0), packingB_jobs(0), compute_jobs(0), - packingA_done(blocking.blocks_m()), packingB_done(blocking.blocks_n()) {} - - void worker() { - // Pack - - if (copyA) { - while (true) { - uint32_t mk = packingA_jobs++; - Index mi = mk / blocks_k; - Index ki = mk % blocks_k; - if (mi >= blocks_m) break; - - LhsScalar * blockA = blocksA + (bk*bm) * (mi*blocks_k+ki); - if (transposeA) { - const LhsScalar * current_a = leftData + (bm*mi)*stride_a + (bk*ki); - libxsmm_otrans(blockA, current_a, sizeof(LhsScalar), actual_bk(ki), - actual_bm(mi), stride_a, bm); - } else { - const LhsScalar * current_a = leftData + (bk*ki)*stride_a + (bm*mi); - internal::pack_simple(blockA, current_a, - actual_bk(ki), actual_bm(mi), bm, stride_a); - } - packingA_done.at(mi)++; - } - } - - if (copyB) { - while (true) { - uint32_t nk = packingB_jobs++; - Index ni = nk / blocks_k; - Index ki = nk % blocks_k; - if (ni >= blocks_n) break; - - RhsScalar * blockB = blocksB + (bk*bn) * (ni*blocks_k+ki); - if (transposeB) { - const RhsScalar * current_b = rightData + (ki*bk)*stride_b + - (ni*bn); - libxsmm_otrans(blockB, current_b, sizeof(RhsScalar), actual_bn(ni), - actual_bk(ki), stride_b, bk); - } else { - const RhsScalar * current_b = rightData + (ni*bn)*stride_b + - (ki*bk); - internal::pack_simple(blockB, current_b, - actual_bn(ni), actual_bk(ki), bk, stride_b); - } - packingB_done.at(ni)++; - } - } - - // Compute - - while (true) { - uint32_t mn = compute_jobs++; - Index mi = mn / blocks_n; - Index ni = mn % blocks_n; - if (mi >= blocks_m) break; - - // Wait for mi, ni packings to be done. This is more fine-grained than - // waiting for all workers to finish packing. - while ((copyA && (packingA_done.at(mi) < blocks_k)) || - (copyB && (packingB_done.at(ni) < blocks_k))) - {} - - for (Index ki=0; ki < blocks_k; ++ki) { - const LhsScalar * current_a = copyA ? - blocksA + (bk*bm) * (mi*blocks_k+ki) : - leftData + (bk*ki)*stride_a + (bm*mi); - const RhsScalar * current_b = copyB ? - blocksB + (bk*bn) * (ni*blocks_k+ki) : - rightData + (ni*bn)*stride_b + (bk*ki); - - Index current_stride_a = copyA ? bm : stride_a; - Index current_stride_b = copyB ? bk : stride_b; - - // Memory may not be zeroed, overwrite instead of adding in first - // iteration. - float beta = ki == 0 ? 0 : 1; - - Scalar * current_c = buffer + (mi*bm) + (ni*bn)*stride_c; - internal::libxsmm_wrapper( - 0, actual_bm(mi), actual_bn(ni), actual_bk(ki), - current_stride_a, current_stride_b, stride_c, 1, beta, 0) - (current_a, current_b, current_c); - } - } - - workers_done.Notify(); - } - - void run() { - // Parallelization strategy. - // - // First pack A into blocks (sharding by m, k) and B (sharding by n,k), - // then shard by m, n. - // - // Do not use advanced ThreadPool queuing, just run a single long-standing - // function in each thread. - if (copyA) { - blocksA = static_cast(device.allocate( - (blocks_m*bm)*(blocks_k*bk)*sizeof(LhsScalar))); - } - if (copyB) { - blocksB = static_cast(device.allocate( - (blocks_n*bn)*(blocks_k*bk)*sizeof(RhsScalar))); - } - - for (Index i = 0; i < num_threads; ++i) { - device.enqueueNoNotification([=]() { worker(); }); - } - - workers_done.Wait(); - - if (copyA) { - device.deallocate(blocksA); - } - if (copyB) { - device.deallocate(blocksB); - } - } - - private: - // real block size for block index in [0, ..., blocks - 1]. - Index actual_bm(Index mi) const { - return mi != blocks_m - 1 ? bm : m + bm - bm * blocks_m; - } - Index actual_bk(Index ki) const { - return ki != blocks_k - 1 ? bk : k + bk - bk * blocks_k; - } - Index actual_bn(Index ni) const { - return ni != blocks_n - 1 ? bn : n + bn - bn * blocks_n; - } - - const Device& device; - Index m, k, n; - Index stride_a, stride_b, stride_c; - Index bm, bk, bn; // Block sizes. - Index blocks_m, blocks_k, blocks_n; // Number of blocks in each dimension. - bool copyA, copyB, transposeA, transposeB; - Index num_threads; - Scalar *buffer; - const LhsScalar *leftData; - const RhsScalar *rightData; - - LhsScalar *blocksA; - RhsScalar *blocksB; - // barrier for joining all threads after all done. - Barrier workers_done; - // "queues" of (mi,ki), (ki,ni), (mi,ni) jobs packed [0,p)x[0,q) -> [0, p*q) - std::atomic packingA_jobs; - std::atomic packingB_jobs; - std::atomic compute_jobs; - // already packed blocks for each mi-panel in A and ni-panel in B. - std::vector> packingA_done; - std::vector> packingB_done; - }; -#endif - -}; - -} // end namespace Eigen - -#endif // EIGEN_USE_THREADS -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_THREAD_POOL_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h deleted file mode 100644 index b29968b6..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h +++ /dev/null @@ -1,282 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H - -namespace Eigen { - -/** \class TensorConversionOp - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor conversion class. This class makes it possible to vectorize - * type casting operations when the number of scalars per packet in the source - * and the destination type differ - */ -namespace internal { -template -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs are different. - typedef TargetType Scalar; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = traits::NumDimensions; - static const int Layout = traits::Layout; - enum { Flags = 0 }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorConversionOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorConversionOp type; -}; - -} // end namespace internal - - -template -struct PacketConverter { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - PacketConverter(const TensorEvaluator& impl) - : m_impl(impl) {} - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const { - return internal::pcast(m_impl.template packet(index)); - } - - private: - const TensorEvaluator& m_impl; -}; - - -template -struct PacketConverter { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - PacketConverter(const TensorEvaluator& impl) - : m_impl(impl) {} - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const { - const int SrcPacketSize = internal::unpacket_traits::size; - - SrcPacket src1 = m_impl.template packet(index); - SrcPacket src2 = m_impl.template packet(index + SrcPacketSize); - TgtPacket result = internal::pcast(src1, src2); - return result; - } - - private: - const TensorEvaluator& m_impl; -}; - -template -struct PacketConverter { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - PacketConverter(const TensorEvaluator& impl) - : m_impl(impl) {} - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const { - const int SrcPacketSize = internal::unpacket_traits::size; - - SrcPacket src1 = m_impl.template packet(index); - SrcPacket src2 = m_impl.template packet(index + SrcPacketSize); - SrcPacket src3 = m_impl.template packet(index + 2 * SrcPacketSize); - SrcPacket src4 = m_impl.template packet(index + 3 * SrcPacketSize); - TgtPacket result = internal::pcast(src1, src2, src3, src4); - return result; - } - - private: - const TensorEvaluator& m_impl; -}; - -template -struct PacketConverter { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - PacketConverter(const TensorEvaluator& impl) - : m_impl(impl), m_maxIndex(impl.dimensions().TotalSize()) {} - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const { - const int SrcPacketSize = internal::unpacket_traits::size; - // Only call m_impl.packet() when we have direct access to the underlying data. This - // ensures that we don't compute the subexpression twice. We may however load some - // coefficients twice, but in practice this doesn't negatively impact performance. - if (m_impl.data() && (index + SrcPacketSize < m_maxIndex)) { - // Force unaligned memory loads since we can't ensure alignment anymore - return internal::pcast(m_impl.template packet(index)); - } else { - const int TgtPacketSize = internal::unpacket_traits::size; - typedef typename internal::unpacket_traits::type SrcType; - typedef typename internal::unpacket_traits::type TgtType; - internal::scalar_cast_op converter; - EIGEN_ALIGN_MAX typename internal::unpacket_traits::type values[TgtPacketSize]; - for (int i = 0; i < TgtPacketSize; ++i) { - values[i] = converter(m_impl.coeff(index+i)); - } - TgtPacket rslt = internal::pload(values); - return rslt; - } - } - - private: - const TensorEvaluator& m_impl; - const typename TensorEvaluator::Index m_maxIndex; -}; - -template -class TensorConversionOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename internal::traits::Scalar Scalar; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - typedef typename internal::nested::type Nested; - typedef Scalar CoeffReturnType; - typedef typename NumTraits::Real RealScalar; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConversionOp(const XprType& xpr) - : m_xpr(xpr) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; -}; - -template struct ConversionSubExprEval { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(Eval& impl, Scalar*) { - impl.evalSubExprsIfNeeded(NULL); - return true; - } -}; - -template struct ConversionSubExprEval { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(Eval& impl, Scalar* data) { - return impl.evalSubExprsIfNeeded(data); - } -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorConversionOp XprType; - typedef typename XprType::Index Index; - typedef typename TensorEvaluator::Dimensions Dimensions; - typedef TargetType Scalar; - typedef TargetType CoeffReturnType; - typedef typename internal::remove_all::Scalar>::type SrcType; - typedef typename PacketType::type PacketReturnType; - typedef typename PacketType::type PacketSourceType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = true, - Layout = TensorEvaluator::Layout, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device) - { - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_impl.dimensions(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* data) - { - return ConversionSubExprEval::value, TensorEvaluator, Scalar>::run(m_impl, data); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() - { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - internal::scalar_cast_op converter; - return converter(m_impl.coeff(index)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - const bool Vectorizable = TensorEvaluator::PacketAccess & - internal::type_casting_traits::VectorizedCast; - return PacketConv::run(m_impl, index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - const double cast_cost = TensorOpCost::CastCost(); - if (vectorized) { - const double SrcCoeffRatio = - internal::type_casting_traits::SrcCoeffRatio; - const double TgtCoeffRatio = - internal::type_casting_traits::TgtCoeffRatio; - return m_impl.costPerCoeff(vectorized) * (SrcCoeffRatio / PacketSize) + - TensorOpCost(0, 0, TgtCoeffRatio * (cast_cost / PacketSize)); - } else { - return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, cast_cost); - } - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - /// required by sycl in order to extract the sycl accessor - const TensorEvaluator& impl() const { return m_impl; } - - protected: - template - struct PacketConv { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType run(const TensorEvaluator& impl, Index index) { - internal::scalar_cast_op converter; - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - for (int i = 0; i < PacketSize; ++i) { - values[i] = converter(impl.coeff(index+i)); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - }; - - template - struct PacketConv { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType run(const TensorEvaluator& impl, Index index) { - const int SrcCoeffRatio = internal::type_casting_traits::SrcCoeffRatio; - const int TgtCoeffRatio = internal::type_casting_traits::TgtCoeffRatio; - PacketConverter, PacketSourceType, PacketReturnType, - SrcCoeffRatio, TgtCoeffRatio> converter(impl); - return converter.template packet(index); - } - }; - - TensorEvaluator m_impl; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h deleted file mode 100644 index 378f5ccc..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h +++ /dev/null @@ -1,1104 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_H - -namespace Eigen { - -/** \class TensorConvolution - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor convolution class. - * - * - */ -namespace internal { - -template -class IndexMapper { - public: - IndexMapper(const InputDims& input_dims, const array& kernel_dims, - const array& indices) { - - array dimensions = input_dims; - for (int i = 0; i < NumKernelDims; ++i) { - const Index index = indices[i]; - const Index input_dim = input_dims[index]; - const Index kernel_dim = kernel_dims[i]; - const Index result_dim = input_dim - kernel_dim + 1; - dimensions[index] = result_dim; - } - - array inputStrides; - array outputStrides; - if (static_cast(Layout) == static_cast(ColMajor)) { - inputStrides[0] = 1; - outputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - inputStrides[i] = inputStrides[i-1] * input_dims[i-1]; - outputStrides[i] = outputStrides[i-1] * dimensions[i-1]; - } - } else { - inputStrides[NumDims - 1] = 1; - outputStrides[NumDims - 1] = 1; - for (int i = static_cast(NumDims) - 2; i >= 0; --i) { - inputStrides[i] = inputStrides[i + 1] * input_dims[i + 1]; - outputStrides[i] = outputStrides[i + 1] * dimensions[i + 1]; - } - } - - array cudaInputDimensions; - array cudaOutputDimensions; - array tmp = dimensions; - array ordering; - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - for (int i = 0; i < NumKernelDims; ++i) { - const Index index = i + offset; - ordering[index] = indices[i]; - tmp[indices[i]] = -1; - cudaInputDimensions[index] = input_dims[indices[i]]; - cudaOutputDimensions[index] = dimensions[indices[i]]; - } - - int written = static_cast(Layout) == static_cast(ColMajor) - ? NumKernelDims - : 0; - for (int i = 0; i < NumDims; ++i) { - if (tmp[i] >= 0) { - ordering[written] = i; - cudaInputDimensions[written] = input_dims[i]; - cudaOutputDimensions[written] = dimensions[i]; - ++written; - } - } - - for (int i = 0; i < NumDims; ++i) { - m_inputStrides[i] = inputStrides[ordering[i]]; - m_outputStrides[i] = outputStrides[ordering[i]]; - } - - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < NumDims; ++i) { - if (i > NumKernelDims) { - m_cudaInputStrides[i] = - m_cudaInputStrides[i - 1] * cudaInputDimensions[i - 1]; - m_cudaOutputStrides[i] = - m_cudaOutputStrides[i - 1] * cudaOutputDimensions[i - 1]; - } else { - m_cudaInputStrides[i] = 1; - m_cudaOutputStrides[i] = 1; - } - } - } else { - for (int i = NumDims - 1; i >= 0; --i) { - if (static_cast(i + 1) < offset) { - m_cudaInputStrides[i] = - m_cudaInputStrides[i + 1] * cudaInputDimensions[i + 1]; - m_cudaOutputStrides[i] = - m_cudaOutputStrides[i + 1] * cudaOutputDimensions[i + 1]; - } else { - m_cudaInputStrides[i] = 1; - m_cudaOutputStrides[i] = 1; - } - } - } - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaInputPlaneToTensorInputOffset(Index p) const { - Index inputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int d = NumDims - 1; d > NumKernelDims; --d) { - const Index idx = p / m_cudaInputStrides[d]; - inputIndex += idx * m_inputStrides[d]; - p -= idx * m_cudaInputStrides[d]; - } - inputIndex += p * m_inputStrides[NumKernelDims]; - } else { - std::ptrdiff_t limit = 0; - if (NumKernelDims < NumDims) { - limit = NumDims - NumKernelDims - 1; - } - for (int d = 0; d < limit; ++d) { - const Index idx = p / m_cudaInputStrides[d]; - inputIndex += idx * m_inputStrides[d]; - p -= idx * m_cudaInputStrides[d]; - } - inputIndex += p * m_inputStrides[limit]; - } - return inputIndex; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaOutputPlaneToTensorOutputOffset(Index p) const { - Index outputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int d = NumDims - 1; d > NumKernelDims; --d) { - const Index idx = p / m_cudaOutputStrides[d]; - outputIndex += idx * m_outputStrides[d]; - p -= idx * m_cudaOutputStrides[d]; - } - outputIndex += p * m_outputStrides[NumKernelDims]; - } else { - std::ptrdiff_t limit = 0; - if (NumKernelDims < NumDims) { - limit = NumDims - NumKernelDims - 1; - } - for (int d = 0; d < limit; ++d) { - const Index idx = p / m_cudaOutputStrides[d]; - outputIndex += idx * m_outputStrides[d]; - p -= idx * m_cudaOutputStrides[d]; - } - outputIndex += p * m_outputStrides[limit]; - } - return outputIndex; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaInputKernelToTensorInputOffset(Index i) const { - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - return i * m_inputStrides[offset]; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaOutputKernelToTensorOutputOffset(Index i) const { - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - return i * m_outputStrides[offset]; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaInputKernelToTensorInputOffset(Index i, Index j) const { - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1]; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaOutputKernelToTensorOutputOffset(Index i, Index j) const { - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1]; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaInputKernelToTensorInputOffset(Index i, Index j, Index k) const { - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1] + - k * m_inputStrides[offset + 2]; - } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapCudaOutputKernelToTensorOutputOffset(Index i, Index j, Index k) const { - const size_t offset = static_cast(Layout) == static_cast(ColMajor) - ? 0 - : NumDims - NumKernelDims; - return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1] + - k * m_outputStrides[offset + 2]; - } - - private: - static const int NumDims = internal::array_size::value; - array m_inputStrides; - array m_outputStrides; - array m_cudaInputStrides; - array m_cudaOutputStrides; -}; - - - -template -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs are different. - typedef typename promote_storage_type::ret Scalar; - typedef typename promote_storage_type::StorageKind, - typename traits::StorageKind>::ret StorageKind; - typedef typename promote_index_type::Index, - typename traits::Index>::type Index; - typedef typename InputXprType::Nested LhsNested; - typedef typename KernelXprType::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - static const int NumDimensions = traits::NumDimensions; - static const int Layout = traits::Layout; - - enum { - Flags = 0 - }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorConvolutionOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorConvolutionOp type; -}; - -} // end namespace internal - - - -template -class TensorConvolutionOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::promote_storage_type::ret CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConvolutionOp(const InputXprType& input, const KernelXprType& kernel, const Indices& dims) - : m_input_xpr(input), m_kernel_xpr(kernel), m_indices(dims) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Indices& indices() const { return m_indices; } - - /** \returns the nested expressions */ - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const typename internal::remove_all::type& - inputExpression() const { return m_input_xpr; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const typename internal::remove_all::type& - kernelExpression() const { return m_kernel_xpr; } - - protected: - typename InputXprType::Nested m_input_xpr; - typename KernelXprType::Nested m_kernel_xpr; - const Indices m_indices; -}; - - -template -struct TensorEvaluator, Device> -{ - typedef TensorConvolutionOp XprType; - - static const int NumDims = internal::array_size::Dimensions>::value; - static const int NumKernelDims = internal::array_size::value; - typedef typename XprType::Index Index; - typedef DSizes Dimensions; - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_inputImpl(op.inputExpression(), device), m_kernelImpl(op.kernelExpression(), device), m_kernelArg(op.kernelExpression()), m_kernel(NULL), m_local_kernel(false), m_device(device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE); - - const typename TensorEvaluator::Dimensions& input_dims = m_inputImpl.dimensions(); - const typename TensorEvaluator::Dimensions& kernel_dims = m_kernelImpl.dimensions(); - - if (static_cast(Layout) == static_cast(ColMajor)) { - m_inputStride[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_inputStride[i] = m_inputStride[i - 1] * input_dims[i - 1]; - } - } else { - m_inputStride[NumDims - 1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_inputStride[i] = m_inputStride[i + 1] * input_dims[i + 1]; - } - } - - m_dimensions = m_inputImpl.dimensions(); - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < NumKernelDims; ++i) { - const Index index = op.indices()[i]; - const Index input_dim = input_dims[index]; - const Index kernel_dim = kernel_dims[i]; - const Index result_dim = input_dim - kernel_dim + 1; - m_dimensions[index] = result_dim; - if (i > 0) { - m_kernelStride[i] = m_kernelStride[i - 1] * kernel_dims[i - 1]; - } else { - m_kernelStride[0] = 1; - } - m_indexStride[i] = m_inputStride[index]; - } - - m_outputStride[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_outputStride[i] = m_outputStride[i - 1] * m_dimensions[i - 1]; - } - } else { - for (int i = NumKernelDims - 1; i >= 0; --i) { - const Index index = op.indices()[i]; - const Index input_dim = input_dims[index]; - const Index kernel_dim = kernel_dims[i]; - const Index result_dim = input_dim - kernel_dim + 1; - m_dimensions[index] = result_dim; - if (i < NumKernelDims - 1) { - m_kernelStride[i] = m_kernelStride[i + 1] * kernel_dims[i + 1]; - } else { - m_kernelStride[NumKernelDims - 1] = 1; - } - m_indexStride[i] = m_inputStride[index]; - } - - m_outputStride[NumDims - 1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_outputStride[i] = m_outputStride[i + 1] * m_dimensions[i + 1]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar*) { - m_inputImpl.evalSubExprsIfNeeded(NULL); - preloadKernel(); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_inputImpl.cleanup(); - if (m_local_kernel) { - m_device.deallocate((void*)m_kernel); - m_local_kernel = false; - } - m_kernel = NULL; - } - - void evalTo(typename XprType::Scalar* buffer) { - evalSubExprsIfNeeded(NULL); - for (int i = 0; i < dimensions().TotalSize(); ++i) { - buffer[i] += coeff(i); - } - cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - CoeffReturnType result = CoeffReturnType(0); - convolve(firstInput(index), 0, NumKernelDims-1, result); - return result; - } - - template - EIGEN_DEVICE_FUNC PacketReturnType packet(const Index index) const - { - Index indices[2] = {index, index+PacketSize-1}; - Index startInputs[2] = {0, 0}; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx0 = indices[0] / m_outputStride[i]; - const Index idx1 = indices[1] / m_outputStride[i]; - startInputs[0] += idx0 * m_inputStride[i]; - startInputs[1] += idx1 * m_inputStride[i]; - indices[0] -= idx0 * m_outputStride[i]; - indices[1] -= idx1 * m_outputStride[i]; - } - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx0 = indices[0] / m_outputStride[i]; - const Index idx1 = indices[1] / m_outputStride[i]; - startInputs[0] += idx0 * m_inputStride[i]; - startInputs[1] += idx1 * m_inputStride[i]; - indices[0] -= idx0 * m_outputStride[i]; - indices[1] -= idx1 * m_outputStride[i]; - } - } - startInputs[0] += indices[0]; - startInputs[1] += indices[1]; - - if (startInputs[1]-startInputs[0] == PacketSize-1) { - PacketReturnType result = internal::pset1(0); - convolvePacket(startInputs[0], 0, NumKernelDims-1, result); - return result; - } else { - EIGEN_ALIGN_MAX Scalar data[PacketSize]; - data[0] = Scalar(0); - convolve(startInputs[0], 0, NumKernelDims-1, data[0]); - for (int i = 1; i < PacketSize-1; ++i) { - data[i] = Scalar(0); - convolve(firstInput(index+i), 0, NumKernelDims-1, data[i]); - } - data[PacketSize-1] = Scalar(0); - convolve(startInputs[1], 0, NumKernelDims-1, data[PacketSize-1]); - return internal::pload(data); - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - const double kernel_size = m_kernelImpl.dimensions().TotalSize(); - // We ignore the use of fused multiply-add. - const double convolve_compute_cost = - TensorOpCost::AddCost() + TensorOpCost::MulCost(); - const double firstIndex_compute_cost = - NumDims * - (2 * TensorOpCost::AddCost() + 2 * TensorOpCost::MulCost() + - TensorOpCost::DivCost()); - return TensorOpCost(0, 0, firstIndex_compute_cost, vectorized, PacketSize) + - kernel_size * (m_inputImpl.costPerCoeff(vectorized) + - m_kernelImpl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, convolve_compute_cost, vectorized, - PacketSize)); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - private: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index firstInput(Index index) const { - Index startInput = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_outputStride[i]; - startInput += idx * m_inputStride[i]; - index -= idx * m_outputStride[i]; - } - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_outputStride[i]; - startInput += idx * m_inputStride[i]; - index -= idx * m_outputStride[i]; - } - } - startInput += index; - return startInput; - } - - EIGEN_DEVICE_FUNC void convolve(Index firstIndex, Index firstKernel, int DimIndex, CoeffReturnType& accum) const { - for (int j = 0; j < m_kernelImpl.dimensions()[DimIndex]; ++j) { - const Index input = firstIndex + j * m_indexStride[DimIndex]; - const Index kernel = firstKernel + j * m_kernelStride[DimIndex]; - if (DimIndex > 0) { - convolve(input, kernel, DimIndex-1, accum); - } else { - accum += m_inputImpl.coeff(input) * m_kernel[kernel]; - } - } - } - - template - EIGEN_DEVICE_FUNC void convolvePacket(Index firstIndex, Index firstKernel, int DimIndex, Packet& accum) const { - for (int j = 0; j < m_kernelImpl.dimensions()[DimIndex]; ++j) { - const Index input = firstIndex + j * m_indexStride[DimIndex]; - const Index kernel = firstKernel + j * m_kernelStride[DimIndex]; - if (DimIndex > 0) { - convolvePacket(input, kernel, DimIndex-1, accum); - } else { - accum = internal::pmadd(m_inputImpl.template packet(input), internal::pset1(m_kernel[kernel]), accum); - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void preloadKernel() { - // Don't make a local copy of the kernel unless we have to (i.e. it's an - // expression that needs to be evaluated) - const Scalar* in_place = m_kernelImpl.data(); - if (in_place) { - m_kernel = in_place; - m_local_kernel = false; - } else { - size_t kernel_sz = m_kernelImpl.dimensions().TotalSize() * sizeof(Scalar); - Scalar* local = (Scalar*)m_device.allocate(kernel_sz); - typedef TensorEvalToOp EvalTo; - EvalTo evalToTmp(local, m_kernelArg); - const bool PacketAccess = internal::IsVectorizable::value; - internal::TensorExecutor::run(evalToTmp, m_device); - - m_kernel = local; - m_local_kernel = true; - } - } - - array m_inputStride; - array m_outputStride; - - array m_indexStride; - array m_kernelStride; - TensorEvaluator m_inputImpl; - TensorEvaluator m_kernelImpl; - Dimensions m_dimensions; - - KernelArgType m_kernelArg; - const Scalar* m_kernel; - bool m_local_kernel; - const Device& m_device; -}; - - - - -// Use an optimized implementation of the evaluation code for GPUs whenever possible. -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) - -template -struct GetKernelSize { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int operator() (const int /*kernelSize*/) const { - return StaticKernelSize; - } -}; -template <> -struct GetKernelSize { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int operator() (const int kernelSize) const { - return kernelSize; - } -}; - -template -__global__ void EigenConvolutionKernel1D( - InputEvaluator eval, - const internal::IndexMapper - indexMapper, - const float* __restrict kernel, const int numPlanes, const int numX, - const int maxX, const int kernelSize, float* buffer) { - extern __shared__ float s[]; - - const int first_x = blockIdx.x * maxX; - const int last_x = (first_x + maxX < numX ? first_x + maxX : numX) - 1; - const int num_x_input = last_x - first_x + GetKernelSize()(kernelSize); - const int num_x_output = last_x - first_x + 1; - - const int first_plane = blockIdx.y * blockDim.y; - const int plane_stride = blockDim.y * gridDim.y; - - for (int p = first_plane + threadIdx.y; p < numPlanes; p += plane_stride) { - // Load inputs to shared memory - const int plane_input_offset = indexMapper.mapCudaInputPlaneToTensorInputOffset(p); - const int plane_kernel_offset = threadIdx.y * num_x_input; - #pragma unroll - for (int i = threadIdx.x; i < num_x_input; i += blockDim.x) { - const int tensor_index = plane_input_offset + indexMapper.mapCudaInputKernelToTensorInputOffset(i+first_x); - s[i + plane_kernel_offset] = eval.coeff(tensor_index); - } - - __syncthreads(); - - // Compute the convolution - const int plane_output_offset = indexMapper.mapCudaOutputPlaneToTensorOutputOffset(p); - - #pragma unroll - for (int i = threadIdx.x; i < num_x_output; i += blockDim.x) { - const int kernel_offset = plane_kernel_offset + i; - float result = 0.0f; - #pragma unroll - for (int k = 0; k < GetKernelSize()(kernelSize); ++k) { - result += s[k + kernel_offset] * kernel[k]; - } - const int tensor_index = plane_output_offset + indexMapper.mapCudaOutputKernelToTensorOutputOffset(i+first_x); - buffer[tensor_index] = result; - } - __syncthreads(); - } -}; - -template -__global__ void EigenConvolutionKernel2D( - InputEvaluator eval, - const internal::IndexMapper - indexMapper, - const float* __restrict kernel, const int numPlanes, const int numX, - const int maxX, const int numY, const int maxY, const int kernelSizeX, - const int kernelSizeY, float* buffer) { - extern __shared__ float s[]; - - const int first_x = blockIdx.x * maxX; - const int last_x = (first_x + maxX < numX ? first_x + maxX : numX) - 1; - const int num_x_input = last_x - first_x + GetKernelSize()(kernelSizeX); - const int num_x_output = last_x - first_x + 1; - - const int first_y = blockIdx.y * maxY; - const int last_y = (first_y + maxY < numY ? first_y + maxY : numY) - 1; - const int num_y_input = last_y - first_y + GetKernelSize()(kernelSizeY); - const int num_y_output = last_y - first_y + 1; - - const int first_plane = blockIdx.z * blockDim.z; - const int plane_stride = blockDim.z * gridDim.z; - - for (int p = first_plane + threadIdx.z; p < numPlanes; p += plane_stride) { - - const int plane_input_offset = indexMapper.mapCudaInputPlaneToTensorInputOffset(p); - const int plane_kernel_offset = threadIdx.z * num_y_input; - - // Load inputs to shared memory - #pragma unroll - for (int j = threadIdx.y; j < num_y_input; j += blockDim.y) { - const int input_offset = num_x_input * (j + plane_kernel_offset); - #pragma unroll - for (int i = threadIdx.x; i < num_x_input; i += blockDim.x) { - const int tensor_index = plane_input_offset + indexMapper.mapCudaInputKernelToTensorInputOffset(i+first_x, j+first_y); - s[i + input_offset] = eval.coeff(tensor_index); - } - } - - __syncthreads(); - - // Convolution - const int plane_output_offset = indexMapper.mapCudaOutputPlaneToTensorOutputOffset(p); - - #pragma unroll - for (int j = threadIdx.y; j < num_y_output; j += blockDim.y) { - #pragma unroll - for (int i = threadIdx.x; i < num_x_output; i += blockDim.x) { - float result = 0.0f; - #pragma unroll - for (int l = 0; l < GetKernelSize()(kernelSizeY); ++l) { - const int kernel_offset = kernelSizeX * l; - const int input_offset = i + num_x_input * (j + l + plane_kernel_offset); - #pragma unroll - for (int k = 0; k < GetKernelSize()(kernelSizeX); ++k) { - result += s[k + input_offset] * kernel[k + kernel_offset]; - } - } - const int tensor_index = plane_output_offset + indexMapper.mapCudaOutputKernelToTensorOutputOffset(i+first_x, j+first_y); - buffer[tensor_index] = result; - } - } - - __syncthreads(); - } -}; - -template -__global__ void EigenConvolutionKernel3D( - InputEvaluator eval, - const internal::IndexMapper - indexMapper, - const float* __restrict kernel, const size_t numPlanes, const size_t numX, - const size_t maxX, const size_t numY, const size_t maxY, const size_t numZ, - const size_t maxZ, const size_t kernelSizeX, const size_t kernelSizeY, - const size_t kernelSizeZ, float* buffer) { - extern __shared__ float s[]; - - // Load inputs to shared memory - const int first_x = blockIdx.x * maxX; - const int last_x = (first_x + maxX < numX ? first_x + maxX : numX) - 1; - const int num_x_input = last_x - first_x + kernelSizeX; - - const int first_y = blockIdx.y * maxY; - const int last_y = (first_y + maxY < numY ? first_y + maxY : numY) - 1; - const int num_y_input = last_y - first_y + kernelSizeY; - - const int first_z = blockIdx.z * maxZ; - const int last_z = (first_z + maxZ < numZ ? first_z + maxZ : numZ) - 1; - const int num_z_input = last_z - first_z + kernelSizeZ; - - for (int p = 0; p < numPlanes; ++p) { - - const int plane_input_offset = indexMapper.mapCudaInputPlaneToTensorInputOffset(p); - const int plane_kernel_offset = 0; - - for (int k = threadIdx.z; k < num_z_input; k += blockDim.z) { - for (int j = threadIdx.y; j < num_y_input; j += blockDim.y) { - for (int i = threadIdx.x; i < num_x_input; i += blockDim.x) { - const int tensor_index = plane_input_offset + indexMapper.mapCudaInputKernelToTensorInputOffset(i+first_x, j+first_y, k+first_z); - s[i + num_x_input * (j + num_y_input * (k + plane_kernel_offset))] = eval.coeff(tensor_index); - } - } - } - - __syncthreads(); - - // Convolution - const int num_z_output = last_z - first_z + 1; - const int num_y_output = last_y - first_y + 1; - const int num_x_output = last_x - first_x + 1; - const int plane_output_offset = indexMapper.mapCudaOutputPlaneToTensorOutputOffset(p); - - for (int k = threadIdx.z; k < num_z_output; k += blockDim.z) { - for (int j = threadIdx.y; j < num_y_output; j += blockDim.y) { - for (int i = threadIdx.x; i < num_x_output; i += blockDim.x) { - float result = 0.0f; - for (int n = 0; n < kernelSizeZ; ++n) { - for (int m = 0; m < kernelSizeY; ++m) { - for (int l = 0; l < kernelSizeX; ++l) { - result += s[i + l + num_x_input * (j + m + num_y_input * (k + n + plane_kernel_offset))] * kernel[l + kernelSizeX * (m + kernelSizeY * n)]; - } - } - } - const int tensor_index = plane_output_offset + indexMapper.mapCudaOutputKernelToTensorOutputOffset(i+first_x, j+first_y, k+first_z); - buffer[tensor_index] = result; - } - } - } - __syncthreads(); - } -}; - - - -template -struct TensorEvaluator, GpuDevice> -{ - typedef TensorConvolutionOp XprType; - - static const int NumDims = internal::array_size::Dimensions>::value; - static const int NumKernelDims = internal::array_size::value; - typedef typename XprType::Index Index; - typedef DSizes Dimensions; - typedef typename TensorEvaluator::Dimensions KernelDimensions; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const GpuDevice& device) - : m_inputImpl(op.inputExpression(), device), m_kernelArg(op.kernelExpression()), m_kernelImpl(op.kernelExpression(), device), m_indices(op.indices()), m_buf(NULL), m_kernel(NULL), m_local_kernel(false), m_device(device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE); - - const typename TensorEvaluator::Dimensions& input_dims = m_inputImpl.dimensions(); - const typename TensorEvaluator::Dimensions& kernel_dims = m_kernelImpl.dimensions(); - - m_dimensions = m_inputImpl.dimensions(); - for (int i = 0; i < NumKernelDims; ++i) { - const Index index = op.indices()[i]; - const Index input_dim = input_dims[index]; - const Index kernel_dim = kernel_dims[i]; - const Index result_dim = input_dim - kernel_dim + 1; - m_dimensions[index] = result_dim; - } - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef typename InputArgType::Scalar Scalar; - static const int PacketSize = internal::unpacket_traits::size; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* data) { - preloadKernel(); - m_inputImpl.evalSubExprsIfNeeded(NULL); - if (data) { - executeEval(data); - return false; - } else { - m_buf = (Scalar*)m_device.allocate(dimensions().TotalSize() * sizeof(Scalar)); - executeEval(m_buf); - return true; - } - } - - EIGEN_STRONG_INLINE void cleanup() { - m_inputImpl.cleanup(); - if (m_buf) { - m_device.deallocate(m_buf); - m_buf = NULL; - } - if (m_local_kernel) { - m_device.deallocate((void*)m_kernel); - m_local_kernel = false; - } - m_kernel = NULL; - } - - EIGEN_STRONG_INLINE void preloadKernel() { - // Don't make a local copy of the kernel unless we have to (i.e. it's an - // expression that needs to be evaluated) - const Scalar* in_place = m_kernelImpl.data(); - if (in_place) { - m_kernel = in_place; - m_local_kernel = false; - } else { - size_t kernel_sz = m_kernelImpl.dimensions().TotalSize() * sizeof(Scalar); - Scalar* local = (Scalar*)m_device.allocate(kernel_sz); - typedef TensorEvalToOp EvalTo; - EvalTo evalToTmp(local, m_kernelArg); - const bool PacketAccess = internal::IsVectorizable::value; - internal::TensorExecutor::run(evalToTmp, m_device); - - m_kernel = local; - m_local_kernel = true; - } - } - - static unsigned int ceil(unsigned int num, unsigned int denom) { - const unsigned int rounded_toward_zero = num / denom; - if (num > rounded_toward_zero * denom) { - return rounded_toward_zero + 1; - } - return rounded_toward_zero; - } - - void executeEval(Scalar* data) const { - typedef typename TensorEvaluator::Dimensions InputDims; - - const int maxSharedMem = m_device.sharedMemPerBlock(); - const int maxThreadsPerBlock = m_device.maxCudaThreadsPerBlock(); - const int maxBlocksPerProcessor = m_device.maxCudaThreadsPerMultiProcessor() / maxThreadsPerBlock; - const int numMultiProcessors = m_device.getNumCudaMultiProcessors(); - const int warpSize = 32; - - switch (NumKernelDims) { - case 1: { - const int kernel_size = m_kernelImpl.dimensions().TotalSize(); - - const int numX = dimensions()[m_indices[0]]; - const int numP = dimensions().TotalSize() / numX; - int maxX; - dim3 block_size; - - const int single_stride_dim = - static_cast(Layout) == static_cast(ColMajor) - ? 0 - : m_inputImpl.dimensions().rank() - 1; - if (m_indices[0] == single_stride_dim) { - // Maximum the reuse - const int inner_dim = ((maxSharedMem / (sizeof(Scalar)) - kernel_size + 1 + 31) / 32) * 32; - maxX = numext::mini(inner_dim, numX); - const int maxP = numext::mini(maxSharedMem / ((kernel_size - 1 + maxX) * sizeof(Scalar)), numP); - block_size.x = numext::mini(maxThreadsPerBlock, maxX); - block_size.y = numext::mini(maxThreadsPerBlock / block_size.x, maxP); - } - else { - // Read as much as possible alongside the inner most dimension, that is the plane - const int inner_dim = maxSharedMem / ((warpSize + kernel_size) * sizeof(Scalar)); - const int maxP = numext::mini(inner_dim, numP); - maxX = numext::mini(maxSharedMem / (inner_dim * sizeof(Scalar)) - kernel_size + 1, numX); - - block_size.x = numext::mini(warpSize, maxX); - block_size.y = numext::mini(maxThreadsPerBlock/block_size.x, maxP); - } - - const int shared_mem = block_size.y * (maxX + kernel_size - 1) * sizeof(Scalar); - assert(shared_mem <= maxSharedMem); - - const int num_x_blocks = ceil(numX, maxX); - const int blocksPerProcessor = numext::mini(maxBlocksPerProcessor, maxSharedMem / shared_mem); - const int num_y_blocks = ceil(numMultiProcessors * blocksPerProcessor, num_x_blocks); - - dim3 num_blocks(num_x_blocks, numext::mini(num_y_blocks, ceil(numP, block_size.y))); - - - //cout << "launching 1D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " maxX: " << maxX << " shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl; - - const array indices(m_indices[0]); - const array kernel_dims(m_kernelImpl.dimensions()[0]); - internal::IndexMapper indexMapper( - m_inputImpl.dimensions(), kernel_dims, indices); - switch(kernel_size) { - case 4: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel1D, Index, InputDims, 4>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, 4, data); - break; - } - case 7: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel1D, Index, InputDims, 7>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, 7, data); - break; - } - default: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel1D, Index, InputDims, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, kernel_size, data); - } - } - break; - } - - case 2: { - const int idxX = - static_cast(Layout) == static_cast(ColMajor) ? 0 : 1; - const int idxY = - static_cast(Layout) == static_cast(ColMajor) ? 1 : 0; - const int kernel_size_x = m_kernelImpl.dimensions()[idxX]; - const int kernel_size_y = m_kernelImpl.dimensions()[idxY]; - - const int numX = dimensions()[m_indices[idxX]]; - const int numY = dimensions()[m_indices[idxY]]; - const int numP = dimensions().TotalSize() / (numX*numY); - - const float scaling_factor = sqrtf(static_cast(maxSharedMem) / (sizeof(Scalar) * kernel_size_y * kernel_size_x)); - - // Snap maxX to warp size - int inner_dim = ((static_cast(scaling_factor * kernel_size_x) - kernel_size_x + 1 + 32) / 32) * 32; - const int maxX = numext::mini(inner_dim, numX); - const int maxY = numext::mini(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1)) - kernel_size_y + 1, numY); - const int maxP = numext::mini(maxSharedMem / ((kernel_size_x - 1 + maxX) * (kernel_size_y - 1 + maxY) * sizeof(Scalar)), numP); - - dim3 block_size; - block_size.x = numext::mini(1024, maxX); - block_size.y = numext::mini(1024/block_size.x, maxY); - block_size.z = numext::mini(1024/(block_size.x*block_size.y), maxP); - - const int shared_mem = block_size.z * (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1) * sizeof(Scalar); - assert(shared_mem <= maxSharedMem); - - const int num_x_blocks = ceil(numX, maxX); - const int num_y_blocks = ceil(numY, maxY); - const int blocksPerProcessor = numext::mini(maxBlocksPerProcessor, maxSharedMem / shared_mem); - const int num_z_blocks = ceil(numMultiProcessors * blocksPerProcessor, num_x_blocks * num_y_blocks); - - dim3 num_blocks(num_x_blocks, num_y_blocks, numext::mini(num_z_blocks, ceil(numP, block_size.z))); - - - //cout << "launching 2D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y << " block_size.z: " << block_size.z << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " num_blocks.z: " << num_blocks.z << " maxX: " << maxX << " maxY: " << maxY << " maxP: " << maxP << " shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl; - - const array indices(m_indices[idxX], m_indices[idxY]); - const array kernel_dims(m_kernelImpl.dimensions()[idxX], - m_kernelImpl.dimensions()[idxY]); - internal::IndexMapper indexMapper( - m_inputImpl.dimensions(), kernel_dims, indices); - switch (kernel_size_x) { - case 4: { - switch (kernel_size_y) { - case 7: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel2D, Index, InputDims, 4, 7>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 4, 7, data); - break; - } - default: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel2D, Index, InputDims, 4, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 4, kernel_size_y, data); - break; - } - } - break; - } - case 7: { - switch (kernel_size_y) { - case 4: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel2D, Index, InputDims, 7, 4>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 7, 4, data); - break; - } - default: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel2D, Index, InputDims, 7, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 7, kernel_size_y, data); - break; - } - } - break; - } - default: { - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel2D, Index, InputDims, Dynamic, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, kernel_size_x, kernel_size_y, data); - break; - } - } - break; - } - - case 3: { - const int idxX = - static_cast(Layout) == static_cast(ColMajor) ? 0 : 2; - const int idxY = - static_cast(Layout) == static_cast(ColMajor) ? 1 : 1; - const int idxZ = - static_cast(Layout) == static_cast(ColMajor) ? 2 : 0; - - const int kernel_size_x = m_kernelImpl.dimensions()[idxX]; - const int kernel_size_y = m_kernelImpl.dimensions()[idxY]; - const int kernel_size_z = m_kernelImpl.dimensions()[idxZ]; - - const int numX = dimensions()[m_indices[idxX]]; - const int numY = dimensions()[m_indices[idxY]]; - const int numZ = dimensions()[m_indices[idxZ]]; - const int numP = dimensions().TotalSize() / (numX*numY*numZ); - - const int maxX = numext::mini(128, numext::mini(maxSharedMem / (sizeof(Scalar) * kernel_size_y * kernel_size_z) - kernel_size_x + 1, numX)); - const int maxY = numext::mini(128, numext::mini(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1) * kernel_size_z) - kernel_size_y + 1, numY)); - const int maxZ = numext::mini(128, numext::mini(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1)) - kernel_size_z + 1, numZ)); - - dim3 block_size; - block_size.x = numext::mini(32, maxX); - block_size.y = numext::mini(32, maxY); - block_size.z = numext::mini(1024/(block_size.x*block_size.y), maxZ); - dim3 num_blocks(ceil(numX, maxX), ceil(numY, maxY), ceil(numZ, maxZ)); - - const int shared_mem = (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1) * (maxZ + kernel_size_z - 1) * sizeof(Scalar); - assert(shared_mem <= maxSharedMem); - - //cout << "launching 3D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y << " block_size.z: " << block_size.z << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " num_blocks.z: " << num_blocks.z << " shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl; - const array indices(m_indices[idxX], m_indices[idxY], - m_indices[idxZ]); - const array kernel_dims(m_kernelImpl.dimensions()[idxX], - m_kernelImpl.dimensions()[idxY], - m_kernelImpl.dimensions()[idxZ]); - internal::IndexMapper indexMapper( - m_inputImpl.dimensions(), kernel_dims, indices); - - LAUNCH_CUDA_KERNEL((EigenConvolutionKernel3D, Index, InputDims>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, numZ, maxZ, kernel_size_x, kernel_size_y, kernel_size_z, data); - break; - } - - default: { - EIGEN_STATIC_ASSERT((NumKernelDims >= 1 && NumKernelDims <= 3), THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE); - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - eigen_assert(m_buf); - eigen_assert(index < m_dimensions.TotalSize()); - return m_buf[index]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(const Index index) const - { - eigen_assert(m_buf); - eigen_assert(index < m_dimensions.TotalSize()); - return internal::ploadt(m_buf+index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - // TODO(rmlarsen): FIXME: For now, this is just a copy of the CPU cost - // model. - const double kernel_size = m_kernelImpl.dimensions().TotalSize(); - // We ignore the use of fused multiply-add. - const double convolve_compute_cost = - TensorOpCost::AddCost() + TensorOpCost::MulCost(); - const double firstIndex_compute_cost = - NumDims * - (2 * TensorOpCost::AddCost() + 2 * TensorOpCost::MulCost() + - TensorOpCost::DivCost()); - return TensorOpCost(0, 0, firstIndex_compute_cost, vectorized, PacketSize) + - kernel_size * (m_inputImpl.costPerCoeff(vectorized) + - m_kernelImpl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, convolve_compute_cost, vectorized, - PacketSize)); - } - - private: - // No assignment (copies are needed by the kernels) - TensorEvaluator& operator = (const TensorEvaluator&); - - TensorEvaluator m_inputImpl; - TensorEvaluator m_kernelImpl; - KernelArgType m_kernelArg; - Indices m_indices; - Dimensions m_dimensions; - Scalar* m_buf; - const Scalar* m_kernel; - bool m_local_kernel; - - const GpuDevice& m_device; -}; -#endif - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h deleted file mode 100644 index 4247c1c4..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h +++ /dev/null @@ -1,476 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Mehdi Goli Codeplay Software Ltd. -// Ralph Potter Codeplay Software Ltd. -// Luke Iwanski Codeplay Software Ltd. -// Contact: -// Copyright (C) 2016 Benoit Steiner - -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_SYCL_H -#define EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_SYCL_H - -namespace Eigen { - -/** \class TensorConvolution - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor convolution class. - * - * - */ -template -struct EigenConvolutionKernel1D{ -typedef typename TensorSycl::internal::createPlaceHolderExpression::Type PlaceHolderExpr; -internal::IndexMapper::Layout> indexMapper; -Kernel_accessor kernel_filter; -const size_t kernelSize, range_x, range_y; -Buffer_accessor buffer_acc; -Local_accessor local_acc; -FunctorExpr functors; -TupleType tuple_of_accessors; -EigenConvolutionKernel1D(internal::IndexMapper::Layout> indexMapper_, - Kernel_accessor kernel_filter_, const size_t kernelSize_, const size_t range_x_, const size_t range_y_, - Buffer_accessor buffer_acc_, Local_accessor local_acc_, FunctorExpr functors_, TupleType tuple_of_accessors_) - :indexMapper(indexMapper_), kernel_filter(kernel_filter_), kernelSize(kernelSize_), range_x(range_x_), range_y(range_y_), - buffer_acc(buffer_acc_), local_acc(local_acc_), functors(functors_), tuple_of_accessors(tuple_of_accessors_) {} - - void operator()(cl::sycl::nd_item<2> itemID) { - typedef typename TensorSycl::internal::ConvertToDeviceExpression::Type DevExpr; - auto device_expr =TensorSycl::internal::createDeviceExpression(functors, tuple_of_accessors); - auto device_evaluator = Eigen::TensorEvaluator(device_expr.expr, Eigen::DefaultDevice()); - - auto buffer_ptr = ConvertToActualTypeSycl(CoeffReturnType, buffer_acc); - auto kernel_ptr = ConvertToActualTypeSycl(KernelType, kernel_filter); - - const size_t num_x_input = (itemID.get_local_range()[0] +kernelSize -1); //the required row to be calculated for the for each plane in shered memory - const size_t plane_kernel_offset = itemID.get_local(1) * num_x_input; - const size_t first_input_start = itemID.get_group(0)*itemID.get_local_range()[0]; - const size_t plane_tensor_offset =indexMapper.mapCudaInputPlaneToTensorInputOffset(itemID.get_global(1)); - /// fill the shared memory - for (size_t i = itemID.get_local(0); i < num_x_input ; i += itemID.get_local_range()[0]) { - const size_t local_index = i + plane_kernel_offset ; - const size_t tensor_index = plane_tensor_offset + indexMapper.mapCudaInputKernelToTensorInputOffset(i + first_input_start); - if(((i + first_input_start) < (range_x +kernelSize-1)) && itemID.get_global(1)< range_y){ - local_acc[local_index] = device_evaluator.coeff(tensor_index); - } - else local_acc[local_index]=0.0f; - } - - itemID.barrier(cl::sycl::access::fence_space::local_space); - - // calculate the convolution - const size_t first_output_start =itemID.get_group(0)*(itemID.get_local_range()[0]); // output start x - if(itemID.get_global(0)< range_x && itemID.get_global(1)< range_y){ - CoeffReturnType result = static_cast(0); - const size_t index = plane_kernel_offset+ itemID.get_local(0); - for (size_t k = 0; k < kernelSize; ++k) { - result += (local_acc[k + index] * kernel_ptr[k]); - } - const size_t tensor_index = indexMapper.mapCudaOutputPlaneToTensorOutputOffset(itemID.get_global(1)) - +indexMapper.mapCudaOutputKernelToTensorOutputOffset(itemID.get_local(0) + first_output_start); - buffer_ptr[tensor_index] = result; - } - } -}; - - -template -struct EigenConvolutionKernel2D{ -typedef typename TensorSycl::internal::createPlaceHolderExpression::Type PlaceHolderExpr; -internal::IndexMapper::Layout> indexMapper; -Kernel_accessor kernel_filter; -const size_t kernelSize_x, kernelSize_y, range_x, range_y , range_z; -Buffer_accessor buffer_acc; -Local_accessor local_acc; -FunctorExpr functors; -TupleType tuple_of_accessors; -EigenConvolutionKernel2D(internal::IndexMapper::Layout> indexMapper_, - Kernel_accessor kernel_filter_, const size_t kernelSize_x_, const size_t kernelSize_y_ ,const size_t range_x_, const size_t range_y_, const size_t range_z_, - Buffer_accessor buffer_acc_, Local_accessor local_acc_, FunctorExpr functors_, TupleType tuple_of_accessors_) - :indexMapper(indexMapper_), kernel_filter(kernel_filter_), kernelSize_x(kernelSize_x_), kernelSize_y(kernelSize_y_), range_x(range_x_), range_y(range_y_), range_z(range_z_), - buffer_acc(buffer_acc_), local_acc(local_acc_), functors(functors_), tuple_of_accessors(tuple_of_accessors_) {} - - void operator()(cl::sycl::nd_item<3> itemID) { - typedef typename TensorSycl::internal::ConvertToDeviceExpression::Type DevExpr; - auto device_expr =TensorSycl::internal::createDeviceExpression(functors, tuple_of_accessors); - auto device_evaluator = Eigen::TensorEvaluator(device_expr.expr, Eigen::DefaultDevice()); - - auto buffer_ptr = ConvertToActualTypeSycl(CoeffReturnType, buffer_acc); - auto kernel_ptr = ConvertToActualTypeSycl(KernelType, kernel_filter); - const size_t num_x_input = (itemID.get_local_range()[0] +kernelSize_x -1); //the required row to be calculated for the for each plane in shered memory - const size_t num_y_input = (itemID.get_local_range()[1] +kernelSize_y -1); //the required row to be calculated for the for each plane in shered memory - const size_t plane_input_offset = indexMapper.mapCudaInputPlaneToTensorInputOffset(itemID.get_global(2)); - const size_t plane_kernel_offset = itemID.get_local(2) * num_y_input; - - /// fill the shared memory - const size_t first_x_input_start = itemID.get_group(0)*itemID.get_local_range()[0]; - const size_t first_y_input_start = itemID.get_group(1)*itemID.get_local_range()[1]; - for (size_t j = itemID.get_local(1); j < num_y_input; j += itemID.get_local_range()[1]) { - const size_t local_input_offset = num_x_input * (j + plane_kernel_offset); - for (size_t i = itemID.get_local(0); i < num_x_input ; i += itemID.get_local_range()[0]) { - const size_t local_index = i + local_input_offset; - const size_t tensor_index = plane_input_offset + indexMapper.mapCudaInputKernelToTensorInputOffset(i + first_x_input_start, j+ first_y_input_start ); - if(((i + first_x_input_start) < (range_x +kernelSize_x-1)) &&((j + first_y_input_start) < (range_y +kernelSize_y-1)) && itemID.get_global(2)< range_z){ - local_acc[local_index] = device_evaluator.coeff(tensor_index); - } - else local_acc[local_index]=0.0f; - } - } - - itemID.barrier(cl::sycl::access::fence_space::local_space); - - // calculate the convolution - const size_t fitst_x_output_start =itemID.get_group(0)*(itemID.get_local_range()[0]); // output start x - const size_t fitst_y_output_start =itemID.get_group(1)*(itemID.get_local_range()[1]); // output start y - if(itemID.get_global(0)< range_x && itemID.get_global(1)< range_y && itemID.get_global(2)< range_z){ - CoeffReturnType result = static_cast(0); - for (size_t j = 0; j < kernelSize_y; j++) { - size_t kernel_offset =kernelSize_x * j; - const size_t index = (num_x_input*(plane_kernel_offset + j+ itemID.get_local(1))) + itemID.get_local(0); - for (size_t i = 0; i < kernelSize_x; i++) { - result += (local_acc[i + index] * kernel_ptr[i+kernel_offset]); - } - } - const size_t tensor_index = indexMapper.mapCudaOutputPlaneToTensorOutputOffset(itemID.get_global(2)) - +indexMapper.mapCudaOutputKernelToTensorOutputOffset(itemID.get_local(0) + fitst_x_output_start, itemID.get_local(1) + fitst_y_output_start); - buffer_ptr[tensor_index] = result; - } - } -}; - - - -template -struct EigenConvolutionKernel3D{ -typedef typename TensorSycl::internal::createPlaceHolderExpression::Type PlaceHolderExpr; -internal::IndexMapper::Layout> indexMapper; -Kernel_accessor kernel_filter; -const size_t kernelSize_x, kernelSize_y, kernelSize_z, range_x, range_y , range_z, numP; -Buffer_accessor buffer_acc; -Local_accessor local_acc; -FunctorExpr functors; -TupleType tuple_of_accessors; -EigenConvolutionKernel3D(internal::IndexMapper::Layout> indexMapper_, - Kernel_accessor kernel_filter_, const size_t kernelSize_x_, const size_t kernelSize_y_ , const size_t kernelSize_z_ , - const size_t range_x_, const size_t range_y_, const size_t range_z_, const size_t numP_, - Buffer_accessor buffer_acc_, Local_accessor local_acc_, FunctorExpr functors_, TupleType tuple_of_accessors_) - :indexMapper(indexMapper_), kernel_filter(kernel_filter_), kernelSize_x(kernelSize_x_), kernelSize_y(kernelSize_y_), - kernelSize_z(kernelSize_z_), range_x(range_x_), range_y(range_y_), range_z(range_z_), numP(numP_), - buffer_acc(buffer_acc_), local_acc(local_acc_), functors(functors_), tuple_of_accessors(tuple_of_accessors_) {} - - void operator()(cl::sycl::nd_item<3> itemID) { - typedef typename TensorSycl::internal::ConvertToDeviceExpression::Type DevExpr; - auto device_expr =TensorSycl::internal::createDeviceExpression(functors, tuple_of_accessors); - auto device_evaluator = Eigen::TensorEvaluator(device_expr.expr, Eigen::DefaultDevice()); - - auto buffer_ptr = ConvertToActualTypeSycl(CoeffReturnType, buffer_acc); - auto kernel_ptr = ConvertToActualTypeSycl(KernelType, kernel_filter); - const size_t num_x_input = (itemID.get_local_range()[0] +kernelSize_x -1); //the required row to be calculated for the for each plane in shered memory - const size_t num_y_input = (itemID.get_local_range()[1] +kernelSize_y -1); //the required row to be calculated for the for each plane in shered memory - const size_t num_z_input = (itemID.get_local_range()[2] +kernelSize_z -1); //the required row to be calculated for the for each plane in shered memory - const size_t first_x_input_start = itemID.get_group(0)*itemID.get_local_range()[0]; - const size_t first_y_input_start = itemID.get_group(1)*itemID.get_local_range()[1]; - const size_t first_z_input_start = itemID.get_group(2)*itemID.get_local_range()[2]; - for(size_t p=0; p(0); - for (size_t k = 0; k < kernelSize_z; k++) { - for (size_t j = 0; j < kernelSize_y; j++) { - for (size_t i = 0; i < kernelSize_x; i++) { - const size_t kernel_index =i + kernelSize_x * (j + kernelSize_y * k); - const size_t local_index = ((i+ itemID.get_local(0))+ num_x_input*((j+ itemID.get_local(1)) + num_y_input * (k+ itemID.get_local(2)))); - result += (local_acc[local_index] * kernel_ptr[kernel_index]); - } - } - } - const size_t tensor_index = indexMapper.mapCudaOutputPlaneToTensorOutputOffset(p) - +indexMapper.mapCudaOutputKernelToTensorOutputOffset(itemID.get_local(0) + fitst_x_output_start, itemID.get_local(1) + fitst_y_output_start, itemID.get_local(2) + fitst_z_output_start ); - buffer_ptr[tensor_index] = result; - } - - itemID.barrier(cl::sycl::access::fence_space::local_space); - } - } -}; - - -template -struct TensorEvaluator, const Eigen::SyclDevice> -{ - typedef TensorConvolutionOp XprType; - - static const int NumDims = internal::array_size::Dimensions>::value; - static const int NumKernelDims = internal::array_size::value; - typedef typename XprType::Index Index; - typedef DSizes Dimensions; - typedef typename TensorEvaluator::Dimensions KernelDimensions; - typedef const Eigen::SyclDevice Device; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Eigen::SyclDevice& device) - : m_inputImpl(op.inputExpression(), device), m_kernelArg(op.kernelExpression()), m_kernelImpl(op.kernelExpression(), device), m_indices(op.indices()), m_buf(NULL), m_kernel(NULL), m_local_kernel(false), m_device(device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE); - - const typename TensorEvaluator::Dimensions& input_dims = m_inputImpl.dimensions(); - const typename TensorEvaluator::Dimensions& kernel_dims = m_kernelImpl.dimensions(); - - m_dimensions = m_inputImpl.dimensions(); - for (int i = 0; i < NumKernelDims; ++i) { - const Index index = op.indices()[i]; - const Index input_dim = input_dims[index]; - const Index kernel_dim = kernel_dims[i]; - const Index result_dim = input_dim - kernel_dim + 1; - m_dimensions[index] = result_dim; - } - } - - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef typename InputArgType::Scalar Scalar; - static const int PacketSize = internal::unpacket_traits::size; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* data) { - preloadKernel(); - m_inputImpl.evalSubExprsIfNeeded(NULL); - if (data) { - executeEval(data); - return false; - } else { - m_buf = (Scalar*)m_device.allocate(dimensions().TotalSize() * sizeof(Scalar)); - executeEval(m_buf); - return true; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_inputImpl.cleanup(); - if (m_buf) { - m_device.deallocate(m_buf); - m_buf = NULL; - } - if (m_local_kernel) { - m_device.deallocate((void*)m_kernel); - m_local_kernel = false; - } - m_kernel = NULL; - } - /// used by sycl in order to build the sycl buffer - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Device& device() const{return m_device;} - /// used by sycl in order to build the sycl buffer - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType* data() const { return m_buf; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void preloadKernel() { - // Don't make a local copy of the kernel unless we have to (i.e. it's an - // expression that needs to be evaluated) - const Scalar* in_place = m_kernelImpl.data(); - if (in_place) { - m_kernel = in_place; - m_local_kernel = false; - } else { - size_t kernel_sz = m_kernelImpl.dimensions().TotalSize() * sizeof(Scalar); - Scalar* local = (Scalar*)m_device.allocate(kernel_sz); - typedef TensorEvalToOp EvalTo; - EvalTo evalToTmp(local, m_kernelArg); - const bool PacketAccess = internal::IsVectorizable::value; - internal::TensorExecutor::run(evalToTmp, m_device); - m_kernel = local; - m_local_kernel = true; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void executeEval(Scalar* data) const { - typedef TensorEvaluator InputEvaluator; - typedef typename InputEvaluator::Dimensions InputDims; - - typedef Eigen::TensorSycl::internal::FunctorExtractor InputFunctorExpr; - // extract input functor list - InputFunctorExpr input_functors = Eigen::TensorSycl::internal::extractFunctors(m_inputImpl); - - - m_device.sycl_queue().submit([&](cl::sycl::handler &cgh) { - - typedef cl::sycl::accessor InputLocalAcc; - /// work-around for gcc 4.8 auto bug - typedef decltype(Eigen::TensorSycl::internal::createTupleOfAccessors(cgh, m_inputImpl)) InputTupleType; - // create input tuple of accessors - InputTupleType tuple_of_accessors = Eigen::TensorSycl::internal::createTupleOfAccessors(cgh, m_inputImpl); - - typedef cl::sycl::accessor OutputAccessorType; - OutputAccessorType out_res= m_device. template get_sycl_accessor(cgh, data); - typedef cl::sycl::accessor KernelAccessorType; - KernelAccessorType kernel_acc= m_device. template get_sycl_accessor(cgh, m_kernel); - - switch (NumKernelDims) { - case 1: { - const size_t numX = dimensions()[m_indices[0]]; - const size_t numP = dimensions().TotalSize() / numX; - const size_t kernel_size = m_kernelImpl.dimensions().TotalSize(); - size_t range_x, GRange_x, tileSize_x, range_y, GRange_y, tileSize_y; - m_device.parallel_for_setup(numX, numP, tileSize_x,tileSize_y,range_x,range_y, GRange_x, GRange_y ); - const size_t shared_mem =(tileSize_x +kernel_size -1)*(tileSize_y); - assert(static_cast(shared_mem) <= m_device.sharedMemPerBlock()); - auto global_range=cl::sycl::range<2>(GRange_x, GRange_y); // global range - auto local_range=cl::sycl::range<2>(tileSize_x, tileSize_y); // local range - InputLocalAcc local_acc(cl::sycl::range<1>(shared_mem), cgh); - const array indices{{m_indices[0]}}; - const array kernel_dims{{m_kernelImpl.dimensions()[0]}}; - internal::IndexMapper indexMapper(m_inputImpl.dimensions(), kernel_dims, indices); - cgh.parallel_for(cl::sycl::nd_range<2>(global_range, local_range), - EigenConvolutionKernel1D( - indexMapper,kernel_acc, kernel_size, numX, numP, out_res, local_acc, input_functors, tuple_of_accessors)); - break; - } - - case 2: { - const size_t idxX =static_cast(Layout) == static_cast(ColMajor) ? 0 : 1; - const size_t idxY =static_cast(Layout) == static_cast(ColMajor) ? 1 : 0; - const size_t kernel_size_x = m_kernelImpl.dimensions()[idxX]; - const size_t kernel_size_y = m_kernelImpl.dimensions()[idxY]; - const size_t numX = dimensions()[m_indices[idxX]]; - const size_t numY = dimensions()[m_indices[idxY]]; - const size_t numP = dimensions().TotalSize() / (numX*numY); - size_t range_x, GRange_x, tileSize_x, range_y, GRange_y, tileSize_y, range_z, GRange_z, tileSize_z; - m_device.parallel_for_setup(numX, numY, numP, tileSize_x, tileSize_y, tileSize_z, range_x, range_y, range_z, GRange_x, GRange_y, GRange_z ); - const size_t shared_mem =(tileSize_x +kernel_size_x -1)*(tileSize_y +kernel_size_y -1) * tileSize_z; - assert(static_cast(shared_mem) <= m_device.sharedMemPerBlock()); - auto global_range=cl::sycl::range<3>(GRange_x, GRange_y, GRange_z); // global range - auto local_range=cl::sycl::range<3>(tileSize_x, tileSize_y, tileSize_z); // local range - InputLocalAcc local_acc(cl::sycl::range<1>(shared_mem), cgh); - const array indices {{m_indices[idxX], m_indices[idxY]}}; - const array kernel_dims{{m_kernelImpl.dimensions()[idxX], m_kernelImpl.dimensions()[idxY]}}; - internal::IndexMapper indexMapper(m_inputImpl.dimensions(), kernel_dims, indices); - cgh.parallel_for(cl::sycl::nd_range<3>(global_range, local_range), - EigenConvolutionKernel2D( - indexMapper,kernel_acc, kernel_size_x, kernel_size_y, numX, numY, numP, out_res, local_acc, input_functors, tuple_of_accessors)); - break; - } - - case 3: { - const size_t idxX =static_cast(Layout) == static_cast(ColMajor) ? 0 : 2; - const size_t idxY =static_cast(Layout) == static_cast(ColMajor) ? 1 : 1; - const size_t idxZ =static_cast(Layout) == static_cast(ColMajor) ? 2 : 0; - const size_t kernel_size_x = m_kernelImpl.dimensions()[idxX]; - const size_t kernel_size_y = m_kernelImpl.dimensions()[idxY]; - const size_t kernel_size_z = m_kernelImpl.dimensions()[idxZ]; - const size_t numX = dimensions()[m_indices[idxX]]; - const size_t numY = dimensions()[m_indices[idxY]]; - const size_t numZ = dimensions()[m_indices[idxZ]]; - const size_t numP = dimensions().TotalSize() / (numX*numY*numZ); - const array indices{{m_indices[idxX], m_indices[idxY], m_indices[idxZ]}}; - const array kernel_dims{{m_kernelImpl.dimensions()[idxX],m_kernelImpl.dimensions()[idxY], m_kernelImpl.dimensions()[idxZ]}}; - internal::IndexMapper indexMapper(m_inputImpl.dimensions(), kernel_dims, indices); - size_t range_x, GRange_x, tileSize_x, range_y, GRange_y, tileSize_y, range_z, GRange_z, tileSize_z; - m_device.parallel_for_setup(numX, numY, numZ, tileSize_x, tileSize_y, tileSize_z, range_x, range_y, range_z, GRange_x, GRange_y, GRange_z ); - const size_t shared_mem =(tileSize_x +kernel_size_x -1)*(tileSize_y +kernel_size_y -1) * (tileSize_z +kernel_size_y -1); - assert(static_cast(shared_mem) <= m_device.sharedMemPerBlock()); - auto global_range=cl::sycl::range<3>(GRange_x, GRange_y, GRange_z); // global range - auto local_range=cl::sycl::range<3>(tileSize_x, tileSize_y, tileSize_z); // local range - InputLocalAcc local_acc(cl::sycl::range<1>(shared_mem), cgh); - cgh.parallel_for(cl::sycl::nd_range<3>(global_range, local_range), - EigenConvolutionKernel3D( - indexMapper,kernel_acc, kernel_size_x, kernel_size_y, kernel_size_z, numX, numY, - numZ, numP, out_res, local_acc, input_functors, tuple_of_accessors)); - break; - } - - default: { - EIGEN_STATIC_ASSERT((NumKernelDims >= 1 && NumKernelDims <= 3), THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE); - } - } - }); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - eigen_assert(m_buf); - eigen_assert(index < m_dimensions.TotalSize()); - return m_buf[index]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(const Index index) const - { - eigen_assert(m_buf); - eigen_assert(index < m_dimensions.TotalSize()); - return internal::ploadt(m_buf+index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - // TODO(rmlarsen): FIXME: For now, this is just a copy of the CPU cost - // model. - const double kernel_size = m_kernelImpl.dimensions().TotalSize(); - // We ignore the use of fused multiply-add. - const double convolve_compute_cost = - TensorOpCost::AddCost() + TensorOpCost::MulCost(); - const double firstIndex_compute_cost = - NumDims * - (2 * TensorOpCost::AddCost() + 2 * TensorOpCost::MulCost() + - TensorOpCost::DivCost()); - return TensorOpCost(0, 0, firstIndex_compute_cost, vectorized, PacketSize) + - kernel_size * (m_inputImpl.costPerCoeff(vectorized) + - m_kernelImpl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, convolve_compute_cost, vectorized, - PacketSize)); - } - - private: - // No assignment (copies are needed by the kernels) - TensorEvaluator& operator = (const TensorEvaluator&); - TensorEvaluator m_inputImpl; - KernelArgType m_kernelArg; - TensorEvaluator m_kernelImpl; - Indices m_indices; - Dimensions m_dimensions; - Scalar* m_buf; - const Scalar* m_kernel; - bool m_local_kernel; - const Eigen::SyclDevice& m_device; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h deleted file mode 100644 index 83c449cf..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h +++ /dev/null @@ -1,212 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Rasmus Munk Larsen -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_COST_MODEL_H -#define EIGEN_CXX11_TENSOR_TENSOR_COST_MODEL_H - -namespace Eigen { - -/** \class TensorEvaluator - * \ingroup CXX11_Tensor_Module - * - * \brief A cost model used to limit the number of threads used for evaluating - * tensor expression. - * - */ - -// Class storing the cost of evaluating a tensor expression in terms of the -// estimated number of operand bytes loads, bytes stored, and compute cycles. -class TensorOpCost { - public: - // TODO(rmlarsen): Fix the scalar op costs in Eigen proper. Even a simple - // model based on minimal reciprocal throughput numbers from Intel or - // Agner Fog's tables would be better than what is there now. - template - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int MulCost() { - return internal::functor_traits< - internal::scalar_product_op >::Cost; - } - template - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int AddCost() { - return internal::functor_traits >::Cost; - } - template - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int DivCost() { - return internal::functor_traits< - internal::scalar_quotient_op >::Cost; - } - template - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int ModCost() { - return internal::functor_traits >::Cost; - } - template - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int CastCost() { - return internal::functor_traits< - internal::scalar_cast_op >::Cost; - } - - EIGEN_DEVICE_FUNC - TensorOpCost() : bytes_loaded_(0), bytes_stored_(0), compute_cycles_(0) {} - EIGEN_DEVICE_FUNC - TensorOpCost(double bytes_loaded, double bytes_stored, double compute_cycles) - : bytes_loaded_(bytes_loaded), - bytes_stored_(bytes_stored), - compute_cycles_(compute_cycles) {} - - EIGEN_DEVICE_FUNC - TensorOpCost(double bytes_loaded, double bytes_stored, double compute_cycles, - bool vectorized, double packet_size) - : bytes_loaded_(bytes_loaded), - bytes_stored_(bytes_stored), - compute_cycles_(vectorized ? compute_cycles / packet_size - : compute_cycles) { - eigen_assert(bytes_loaded >= 0 && (numext::isfinite)(bytes_loaded)); - eigen_assert(bytes_stored >= 0 && (numext::isfinite)(bytes_stored)); - eigen_assert(compute_cycles >= 0 && (numext::isfinite)(compute_cycles)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bytes_loaded() const { - return bytes_loaded_; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bytes_stored() const { - return bytes_stored_; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double compute_cycles() const { - return compute_cycles_; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double total_cost( - double load_cost, double store_cost, double compute_cost) const { - return load_cost * bytes_loaded_ + store_cost * bytes_stored_ + - compute_cost * compute_cycles_; - } - - // Drop memory access component. Intended for cases when memory accesses are - // sequential or are completely masked by computations. - EIGEN_DEVICE_FUNC void dropMemoryCost() { - bytes_loaded_ = 0; - bytes_stored_ = 0; - } - - // TODO(rmlarsen): Define min in terms of total cost, not elementwise. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost cwiseMin( - const TensorOpCost& rhs) const { - double bytes_loaded = numext::mini(bytes_loaded_, rhs.bytes_loaded()); - double bytes_stored = numext::mini(bytes_stored_, rhs.bytes_stored()); - double compute_cycles = numext::mini(compute_cycles_, rhs.compute_cycles()); - return TensorOpCost(bytes_loaded, bytes_stored, compute_cycles); - } - - // TODO(rmlarsen): Define max in terms of total cost, not elementwise. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost cwiseMax( - const TensorOpCost& rhs) const { - double bytes_loaded = numext::maxi(bytes_loaded_, rhs.bytes_loaded()); - double bytes_stored = numext::maxi(bytes_stored_, rhs.bytes_stored()); - double compute_cycles = numext::maxi(compute_cycles_, rhs.compute_cycles()); - return TensorOpCost(bytes_loaded, bytes_stored, compute_cycles); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost& operator+=( - const TensorOpCost& rhs) { - bytes_loaded_ += rhs.bytes_loaded(); - bytes_stored_ += rhs.bytes_stored(); - compute_cycles_ += rhs.compute_cycles(); - return *this; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost& operator*=(double rhs) { - bytes_loaded_ *= rhs; - bytes_stored_ *= rhs; - compute_cycles_ *= rhs; - return *this; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator+( - TensorOpCost lhs, const TensorOpCost& rhs) { - lhs += rhs; - return lhs; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator*( - TensorOpCost lhs, double rhs) { - lhs *= rhs; - return lhs; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator*( - double lhs, TensorOpCost rhs) { - rhs *= lhs; - return rhs; - } - - friend std::ostream& operator<<(std::ostream& os, const TensorOpCost& tc) { - return os << "[bytes_loaded = " << tc.bytes_loaded() - << ", bytes_stored = " << tc.bytes_stored() - << ", compute_cycles = " << tc.compute_cycles() << "]"; - } - - private: - double bytes_loaded_; - double bytes_stored_; - double compute_cycles_; -}; - -// TODO(rmlarsen): Implement a policy that chooses an "optimal" number of theads -// in [1:max_threads] instead of just switching multi-threading off for small -// work units. -template -class TensorCostModel { - public: - // Scaling from Eigen compute cost to device cycles. - static const int kDeviceCyclesPerComputeCycle = 1; - - // Costs in device cycles. - static const int kStartupCycles = 100000; - static const int kPerThreadCycles = 100000; - static const int kTaskSize = 40000; - - // Returns the number of threads in [1:max_threads] to use for - // evaluating an expression with the given output size and cost per - // coefficient. - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int numThreads( - double output_size, const TensorOpCost& cost_per_coeff, int max_threads) { - double cost = totalCost(output_size, cost_per_coeff); - int threads = (cost - kStartupCycles) / kPerThreadCycles + 0.9; - return numext::mini(max_threads, numext::maxi(1, threads)); - } - - // taskSize assesses parallel task size. - // Value of 1.0 means ideal parallel task size. Values < 1.0 mean that task - // granularity needs to be increased to mitigate parallelization overheads. - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double taskSize( - double output_size, const TensorOpCost& cost_per_coeff) { - return totalCost(output_size, cost_per_coeff) / kTaskSize; - } - - private: - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double totalCost( - double output_size, const TensorOpCost& cost_per_coeff) { - // Cost of memory fetches from L2 cache. 64 is typical cache line size. - // 11 is L2 cache latency on Haswell. - // We don't know whether data is in L1, L2 or L3. But we are most interested - // in single-threaded computational time around 100us-10ms (smaller time - // is too small for parallelization, larger time is not intersting - // either because we are probably using all available threads already). - // And for the target time range, L2 seems to be what matters. Data set - // fitting into L1 is too small to take noticeable time. Data set fitting - // only into L3 presumably will take more than 10ms to load and process. - const double kLoadCycles = 1.0 / 64 * 11; - const double kStoreCycles = 1.0 / 64 * 11; - // Scaling from Eigen compute cost to device cycles. - return output_size * - cost_per_coeff.total_cost(kLoadCycles, kStoreCycles, - kDeviceCyclesPerComputeCycle); - } -}; - -} // namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_COST_MODEL_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h deleted file mode 100644 index e020d076..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h +++ /dev/null @@ -1,313 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_CUSTOM_OP_H -#define EIGEN_CXX11_TENSOR_TENSOR_CUSTOM_OP_H - -namespace Eigen { - -/** \class TensorCustomUnaryOp - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor custom class. - * - * - */ -namespace internal { -template -struct traits > -{ - typedef typename XprType::Scalar Scalar; - typedef typename XprType::StorageKind StorageKind; - typedef typename XprType::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = traits::NumDimensions; - static const int Layout = traits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorCustomUnaryOp& type; -}; - -template -struct nested > -{ - typedef TensorCustomUnaryOp type; -}; - -} // end namespace internal - - - -template -class TensorCustomUnaryOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename internal::nested::type Nested; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCustomUnaryOp(const XprType& expr, const CustomUnaryFunc& func) - : m_expr(expr), m_func(func) {} - - EIGEN_DEVICE_FUNC - const CustomUnaryFunc& func() const { return m_func; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_expr; } - - protected: - typename XprType::Nested m_expr; - const CustomUnaryFunc m_func; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorCustomUnaryOp ArgType; - typedef typename internal::traits::Index Index; - static const int NumDims = internal::traits::NumDimensions; - typedef DSizes Dimensions; - typedef typename internal::remove_const::type Scalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = (internal::packet_traits::size > 1), - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const ArgType& op, const Device& device) - : m_op(op), m_device(device), m_result(NULL) - { - m_dimensions = op.func().dimensions(op.expression()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* data) { - if (data) { - evalTo(data); - return false; - } else { - m_result = static_cast( - m_device.allocate(dimensions().TotalSize() * sizeof(Scalar))); - evalTo(m_result); - return true; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - if (m_result != NULL) { - m_device.deallocate(m_result); - m_result = NULL; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - return m_result[index]; - } - - template - EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const { - return internal::ploadt(m_result + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - // TODO(rmlarsen): Extend CustomOp API to return its cost estimate. - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return m_result; } - - protected: - EIGEN_DEVICE_FUNC void evalTo(Scalar* data) { - TensorMap > result( - data, m_dimensions); - m_op.func().eval(m_op.expression(), result, m_device); - } - - Dimensions m_dimensions; - const ArgType m_op; - const Device& m_device; - CoeffReturnType* m_result; -}; - - - -/** \class TensorCustomBinaryOp - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor custom class. - * - * - */ -namespace internal { -template -struct traits > -{ - typedef typename internal::promote_storage_type::ret Scalar; - typedef typename internal::promote_storage_type::ret CoeffReturnType; - typedef typename promote_storage_type::StorageKind, - typename traits::StorageKind>::ret StorageKind; - typedef typename promote_index_type::Index, - typename traits::Index>::type Index; - typedef typename LhsXprType::Nested LhsNested; - typedef typename RhsXprType::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - static const int NumDimensions = traits::NumDimensions; - static const int Layout = traits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorCustomBinaryOp& type; -}; - -template -struct nested > -{ - typedef TensorCustomBinaryOp type; -}; - -} // end namespace internal - - - -template -class TensorCustomBinaryOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::traits::CoeffReturnType CoeffReturnType; - typedef typename internal::nested::type Nested; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCustomBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs, const CustomBinaryFunc& func) - - : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_func(func) {} - - EIGEN_DEVICE_FUNC - const CustomBinaryFunc& func() const { return m_func; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - lhsExpression() const { return m_lhs_xpr; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - rhsExpression() const { return m_rhs_xpr; } - - protected: - typename LhsXprType::Nested m_lhs_xpr; - typename RhsXprType::Nested m_rhs_xpr; - const CustomBinaryFunc m_func; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorCustomBinaryOp XprType; - typedef typename internal::traits::Index Index; - static const int NumDims = internal::traits::NumDimensions; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = (internal::packet_traits::size > 1), - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_op(op), m_device(device), m_result(NULL) - { - m_dimensions = op.func().dimensions(op.lhsExpression(), op.rhsExpression()); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* data) { - if (data) { - evalTo(data); - return false; - } else { - m_result = static_cast(m_device.allocate(dimensions().TotalSize() * sizeof(Scalar))); - evalTo(m_result); - return true; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - if (m_result != NULL) { - m_device.deallocate(m_result); - m_result = NULL; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - return m_result[index]; - } - - template - EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const { - return internal::ploadt(m_result + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - // TODO(rmlarsen): Extend CustomOp API to return its cost estimate. - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return m_result; } - - protected: - EIGEN_DEVICE_FUNC void evalTo(Scalar* data) { - TensorMap > result(data, m_dimensions); - m_op.func().eval(m_op.lhsExpression(), m_op.rhsExpression(), result, m_device); - } - - Dimensions m_dimensions; - const XprType m_op; - const Device& m_device; - CoeffReturnType* m_result; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_CUSTOM_OP_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h deleted file mode 100644 index 29e50a3b..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h +++ /dev/null @@ -1,68 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_DEVICE_H -#define EIGEN_CXX11_TENSOR_TENSOR_DEVICE_H - -namespace Eigen { - -/** \class TensorDevice - * \ingroup CXX11_Tensor_Module - * - * \brief Pseudo expression providing an operator = that will evaluate its argument - * on the specified computing 'device' (GPU, thread pool, ...) - * - * Example: - * C.device(EIGEN_GPU) = A + B; - * - * Todo: operator *= and /=. - */ - -template class TensorDevice { - public: - TensorDevice(const DeviceType& device, ExpressionType& expression) : m_device(device), m_expression(expression) {} - - template - EIGEN_STRONG_INLINE TensorDevice& operator=(const OtherDerived& other) { - typedef TensorAssignOp Assign; - Assign assign(m_expression, other); - internal::TensorExecutor::run(assign, m_device); - return *this; - } - - template - EIGEN_STRONG_INLINE TensorDevice& operator+=(const OtherDerived& other) { - typedef typename OtherDerived::Scalar Scalar; - typedef TensorCwiseBinaryOp, const ExpressionType, const OtherDerived> Sum; - Sum sum(m_expression, other); - typedef TensorAssignOp Assign; - Assign assign(m_expression, sum); - internal::TensorExecutor::run(assign, m_device); - return *this; - } - - template - EIGEN_STRONG_INLINE TensorDevice& operator-=(const OtherDerived& other) { - typedef typename OtherDerived::Scalar Scalar; - typedef TensorCwiseBinaryOp, const ExpressionType, const OtherDerived> Difference; - Difference difference(m_expression, other); - typedef TensorAssignOp Assign; - Assign assign(m_expression, difference); - internal::TensorExecutor::run(assign, m_device); - return *this; - } - - protected: - const DeviceType& m_device; - ExpressionType& m_expression; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h deleted file mode 100644 index be8d6938..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h +++ /dev/null @@ -1,340 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#if defined(EIGEN_USE_GPU) && !defined(EIGEN_CXX11_TENSOR_TENSOR_DEVICE_CUDA_H) -#define EIGEN_CXX11_TENSOR_TENSOR_DEVICE_CUDA_H - -namespace Eigen { - -static const int kCudaScratchSize = 1024; - -// This defines an interface that GPUDevice can take to use -// CUDA streams underneath. -class StreamInterface { - public: - virtual ~StreamInterface() {} - - virtual const cudaStream_t& stream() const = 0; - virtual const cudaDeviceProp& deviceProperties() const = 0; - - // Allocate memory on the actual device where the computation will run - virtual void* allocate(size_t num_bytes) const = 0; - virtual void deallocate(void* buffer) const = 0; - - // Return a scratchpad buffer of size 1k - virtual void* scratchpad() const = 0; - - // Return a semaphore. The semaphore is initially initialized to 0, and - // each kernel using it is responsible for resetting to 0 upon completion - // to maintain the invariant that the semaphore is always equal to 0 upon - // each kernel start. - virtual unsigned int* semaphore() const = 0; -}; - -static cudaDeviceProp* m_deviceProperties; -static bool m_devicePropInitialized = false; - -static void initializeDeviceProp() { - if (!m_devicePropInitialized) { - // Attempts to ensure proper behavior in the case of multiple threads - // calling this function simultaneously. This would be trivial to - // implement if we could use std::mutex, but unfortunately mutex don't - // compile with nvcc, so we resort to atomics and thread fences instead. - // Note that if the caller uses a compiler that doesn't support c++11 we - // can't ensure that the initialization is thread safe. -#if __cplusplus >= 201103L - static std::atomic first(true); - if (first.exchange(false)) { -#else - static bool first = true; - if (first) { - first = false; -#endif - // We're the first thread to reach this point. - int num_devices; - cudaError_t status = cudaGetDeviceCount(&num_devices); - if (status != cudaSuccess) { - std::cerr << "Failed to get the number of CUDA devices: " - << cudaGetErrorString(status) - << std::endl; - assert(status == cudaSuccess); - } - m_deviceProperties = new cudaDeviceProp[num_devices]; - for (int i = 0; i < num_devices; ++i) { - status = cudaGetDeviceProperties(&m_deviceProperties[i], i); - if (status != cudaSuccess) { - std::cerr << "Failed to initialize CUDA device #" - << i - << ": " - << cudaGetErrorString(status) - << std::endl; - assert(status == cudaSuccess); - } - } - -#if __cplusplus >= 201103L - std::atomic_thread_fence(std::memory_order_release); -#endif - m_devicePropInitialized = true; - } else { - // Wait for the other thread to inititialize the properties. - while (!m_devicePropInitialized) { -#if __cplusplus >= 201103L - std::atomic_thread_fence(std::memory_order_acquire); -#endif - EIGEN_SLEEP(1000); - } - } - } -} - -static const cudaStream_t default_stream = cudaStreamDefault; - -class CudaStreamDevice : public StreamInterface { - public: - // Use the default stream on the current device - CudaStreamDevice() : stream_(&default_stream), scratch_(NULL), semaphore_(NULL) { - cudaGetDevice(&device_); - initializeDeviceProp(); - } - // Use the default stream on the specified device - CudaStreamDevice(int device) : stream_(&default_stream), device_(device), scratch_(NULL), semaphore_(NULL) { - initializeDeviceProp(); - } - // Use the specified stream. Note that it's the - // caller responsibility to ensure that the stream can run on - // the specified device. If no device is specified the code - // assumes that the stream is associated to the current gpu device. - CudaStreamDevice(const cudaStream_t* stream, int device = -1) - : stream_(stream), device_(device), scratch_(NULL), semaphore_(NULL) { - if (device < 0) { - cudaGetDevice(&device_); - } else { - int num_devices; - cudaError_t err = cudaGetDeviceCount(&num_devices); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); - assert(device < num_devices); - device_ = device; - } - initializeDeviceProp(); - } - - virtual ~CudaStreamDevice() { - if (scratch_) { - deallocate(scratch_); - } - } - - const cudaStream_t& stream() const { return *stream_; } - const cudaDeviceProp& deviceProperties() const { - return m_deviceProperties[device_]; - } - virtual void* allocate(size_t num_bytes) const { - cudaError_t err = cudaSetDevice(device_); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); - void* result; - err = cudaMalloc(&result, num_bytes); - assert(err == cudaSuccess); - assert(result != NULL); - return result; - } - virtual void deallocate(void* buffer) const { - cudaError_t err = cudaSetDevice(device_); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); - assert(buffer != NULL); - err = cudaFree(buffer); - assert(err == cudaSuccess); - } - - virtual void* scratchpad() const { - if (scratch_ == NULL) { - scratch_ = allocate(kCudaScratchSize + sizeof(unsigned int)); - } - return scratch_; - } - - virtual unsigned int* semaphore() const { - if (semaphore_ == NULL) { - char* scratch = static_cast(scratchpad()) + kCudaScratchSize; - semaphore_ = reinterpret_cast(scratch); - cudaError_t err = cudaMemsetAsync(semaphore_, 0, sizeof(unsigned int), *stream_); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); - } - return semaphore_; - } - - private: - const cudaStream_t* stream_; - int device_; - mutable void* scratch_; - mutable unsigned int* semaphore_; -}; - -struct GpuDevice { - // The StreamInterface is not owned: the caller is - // responsible for its initialization and eventual destruction. - explicit GpuDevice(const StreamInterface* stream) : stream_(stream), max_blocks_(INT_MAX) { - eigen_assert(stream); - } - explicit GpuDevice(const StreamInterface* stream, int num_blocks) : stream_(stream), max_blocks_(num_blocks) { - eigen_assert(stream); - } - // TODO(bsteiner): This is an internal API, we should not expose it. - EIGEN_STRONG_INLINE const cudaStream_t& stream() const { - return stream_->stream(); - } - - EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const { - return stream_->allocate(num_bytes); - } - - EIGEN_STRONG_INLINE void deallocate(void* buffer) const { - stream_->deallocate(buffer); - } - - EIGEN_STRONG_INLINE void* scratchpad() const { - return stream_->scratchpad(); - } - - EIGEN_STRONG_INLINE unsigned int* semaphore() const { - return stream_->semaphore(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpy(void* dst, const void* src, size_t n) const { -#ifndef __CUDA_ARCH__ - cudaError_t err = cudaMemcpyAsync(dst, src, n, cudaMemcpyDeviceToDevice, - stream_->stream()); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); -#else - EIGEN_UNUSED_VARIABLE(dst); - EIGEN_UNUSED_VARIABLE(src); - EIGEN_UNUSED_VARIABLE(n); - eigen_assert(false && "The default device should be used instead to generate kernel code"); -#endif - } - - EIGEN_STRONG_INLINE void memcpyHostToDevice(void* dst, const void* src, size_t n) const { - cudaError_t err = - cudaMemcpyAsync(dst, src, n, cudaMemcpyHostToDevice, stream_->stream()); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); - } - - EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const { - cudaError_t err = - cudaMemcpyAsync(dst, src, n, cudaMemcpyDeviceToHost, stream_->stream()); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const { -#ifndef __CUDA_ARCH__ - cudaError_t err = cudaMemsetAsync(buffer, c, n, stream_->stream()); - EIGEN_UNUSED_VARIABLE(err) - assert(err == cudaSuccess); -#else - eigen_assert(false && "The default device should be used instead to generate kernel code"); -#endif - } - - EIGEN_STRONG_INLINE size_t numThreads() const { - // FIXME - return 32; - } - - EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const { - // FIXME - return 48*1024; - } - - EIGEN_STRONG_INLINE size_t lastLevelCacheSize() const { - // We won't try to take advantage of the l2 cache for the time being, and - // there is no l3 cache on cuda devices. - return firstLevelCacheSize(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void synchronize() const { -#if defined(__CUDACC__) && !defined(__CUDA_ARCH__) - cudaError_t err = cudaStreamSynchronize(stream_->stream()); - if (err != cudaSuccess) { - std::cerr << "Error detected in CUDA stream: " - << cudaGetErrorString(err) - << std::endl; - assert(err == cudaSuccess); - } -#else - assert(false && "The default device should be used instead to generate kernel code"); -#endif - } - - EIGEN_STRONG_INLINE int getNumCudaMultiProcessors() const { - return stream_->deviceProperties().multiProcessorCount; - } - EIGEN_STRONG_INLINE int maxCudaThreadsPerBlock() const { - return stream_->deviceProperties().maxThreadsPerBlock; - } - EIGEN_STRONG_INLINE int maxCudaThreadsPerMultiProcessor() const { - return stream_->deviceProperties().maxThreadsPerMultiProcessor; - } - EIGEN_STRONG_INLINE int sharedMemPerBlock() const { - return stream_->deviceProperties().sharedMemPerBlock; - } - EIGEN_STRONG_INLINE int majorDeviceVersion() const { - return stream_->deviceProperties().major; - } - EIGEN_STRONG_INLINE int minorDeviceVersion() const { - return stream_->deviceProperties().minor; - } - - EIGEN_STRONG_INLINE int maxBlocks() const { - return max_blocks_; - } - - // This function checks if the CUDA runtime recorded an error for the - // underlying stream device. - inline bool ok() const { -#ifdef __CUDACC__ - cudaError_t error = cudaStreamQuery(stream_->stream()); - return (error == cudaSuccess) || (error == cudaErrorNotReady); -#else - return false; -#endif - } - - private: - const StreamInterface* stream_; - int max_blocks_; -}; - -#define LAUNCH_CUDA_KERNEL(kernel, gridsize, blocksize, sharedmem, device, ...) \ - (kernel) <<< (gridsize), (blocksize), (sharedmem), (device).stream() >>> (__VA_ARGS__); \ - assert(cudaGetLastError() == cudaSuccess); - - -// FIXME: Should be device and kernel specific. -#ifdef __CUDACC__ -static EIGEN_DEVICE_FUNC inline void setCudaSharedMemConfig(cudaSharedMemConfig config) { -#ifndef __CUDA_ARCH__ - cudaError_t status = cudaDeviceSetSharedMemConfig(config); - EIGEN_UNUSED_VARIABLE(status) - assert(status == cudaSuccess); -#else - EIGEN_UNUSED_VARIABLE(config) -#endif -} -#endif - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_CUDA_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h deleted file mode 100644 index ccaaa6cb..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h +++ /dev/null @@ -1,81 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H -#define EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H - - -namespace Eigen { - -// Default device for the machine (typically a single cpu core) -struct DefaultDevice { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const { - return internal::aligned_malloc(num_bytes); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void deallocate(void* buffer) const { - internal::aligned_free(buffer); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpy(void* dst, const void* src, size_t n) const { - ::memcpy(dst, src, n); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpyHostToDevice(void* dst, const void* src, size_t n) const { - memcpy(dst, src, n); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const { - memcpy(dst, src, n); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const { - ::memset(buffer, c, n); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t numThreads() const { -#ifndef __CUDA_ARCH__ - // Running on the host CPU - return 1; -#else - // Running on a CUDA device - return 32; -#endif - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const { -#if !defined(__CUDA_ARCH__) && !defined(__SYCL_DEVICE_ONLY__) - // Running on the host CPU - return l1CacheSize(); -#else - // Running on a CUDA device, return the amount of shared memory available. - return 48*1024; -#endif - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t lastLevelCacheSize() const { -#if !defined(__CUDA_ARCH__) && !defined(__SYCL_DEVICE_ONLY__) - // Running single threaded on the host CPU - return l3CacheSize(); -#else - // Running on a CUDA device - return firstLevelCacheSize(); -#endif - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int majorDeviceVersion() const { -#ifndef __CUDA_ARCH__ - // Running single threaded on the host CPU - // Should return an enum that encodes the ISA supported by the CPU - return 1; -#else - // Running on a CUDA device - return __CUDA_ARCH__ / 100; -#endif - } -}; - -} // namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h deleted file mode 100644 index e209799b..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h +++ /dev/null @@ -1,415 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Mehdi Goli Codeplay Software Ltd. -// Ralph Potter Codeplay Software Ltd. -// Luke Iwanski Codeplay Software Ltd. -// Contact: -// Copyright (C) 2016 Benoit Steiner - -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#if defined(EIGEN_USE_SYCL) && !defined(EIGEN_CXX11_TENSOR_TENSOR_DEVICE_SYCL_H) -#define EIGEN_CXX11_TENSOR_TENSOR_DEVICE_SYCL_H - -namespace Eigen { - - #define ConvertToActualTypeSycl(Scalar, buf_acc) reinterpret_cast::pointer_t>((&(*buf_acc.get_pointer()))) - - template class MemCopyFunctor { - public: - MemCopyFunctor(read_accessor src_acc, write_accessor dst_acc, size_t rng, size_t i, size_t offset) : m_src_acc(src_acc), m_dst_acc(dst_acc), m_rng(rng), m_i(i), m_offset(offset) {} - - void operator()(cl::sycl::nd_item<1> itemID) { - auto src_ptr = ConvertToActualTypeSycl(Scalar, m_src_acc); - auto dst_ptr = ConvertToActualTypeSycl(Scalar, m_dst_acc); - auto globalid = itemID.get_global_linear_id(); - if (globalid < m_rng) { - dst_ptr[globalid + m_i] = src_ptr[globalid + m_offset]; - } - } - - private: - read_accessor m_src_acc; - write_accessor m_dst_acc; - size_t m_rng; - size_t m_i; - size_t m_offset; - }; - - struct memsetkernelFunctor{ - typedef cl::sycl::accessor AccType; - AccType m_acc; - const size_t m_rng, m_c; - memsetkernelFunctor(AccType acc, const size_t rng, const size_t c):m_acc(acc), m_rng(rng), m_c(c){} - void operator()(cl::sycl::nd_item<1> itemID) { - auto globalid=itemID.get_global_linear_id(); - if (globalid< m_rng) m_acc[globalid] = m_c; - } - - }; - -EIGEN_STRONG_INLINE auto get_sycl_supported_devices()->decltype(cl::sycl::device::get_devices()){ - auto devices = cl::sycl::device::get_devices(); - std::vector::iterator it =devices.begin(); - while(it!=devices.end()) { - /// get_devices returns all the available opencl devices. Either use device_selector or exclude devices that computecpp does not support (AMD OpenCL for CPU ) - auto s= (*it).template get_info(); - std::transform(s.begin(), s.end(), s.begin(), ::tolower); - if((*it).is_cpu() && s.find("amd")!=std::string::npos && s.find("apu") == std::string::npos){ // remove amd cpu as it is not supported by computecpp allow APUs - it=devices.erase(it); - } - else{ - ++it; - } - } - return devices; -} - -struct QueueInterface { - /// class members: - bool exception_caught_ = false; - - mutable std::mutex mutex_; - - /// std::map is the container used to make sure that we create only one buffer - /// per pointer. The lifespan of the buffer now depends on the lifespan of SyclDevice. - /// If a non-read-only pointer is needed to be accessed on the host we should manually deallocate it. - mutable std::map> buffer_map; - /// sycl queue - mutable cl::sycl::queue m_queue; - /// creating device by using cl::sycl::selector or cl::sycl::device both are the same and can be captured through dev_Selector typename - /// SyclStreamDevice is not owned. it is the caller's responsibility to destroy it. - template explicit QueueInterface(const dev_Selector& s): -#ifdef EIGEN_EXCEPTIONS - m_queue(cl::sycl::queue(s, [&](cl::sycl::exception_list l) { - for (const auto& e : l) { - try { - if (e) { - exception_caught_ = true; - std::rethrow_exception(e); - } - } catch (cl::sycl::exception e) { - std::cerr << e.what() << std::endl; - } - } - })) -#else -m_queue(cl::sycl::queue(s, [&](cl::sycl::exception_list l) { - for (const auto& e : l) { - if (e) { - exception_caught_ = true; - std::cerr << "Error detected Inside Sycl Device."<< std::endl; - - } - } -})) -#endif - {} - - /// Allocating device pointer. This pointer is actually an 8 bytes host pointer used as key to access the sycl device buffer. - /// The reason is that we cannot use device buffer as a pointer as a m_data in Eigen leafNode expressions. So we create a key - /// pointer to be used in Eigen expression construction. When we convert the Eigen construction into the sycl construction we - /// use this pointer as a key in our buffer_map and we make sure that we dedicate only one buffer only for this pointer. - /// The device pointer would be deleted by calling deallocate function. - EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const { - auto buf = cl::sycl::buffer(cl::sycl::range<1>(num_bytes)); - auto ptr =buf.get_access().get_pointer(); - buf.set_final_data(nullptr); - std::lock_guard lock(mutex_); - buffer_map.insert(std::pair>(static_cast(ptr),buf)); - return static_cast(ptr); - } - - /// This is used to deallocate the device pointer. p is used as a key inside - /// the map to find the device buffer and delete it. - EIGEN_STRONG_INLINE void deallocate(void *p) const { - std::lock_guard lock(mutex_); - auto it = buffer_map.find(static_cast(p)); - if (it != buffer_map.end()) { - buffer_map.erase(it); - } - } - - EIGEN_STRONG_INLINE void deallocate_all() const { - std::lock_guard lock(mutex_); - buffer_map.clear(); - } - - EIGEN_STRONG_INLINE std::map>::iterator find_buffer(const void* ptr) const { - std::lock_guard lock(mutex_); - auto it1 = buffer_map.find(static_cast(ptr)); - if (it1 != buffer_map.end()){ - return it1; - } - else{ - for(std::map>::iterator it=buffer_map.begin(); it!=buffer_map.end(); ++it){ - auto size = it->second.get_size(); - if((it->first < (static_cast(ptr))) && ((static_cast(ptr)) < (it->first + size)) ) return it; - } - } - std::cerr << "No sycl buffer found. Make sure that you have allocated memory for your buffer by calling malloc-ed function."<< std::endl; - abort(); - } - - // This function checks if the runtime recorded an error for the - // underlying stream device. - EIGEN_STRONG_INLINE bool ok() const { - if (!exception_caught_) { - m_queue.wait_and_throw(); - } - return !exception_caught_; - } - - // destructor - ~QueueInterface() { buffer_map.clear(); } -}; - -struct SyclDevice { - // class member. - QueueInterface* m_queue_stream; - /// QueueInterface is not owned. it is the caller's responsibility to destroy it. - explicit SyclDevice(QueueInterface* queue_stream) : m_queue_stream(queue_stream){} - - /// Creation of sycl accessor for a buffer. This function first tries to find - /// the buffer in the buffer_map. If found it gets the accessor from it, if not, - /// the function then adds an entry by creating a sycl buffer for that particular pointer. - template EIGEN_STRONG_INLINE cl::sycl::accessor - get_sycl_accessor(cl::sycl::handler &cgh, const void* ptr) const { - return (get_sycl_buffer(ptr).template get_access(cgh)); - } - - /// Accessing the created sycl device buffer for the device pointer - EIGEN_STRONG_INLINE cl::sycl::buffer& get_sycl_buffer(const void * ptr) const { - return m_queue_stream->find_buffer(ptr)->second; - } - - /// This is used to prepare the number of threads and also the number of threads per block for sycl kernels - template - EIGEN_STRONG_INLINE void parallel_for_setup(Index n, Index &tileSize, Index &rng, Index &GRange) const { - tileSize =static_cast(sycl_queue().get_device(). template get_info()); - auto s= sycl_queue().get_device().template get_info(); - std::transform(s.begin(), s.end(), s.begin(), ::tolower); - if(sycl_queue().get_device().is_cpu()){ // intel doesnot allow to use max workgroup size - tileSize=std::min(static_cast(256), static_cast(tileSize)); - } - rng = n; - if (rng==0) rng=static_cast(1); - GRange=rng; - if (tileSize>GRange) tileSize=GRange; - else if(GRange>tileSize){ - Index xMode = static_cast(GRange % tileSize); - if (xMode != 0) GRange += static_cast(tileSize - xMode); - } - } - - /// This is used to prepare the number of threads and also the number of threads per block for sycl kernels - template - EIGEN_STRONG_INLINE void parallel_for_setup(Index dim0, Index dim1, Index &tileSize0, Index &tileSize1, Index &rng0, Index &rng1, Index &GRange0, Index &GRange1) const { - Index max_workgroup_Size = static_cast(maxSyclThreadsPerBlock()); - if(sycl_queue().get_device().is_cpu()){ // intel doesnot allow to use max workgroup size - max_workgroup_Size=std::min(static_cast(256), static_cast(max_workgroup_Size)); - } - Index pow_of_2 = static_cast(std::log2(max_workgroup_Size)); - tileSize1 =static_cast(std::pow(2, static_cast(pow_of_2/2))); - rng1=dim1; - if (rng1==0 ) rng1=static_cast(1); - GRange1=rng1; - if (tileSize1>GRange1) tileSize1=GRange1; - else if(GRange1>tileSize1){ - Index xMode = static_cast(GRange1 % tileSize1); - if (xMode != 0) GRange1 += static_cast(tileSize1 - xMode); - } - tileSize0 = static_cast(max_workgroup_Size/tileSize1); - rng0 = dim0; - if (rng0==0 ) rng0=static_cast(1); - GRange0=rng0; - if (tileSize0>GRange0) tileSize0=GRange0; - else if(GRange0>tileSize0){ - Index xMode = static_cast(GRange0 % tileSize0); - if (xMode != 0) GRange0 += static_cast(tileSize0 - xMode); - } - } - - - - /// This is used to prepare the number of threads and also the number of threads per block for sycl kernels - template - EIGEN_STRONG_INLINE void parallel_for_setup(Index dim0, Index dim1,Index dim2, Index &tileSize0, Index &tileSize1, Index &tileSize2, Index &rng0, Index &rng1, Index &rng2, Index &GRange0, Index &GRange1, Index &GRange2) const { - Index max_workgroup_Size = static_cast(maxSyclThreadsPerBlock()); - if(sycl_queue().get_device().is_cpu()){ // intel doesnot allow to use max workgroup size - max_workgroup_Size=std::min(static_cast(256), static_cast(max_workgroup_Size)); - } - Index pow_of_2 = static_cast(std::log2(max_workgroup_Size)); - tileSize2 =static_cast(std::pow(2, static_cast(pow_of_2/3))); - rng2=dim2; - if (rng2==0 ) rng1=static_cast(1); - GRange2=rng2; - if (tileSize2>GRange2) tileSize2=GRange2; - else if(GRange2>tileSize2){ - Index xMode = static_cast(GRange2 % tileSize2); - if (xMode != 0) GRange2 += static_cast(tileSize2 - xMode); - } - pow_of_2 = static_cast(std::log2(static_cast(max_workgroup_Size/tileSize2))); - tileSize1 =static_cast(std::pow(2, static_cast(pow_of_2/2))); - rng1=dim1; - if (rng1==0 ) rng1=static_cast(1); - GRange1=rng1; - if (tileSize1>GRange1) tileSize1=GRange1; - else if(GRange1>tileSize1){ - Index xMode = static_cast(GRange1 % tileSize1); - if (xMode != 0) GRange1 += static_cast(tileSize1 - xMode); - } - tileSize0 = static_cast(max_workgroup_Size/(tileSize1*tileSize2)); - rng0 = dim0; - if (rng0==0 ) rng0=static_cast(1); - GRange0=rng0; - if (tileSize0>GRange0) tileSize0=GRange0; - else if(GRange0>tileSize0){ - Index xMode = static_cast(GRange0 % tileSize0); - if (xMode != 0) GRange0 += static_cast(tileSize0 - xMode); - } - } - /// allocate device memory - EIGEN_STRONG_INLINE void *allocate(size_t num_bytes) const { - return m_queue_stream->allocate(num_bytes); - } - /// deallocate device memory - EIGEN_STRONG_INLINE void deallocate(void *p) const { - m_queue_stream->deallocate(p); - } - - // some runtime conditions that can be applied here - EIGEN_STRONG_INLINE bool isDeviceSuitable() const { return true; } - - /// the memcpy function - template EIGEN_STRONG_INLINE void memcpy(void *dst, const Index *src, size_t n) const { - auto it1 = m_queue_stream->find_buffer(static_cast(src)); - auto it2 = m_queue_stream->find_buffer(dst); - auto offset= (static_cast(static_cast(src))) - it1->first; - auto i= (static_cast(dst)) - it2->first; - offset/=sizeof(Index); - i/=sizeof(Index); - size_t rng, GRange, tileSize; - parallel_for_setup(n/sizeof(Index), tileSize, rng, GRange); - sycl_queue().submit([&](cl::sycl::handler &cgh) { - auto src_acc =it1->second.template get_access(cgh); - auto dst_acc =it2->second.template get_access(cgh); - typedef decltype(src_acc) read_accessor; - typedef decltype(dst_acc) write_accessor; - cgh.parallel_for(cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange), cl::sycl::range<1>(tileSize)), MemCopyFunctor(src_acc, dst_acc, rng, i, offset)); - }); - synchronize(); - } - - /// The memcpyHostToDevice is used to copy the device only pointer to a host pointer. Using the device - /// pointer created as a key we find the sycl buffer and get the host accessor with discard_write mode - /// on it. Using a discard_write accessor guarantees that we do not bring back the current value of the - /// buffer to host. Then we use the memcpy to copy the data to the host accessor. The first time that - /// this buffer is accessed, the data will be copied to the device. - template EIGEN_STRONG_INLINE void memcpyHostToDevice(Index *dst, const Index *src, size_t n) const { - auto host_acc= get_sycl_buffer(dst). template get_access(); - ::memcpy(host_acc.get_pointer(), src, n); - } - /// The memcpyDeviceToHost is used to copy the data from host to device. Here, in order to avoid double copying the data. We create a sycl - /// buffer with map_allocator for the destination pointer with a discard_write accessor on it. The lifespan of the buffer is bound to the - /// lifespan of the memcpyDeviceToHost function. We create a kernel to copy the data, from the device- only source buffer to the destination - /// buffer with map_allocator on the gpu in parallel. At the end of the function call the destination buffer would be destroyed and the data - /// would be available on the dst pointer using fast copy technique (map_allocator). In this case we can make sure that we copy the data back - /// to the cpu only once per function call. - template EIGEN_STRONG_INLINE void memcpyDeviceToHost(void *dst, const Index *src, size_t n) const { - auto it = m_queue_stream->find_buffer(src); - auto offset =static_cast(static_cast(src))- it->first; - offset/=sizeof(Index); - size_t rng, GRange, tileSize; - parallel_for_setup(n/sizeof(Index), tileSize, rng, GRange); - // Assuming that the dst is the start of the destination pointer - auto dest_buf = cl::sycl::buffer >(static_cast(dst), cl::sycl::range<1>(n)); - sycl_queue().submit([&](cl::sycl::handler &cgh) { - auto src_acc= it->second.template get_access(cgh); - auto dst_acc =dest_buf.template get_access(cgh); - typedef decltype(src_acc) read_accessor; - typedef decltype(dst_acc) write_accessor; - cgh.parallel_for( cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange), cl::sycl::range<1>(tileSize)), MemCopyFunctor(src_acc, dst_acc, rng, 0, offset)); - }); - synchronize(); - } - /// returning the sycl queue - EIGEN_STRONG_INLINE cl::sycl::queue& sycl_queue() const { return m_queue_stream->m_queue;} - /// Here is the implementation of memset function on sycl. - EIGEN_STRONG_INLINE void memset(void *data, int c, size_t n) const { - size_t rng, GRange, tileSize; - parallel_for_setup(n, tileSize, rng, GRange); - sycl_queue().submit(memsetCghFunctor(get_sycl_buffer(static_cast(static_cast(data))),rng, GRange, tileSize, c )); - synchronize(); - } - - struct memsetCghFunctor{ - cl::sycl::buffer& m_buf; - const size_t& rng , GRange, tileSize; - const int &c; - memsetCghFunctor(cl::sycl::buffer& buff, const size_t& rng_, const size_t& GRange_, const size_t& tileSize_, const int& c_) - :m_buf(buff), rng(rng_), GRange(GRange_), tileSize(tileSize_), c(c_){} - - void operator()(cl::sycl::handler &cgh) const { - auto buf_acc = m_buf.template get_access(cgh); - cgh.parallel_for(cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange), cl::sycl::range<1>(tileSize)), memsetkernelFunctor(buf_acc, rng, c)); - } - }; - - EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const { - // FIXME - return 48*1024; - } - - EIGEN_STRONG_INLINE size_t lastLevelCacheSize() const { - // We won't try to take advantage of the l2 cache for the time being, and - // there is no l3 cache on cuda devices. - return firstLevelCacheSize(); - } - EIGEN_STRONG_INLINE unsigned long getNumSyclMultiProcessors() const { - return sycl_queue().get_device(). template get_info(); - // return stream_->deviceProperties().multiProcessorCount; - } - EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerBlock() const { - return sycl_queue().get_device(). template get_info(); - - // return stream_->deviceProperties().maxThreadsPerBlock; - } - EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerMultiProcessor() const { - // OpenCL doesnot have such concept - return 2;//sycl_queue().get_device(). template get_info(); - // return stream_->deviceProperties().maxThreadsPerMultiProcessor; - } - EIGEN_STRONG_INLINE size_t sharedMemPerBlock() const { - return sycl_queue().get_device(). template get_info(); - // return stream_->deviceProperties().sharedMemPerBlock; - } - /// No need for sycl it should act the same as CPU version - EIGEN_STRONG_INLINE int majorDeviceVersion() const { return 1; } - - EIGEN_STRONG_INLINE void synchronize() const { - sycl_queue().wait_and_throw(); //pass - } - - EIGEN_STRONG_INLINE void asynchronousExec() const { - ///FIXEDME:: currently there is a race condition regarding the asynch scheduler. - //sycl_queue().throw_asynchronous();// does not pass. Temporarily disabled - sycl_queue().wait_and_throw(); //pass - - } - // This function checks if the runtime recorded an error for the - // underlying stream device. - EIGEN_STRONG_INLINE bool ok() const { - return m_queue_stream->ok(); - } -}; - - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_SYCL_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h deleted file mode 100644 index 16180ca6..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h +++ /dev/null @@ -1,268 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#if defined(EIGEN_USE_THREADS) && !defined(EIGEN_CXX11_TENSOR_TENSOR_DEVICE_THREAD_POOL_H) -#define EIGEN_CXX11_TENSOR_TENSOR_DEVICE_THREAD_POOL_H - -namespace Eigen { - -// Barrier is an object that allows one or more threads to wait until -// Notify has been called a specified number of times. -class Barrier { - public: - Barrier(unsigned int count) : state_(count << 1), notified_(false) { - eigen_assert(((count << 1) >> 1) == count); - } - ~Barrier() { - eigen_assert((state_>>1) == 0); - } - - void Notify() { - unsigned int v = state_.fetch_sub(2, std::memory_order_acq_rel) - 2; - if (v != 1) { - eigen_assert(((v + 2) & ~1) != 0); - return; // either count has not dropped to 0, or waiter is not waiting - } - std::unique_lock l(mu_); - eigen_assert(!notified_); - notified_ = true; - cv_.notify_all(); - } - - void Wait() { - unsigned int v = state_.fetch_or(1, std::memory_order_acq_rel); - if ((v >> 1) == 0) return; - std::unique_lock l(mu_); - while (!notified_) { - cv_.wait(l); - } - } - - private: - std::mutex mu_; - std::condition_variable cv_; - std::atomic state_; // low bit is waiter flag - bool notified_; -}; - - -// Notification is an object that allows a user to to wait for another -// thread to signal a notification that an event has occurred. -// -// Multiple threads can wait on the same Notification object, -// but only one caller must call Notify() on the object. -struct Notification : Barrier { - Notification() : Barrier(1) {}; -}; - - -// Runs an arbitrary function and then calls Notify() on the passed in -// Notification. -template struct FunctionWrapperWithNotification -{ - static void run(Notification* n, Function f, Args... args) { - f(args...); - if (n) { - n->Notify(); - } - } -}; - -template struct FunctionWrapperWithBarrier -{ - static void run(Barrier* b, Function f, Args... args) { - f(args...); - if (b) { - b->Notify(); - } - } -}; - -template -static EIGEN_STRONG_INLINE void wait_until_ready(SyncType* n) { - if (n) { - n->Wait(); - } -} - - -// Build a thread pool device on top the an existing pool of threads. -struct ThreadPoolDevice { - // The ownership of the thread pool remains with the caller. - ThreadPoolDevice(ThreadPoolInterface* pool, int num_cores) : pool_(pool), num_threads_(num_cores) { } - - EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const { - return internal::aligned_malloc(num_bytes); - } - - EIGEN_STRONG_INLINE void deallocate(void* buffer) const { - internal::aligned_free(buffer); - } - - EIGEN_STRONG_INLINE void memcpy(void* dst, const void* src, size_t n) const { - ::memcpy(dst, src, n); - } - EIGEN_STRONG_INLINE void memcpyHostToDevice(void* dst, const void* src, size_t n) const { - memcpy(dst, src, n); - } - EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const { - memcpy(dst, src, n); - } - - EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const { - ::memset(buffer, c, n); - } - - EIGEN_STRONG_INLINE int numThreads() const { - return num_threads_; - } - - EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const { - return l1CacheSize(); - } - - EIGEN_STRONG_INLINE size_t lastLevelCacheSize() const { - // The l3 cache size is shared between all the cores. - return l3CacheSize() / num_threads_; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int majorDeviceVersion() const { - // Should return an enum that encodes the ISA supported by the CPU - return 1; - } - - template - EIGEN_STRONG_INLINE Notification* enqueue(Function&& f, Args&&... args) const { - Notification* n = new Notification(); - pool_->Schedule(std::bind(&FunctionWrapperWithNotification::run, n, f, args...)); - return n; - } - - template - EIGEN_STRONG_INLINE void enqueue_with_barrier(Barrier* b, - Function&& f, - Args&&... args) const { - pool_->Schedule(std::bind( - &FunctionWrapperWithBarrier::run, b, f, args...)); - } - - template - EIGEN_STRONG_INLINE void enqueueNoNotification(Function&& f, Args&&... args) const { - pool_->Schedule(std::bind(f, args...)); - } - - // Returns a logical thread index between 0 and pool_->NumThreads() - 1 if - // called from one of the threads in pool_. Returns -1 otherwise. - EIGEN_STRONG_INLINE int currentThreadId() const { - return pool_->CurrentThreadId(); - } - - // parallelFor executes f with [0, n) arguments in parallel and waits for - // completion. F accepts a half-open interval [first, last). - // Block size is choosen based on the iteration cost and resulting parallel - // efficiency. If block_align is not nullptr, it is called to round up the - // block size. - void parallelFor(Index n, const TensorOpCost& cost, - std::function block_align, - std::function f) const { - typedef TensorCostModel CostModel; - if (n <= 1 || numThreads() == 1 || - CostModel::numThreads(n, cost, static_cast(numThreads())) == 1) { - f(0, n); - return; - } - - // Calculate block size based on (1) the iteration cost and (2) parallel - // efficiency. We want blocks to be not too small to mitigate - // parallelization overheads; not too large to mitigate tail - // effect and potential load imbalance and we also want number - // of blocks to be evenly dividable across threads. - - double block_size_f = 1.0 / CostModel::taskSize(1, cost); - Index block_size = numext::mini(n, numext::maxi(1, block_size_f)); - const Index max_block_size = - numext::mini(n, numext::maxi(1, 2 * block_size_f)); - if (block_align) { - Index new_block_size = block_align(block_size); - eigen_assert(new_block_size >= block_size); - block_size = numext::mini(n, new_block_size); - } - Index block_count = divup(n, block_size); - // Calculate parallel efficiency as fraction of total CPU time used for - // computations: - double max_efficiency = - static_cast(block_count) / - (divup(block_count, numThreads()) * numThreads()); - // Now try to increase block size up to max_block_size as long as it - // doesn't decrease parallel efficiency. - for (Index prev_block_count = block_count; prev_block_count > 1;) { - // This is the next block size that divides size into a smaller number - // of blocks than the current block_size. - Index coarser_block_size = divup(n, prev_block_count - 1); - if (block_align) { - Index new_block_size = block_align(coarser_block_size); - eigen_assert(new_block_size >= coarser_block_size); - coarser_block_size = numext::mini(n, new_block_size); - } - if (coarser_block_size > max_block_size) { - break; // Reached max block size. Stop. - } - // Recalculate parallel efficiency. - const Index coarser_block_count = divup(n, coarser_block_size); - eigen_assert(coarser_block_count < prev_block_count); - prev_block_count = coarser_block_count; - const double coarser_efficiency = - static_cast(coarser_block_count) / - (divup(coarser_block_count, numThreads()) * numThreads()); - if (coarser_efficiency + 0.01 >= max_efficiency) { - // Taking it. - block_size = coarser_block_size; - block_count = coarser_block_count; - if (max_efficiency < coarser_efficiency) { - max_efficiency = coarser_efficiency; - } - } - } - - // Recursively divide size into halves until we reach block_size. - // Division code rounds mid to block_size, so we are guaranteed to get - // block_count leaves that do actual computations. - Barrier barrier(static_cast(block_count)); - std::function handleRange; - handleRange = [=, &handleRange, &barrier, &f](Index first, Index last) { - if (last - first <= block_size) { - // Single block or less, execute directly. - f(first, last); - barrier.Notify(); - return; - } - // Split into halves and submit to the pool. - Index mid = first + divup((last - first) / 2, block_size) * block_size; - pool_->Schedule([=, &handleRange]() { handleRange(mid, last); }); - handleRange(first, mid); - }; - handleRange(0, n); - barrier.Wait(); - } - - // Convenience wrapper for parallelFor that does not align blocks. - void parallelFor(Index n, const TensorOpCost& cost, - std::function f) const { - parallelFor(n, cost, nullptr, std::move(f)); - } - - private: - ThreadPoolInterface* pool_; - int num_threads_; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_THREAD_POOL_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h deleted file mode 100644 index 1a30e45f..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h +++ /dev/null @@ -1,236 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H -#define EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H - -namespace Eigen { - -/** \internal - * - * \class TensorDimensionList - * \ingroup CXX11_Tensor_Module - * - * \brief Special case of tensor index list used to list all the dimensions of a tensor of rank n. - * - * \sa Tensor - */ - -template struct DimensionList { - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE - const Index operator[] (const Index i) const { return i; } -}; - -namespace internal { - -template struct array_size > { - static const size_t value = Rank; -}; -template struct array_size > { - static const size_t value = Rank; -}; - -template const Index array_get(DimensionList&) { - return n; -} -template const Index array_get(const DimensionList&) { - return n; -} - - -#if EIGEN_HAS_CONSTEXPR -template -struct index_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) { - return true; - } -}; -template -struct index_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) { - return true; - } -}; - -template -struct all_indices_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return true; - } -}; -template -struct all_indices_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return true; - } -}; - -template -struct indices_statically_known_to_increase_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return true; - } -}; -template -struct indices_statically_known_to_increase_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return true; - } -}; - -template -struct index_statically_eq_impl > { - static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i == value; - } -}; -template -struct index_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i == value; - } -}; - -template -struct index_statically_ne_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i != value; - } -}; -template -struct index_statically_ne_impl > { - static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i != value; - } -}; - -template -struct index_statically_gt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i > value; - } -}; -template -struct index_statically_gt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i > value; - } -}; - -template -struct index_statically_lt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i < value; - } -}; -template -struct index_statically_lt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return i < value; - } -}; - -#else -template -struct index_known_statically_impl > { - EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run(const DenseIndex) { - return true; - } -}; -template -struct index_known_statically_impl > { - EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run(const DenseIndex) { - return true; - } -}; - -template -struct all_indices_known_statically_impl > { - EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run() { - return true; - } -}; -template -struct all_indices_known_statically_impl > { - EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run() { - return true; - } -}; - -template -struct indices_statically_known_to_increase_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() { - return true; - } -}; -template -struct indices_statically_known_to_increase_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() { - return true; - } -}; - -template -struct index_statically_eq_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; -template -struct index_statically_eq_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; - -template -struct index_statically_ne_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex){ - return false; - } -}; -template -struct index_statically_ne_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; - -template -struct index_statically_gt_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; -template -struct index_statically_gt_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; - -template -struct index_statically_lt_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; -template -struct index_statically_lt_impl > { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) { - return false; - } -}; -#endif - -} // end namespace internal -} // end namespace Eigen - - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h deleted file mode 100644 index 86405e69..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h +++ /dev/null @@ -1,430 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H -#define EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H - - -namespace Eigen { - -/** \internal - * - * \class TensorDimensions - * \ingroup CXX11_Tensor_Module - * - * \brief Set of classes used to encode and store the dimensions of a Tensor. - * - * The Sizes class encodes as part of the type the number of dimensions and the - * sizes corresponding to each dimension. It uses no storage space since it is - * entirely known at compile time. - * The DSizes class is its dynamic sibling: the number of dimensions is known - * at compile time but the sizes are set during execution. - * - * \sa Tensor - */ - -// Boilerplate code -namespace internal { - -template struct dget { - static const std::ptrdiff_t value = get::value; -}; - - -template -struct fixed_size_tensor_index_linearization_helper -{ - template EIGEN_DEVICE_FUNC - static inline Index run(array const& indices, - const Dimensions& dimensions) - { - return array_get(indices) + - dget::value * - fixed_size_tensor_index_linearization_helper::run(indices, dimensions); - } -}; - -template -struct fixed_size_tensor_index_linearization_helper -{ - template EIGEN_DEVICE_FUNC - static inline Index run(array const&, const Dimensions&) - { - return 0; - } -}; - -template -struct fixed_size_tensor_index_extraction_helper -{ - template EIGEN_DEVICE_FUNC - static inline Index run(const Index index, - const Dimensions& dimensions) - { - const Index mult = (index == n-1) ? 1 : 0; - return array_get(dimensions) * mult + - fixed_size_tensor_index_extraction_helper::run(index, dimensions); - } -}; - -template -struct fixed_size_tensor_index_extraction_helper -{ - template EIGEN_DEVICE_FUNC - static inline Index run(const Index, - const Dimensions&) - { - return 0; - } - }; - -} // end namespace internal - - -// Fixed size -#ifndef EIGEN_EMULATE_CXX11_META_H -template -struct Sizes { - typedef internal::numeric_list Base; - const Base t = Base(); - static const std::ptrdiff_t total_size = internal::arg_prod(Indices...); - static const size_t count = Base::count; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t rank() const { - return Base::count; - } - - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t TotalSize() { - return internal::arg_prod(Indices...); - } - - EIGEN_DEVICE_FUNC Sizes() { } - template - explicit EIGEN_DEVICE_FUNC Sizes(const array& /*indices*/) { - // todo: add assertion - } -#if EIGEN_HAS_VARIADIC_TEMPLATES - template EIGEN_DEVICE_FUNC Sizes(DenseIndex...) { } - explicit EIGEN_DEVICE_FUNC Sizes(std::initializer_list /*l*/) { - // todo: add assertion - } -#endif - - template Sizes& operator = (const T& /*other*/) { - // add assertion failure if the size of other is different - return *this; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t operator[] (const std::size_t index) const { - return internal::fixed_size_tensor_index_extraction_helper::run(index, t); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - size_t IndexOfColMajor(const array& indices) const { - return internal::fixed_size_tensor_index_linearization_helper::run(indices, t); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - size_t IndexOfRowMajor(const array& indices) const { - return internal::fixed_size_tensor_index_linearization_helper::run(indices, t); - } -}; - -namespace internal { -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_prod(const Sizes&) { - return Sizes::total_size; -} -} - -#else - -template -struct non_zero_size { - typedef internal::type2val type; -}; -template <> -struct non_zero_size<0> { - typedef internal::null_type type; -}; - -template struct Sizes { - typedef typename internal::make_type_list::type, typename non_zero_size::type, typename non_zero_size::type, typename non_zero_size::type, typename non_zero_size::type >::type Base; - static const size_t count = Base::count; - static const std::size_t total_size = internal::arg_prod::value; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t rank() const { - return count; - } - - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t TotalSize() { - return internal::arg_prod::value; - } - - Sizes() { } - template - explicit Sizes(const array& /*indices*/) { - // todo: add assertion - } - template Sizes& operator = (const T& /*other*/) { - // add assertion failure if the size of other is different - return *this; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template Sizes(DenseIndex... /*indices*/) { } - explicit Sizes(std::initializer_list) { - // todo: add assertion - } -#else - EIGEN_DEVICE_FUNC explicit Sizes(const DenseIndex) { - } - EIGEN_DEVICE_FUNC Sizes(const DenseIndex, const DenseIndex) { - } - EIGEN_DEVICE_FUNC Sizes(const DenseIndex, const DenseIndex, const DenseIndex) { - } - EIGEN_DEVICE_FUNC Sizes(const DenseIndex, const DenseIndex, const DenseIndex, const DenseIndex) { - } - EIGEN_DEVICE_FUNC Sizes(const DenseIndex, const DenseIndex, const DenseIndex, const DenseIndex, const DenseIndex) { - } -#endif - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex operator[] (const int index) const { - switch (index) { - case 0: - return internal::get<0, Base>::value; - case 1: - return internal::get<1, Base>::value; - case 2: - return internal::get<2, Base>::value; - case 3: - return internal::get<3, Base>::value; - case 4: - return internal::get<4, Base>::value; - default: - eigen_assert(false && "index overflow"); - return static_cast(-1); - } - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - size_t IndexOfColMajor(const array& indices) const { - return internal::fixed_size_tensor_index_linearization_helper::run(indices, *reinterpret_cast(this)); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - size_t IndexOfRowMajor(const array& indices) const { - return internal::fixed_size_tensor_index_linearization_helper::run(indices, *reinterpret_cast(this)); - } -}; - -namespace internal { -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t array_prod(const Sizes&) { - return Sizes::total_size; -} -} - -#endif - -// Boilerplate -namespace internal { -template -struct tensor_index_linearization_helper -{ - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index run(array const& indices, array const& dimensions) - { - return array_get(indices) + - array_get(dimensions) * - tensor_index_linearization_helper::run(indices, dimensions); - } -}; - -template -struct tensor_index_linearization_helper -{ - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index run(array const& indices, array const&) - { - return array_get(indices); - } -}; -} // end namespace internal - - - -// Dynamic size -template -struct DSizes : array { - typedef array Base; - static const int count = NumDims; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t rank() const { - return NumDims; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex TotalSize() const { - return (NumDims == 0) ? 1 : internal::array_prod(*static_cast(this)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DSizes() { - for (int i = 0 ; i < NumDims; ++i) { - (*this)[i] = 0; - } - } - EIGEN_DEVICE_FUNC explicit DSizes(const array& a) : Base(a) { } - - EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0) { - eigen_assert(NumDims == 1); - (*this)[0] = i0; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE explicit DSizes(DenseIndex firstDimension, DenseIndex secondDimension, IndexTypes... otherDimensions) : Base({{firstDimension, secondDimension, otherDimensions...}}) { - EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 2 == NumDims, YOU_MADE_A_PROGRAMMING_MISTAKE) - } -#else - EIGEN_DEVICE_FUNC DSizes(const DenseIndex i0, const DenseIndex i1) { - eigen_assert(NumDims == 2); - (*this)[0] = i0; - (*this)[1] = i1; - } - EIGEN_DEVICE_FUNC DSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2) { - eigen_assert(NumDims == 3); - (*this)[0] = i0; - (*this)[1] = i1; - (*this)[2] = i2; - } - EIGEN_DEVICE_FUNC DSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2, const DenseIndex i3) { - eigen_assert(NumDims == 4); - (*this)[0] = i0; - (*this)[1] = i1; - (*this)[2] = i2; - (*this)[3] = i3; - } - EIGEN_DEVICE_FUNC DSizes(const DenseIndex i0, const DenseIndex i1, const DenseIndex i2, const DenseIndex i3, const DenseIndex i4) { - eigen_assert(NumDims == 5); - (*this)[0] = i0; - (*this)[1] = i1; - (*this)[2] = i2; - (*this)[3] = i3; - (*this)[4] = i4; - } -#endif - - EIGEN_DEVICE_FUNC DSizes& operator = (const array& other) { - *static_cast(this) = other; - return *this; - } - - // A constexpr would be so much better here - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex IndexOfColMajor(const array& indices) const { - return internal::tensor_index_linearization_helper::run(indices, *static_cast(this)); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex IndexOfRowMajor(const array& indices) const { - return internal::tensor_index_linearization_helper::run(indices, *static_cast(this)); - } -}; - - - - -// Boilerplate -namespace internal { -template -struct tensor_vsize_index_linearization_helper -{ - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index run(array const& indices, std::vector const& dimensions) - { - return array_get(indices) + - array_get(dimensions) * - tensor_vsize_index_linearization_helper::run(indices, dimensions); - } -}; - -template -struct tensor_vsize_index_linearization_helper -{ - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Index run(array const& indices, std::vector const&) - { - return array_get(indices); - } -}; -} // end namespace internal - - -namespace internal { - -template struct array_size > { - static const size_t value = NumDims; -}; -template struct array_size > { - static const size_t value = NumDims; -}; -#ifndef EIGEN_EMULATE_CXX11_META_H -template struct array_size > { -static const std::ptrdiff_t value = Sizes::count; -}; -template struct array_size > { -static const std::ptrdiff_t value = Sizes::count; -}; -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes&) { - return get >::value; -} -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<>&) { - eigen_assert(false && "should never be called"); - return -1; -} -#else -template struct array_size > { - static const size_t value = Sizes::count; -}; -template struct array_size > { - static const size_t value = Sizes::count; -}; -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t array_get(const Sizes&) { - return get::Base>::value; -} - -#endif - - -template -struct sizes_match_below_dim { - static EIGEN_DEVICE_FUNC inline bool run(Dims1&, Dims2&) { - return false; - } -}; -template -struct sizes_match_below_dim { - static EIGEN_DEVICE_FUNC inline bool run(Dims1& dims1, Dims2& dims2) { - return (array_get(dims1) == array_get(dims2)) & - sizes_match_below_dim::run(dims1, dims2); - } -}; -template -struct sizes_match_below_dim { - static EIGEN_DEVICE_FUNC inline bool run(Dims1&, Dims2&) { - return true; - } -}; - -} // end namespace internal - - -template -EIGEN_DEVICE_FUNC bool dimensions_match(Dims1& dims1, Dims2& dims2) { - return internal::sizes_match_below_dim::value, internal::array_size::value>::run(dims1, dims2); -} - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h deleted file mode 100644 index 82dd1e64..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h +++ /dev/null @@ -1,184 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H -#define EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H - -namespace Eigen { - -/** \class TensorForcedEval - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor reshaping class. - * - * - */ -namespace internal { -template class MakePointer_> -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs are different. - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; - - enum { - Flags = 0 - }; - template - struct MakePointer { - // Intermediate typedef to workaround MSVC issue. - typedef MakePointer_ MakePointerT; - typedef typename MakePointerT::Type Type; - typedef typename MakePointerT::RefType RefType; - - - }; -}; - -template class MakePointer_> -struct eval, Eigen::Dense> -{ - typedef const TensorEvalToOp& type; -}; - -template class MakePointer_> -struct nested, 1, typename eval >::type> -{ - typedef TensorEvalToOp type; -}; - -} // end namespace internal - - - - -template class MakePointer_> -class TensorEvalToOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename MakePointer_::Type PointerType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvalToOp(PointerType buffer, const XprType& expr) - : m_xpr(expr), m_buffer(buffer) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC PointerType buffer() const { return m_buffer; } - - protected: - typename XprType::Nested m_xpr; - PointerType m_buffer; -}; - - - -template class MakePointer_> -struct TensorEvaluator, Device> -{ - typedef TensorEvalToOp XprType; - typedef typename ArgType::Scalar Scalar; - typedef typename TensorEvaluator::Dimensions Dimensions; - typedef typename XprType::Index Index; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = true - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_device(device), - m_buffer(op.buffer()), m_op(op), m_expression(op.expression()) - { } - - // Used for accessor extraction in SYCL Managed TensorMap: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const XprType& op() const { - return m_op; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~TensorEvaluator() { - } - - typedef typename internal::traits >::template MakePointer::Type DevicePointer; - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_impl.dimensions(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(DevicePointer scalar) { - EIGEN_UNUSED_VARIABLE(scalar); - eigen_assert(scalar == NULL); - return m_impl.evalSubExprsIfNeeded(m_buffer); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalScalar(Index i) { - m_buffer[i] = m_impl.coeff(i); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalPacket(Index i) { - internal::pstoret(m_buffer + i, m_impl.template packet::IsAligned ? Aligned : Unaligned>(i)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_buffer[index]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return internal::ploadt(m_buffer + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - // We assume that evalPacket or evalScalar is called to perform the - // assignment and account for the cost of the write here. - return m_impl.costPerCoeff(vectorized) + - TensorOpCost(0, sizeof(CoeffReturnType), 0, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC DevicePointer data() const { return m_buffer; } - ArgType expression() const { return m_expression; } - - /// required by sycl in order to extract the accessor - const TensorEvaluator& impl() const { return m_impl; } - /// added for sycl in order to construct the buffer from the sycl device - const Device& device() const{return m_device;} - - private: - TensorEvaluator m_impl; - const Device& m_device; - DevicePointer m_buffer; - const XprType& m_op; - const ArgType m_expression; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h deleted file mode 100644 index d6415817..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h +++ /dev/null @@ -1,640 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_EVALUATOR_H -#define EIGEN_CXX11_TENSOR_TENSOR_EVALUATOR_H - -namespace Eigen { - -/** \class TensorEvaluator - * \ingroup CXX11_Tensor_Module - * - * \brief The tensor evaluator classes. - * - * These classes are responsible for the evaluation of the tensor expression. - * - * TODO: add support for more types of expressions, in particular expressions - * leading to lvalues (slicing, reshaping, etc...) - */ - -// Generic evaluator -template -struct TensorEvaluator -{ - typedef typename Derived::Index Index; - typedef typename Derived::Scalar Scalar; - typedef typename Derived::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef typename Derived::Dimensions Dimensions; - typedef Derived XprType; - - // NumDimensions is -1 for variable dim tensors - static const int NumCoords = internal::traits::NumDimensions > 0 ? - internal::traits::NumDimensions : 0; - - enum { - IsAligned = Derived::IsAligned, - PacketAccess = (internal::unpacket_traits::size > 1), - Layout = Derived::Layout, - CoordAccess = NumCoords > 0, - RawAccess = true - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const Derived& m, const Device& device) - : m_data(const_cast::template MakePointer::Type>(m.data())), m_dims(m.dimensions()), m_device(device), m_impl(m) - { } - - // Used for accessor extraction in SYCL Managed TensorMap: - const Derived& derived() const { return m_impl; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dims; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* dest) { - if (dest) { - m_device.memcpy((void*)dest, m_data, sizeof(Scalar) * m_dims.TotalSize()); - return false; - } - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - eigen_assert(m_data); - return m_data[index]; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename internal::traits::template MakePointer::RefType - coeffRef(Index index) { - eigen_assert(m_data); - return m_data[index]; - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - PacketReturnType packet(Index index) const - { - return internal::ploadt(m_data + index); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketReturnType& x) - { - return internal::pstoret(m_data + index, x); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(const array& coords) const { - eigen_assert(m_data); - if (static_cast(Layout) == static_cast(ColMajor)) { - return m_data[m_dims.IndexOfColMajor(coords)]; - } else { - return m_data[m_dims.IndexOfRowMajor(coords)]; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - typename internal::traits::template MakePointer::RefType - coeffRef(const array& coords) { - eigen_assert(m_data); - if (static_cast(Layout) == static_cast(ColMajor)) { - return m_data[m_dims.IndexOfColMajor(coords)]; - } else { - return m_data[m_dims.IndexOfRowMajor(coords)]; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, - internal::unpacket_traits::size); - } - - EIGEN_DEVICE_FUNC typename internal::traits::template MakePointer::Type data() const { return m_data; } - - /// required by sycl in order to construct sycl buffer from raw pointer - const Device& device() const{return m_device;} - - protected: - typename internal::traits::template MakePointer::Type m_data; - Dimensions m_dims; - const Device& m_device; - const Derived& m_impl; -}; - -namespace { -template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T loadConstant(const T* address) { - return *address; -} -// Use the texture cache on CUDA devices whenever possible -#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 350 -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -float loadConstant(const float* address) { - return __ldg(address); -} -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -double loadConstant(const double* address) { - return __ldg(address); -} -template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -Eigen::half loadConstant(const Eigen::half* address) { - return Eigen::half(half_impl::raw_uint16_to_half(__ldg(&address->x))); -} -#endif -} - - -// Default evaluator for rvalues -template -struct TensorEvaluator -{ - typedef typename Derived::Index Index; - typedef typename Derived::Scalar Scalar; - typedef typename Derived::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef typename Derived::Dimensions Dimensions; - typedef const Derived XprType; - - - // NumDimensions is -1 for variable dim tensors - static const int NumCoords = internal::traits::NumDimensions > 0 ? - internal::traits::NumDimensions : 0; - - enum { - IsAligned = Derived::IsAligned, - PacketAccess = (internal::unpacket_traits::size > 1), - Layout = Derived::Layout, - CoordAccess = NumCoords > 0, - RawAccess = true - }; - - // Used for accessor extraction in SYCL Managed TensorMap: - const Derived& derived() const { return m_impl; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const Derived& m, const Device& device) - : m_data(m.data()), m_dims(m.dimensions()), m_device(device), m_impl(m) - { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dims; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* data) { - if (!NumTraits::type>::RequireInitialization && data) { - m_device.memcpy((void*)data, m_data, m_dims.TotalSize() * sizeof(Scalar)); - return false; - } - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - eigen_assert(m_data); - return loadConstant(m_data+index); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - PacketReturnType packet(Index index) const - { - return internal::ploadt_ro(m_data + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(const array& coords) const { - eigen_assert(m_data); - const Index index = (static_cast(Layout) == static_cast(ColMajor)) ? m_dims.IndexOfColMajor(coords) - : m_dims.IndexOfRowMajor(coords); - return loadConstant(m_data+index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, - internal::unpacket_traits::size); - } - - EIGEN_DEVICE_FUNC typename internal::traits::template MakePointer::Type data() const { return m_data; } - - /// added for sycl in order to construct the buffer from the sycl device - const Device& device() const{return m_device;} - - protected: - typename internal::traits::template MakePointer::Type m_data; - Dimensions m_dims; - const Device& m_device; - const Derived& m_impl; -}; - - - - -// -------------------- CwiseNullaryOp -------------------- - -template -struct TensorEvaluator, Device> -{ - typedef TensorCwiseNullaryOp XprType; - - enum { - IsAligned = true, - PacketAccess = internal::functor_traits::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC - TensorEvaluator(const XprType& op, const Device& device) - : m_functor(op.functor()), m_argImpl(op.nestedExpression(), device), m_wrapper() - { } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename internal::traits::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - typedef typename TensorEvaluator::Dimensions Dimensions; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_argImpl.dimensions(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType*) { return true; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { } - - EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const - { - return m_wrapper(m_functor, index); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return m_wrapper.template packetOp(m_functor, index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, - internal::unpacket_traits::size); - } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return NULL; } - - /// required by sycl in order to extract the accessor - const TensorEvaluator& impl() const { return m_argImpl; } - /// required by sycl in order to extract the accessor - NullaryOp functor() const { return m_functor; } - - - private: - const NullaryOp m_functor; - TensorEvaluator m_argImpl; - const internal::nullary_wrapper m_wrapper; -}; - - - -// -------------------- CwiseUnaryOp -------------------- - -template -struct TensorEvaluator, Device> -{ - typedef TensorCwiseUnaryOp XprType; - - enum { - IsAligned = TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & internal::functor_traits::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) - : m_functor(op.functor()), - m_argImpl(op.nestedExpression(), device) - { } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename internal::traits::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - typedef typename TensorEvaluator::Dimensions Dimensions; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_argImpl.dimensions(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar*) { - m_argImpl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_argImpl.cleanup(); - } - - EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const - { - return m_functor(m_argImpl.coeff(index)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return m_functor.packetOp(m_argImpl.template packet(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - const double functor_cost = internal::functor_traits::Cost; - return m_argImpl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, functor_cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return NULL; } - - /// required by sycl in order to extract the accessor - const TensorEvaluator & impl() const { return m_argImpl; } - /// added for sycl in order to construct the buffer from sycl device - UnaryOp functor() const { return m_functor; } - - - private: - const UnaryOp m_functor; - TensorEvaluator m_argImpl; -}; - - -// -------------------- CwiseBinaryOp -------------------- - -template -struct TensorEvaluator, Device> -{ - typedef TensorCwiseBinaryOp XprType; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess & - internal::functor_traits::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) - : m_functor(op.functor()), - m_leftImpl(op.lhsExpression(), device), - m_rightImpl(op.rhsExpression(), device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout) || internal::traits::NumDimensions <= 1), YOU_MADE_A_PROGRAMMING_MISTAKE); - eigen_assert(dimensions_match(m_leftImpl.dimensions(), m_rightImpl.dimensions())); - } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename internal::traits::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - typedef typename TensorEvaluator::Dimensions Dimensions; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const - { - // TODO: use right impl instead if right impl dimensions are known at compile time. - return m_leftImpl.dimensions(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType*) { - m_leftImpl.evalSubExprsIfNeeded(NULL); - m_rightImpl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_leftImpl.cleanup(); - m_rightImpl.cleanup(); - } - - EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const - { - return m_functor(m_leftImpl.coeff(index), m_rightImpl.coeff(index)); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return m_functor.packetOp(m_leftImpl.template packet(index), m_rightImpl.template packet(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - const double functor_cost = internal::functor_traits::Cost; - return m_leftImpl.costPerCoeff(vectorized) + - m_rightImpl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, functor_cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return NULL; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& left_impl() const { return m_leftImpl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& right_impl() const { return m_rightImpl; } - /// required by sycl in order to extract the accessor - BinaryOp functor() const { return m_functor; } - - private: - const BinaryOp m_functor; - TensorEvaluator m_leftImpl; - TensorEvaluator m_rightImpl; -}; - -// -------------------- CwiseTernaryOp -------------------- - -template -struct TensorEvaluator, Device> -{ - typedef TensorCwiseTernaryOp XprType; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess & - internal::functor_traits::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) - : m_functor(op.functor()), - m_arg1Impl(op.arg1Expression(), device), - m_arg2Impl(op.arg2Expression(), device), - m_arg3Impl(op.arg3Expression(), device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout) || internal::traits::NumDimensions <= 1), YOU_MADE_A_PROGRAMMING_MISTAKE); - - EIGEN_STATIC_ASSERT((internal::is_same::StorageKind, - typename internal::traits::StorageKind>::value), - STORAGE_KIND_MUST_MATCH) - EIGEN_STATIC_ASSERT((internal::is_same::StorageKind, - typename internal::traits::StorageKind>::value), - STORAGE_KIND_MUST_MATCH) - EIGEN_STATIC_ASSERT((internal::is_same::Index, - typename internal::traits::Index>::value), - STORAGE_INDEX_MUST_MATCH) - EIGEN_STATIC_ASSERT((internal::is_same::Index, - typename internal::traits::Index>::value), - STORAGE_INDEX_MUST_MATCH) - - eigen_assert(dimensions_match(m_arg1Impl.dimensions(), m_arg2Impl.dimensions()) && dimensions_match(m_arg1Impl.dimensions(), m_arg3Impl.dimensions())); - } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename internal::traits::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - typedef typename TensorEvaluator::Dimensions Dimensions; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const - { - // TODO: use arg2 or arg3 dimensions if they are known at compile time. - return m_arg1Impl.dimensions(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType*) { - m_arg1Impl.evalSubExprsIfNeeded(NULL); - m_arg2Impl.evalSubExprsIfNeeded(NULL); - m_arg3Impl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_arg1Impl.cleanup(); - m_arg2Impl.cleanup(); - m_arg3Impl.cleanup(); - } - - EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const - { - return m_functor(m_arg1Impl.coeff(index), m_arg2Impl.coeff(index), m_arg3Impl.coeff(index)); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return m_functor.packetOp(m_arg1Impl.template packet(index), - m_arg2Impl.template packet(index), - m_arg3Impl.template packet(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - const double functor_cost = internal::functor_traits::Cost; - return m_arg1Impl.costPerCoeff(vectorized) + - m_arg2Impl.costPerCoeff(vectorized) + - m_arg3Impl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, functor_cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC CoeffReturnType* data() const { return NULL; } - - /// required by sycl in order to extract the accessor - const TensorEvaluator & arg1Impl() const { return m_arg1Impl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& arg2Impl() const { return m_arg2Impl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& arg3Impl() const { return m_arg3Impl; } - - private: - const TernaryOp m_functor; - TensorEvaluator m_arg1Impl; - TensorEvaluator m_arg2Impl; - TensorEvaluator m_arg3Impl; -}; - - -// -------------------- SelectOp -------------------- - -template -struct TensorEvaluator, Device> -{ - typedef TensorSelectOp XprType; - typedef typename XprType::Scalar Scalar; - - enum { - IsAligned = TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess & - internal::packet_traits::HasBlend, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) - : m_condImpl(op.ifExpression(), device), - m_thenImpl(op.thenExpression(), device), - m_elseImpl(op.elseExpression(), device) - { - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE); - EIGEN_STATIC_ASSERT((static_cast(TensorEvaluator::Layout) == static_cast(TensorEvaluator::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE); - eigen_assert(dimensions_match(m_condImpl.dimensions(), m_thenImpl.dimensions())); - eigen_assert(dimensions_match(m_thenImpl.dimensions(), m_elseImpl.dimensions())); - } - - typedef typename XprType::Index Index; - typedef typename internal::traits::Scalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - typedef typename TensorEvaluator::Dimensions Dimensions; - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const - { - // TODO: use then or else impl instead if they happen to be known at compile time. - return m_condImpl.dimensions(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType*) { - m_condImpl.evalSubExprsIfNeeded(NULL); - m_thenImpl.evalSubExprsIfNeeded(NULL); - m_elseImpl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_condImpl.cleanup(); - m_thenImpl.cleanup(); - m_elseImpl.cleanup(); - } - - EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const - { - return m_condImpl.coeff(index) ? m_thenImpl.coeff(index) : m_elseImpl.coeff(index); - } - template - EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const - { - internal::Selector select; - for (Index i = 0; i < PacketSize; ++i) { - select.select[i] = m_condImpl.coeff(index+i); - } - return internal::pblend(select, - m_thenImpl.template packet(index), - m_elseImpl.template packet(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - return m_condImpl.costPerCoeff(vectorized) + - m_thenImpl.costPerCoeff(vectorized) - .cwiseMax(m_elseImpl.costPerCoeff(vectorized)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType* data() const { return NULL; } - /// required by sycl in order to extract the accessor - const TensorEvaluator & cond_impl() const { return m_condImpl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& then_impl() const { return m_thenImpl; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& else_impl() const { return m_elseImpl; } - - private: - TensorEvaluator m_condImpl; - TensorEvaluator m_thenImpl; - TensorEvaluator m_elseImpl; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_EVALUATOR_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h deleted file mode 100644 index f01d77c0..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h +++ /dev/null @@ -1,288 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_EXECUTOR_H -#define EIGEN_CXX11_TENSOR_TENSOR_EXECUTOR_H - -namespace Eigen { - -/** \class TensorExecutor - * \ingroup CXX11_Tensor_Module - * - * \brief The tensor executor class. - * - * This class is responsible for launch the evaluation of the expression on - * the specified computing device. - */ -namespace internal { - -// Default strategy: the expression is evaluated with a single cpu thread. -template -class TensorExecutor -{ - public: - typedef typename Expression::Index Index; - EIGEN_DEVICE_FUNC - static inline void run(const Expression& expr, const Device& device = Device()) - { - TensorEvaluator evaluator(expr, device); - const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL); - if (needs_assign) - { - const Index size = array_prod(evaluator.dimensions()); - for (Index i = 0; i < size; ++i) { - evaluator.evalScalar(i); - } - } - evaluator.cleanup(); - } -}; - - -template -class TensorExecutor -{ - public: - typedef typename Expression::Index Index; - EIGEN_DEVICE_FUNC - static inline void run(const Expression& expr, const DefaultDevice& device = DefaultDevice()) - { - TensorEvaluator evaluator(expr, device); - const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL); - if (needs_assign) - { - const Index size = array_prod(evaluator.dimensions()); - const int PacketSize = unpacket_traits::PacketReturnType>::size; - // Give the compiler a strong hint to unroll the loop. But don't insist - // on unrolling, because if the function is expensive the compiler should not - // unroll the loop at the expense of inlining. - const Index UnrolledSize = (size / (4 * PacketSize)) * 4 * PacketSize; - for (Index i = 0; i < UnrolledSize; i += 4*PacketSize) { - for (Index j = 0; j < 4; j++) { - evaluator.evalPacket(i + j * PacketSize); - } - } - const Index VectorizedSize = (size / PacketSize) * PacketSize; - for (Index i = UnrolledSize; i < VectorizedSize; i += PacketSize) { - evaluator.evalPacket(i); - } - for (Index i = VectorizedSize; i < size; ++i) { - evaluator.evalScalar(i); - } - } - evaluator.cleanup(); - } -}; - - - -// Multicore strategy: the index space is partitioned and each partition is executed on a single core -#ifdef EIGEN_USE_THREADS -template -struct EvalRange { - static void run(Evaluator* evaluator_in, const Index first, const Index last) { - Evaluator evaluator = *evaluator_in; - eigen_assert(last >= first); - for (Index i = first; i < last; ++i) { - evaluator.evalScalar(i); - } - } - - static Index alignBlockSize(Index size) { - return size; - } -}; - -template -struct EvalRange { - static const int PacketSize = unpacket_traits::size; - - static void run(Evaluator* evaluator_in, const Index first, const Index last) { - Evaluator evaluator = *evaluator_in; - eigen_assert(last >= first); - Index i = first; - if (last - first >= PacketSize) { - eigen_assert(first % PacketSize == 0); - Index last_chunk_offset = last - 4 * PacketSize; - // Give the compiler a strong hint to unroll the loop. But don't insist - // on unrolling, because if the function is expensive the compiler should not - // unroll the loop at the expense of inlining. - for (; i <= last_chunk_offset; i += 4*PacketSize) { - for (Index j = 0; j < 4; j++) { - evaluator.evalPacket(i + j * PacketSize); - } - } - last_chunk_offset = last - PacketSize; - for (; i <= last_chunk_offset; i += PacketSize) { - evaluator.evalPacket(i); - } - } - for (; i < last; ++i) { - evaluator.evalScalar(i); - } - } - - static Index alignBlockSize(Index size) { - // Align block size to packet size and account for unrolling in run above. - if (size >= 16 * PacketSize) { - return (size + 4 * PacketSize - 1) & ~(4 * PacketSize - 1); - } - // Aligning to 4 * PacketSize would increase block size by more than 25%. - return (size + PacketSize - 1) & ~(PacketSize - 1); - } -}; - -template -class TensorExecutor { - public: - typedef typename Expression::Index Index; - static inline void run(const Expression& expr, const ThreadPoolDevice& device) - { - typedef TensorEvaluator Evaluator; - Evaluator evaluator(expr, device); - const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL); - if (needs_assign) - { - const Index size = array_prod(evaluator.dimensions()); -#if !defined(EIGEN_USE_SIMPLE_THREAD_POOL) - device.parallelFor(size, evaluator.costPerCoeff(Vectorizable), - EvalRange::alignBlockSize, - [&evaluator](Index first, Index last) { - EvalRange::run(&evaluator, first, last); - }); -#else - size_t num_threads = device.numThreads(); - if (num_threads > 1) { - num_threads = TensorCostModel::numThreads( - size, evaluator.costPerCoeff(Vectorizable), num_threads); - } - if (num_threads == 1) { - EvalRange::run(&evaluator, 0, size); - } else { - const Index PacketSize = Vectorizable ? unpacket_traits::size : 1; - Index blocksz = std::ceil(static_cast(size)/num_threads) + PacketSize - 1; - const Index blocksize = numext::maxi(PacketSize, (blocksz - (blocksz % PacketSize))); - const Index numblocks = size / blocksize; - - Barrier barrier(numblocks); - for (int i = 0; i < numblocks; ++i) { - device.enqueue_with_barrier( - &barrier, &EvalRange::run, - &evaluator, i * blocksize, (i + 1) * blocksize); - } - if (numblocks * blocksize < size) { - EvalRange::run( - &evaluator, numblocks * blocksize, size); - } - barrier.Wait(); - } -#endif // defined(!EIGEN_USE_SIMPLE_THREAD_POOL) - } - evaluator.cleanup(); - } -}; -#endif // EIGEN_USE_THREADS - - -// GPU: the evaluation of the expression is offloaded to a GPU. -#if defined(EIGEN_USE_GPU) - -template -class TensorExecutor { - public: - typedef typename Expression::Index Index; - static void run(const Expression& expr, const GpuDevice& device); -}; - - -#if defined(__CUDACC__) -template -struct EigenMetaKernelEval { - static __device__ EIGEN_ALWAYS_INLINE - void run(Evaluator& eval, Index first, Index last, Index step_size) { - for (Index i = first; i < last; i += step_size) { - eval.evalScalar(i); - } - } -}; - -template -struct EigenMetaKernelEval { - static __device__ EIGEN_ALWAYS_INLINE - void run(Evaluator& eval, Index first, Index last, Index step_size) { - const Index PacketSize = unpacket_traits::size; - const Index vectorized_size = (last / PacketSize) * PacketSize; - const Index vectorized_step_size = step_size * PacketSize; - - // Use the vector path - for (Index i = first * PacketSize; i < vectorized_size; - i += vectorized_step_size) { - eval.evalPacket(i); - } - for (Index i = vectorized_size + first; i < last; i += step_size) { - eval.evalScalar(i); - } - } -}; - -template -__global__ void -__launch_bounds__(1024) -EigenMetaKernel(Evaluator eval, Index size) { - - const Index first_index = blockIdx.x * blockDim.x + threadIdx.x; - const Index step_size = blockDim.x * gridDim.x; - - const bool vectorizable = Evaluator::PacketAccess & Evaluator::IsAligned; - EigenMetaKernelEval::run(eval, first_index, size, step_size); -} - -/*static*/ -template -inline void TensorExecutor::run( - const Expression& expr, const GpuDevice& device) { - TensorEvaluator evaluator(expr, device); - const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL); - if (needs_assign) { - const int block_size = device.maxCudaThreadsPerBlock(); - const int max_blocks = device.getNumCudaMultiProcessors() * - device.maxCudaThreadsPerMultiProcessor() / block_size; - const Index size = array_prod(evaluator.dimensions()); - // Create a least one block to ensure we won't crash when tensorflow calls with tensors of size 0. - const int num_blocks = numext::maxi(numext::mini(max_blocks, divup(size, block_size)), 1); - - LAUNCH_CUDA_KERNEL( - (EigenMetaKernel, Index>), - num_blocks, block_size, 0, device, evaluator, size); - } - evaluator.cleanup(); -} - -#endif // __CUDACC__ -#endif // EIGEN_USE_GPU - -// SYCL Executor policy -#ifdef EIGEN_USE_SYCL - -template -class TensorExecutor { -public: - static inline void run(const Expression &expr, const SyclDevice &device) { - // call TensorSYCL module - TensorSycl::run(expr, device); - } -}; - -#endif - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_EXECUTOR_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h deleted file mode 100644 index 85dfc7a6..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h +++ /dev/null @@ -1,371 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H -#define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H - -namespace Eigen { - -/** \class TensorExpr - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor expression classes. - * - * The TensorCwiseNullaryOp class applies a nullary operators to an expression. - * This is typically used to generate constants. - * - * The TensorCwiseUnaryOp class represents an expression where a unary operator - * (e.g. cwiseSqrt) is applied to an expression. - * - * The TensorCwiseBinaryOp class represents an expression where a binary - * operator (e.g. addition) is applied to a lhs and a rhs expression. - * - */ -namespace internal { -template -struct traits > - : traits -{ - typedef traits XprTraits; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::Nested XprTypeNested; - typedef typename remove_reference::type _XprTypeNested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; - - enum { - Flags = 0 - }; -}; - -} // end namespace internal - - - -template -class TensorCwiseNullaryOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef TensorCwiseNullaryOp Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(const XprType& xpr, const NullaryOp& func = NullaryOp()) - : m_xpr(xpr), m_functor(func) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - nestedExpression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC - const NullaryOp& functor() const { return m_functor; } - - protected: - typename XprType::Nested m_xpr; - const NullaryOp m_functor; -}; - - - -namespace internal { -template -struct traits > - : traits -{ - // TODO(phli): Add InputScalar, InputPacket. Check references to - // current Scalar/Packet to see if the intent is Input or Output. - typedef typename result_of::type Scalar; - typedef traits XprTraits; - typedef typename XprType::Nested XprTypeNested; - typedef typename remove_reference::type _XprTypeNested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorCwiseUnaryOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorCwiseUnaryOp type; -}; - -} // end namespace internal - - - -template -class TensorCwiseUnaryOp : public TensorBase, ReadOnlyAccessors> -{ - public: - // TODO(phli): Add InputScalar, InputPacket. Check references to - // current Scalar/Packet to see if the intent is Input or Output. - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef Scalar CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp()) - : m_xpr(xpr), m_functor(func) {} - - EIGEN_DEVICE_FUNC - const UnaryOp& functor() const { return m_functor; } - - /** \returns the nested expression */ - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - nestedExpression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const UnaryOp m_functor; -}; - - -namespace internal { -template -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs - // are different. - // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket. Check references to - // current Scalar/Packet to see if the intent is Inputs or Output. - typedef typename result_of< - BinaryOp(typename LhsXprType::Scalar, - typename RhsXprType::Scalar)>::type Scalar; - typedef traits XprTraits; - typedef typename promote_storage_type< - typename traits::StorageKind, - typename traits::StorageKind>::ret StorageKind; - typedef typename promote_index_type< - typename traits::Index, - typename traits::Index>::type Index; - typedef typename LhsXprType::Nested LhsNested; - typedef typename RhsXprType::Nested RhsNested; - typedef typename remove_reference::type _LhsNested; - typedef typename remove_reference::type _RhsNested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; - - enum { - Flags = 0 - }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorCwiseBinaryOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorCwiseBinaryOp type; -}; - -} // end namespace internal - - - -template -class TensorCwiseBinaryOp : public TensorBase, ReadOnlyAccessors> -{ - public: - // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket. Check references to - // current Scalar/Packet to see if the intent is Inputs or Output. - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef Scalar CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs, const BinaryOp& func = BinaryOp()) - : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {} - - EIGEN_DEVICE_FUNC - const BinaryOp& functor() const { return m_functor; } - - /** \returns the nested expressions */ - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - lhsExpression() const { return m_lhs_xpr; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - rhsExpression() const { return m_rhs_xpr; } - - protected: - typename LhsXprType::Nested m_lhs_xpr; - typename RhsXprType::Nested m_rhs_xpr; - const BinaryOp m_functor; -}; - - -namespace internal { -template -struct traits > -{ - // Type promotion to handle the case where the types of the args are different. - typedef typename result_of< - TernaryOp(typename Arg1XprType::Scalar, - typename Arg2XprType::Scalar, - typename Arg3XprType::Scalar)>::type Scalar; - typedef traits XprTraits; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::Index Index; - typedef typename Arg1XprType::Nested Arg1Nested; - typedef typename Arg2XprType::Nested Arg2Nested; - typedef typename Arg3XprType::Nested Arg3Nested; - typedef typename remove_reference::type _Arg1Nested; - typedef typename remove_reference::type _Arg2Nested; - typedef typename remove_reference::type _Arg3Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; - - enum { - Flags = 0 - }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorCwiseTernaryOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorCwiseTernaryOp type; -}; - -} // end namespace internal - - - -template -class TensorCwiseTernaryOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef Scalar CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(const Arg1XprType& arg1, const Arg2XprType& arg2, const Arg3XprType& arg3, const TernaryOp& func = TernaryOp()) - : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {} - - EIGEN_DEVICE_FUNC - const TernaryOp& functor() const { return m_functor; } - - /** \returns the nested expressions */ - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - arg1Expression() const { return m_arg1_xpr; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - arg2Expression() const { return m_arg2_xpr; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - arg3Expression() const { return m_arg3_xpr; } - - protected: - typename Arg1XprType::Nested m_arg1_xpr; - typename Arg2XprType::Nested m_arg2_xpr; - typename Arg3XprType::Nested m_arg3_xpr; - const TernaryOp m_functor; -}; - - -namespace internal { -template -struct traits > - : traits -{ - typedef typename traits::Scalar Scalar; - typedef traits XprTraits; - typedef typename promote_storage_type::StorageKind, - typename traits::StorageKind>::ret StorageKind; - typedef typename promote_index_type::Index, - typename traits::Index>::type Index; - typedef typename IfXprType::Nested IfNested; - typedef typename ThenXprType::Nested ThenNested; - typedef typename ElseXprType::Nested ElseNested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorSelectOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorSelectOp type; -}; - -} // end namespace internal - - -template -class TensorSelectOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::promote_storage_type::ret CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC - TensorSelectOp(const IfXprType& a_condition, - const ThenXprType& a_then, - const ElseXprType& a_else) - : m_condition(a_condition), m_then(a_then), m_else(a_else) - { } - - EIGEN_DEVICE_FUNC - const IfXprType& ifExpression() const { return m_condition; } - - EIGEN_DEVICE_FUNC - const ThenXprType& thenExpression() const { return m_then; } - - EIGEN_DEVICE_FUNC - const ElseXprType& elseExpression() const { return m_else; } - - protected: - typename IfXprType::Nested m_condition; - typename ThenXprType::Nested m_then; - typename ElseXprType::Nested m_else; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_EXPR_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h deleted file mode 100644 index f060191a..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h +++ /dev/null @@ -1,651 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Jianwei Cui -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_FFT_H -#define EIGEN_CXX11_TENSOR_TENSOR_FFT_H - -// This code requires the ability to initialize arrays of constant -// values directly inside a class. -#if __cplusplus >= 201103L || EIGEN_COMP_MSVC >= 1900 - -namespace Eigen { - -/** \class TensorFFT - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor FFT class. - * - * TODO: - * Vectorize the Cooley Tukey and the Bluestein algorithm - * Add support for multithreaded evaluation - * Improve the performance on GPU - */ - -template struct MakeComplex { - template - EIGEN_DEVICE_FUNC - T operator() (const T& val) const { return val; } -}; - -template <> struct MakeComplex { - template - EIGEN_DEVICE_FUNC - std::complex operator() (const T& val) const { return std::complex(val, 0); } -}; - -template <> struct MakeComplex { - template - EIGEN_DEVICE_FUNC - std::complex operator() (const std::complex& val) const { return val; } -}; - -template struct PartOf { - template T operator() (const T& val) const { return val; } -}; - -template <> struct PartOf { - template T operator() (const std::complex& val) const { return val.real(); } -}; - -template <> struct PartOf { - template T operator() (const std::complex& val) const { return val.imag(); } -}; - -namespace internal { -template -struct traits > : public traits { - typedef traits XprTraits; - typedef typename NumTraits::Real RealScalar; - typedef typename std::complex ComplexScalar; - typedef typename XprTraits::Scalar InputScalar; - typedef typename conditional::type OutputScalar; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> { - typedef const TensorFFTOp& type; -}; - -template -struct nested, 1, typename eval >::type> { - typedef TensorFFTOp type; -}; - -} // end namespace internal - -template -class TensorFFTOp : public TensorBase, ReadOnlyAccessors> { - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename std::complex ComplexScalar; - typedef typename internal::conditional::type OutputScalar; - typedef OutputScalar CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFFTOp(const XprType& expr, const FFT& fft) - : m_xpr(expr), m_fft(fft) {} - - EIGEN_DEVICE_FUNC - const FFT& fft() const { return m_fft; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& expression() const { - return m_xpr; - } - - protected: - typename XprType::Nested m_xpr; - const FFT m_fft; -}; - -// Eval as rvalue -template -struct TensorEvaluator, Device> { - typedef TensorFFTOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::Dimensions>::value; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename std::complex ComplexScalar; - typedef typename TensorEvaluator::Dimensions InputDimensions; - typedef internal::traits XprTraits; - typedef typename XprTraits::Scalar InputScalar; - typedef typename internal::conditional::type OutputScalar; - typedef OutputScalar CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = true, - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_fft(op.fft()), m_impl(op.expression(), device), m_data(NULL), m_device(device) { - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - for (int i = 0; i < NumDims; ++i) { - eigen_assert(input_dims[i] > 0); - m_dimensions[i] = input_dims[i]; - } - - if (static_cast(Layout) == static_cast(ColMajor)) { - m_strides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_strides[i] = m_strides[i - 1] * m_dimensions[i - 1]; - } - } else { - m_strides[NumDims - 1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_strides[i] = m_strides[i + 1] * m_dimensions[i + 1]; - } - } - m_size = m_dimensions.TotalSize(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { - return m_dimensions; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(OutputScalar* data) { - m_impl.evalSubExprsIfNeeded(NULL); - if (data) { - evalToBuf(data); - return false; - } else { - m_data = (CoeffReturnType*)m_device.allocate(sizeof(CoeffReturnType) * m_size); - evalToBuf(m_data); - return true; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - if (m_data) { - m_device.deallocate(m_data); - m_data = NULL; - } - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const { - return m_data[index]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType - packet(Index index) const { - return internal::ploadt(m_data + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return m_data; } - - - private: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalToBuf(OutputScalar* data) { - const bool write_to_out = internal::is_same::value; - ComplexScalar* buf = write_to_out ? (ComplexScalar*)data : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * m_size); - - for (Index i = 0; i < m_size; ++i) { - buf[i] = MakeComplex::value>()(m_impl.coeff(i)); - } - - for (size_t i = 0; i < m_fft.size(); ++i) { - Index dim = m_fft[i]; - eigen_assert(dim >= 0 && dim < NumDims); - Index line_len = m_dimensions[dim]; - eigen_assert(line_len >= 1); - ComplexScalar* line_buf = (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * line_len); - const bool is_power_of_two = isPowerOfTwo(line_len); - const Index good_composite = is_power_of_two ? 0 : findGoodComposite(line_len); - const Index log_len = is_power_of_two ? getLog2(line_len) : getLog2(good_composite); - - ComplexScalar* a = is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * good_composite); - ComplexScalar* b = is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * good_composite); - ComplexScalar* pos_j_base_powered = is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * (line_len + 1)); - if (!is_power_of_two) { - // Compute twiddle factors - // t_n = exp(sqrt(-1) * pi * n^2 / line_len) - // for n = 0, 1,..., line_len-1. - // For n > 2 we use the recurrence t_n = t_{n-1}^2 / t_{n-2} * t_1^2 - pos_j_base_powered[0] = ComplexScalar(1, 0); - if (line_len > 1) { - const RealScalar pi_over_len(EIGEN_PI / line_len); - const ComplexScalar pos_j_base = ComplexScalar( - std::cos(pi_over_len), std::sin(pi_over_len)); - pos_j_base_powered[1] = pos_j_base; - if (line_len > 2) { - const ComplexScalar pos_j_base_sq = pos_j_base * pos_j_base; - for (int j = 2; j < line_len + 1; ++j) { - pos_j_base_powered[j] = pos_j_base_powered[j - 1] * - pos_j_base_powered[j - 1] / - pos_j_base_powered[j - 2] * pos_j_base_sq; - } - } - } - } - - for (Index partial_index = 0; partial_index < m_size / line_len; ++partial_index) { - const Index base_offset = getBaseOffsetFromIndex(partial_index, dim); - - // get data into line_buf - const Index stride = m_strides[dim]; - if (stride == 1) { - m_device.memcpy(line_buf, &buf[base_offset], line_len*sizeof(ComplexScalar)); - } else { - Index offset = base_offset; - for (int j = 0; j < line_len; ++j, offset += stride) { - line_buf[j] = buf[offset]; - } - } - - // processs the line - if (is_power_of_two) { - processDataLineCooleyTukey(line_buf, line_len, log_len); - } - else { - processDataLineBluestein(line_buf, line_len, good_composite, log_len, a, b, pos_j_base_powered); - } - - // write back - if (FFTDir == FFT_FORWARD && stride == 1) { - m_device.memcpy(&buf[base_offset], line_buf, line_len*sizeof(ComplexScalar)); - } else { - Index offset = base_offset; - const ComplexScalar div_factor = ComplexScalar(1.0 / line_len, 0); - for (int j = 0; j < line_len; ++j, offset += stride) { - buf[offset] = (FFTDir == FFT_FORWARD) ? line_buf[j] : line_buf[j] * div_factor; - } - } - } - m_device.deallocate(line_buf); - if (!is_power_of_two) { - m_device.deallocate(a); - m_device.deallocate(b); - m_device.deallocate(pos_j_base_powered); - } - } - - if(!write_to_out) { - for (Index i = 0; i < m_size; ++i) { - data[i] = PartOf()(buf[i]); - } - m_device.deallocate(buf); - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static bool isPowerOfTwo(Index x) { - eigen_assert(x > 0); - return !(x & (x - 1)); - } - - // The composite number for padding, used in Bluestein's FFT algorithm - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static Index findGoodComposite(Index n) { - Index i = 2; - while (i < 2 * n - 1) i *= 2; - return i; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static Index getLog2(Index m) { - Index log2m = 0; - while (m >>= 1) log2m++; - return log2m; - } - - // Call Cooley Tukey algorithm directly, data length must be power of 2 - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineCooleyTukey(ComplexScalar* line_buf, Index line_len, Index log_len) { - eigen_assert(isPowerOfTwo(line_len)); - scramble_FFT(line_buf, line_len); - compute_1D_Butterfly(line_buf, line_len, log_len); - } - - // Call Bluestein's FFT algorithm, m is a good composite number greater than (2 * n - 1), used as the padding length - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineBluestein(ComplexScalar* line_buf, Index line_len, Index good_composite, Index log_len, ComplexScalar* a, ComplexScalar* b, const ComplexScalar* pos_j_base_powered) { - Index n = line_len; - Index m = good_composite; - ComplexScalar* data = line_buf; - - for (Index i = 0; i < n; ++i) { - if(FFTDir == FFT_FORWARD) { - a[i] = data[i] * numext::conj(pos_j_base_powered[i]); - } - else { - a[i] = data[i] * pos_j_base_powered[i]; - } - } - for (Index i = n; i < m; ++i) { - a[i] = ComplexScalar(0, 0); - } - - for (Index i = 0; i < n; ++i) { - if(FFTDir == FFT_FORWARD) { - b[i] = pos_j_base_powered[i]; - } - else { - b[i] = numext::conj(pos_j_base_powered[i]); - } - } - for (Index i = n; i < m - n; ++i) { - b[i] = ComplexScalar(0, 0); - } - for (Index i = m - n; i < m; ++i) { - if(FFTDir == FFT_FORWARD) { - b[i] = pos_j_base_powered[m-i]; - } - else { - b[i] = numext::conj(pos_j_base_powered[m-i]); - } - } - - scramble_FFT(a, m); - compute_1D_Butterfly(a, m, log_len); - - scramble_FFT(b, m); - compute_1D_Butterfly(b, m, log_len); - - for (Index i = 0; i < m; ++i) { - a[i] *= b[i]; - } - - scramble_FFT(a, m); - compute_1D_Butterfly(a, m, log_len); - - //Do the scaling after ifft - for (Index i = 0; i < m; ++i) { - a[i] /= m; - } - - for (Index i = 0; i < n; ++i) { - if(FFTDir == FFT_FORWARD) { - data[i] = a[i] * numext::conj(pos_j_base_powered[i]); - } - else { - data[i] = a[i] * pos_j_base_powered[i]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void scramble_FFT(ComplexScalar* data, Index n) { - eigen_assert(isPowerOfTwo(n)); - Index j = 1; - for (Index i = 1; i < n; ++i){ - if (j > i) { - std::swap(data[j-1], data[i-1]); - } - Index m = n >> 1; - while (m >= 2 && j > m) { - j -= m; - m >>= 1; - } - j += m; - } - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_2(ComplexScalar* data) { - ComplexScalar tmp = data[1]; - data[1] = data[0] - data[1]; - data[0] += tmp; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_4(ComplexScalar* data) { - ComplexScalar tmp[4]; - tmp[0] = data[0] + data[1]; - tmp[1] = data[0] - data[1]; - tmp[2] = data[2] + data[3]; - if (Dir == FFT_FORWARD) { - tmp[3] = ComplexScalar(0.0, -1.0) * (data[2] - data[3]); - } else { - tmp[3] = ComplexScalar(0.0, 1.0) * (data[2] - data[3]); - } - data[0] = tmp[0] + tmp[2]; - data[1] = tmp[1] + tmp[3]; - data[2] = tmp[0] - tmp[2]; - data[3] = tmp[1] - tmp[3]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_8(ComplexScalar* data) { - ComplexScalar tmp_1[8]; - ComplexScalar tmp_2[8]; - - tmp_1[0] = data[0] + data[1]; - tmp_1[1] = data[0] - data[1]; - tmp_1[2] = data[2] + data[3]; - if (Dir == FFT_FORWARD) { - tmp_1[3] = (data[2] - data[3]) * ComplexScalar(0, -1); - } else { - tmp_1[3] = (data[2] - data[3]) * ComplexScalar(0, 1); - } - tmp_1[4] = data[4] + data[5]; - tmp_1[5] = data[4] - data[5]; - tmp_1[6] = data[6] + data[7]; - if (Dir == FFT_FORWARD) { - tmp_1[7] = (data[6] - data[7]) * ComplexScalar(0, -1); - } else { - tmp_1[7] = (data[6] - data[7]) * ComplexScalar(0, 1); - } - tmp_2[0] = tmp_1[0] + tmp_1[2]; - tmp_2[1] = tmp_1[1] + tmp_1[3]; - tmp_2[2] = tmp_1[0] - tmp_1[2]; - tmp_2[3] = tmp_1[1] - tmp_1[3]; - tmp_2[4] = tmp_1[4] + tmp_1[6]; -// SQRT2DIV2 = sqrt(2)/2 -#define SQRT2DIV2 0.7071067811865476 - if (Dir == FFT_FORWARD) { - tmp_2[5] = (tmp_1[5] + tmp_1[7]) * ComplexScalar(SQRT2DIV2, -SQRT2DIV2); - tmp_2[6] = (tmp_1[4] - tmp_1[6]) * ComplexScalar(0, -1); - tmp_2[7] = (tmp_1[5] - tmp_1[7]) * ComplexScalar(-SQRT2DIV2, -SQRT2DIV2); - } else { - tmp_2[5] = (tmp_1[5] + tmp_1[7]) * ComplexScalar(SQRT2DIV2, SQRT2DIV2); - tmp_2[6] = (tmp_1[4] - tmp_1[6]) * ComplexScalar(0, 1); - tmp_2[7] = (tmp_1[5] - tmp_1[7]) * ComplexScalar(-SQRT2DIV2, SQRT2DIV2); - } - data[0] = tmp_2[0] + tmp_2[4]; - data[1] = tmp_2[1] + tmp_2[5]; - data[2] = tmp_2[2] + tmp_2[6]; - data[3] = tmp_2[3] + tmp_2[7]; - data[4] = tmp_2[0] - tmp_2[4]; - data[5] = tmp_2[1] - tmp_2[5]; - data[6] = tmp_2[2] - tmp_2[6]; - data[7] = tmp_2[3] - tmp_2[7]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_1D_merge( - ComplexScalar* data, Index n, Index n_power_of_2) { - // Original code: - // RealScalar wtemp = std::sin(M_PI/n); - // RealScalar wpi = -std::sin(2 * M_PI/n); - const RealScalar wtemp = m_sin_PI_div_n_LUT[n_power_of_2]; - const RealScalar wpi = (Dir == FFT_FORWARD) - ? m_minus_sin_2_PI_div_n_LUT[n_power_of_2] - : -m_minus_sin_2_PI_div_n_LUT[n_power_of_2]; - - const ComplexScalar wp(wtemp, wpi); - const ComplexScalar wp_one = wp + ComplexScalar(1, 0); - const ComplexScalar wp_one_2 = wp_one * wp_one; - const ComplexScalar wp_one_3 = wp_one_2 * wp_one; - const ComplexScalar wp_one_4 = wp_one_3 * wp_one; - const Index n2 = n / 2; - ComplexScalar w(1.0, 0.0); - for (Index i = 0; i < n2; i += 4) { - ComplexScalar temp0(data[i + n2] * w); - ComplexScalar temp1(data[i + 1 + n2] * w * wp_one); - ComplexScalar temp2(data[i + 2 + n2] * w * wp_one_2); - ComplexScalar temp3(data[i + 3 + n2] * w * wp_one_3); - w = w * wp_one_4; - - data[i + n2] = data[i] - temp0; - data[i] += temp0; - - data[i + 1 + n2] = data[i + 1] - temp1; - data[i + 1] += temp1; - - data[i + 2 + n2] = data[i + 2] - temp2; - data[i + 2] += temp2; - - data[i + 3 + n2] = data[i + 3] - temp3; - data[i + 3] += temp3; - } - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void compute_1D_Butterfly( - ComplexScalar* data, Index n, Index n_power_of_2) { - eigen_assert(isPowerOfTwo(n)); - if (n > 8) { - compute_1D_Butterfly(data, n / 2, n_power_of_2 - 1); - compute_1D_Butterfly(data + n / 2, n / 2, n_power_of_2 - 1); - butterfly_1D_merge(data, n, n_power_of_2); - } else if (n == 8) { - butterfly_8(data); - } else if (n == 4) { - butterfly_4(data); - } else if (n == 2) { - butterfly_2(data); - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index getBaseOffsetFromIndex(Index index, Index omitted_dim) const { - Index result = 0; - - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > omitted_dim; --i) { - const Index partial_m_stride = m_strides[i] / m_dimensions[omitted_dim]; - const Index idx = index / partial_m_stride; - index -= idx * partial_m_stride; - result += idx * m_strides[i]; - } - result += index; - } - else { - for (Index i = 0; i < omitted_dim; ++i) { - const Index partial_m_stride = m_strides[i] / m_dimensions[omitted_dim]; - const Index idx = index / partial_m_stride; - index -= idx * partial_m_stride; - result += idx * m_strides[i]; - } - result += index; - } - // Value of index_coords[omitted_dim] is not determined to this step - return result; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index getIndexFromOffset(Index base, Index omitted_dim, Index offset) const { - Index result = base + offset * m_strides[omitted_dim] ; - return result; - } - - protected: - Index m_size; - const FFT& m_fft; - Dimensions m_dimensions; - array m_strides; - TensorEvaluator m_impl; - CoeffReturnType* m_data; - const Device& m_device; - - // This will support a maximum FFT size of 2^32 for each dimension - // m_sin_PI_div_n_LUT[i] = (-2) * std::sin(M_PI / std::pow(2,i)) ^ 2; - const RealScalar m_sin_PI_div_n_LUT[32] = { - RealScalar(0.0), - RealScalar(-2), - RealScalar(-0.999999999999999), - RealScalar(-0.292893218813453), - RealScalar(-0.0761204674887130), - RealScalar(-0.0192147195967696), - RealScalar(-0.00481527332780311), - RealScalar(-0.00120454379482761), - RealScalar(-3.01181303795779e-04), - RealScalar(-7.52981608554592e-05), - RealScalar(-1.88247173988574e-05), - RealScalar(-4.70619042382852e-06), - RealScalar(-1.17654829809007e-06), - RealScalar(-2.94137117780840e-07), - RealScalar(-7.35342821488550e-08), - RealScalar(-1.83835707061916e-08), - RealScalar(-4.59589268710903e-09), - RealScalar(-1.14897317243732e-09), - RealScalar(-2.87243293150586e-10), - RealScalar( -7.18108232902250e-11), - RealScalar(-1.79527058227174e-11), - RealScalar(-4.48817645568941e-12), - RealScalar(-1.12204411392298e-12), - RealScalar(-2.80511028480785e-13), - RealScalar(-7.01277571201985e-14), - RealScalar(-1.75319392800498e-14), - RealScalar(-4.38298482001247e-15), - RealScalar(-1.09574620500312e-15), - RealScalar(-2.73936551250781e-16), - RealScalar(-6.84841378126949e-17), - RealScalar(-1.71210344531737e-17), - RealScalar(-4.28025861329343e-18) - }; - - // m_minus_sin_2_PI_div_n_LUT[i] = -std::sin(2 * M_PI / std::pow(2,i)); - const RealScalar m_minus_sin_2_PI_div_n_LUT[32] = { - RealScalar(0.0), - RealScalar(0.0), - RealScalar(-1.00000000000000e+00), - RealScalar(-7.07106781186547e-01), - RealScalar(-3.82683432365090e-01), - RealScalar(-1.95090322016128e-01), - RealScalar(-9.80171403295606e-02), - RealScalar(-4.90676743274180e-02), - RealScalar(-2.45412285229123e-02), - RealScalar(-1.22715382857199e-02), - RealScalar(-6.13588464915448e-03), - RealScalar(-3.06795676296598e-03), - RealScalar(-1.53398018628477e-03), - RealScalar(-7.66990318742704e-04), - RealScalar(-3.83495187571396e-04), - RealScalar(-1.91747597310703e-04), - RealScalar(-9.58737990959773e-05), - RealScalar(-4.79368996030669e-05), - RealScalar(-2.39684498084182e-05), - RealScalar(-1.19842249050697e-05), - RealScalar(-5.99211245264243e-06), - RealScalar(-2.99605622633466e-06), - RealScalar(-1.49802811316901e-06), - RealScalar(-7.49014056584716e-07), - RealScalar(-3.74507028292384e-07), - RealScalar(-1.87253514146195e-07), - RealScalar(-9.36267570730981e-08), - RealScalar(-4.68133785365491e-08), - RealScalar(-2.34066892682746e-08), - RealScalar(-1.17033446341373e-08), - RealScalar(-5.85167231706864e-09), - RealScalar(-2.92583615853432e-09) - }; -}; - -} // end namespace Eigen - -#endif // EIGEN_HAS_CONSTEXPR - - -#endif // EIGEN_CXX11_TENSOR_TENSOR_FFT_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h deleted file mode 100644 index fcee5f60..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h +++ /dev/null @@ -1,389 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_FIXED_SIZE_H -#define EIGEN_CXX11_TENSOR_TENSOR_FIXED_SIZE_H - -namespace Eigen { - -/** \class TensorFixedSize - * \ingroup CXX11_Tensor_Module - * - * \brief The fixed sized version of the tensor class. - * - * The fixed sized equivalent of - * Eigen::Tensor t(3, 5, 7); - * is - * Eigen::TensorFixedSize> t; - */ - -template -class TensorFixedSize : public TensorBase > -{ - public: - typedef TensorFixedSize Self; - typedef TensorBase > Base; - typedef typename Eigen::internal::nested::type Nested; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - typedef Scalar_ Scalar; - typedef typename NumTraits::Real RealScalar; - typedef typename Base::CoeffReturnType CoeffReturnType; - - static const int Options = Options_; - - enum { - IsAligned = bool(EIGEN_MAX_ALIGN_BYTES>0), - Layout = Options_ & RowMajor ? RowMajor : ColMajor, - CoordAccess = true, - RawAccess = true - }; - - typedef Dimensions_ Dimensions; - static const std::size_t NumIndices = Dimensions::count; - - protected: - TensorStorage m_storage; - - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return NumIndices; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const { return m_storage.dimensions()[n]; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_storage.dimensions(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_storage.size(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data() { return m_storage.data(); } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const { return m_storage.data(); } - - // This makes EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED - // work, because that uses base().coeffRef() - and we don't yet - // implement a similar class hierarchy - inline Self& base() { return *this; } - inline const Self& base() const { return *this; } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index firstIndex, IndexTypes... otherIndices) const - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return coeff(array{{firstIndex, otherIndices...}}); - } -#endif - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff(const array& indices) const - { - eigen_internal_assert(checkIndexRange(indices)); - return m_storage.data()[linearizedIndex(indices)]; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const - { - eigen_internal_assert(index >= 0 && index < size()); - return m_storage.data()[index]; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& coeff() const - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return m_storage.data()[0]; - } - - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index firstIndex, IndexTypes... otherIndices) - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return coeffRef(array{{firstIndex, otherIndices...}}); - } -#endif - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(const array& indices) - { - eigen_internal_assert(checkIndexRange(indices)); - return m_storage.data()[linearizedIndex(indices)]; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) - { - eigen_internal_assert(index >= 0 && index < size()); - return m_storage.data()[index]; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& coeffRef() - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return m_storage.data()[0]; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) const - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return this->operator()(array{{firstIndex, otherIndices...}}); - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1) const - { - if (Options&RowMajor) { - const Index index = i1 + i0 * m_storage.dimensions()[1]; - return m_storage.data()[index]; - } else { - const Index index = i0 + i1 * m_storage.dimensions()[0]; - return m_storage.data()[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2) const - { - if (Options&RowMajor) { - const Index index = i2 + m_storage.dimensions()[2] * (i1 + m_storage.dimensions()[1] * i0); - return m_storage.data()[index]; - } else { - const Index index = i0 + m_storage.dimensions()[0] * (i1 + m_storage.dimensions()[1] * i2); - return m_storage.data()[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3) const - { - if (Options&RowMajor) { - const Index index = i3 + m_storage.dimensions()[3] * (i2 + m_storage.dimensions()[2] * (i1 + m_storage.dimensions()[1] * i0)); - return m_storage.data()[index]; - } else { - const Index index = i0 + m_storage.dimensions()[0] * (i1 + m_storage.dimensions()[1] * (i2 + m_storage.dimensions()[2] * i3)); - return m_storage.data()[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) const - { - if (Options&RowMajor) { - const Index index = i4 + m_storage.dimensions()[4] * (i3 + m_storage.dimensions()[3] * (i2 + m_storage.dimensions()[2] * (i1 + m_storage.dimensions()[1] * i0))); - return m_storage.data()[index]; - } else { - const Index index = i0 + m_storage.dimensions()[0] * (i1 + m_storage.dimensions()[1] * (i2 + m_storage.dimensions()[2] * (i3 + m_storage.dimensions()[3] * i4))); - return m_storage.data()[index]; - } - } -#endif - - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(const array& indices) const - { - eigen_assert(checkIndexRange(indices)); - return coeff(indices); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const - { - eigen_internal_assert(index >= 0 && index < size()); - return coeff(index); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()() const - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return coeff(); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator[](Index index) const - { - // The bracket operator is only for vectors, use the parenthesis operator instead. - EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE); - return coeff(index); - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) - { - // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - return operator()(array{{firstIndex, otherIndices...}}); - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1) - { - if (Options&RowMajor) { - const Index index = i1 + i0 * m_storage.dimensions()[1]; - return m_storage.data()[index]; - } else { - const Index index = i0 + i1 * m_storage.dimensions()[0]; - return m_storage.data()[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2) - { - if (Options&RowMajor) { - const Index index = i2 + m_storage.dimensions()[2] * (i1 + m_storage.dimensions()[1] * i0); - return m_storage.data()[index]; - } else { - const Index index = i0 + m_storage.dimensions()[0] * (i1 + m_storage.dimensions()[1] * i2); - return m_storage.data()[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2, Index i3) - { - if (Options&RowMajor) { - const Index index = i3 + m_storage.dimensions()[3] * (i2 + m_storage.dimensions()[2] * (i1 + m_storage.dimensions()[1] * i0)); - return m_storage.data()[index]; - } else { - const Index index = i0 + m_storage.dimensions()[0] * (i1 + m_storage.dimensions()[1] * (i2 + m_storage.dimensions()[2] * i3)); - return m_storage.data()[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) - { - if (Options&RowMajor) { - const Index index = i4 + m_storage.dimensions()[4] * (i3 + m_storage.dimensions()[3] * (i2 + m_storage.dimensions()[2] * (i1 + m_storage.dimensions()[1] * i0))); - return m_storage.data()[index]; - } else { - const Index index = i0 + m_storage.dimensions()[0] * (i1 + m_storage.dimensions()[1] * (i2 + m_storage.dimensions()[2] * (i3 + m_storage.dimensions()[3] * i4))); - return m_storage.data()[index]; - } - } -#endif - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(const array& indices) - { - eigen_assert(checkIndexRange(indices)); - return coeffRef(indices); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index index) - { - eigen_assert(index >= 0 && index < size()); - return coeffRef(index); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()() - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE); - return coeffRef(); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator[](Index index) - { - // The bracket operator is only for vectors, use the parenthesis operator instead - EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE) - return coeffRef(index); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorFixedSize() - : m_storage() - { - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorFixedSize(const Self& other) - : m_storage(other.m_storage) - { - } - -#if EIGEN_HAS_RVALUE_REFERENCES - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize(Self&& other) - : m_storage(other.m_storage) - { - } -#endif - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other.derived()); - internal::TensorExecutor::run(assign, DefaultDevice()); - } - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other.derived()); - internal::TensorExecutor::run(assign, DefaultDevice()); - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorFixedSize& operator=(const TensorFixedSize& other) - { - // FIXME: check that the dimensions of other match the dimensions of *this. - // Unfortunately this isn't possible yet when the rhs is an expression. - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorFixedSize& operator=(const OtherDerived& other) - { - // FIXME: check that the dimensions of other match the dimensions of *this. - // Unfortunately this isn't possible yet when the rhs is an expression. - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - protected: - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE bool checkIndexRange(const array& /*indices*/) const - { - using internal::array_apply_and_reduce; - using internal::array_zip_and_reduce; - using internal::greater_equal_zero_op; - using internal::logical_and_op; - using internal::lesser_op; - - return true; - // check whether the indices are all >= 0 - /* array_apply_and_reduce(indices) && - // check whether the indices fit in the dimensions - array_zip_and_reduce(indices, m_storage.dimensions());*/ - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index linearizedIndex(const array& indices) const - { - if (Options&RowMajor) { - return m_storage.dimensions().IndexOfRowMajor(indices); - } else { - return m_storage.dimensions().IndexOfColMajor(indices); - } - } -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_FIXED_SIZE_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h deleted file mode 100644 index abe85c86..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h +++ /dev/null @@ -1,162 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_FORCED_EVAL_H -#define EIGEN_CXX11_TENSOR_TENSOR_FORCED_EVAL_H - -namespace Eigen { - -/** \class TensorForcedEval - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor reshaping class. - * - * - */ -/// template class MakePointer_ is added to convert the host pointer to the device pointer. -/// It is added due to the fact that for our device compiler T* is not allowed. -/// If we wanted to use the same Evaluator functions we have to convert that type to our pointer T. -/// This is done through our MakePointer_ class. By default the Type in the MakePointer_ is T* . -/// Therefore, by adding the default value, we managed to convert the type and it does not break any -/// existing code as its default value is T*. -namespace internal { -template -struct traits > -{ - // Type promotion to handle the case where the types of the lhs and the rhs are different. - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename traits::StorageKind StorageKind; - typedef typename traits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; - - enum { - Flags = 0 - }; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorForcedEvalOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorForcedEvalOp type; -}; - -} // end namespace internal - - - -template -class TensorForcedEvalOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorForcedEvalOp(const XprType& expr) - : m_xpr(expr) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; -}; - - -template -struct TensorEvaluator, Device> -{ - typedef TensorForcedEvalOp XprType; - typedef typename ArgType::Scalar Scalar; - typedef typename TensorEvaluator::Dimensions Dimensions; - typedef typename XprType::Index Index; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = true, - PacketAccess = (PacketSize > 1), - Layout = TensorEvaluator::Layout, - RawAccess = true - }; - - EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) - /// op_ is used for sycl - : m_impl(op.expression(), device), m_op(op.expression()), m_device(device), m_buffer(NULL) - { } - - EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_impl.dimensions(); } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType*) { - const Index numValues = internal::array_prod(m_impl.dimensions()); - m_buffer = (CoeffReturnType*)m_device.allocate(numValues * sizeof(CoeffReturnType)); - // Should initialize the memory in case we're dealing with non POD types. - if (NumTraits::RequireInitialization) { - for (Index i = 0; i < numValues; ++i) { - new(m_buffer+i) CoeffReturnType(); - } - } - typedef TensorEvalToOp< const typename internal::remove_const::type > EvalTo; - EvalTo evalToTmp(m_buffer, m_op); - const bool PacketAccess = internal::IsVectorizable::value; - internal::TensorExecutor::type, PacketAccess>::run(evalToTmp, m_device); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_device.deallocate(m_buffer); - m_buffer = NULL; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_buffer[index]; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return internal::ploadt(m_buffer + index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType* data() const { return m_buffer; } - - /// required by sycl in order to extract the sycl accessor - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator& impl() { return m_impl; } - /// used by sycl in order to build the sycl buffer - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Device& device() const{return m_device;} - private: - TensorEvaluator m_impl; - const ArgType m_op; - const Device& m_device; - CoeffReturnType* m_buffer; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_FORCED_EVAL_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h deleted file mode 100644 index 2e638992..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h +++ /dev/null @@ -1,121 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_FORWARD_DECLARATIONS_H -#define EIGEN_CXX11_TENSOR_TENSOR_FORWARD_DECLARATIONS_H - -namespace Eigen { - -// MakePointer class is used as a container of the adress space of the pointer -// on the host and on the device. From the host side it generates the T* pointer -// and when EIGEN_USE_SYCL is used it construct a buffer with a map_allocator to -// T* m_data on the host. It is always called on the device. -// Specialisation of MakePointer class for creating the sycl buffer with -// map_allocator. -template struct MakePointer { - typedef T* Type; - typedef T& RefType; -}; -#if defined(EIGEN_USE_SYCL) -namespace TensorSycl { -namespace internal{ -template class ReductionFunctor; -template -class FullReductionKernelFunctor; -} -} -#endif - - - -template class MakePointer_ = MakePointer> class TensorMap; -template class Tensor; -template class TensorFixedSize; -template class TensorRef; -template class TensorBase; - -template class TensorCwiseNullaryOp; -template class TensorCwiseUnaryOp; -template class TensorCwiseBinaryOp; -template class TensorCwiseTernaryOp; -template class TensorSelectOp; -template class MakePointer_ = MakePointer > class TensorReductionOp; -template class TensorIndexTupleOp; -template class TensorTupleReducerOp; -template class TensorConcatenationOp; -template class TensorContractionOp; -template class TensorConversionOp; -template class TensorConvolutionOp; -template class TensorFFTOp; -template class TensorPatchOp; -template class TensorImagePatchOp; -template class TensorVolumePatchOp; -template class TensorBroadcastingOp; -template class TensorChippingOp; -template class TensorReshapingOp; -template class TensorLayoutSwapOp; -template class TensorSlicingOp; -template class TensorReverseOp; -template class TensorPaddingOp; -template class TensorShufflingOp; -template class TensorStridingOp; -template class TensorStridingSlicingOp; -template class TensorInflationOp; -template class TensorGeneratorOp; -template class TensorAssignOp; -template class TensorScanOp; - -template class TensorCustomUnaryOp; -template class TensorCustomBinaryOp; - -template class MakePointer_ = MakePointer> class TensorEvalToOp; -template class TensorForcedEvalOp; - -template class TensorDevice; -template struct TensorEvaluator; - -struct DefaultDevice; -struct ThreadPoolDevice; -struct GpuDevice; -struct SyclDevice; - -enum FFTResultType { - RealPart = 0, - ImagPart = 1, - BothParts = 2 -}; - -enum FFTDirection { - FFT_FORWARD = 0, - FFT_REVERSE = 1 -}; - - -namespace internal { - -template -struct IsVectorizable { - static const bool value = TensorEvaluator::PacketAccess; -}; - -template -struct IsVectorizable { - static const bool value = TensorEvaluator::PacketAccess && - TensorEvaluator::IsAligned; -}; - -template ::value> -class TensorExecutor; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_FORWARD_DECLARATIONS_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h deleted file mode 100644 index 3b4f8eda..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h +++ /dev/null @@ -1,489 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H -#define EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H - -namespace Eigen { -namespace internal { - - -/** \internal - * \brief Template functor to compute the modulo between an array and a scalar. - */ -template -struct scalar_mod_op { - EIGEN_DEVICE_FUNC scalar_mod_op(const Scalar& divisor) : m_divisor(divisor) {} - EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a % m_divisor; } - const Scalar m_divisor; -}; -template -struct functor_traits > -{ enum { Cost = scalar_div_cost::value, PacketAccess = false }; }; - - -/** \internal - * \brief Template functor to compute the modulo between 2 arrays. - */ -template -struct scalar_mod2_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_mod2_op) - EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a, const Scalar& b) const { return a % b; } -}; -template -struct functor_traits > -{ enum { Cost = scalar_div_cost::value, PacketAccess = false }; }; - -template -struct scalar_fmod_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_fmod_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar - operator()(const Scalar& a, const Scalar& b) const { - return numext::fmod(a, b); - } -}; -template -struct functor_traits > { - enum { Cost = 13, // Reciprocal throughput of FPREM on Haswell. - PacketAccess = false }; -}; - - -/** \internal - * \brief Template functor to compute the sigmoid of a scalar - * \sa class CwiseUnaryOp, ArrayBase::sigmoid() - */ -template -struct scalar_sigmoid_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_sigmoid_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const { - const T one = T(1); - return one / (one + numext::exp(-x)); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Packet packetOp(const Packet& x) const { - const Packet one = pset1(T(1)); - return pdiv(one, padd(one, pexp(pnegate(x)))); - } -}; - -template -struct functor_traits > { - enum { - Cost = NumTraits::AddCost * 2 + NumTraits::MulCost * 6, - PacketAccess = packet_traits::HasAdd && packet_traits::HasDiv && - packet_traits::HasNegate && packet_traits::HasExp - }; -}; - - -template -struct reducer_traits { - enum { - Cost = 1, - PacketAccess = false - }; -}; - -// Standard reduction functors -template struct SumReducer -{ - static const bool PacketAccess = packet_traits::HasAdd; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const { - internal::scalar_sum_op sum_op; - *accum = sum_op(*accum, t); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet& p, Packet* accum) const { - (*accum) = padd(*accum, p); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - internal::scalar_cast_op conv; - return conv(0); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const { - return pset1(initialize()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { - return accum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const { - return vaccum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const { - internal::scalar_sum_op sum_op; - return sum_op(saccum, predux(vaccum)); - } -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::AddCost, - PacketAccess = PacketType::HasAdd - }; -}; - - -template struct MeanReducer -{ - static const bool PacketAccess = packet_traits::HasAdd && !NumTraits::IsInteger; - static const bool IsStateful = true; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - MeanReducer() : scalarCount_(0), packetCount_(0) { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) { - internal::scalar_sum_op sum_op; - *accum = sum_op(*accum, t); - scalarCount_++; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet& p, Packet* accum) { - (*accum) = padd(*accum, p); - packetCount_++; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - internal::scalar_cast_op conv; - return conv(0); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const { - return pset1(initialize()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { - return accum / scalarCount_; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const { - return pdiv(vaccum, pset1(packetCount_)); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const { - internal::scalar_sum_op sum_op; - return sum_op(saccum, predux(vaccum)) / (scalarCount_ + packetCount_ * unpacket_traits::size); - } - - protected: - DenseIndex scalarCount_; - DenseIndex packetCount_; -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::AddCost, - PacketAccess = PacketType::HasAdd - }; -}; - - -template -struct MinMaxBottomValue { - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { - return Eigen::NumTraits::lowest(); - } -}; -template -struct MinMaxBottomValue { - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { - return -Eigen::NumTraits::infinity(); - } -}; -template -struct MinMaxBottomValue { - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { - return Eigen::NumTraits::highest(); - } -}; -template -struct MinMaxBottomValue { - EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { - return Eigen::NumTraits::infinity(); - } -}; - - -template struct MaxReducer -{ - static const bool PacketAccess = packet_traits::HasMax; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const { - if (t > *accum) { *accum = t; } - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet& p, Packet* accum) const { - (*accum) = pmax(*accum, p); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - return MinMaxBottomValue::IsInteger>::bottom_value(); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const { - return pset1(initialize()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { - return accum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const { - return vaccum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const { - return numext::maxi(saccum, predux_max(vaccum)); - } -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::AddCost, - PacketAccess = PacketType::HasMax - }; -}; - - -template struct MinReducer -{ - static const bool PacketAccess = packet_traits::HasMin; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const { - if (t < *accum) { *accum = t; } - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet& p, Packet* accum) const { - (*accum) = pmin(*accum, p); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - return MinMaxBottomValue::IsInteger>::bottom_value(); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const { - return pset1(initialize()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { - return accum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const { - return vaccum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const { - return numext::mini(saccum, predux_min(vaccum)); - } -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::AddCost, - PacketAccess = PacketType::HasMin - }; -}; - - -template struct ProdReducer -{ - static const bool PacketAccess = packet_traits::HasMul; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const { - internal::scalar_product_op prod_op; - (*accum) = prod_op(*accum, t); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reducePacket(const Packet& p, Packet* accum) const { - (*accum) = pmul(*accum, p); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - internal::scalar_cast_op conv; - return conv(1); - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const { - return pset1(initialize()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { - return accum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const { - return vaccum; - } - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const { - internal::scalar_product_op prod_op; - return prod_op(saccum, predux_mul(vaccum)); - } -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::MulCost, - PacketAccess = PacketType::HasMul - }; -}; - - -struct AndReducer -{ - static const bool PacketAccess = false; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const { - *accum = *accum && t; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const { - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const { - return accum; - } -}; - -template -struct reducer_traits { - enum { - Cost = 1, - PacketAccess = false - }; -}; - - -struct OrReducer { - static const bool PacketAccess = false; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const { - *accum = *accum || t; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const { - return false; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const { - return accum; - } -}; - -template -struct reducer_traits { - enum { - Cost = 1, - PacketAccess = false - }; -}; - - -// Argmin/Argmax reducers -template struct ArgMaxTupleReducer -{ - static const bool PacketAccess = false; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const { - if (t.second > accum->second) { *accum = t; } - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - return T(0, NumTraits::lowest()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const { - return accum; - } -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::AddCost, - PacketAccess = false - }; -}; - - -template struct ArgMinTupleReducer -{ - static const bool PacketAccess = false; - static const bool IsStateful = false; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T& t, T* accum) const { - if (t.second < accum->second) { *accum = t; } - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const { - return T(0, NumTraits::highest()); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const { - return accum; - } -}; - -template -struct reducer_traits, Device> { - enum { - Cost = NumTraits::AddCost, - PacketAccess = false - }; -}; - - -template -class GaussianGenerator { - public: - static const bool PacketAccess = false; - - EIGEN_DEVICE_FUNC GaussianGenerator(const array& means, - const array& std_devs) - : m_means(means) - { - for (size_t i = 0; i < NumDims; ++i) { - m_two_sigmas[i] = std_devs[i] * std_devs[i] * 2; - } - } - - EIGEN_DEVICE_FUNC T operator()(const array& coordinates) const { - T tmp = T(0); - for (size_t i = 0; i < NumDims; ++i) { - T offset = coordinates[i] - m_means[i]; - tmp += offset * offset / m_two_sigmas[i]; - } - return numext::exp(-tmp); - } - - private: - array m_means; - array m_two_sigmas; -}; - -template -struct functor_traits > { - enum { - Cost = NumDims * (2 * NumTraits::AddCost + NumTraits::MulCost + - functor_traits >::Cost) + - functor_traits >::Cost, - PacketAccess = GaussianGenerator::PacketAccess - }; -}; - -} // end namespace internal -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h deleted file mode 100644 index eb1d4934..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h +++ /dev/null @@ -1,185 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_GENERATOR_H -#define EIGEN_CXX11_TENSOR_TENSOR_GENERATOR_H - -namespace Eigen { - -/** \class TensorGenerator - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor generator class. - * - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorGeneratorOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorGeneratorOp type; -}; - -} // end namespace internal - - - -template -class TensorGeneratorOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorGeneratorOp(const XprType& expr, const Generator& generator) - : m_xpr(expr), m_generator(generator) {} - - EIGEN_DEVICE_FUNC - const Generator& generator() const { return m_generator; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const Generator m_generator; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorGeneratorOp XprType; - typedef typename XprType::Index Index; - typedef typename TensorEvaluator::Dimensions Dimensions; - static const int NumDims = internal::array_size::value; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - enum { - IsAligned = false, - PacketAccess = (internal::unpacket_traits::size > 1), - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_generator(op.generator()) - { - TensorEvaluator impl(op.expression(), device); - m_dimensions = impl.dimensions(); - - if (static_cast(Layout) == static_cast(ColMajor)) { - m_strides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_strides[i] = m_strides[i - 1] * m_dimensions[i - 1]; - } - } else { - m_strides[NumDims - 1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_strides[i] = m_strides[i + 1] * m_dimensions[i + 1]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - array coords; - extract_coordinates(index, coords); - return m_generator(coords); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - const int packetSize = internal::unpacket_traits::size; - EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+packetSize-1 < dimensions().TotalSize()); - - EIGEN_ALIGN_MAX typename internal::remove_const::type values[packetSize]; - for (int i = 0; i < packetSize; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool) const { - // TODO(rmlarsen): This is just a placeholder. Define interface to make - // generators return their cost. - return TensorOpCost(0, 0, TensorOpCost::AddCost() + - TensorOpCost::MulCost()); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - protected: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void extract_coordinates(Index index, array& coords) const { - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_strides[i]; - index -= idx * m_strides[i]; - coords[i] = idx; - } - coords[0] = index; - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_strides[i]; - index -= idx * m_strides[i]; - coords[i] = idx; - } - coords[NumDims-1] = index; - } - } - - Dimensions m_dimensions; - array m_strides; - Generator m_generator; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_GENERATOR_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h deleted file mode 100644 index 665b861c..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h +++ /dev/null @@ -1,33 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Eugene Brevdo -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_GLOBAL_FUNCTIONS_H -#define EIGEN_CXX11_TENSOR_TENSOR_GLOBAL_FUNCTIONS_H - -namespace Eigen { - -/** \cpp11 \returns an expression of the coefficient-wise betainc(\a x, \a a, \a b) to the given tensors. - * - * This function computes the regularized incomplete beta function (integral). - * - */ -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const - TensorCwiseTernaryOp, - const ADerived, const BDerived, const XDerived> - betainc(const ADerived& a, const BDerived& b, const XDerived& x) { - return TensorCwiseTernaryOp< - internal::scalar_betainc_op, const ADerived, - const BDerived, const XDerived>( - a, b, x, internal::scalar_betainc_op()); -} - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_GLOBAL_FUNCTIONS_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h deleted file mode 100644 index a901c5dd..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h +++ /dev/null @@ -1,79 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_IO_H -#define EIGEN_CXX11_TENSOR_TENSOR_IO_H - -namespace Eigen { - -namespace internal { - -// Print the tensor as a 2d matrix -template -struct TensorPrinter { - static void run (std::ostream& os, const Tensor& tensor) { - typedef typename internal::remove_const::type Scalar; - typedef typename Tensor::Index Index; - const Index total_size = internal::array_prod(tensor.dimensions()); - if (total_size > 0) { - const Index first_dim = Eigen::internal::array_get<0>(tensor.dimensions()); - static const int layout = Tensor::Layout; - Map > matrix(const_cast(tensor.data()), first_dim, total_size/first_dim); - os << matrix; - } - } -}; - - -// Print the tensor as a vector -template -struct TensorPrinter { - static void run (std::ostream& os, const Tensor& tensor) { - typedef typename internal::remove_const::type Scalar; - typedef typename Tensor::Index Index; - const Index total_size = internal::array_prod(tensor.dimensions()); - if (total_size > 0) { - Map > array(const_cast(tensor.data()), total_size); - os << array; - } - } -}; - - -// Print the tensor as a scalar -template -struct TensorPrinter { - static void run (std::ostream& os, const Tensor& tensor) { - os << tensor.coeff(0); - } -}; -} - -template -std::ostream& operator << (std::ostream& os, const TensorBase& expr) { - typedef TensorEvaluator, DefaultDevice> Evaluator; - typedef typename Evaluator::Dimensions Dimensions; - - // Evaluate the expression if needed - TensorForcedEvalOp eval = expr.eval(); - Evaluator tensor(eval, DefaultDevice()); - tensor.evalSubExprsIfNeeded(NULL); - - // Print the result - static const int rank = internal::array_size::value; - internal::TensorPrinter::run(os, tensor); - - // Cleanup. - tensor.cleanup(); - return os; -} - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_IO_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h deleted file mode 100644 index 566856ed..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h +++ /dev/null @@ -1,509 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_IMAGE_PATCH_H -#define EIGEN_CXX11_TENSOR_TENSOR_IMAGE_PATCH_H - -namespace Eigen { - -/** \class TensorImagePatch - * \ingroup CXX11_Tensor_Module - * - * \brief Patch extraction specialized for image processing. - * This assumes that the input has a least 3 dimensions ordered as follow: - * 1st dimension: channels (of size d) - * 2nd dimension: rows (of size r) - * 3rd dimension: columns (of size c) - * There can be additional dimensions such as time (for video) or batch (for - * bulk processing after the first 3. - * Calling the image patch code with patch_rows and patch_cols is equivalent - * to calling the regular patch extraction code with parameters d, patch_rows, - * patch_cols, and 1 for all the additional dimensions. - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename internal::remove_const::type Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions + 1; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorImagePatchOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorImagePatchOp type; -}; - -} // end namespace internal - -template -class TensorImagePatchOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorImagePatchOp(const XprType& expr, DenseIndex patch_rows, DenseIndex patch_cols, - DenseIndex row_strides, DenseIndex col_strides, - DenseIndex in_row_strides, DenseIndex in_col_strides, - DenseIndex row_inflate_strides, DenseIndex col_inflate_strides, - PaddingType padding_type, Scalar padding_value) - : m_xpr(expr), m_patch_rows(patch_rows), m_patch_cols(patch_cols), - m_row_strides(row_strides), m_col_strides(col_strides), - m_in_row_strides(in_row_strides), m_in_col_strides(in_col_strides), - m_row_inflate_strides(row_inflate_strides), m_col_inflate_strides(col_inflate_strides), - m_padding_explicit(false), m_padding_top(0), m_padding_bottom(0), m_padding_left(0), m_padding_right(0), - m_padding_type(padding_type), m_padding_value(padding_value) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorImagePatchOp(const XprType& expr, DenseIndex patch_rows, DenseIndex patch_cols, - DenseIndex row_strides, DenseIndex col_strides, - DenseIndex in_row_strides, DenseIndex in_col_strides, - DenseIndex row_inflate_strides, DenseIndex col_inflate_strides, - DenseIndex padding_top, DenseIndex padding_bottom, - DenseIndex padding_left, DenseIndex padding_right, - Scalar padding_value) - : m_xpr(expr), m_patch_rows(patch_rows), m_patch_cols(patch_cols), - m_row_strides(row_strides), m_col_strides(col_strides), - m_in_row_strides(in_row_strides), m_in_col_strides(in_col_strides), - m_row_inflate_strides(row_inflate_strides), m_col_inflate_strides(col_inflate_strides), - m_padding_explicit(true), m_padding_top(padding_top), m_padding_bottom(padding_bottom), - m_padding_left(padding_left), m_padding_right(padding_right), - m_padding_type(PADDING_VALID), m_padding_value(padding_value) {} - - EIGEN_DEVICE_FUNC - DenseIndex patch_rows() const { return m_patch_rows; } - EIGEN_DEVICE_FUNC - DenseIndex patch_cols() const { return m_patch_cols; } - EIGEN_DEVICE_FUNC - DenseIndex row_strides() const { return m_row_strides; } - EIGEN_DEVICE_FUNC - DenseIndex col_strides() const { return m_col_strides; } - EIGEN_DEVICE_FUNC - DenseIndex in_row_strides() const { return m_in_row_strides; } - EIGEN_DEVICE_FUNC - DenseIndex in_col_strides() const { return m_in_col_strides; } - EIGEN_DEVICE_FUNC - DenseIndex row_inflate_strides() const { return m_row_inflate_strides; } - EIGEN_DEVICE_FUNC - DenseIndex col_inflate_strides() const { return m_col_inflate_strides; } - EIGEN_DEVICE_FUNC - bool padding_explicit() const { return m_padding_explicit; } - EIGEN_DEVICE_FUNC - DenseIndex padding_top() const { return m_padding_top; } - EIGEN_DEVICE_FUNC - DenseIndex padding_bottom() const { return m_padding_bottom; } - EIGEN_DEVICE_FUNC - DenseIndex padding_left() const { return m_padding_left; } - EIGEN_DEVICE_FUNC - DenseIndex padding_right() const { return m_padding_right; } - EIGEN_DEVICE_FUNC - PaddingType padding_type() const { return m_padding_type; } - EIGEN_DEVICE_FUNC - Scalar padding_value() const { return m_padding_value; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const DenseIndex m_patch_rows; - const DenseIndex m_patch_cols; - const DenseIndex m_row_strides; - const DenseIndex m_col_strides; - const DenseIndex m_in_row_strides; - const DenseIndex m_in_col_strides; - const DenseIndex m_row_inflate_strides; - const DenseIndex m_col_inflate_strides; - const bool m_padding_explicit; - const DenseIndex m_padding_top; - const DenseIndex m_padding_bottom; - const DenseIndex m_padding_left; - const DenseIndex m_padding_right; - const PaddingType m_padding_type; - const Scalar m_padding_value; -}; - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorImagePatchOp XprType; - typedef typename XprType::Index Index; - static const int NumInputDims = internal::array_size::Dimensions>::value; - static const int NumDims = NumInputDims + 1; - typedef DSizes Dimensions; - typedef typename internal::remove_const::type Scalar; - typedef TensorEvaluator, - Device> Self; - typedef TensorEvaluator Impl; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device) - { - EIGEN_STATIC_ASSERT((NumDims >= 4), YOU_MADE_A_PROGRAMMING_MISTAKE); - - m_paddingValue = op.padding_value(); - - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - - // Caches a few variables. - if (static_cast(Layout) == static_cast(ColMajor)) { - m_inputDepth = input_dims[0]; - m_inputRows = input_dims[1]; - m_inputCols = input_dims[2]; - } else { - m_inputDepth = input_dims[NumInputDims-1]; - m_inputRows = input_dims[NumInputDims-2]; - m_inputCols = input_dims[NumInputDims-3]; - } - - m_row_strides = op.row_strides(); - m_col_strides = op.col_strides(); - - // Input strides and effective input/patch size - m_in_row_strides = op.in_row_strides(); - m_in_col_strides = op.in_col_strides(); - m_row_inflate_strides = op.row_inflate_strides(); - m_col_inflate_strides = op.col_inflate_strides(); - // The "effective" input rows and input cols are the input rows and cols - // after inflating them with zeros. - // For examples, a 2x3 matrix with row_inflate_strides and - // col_inflate_strides of 2 comes from: - // A B C - // D E F - // - // to a matrix is 3 x 5: - // - // A . B . C - // . . . . . - // D . E . F - - m_input_rows_eff = (m_inputRows - 1) * m_row_inflate_strides + 1; - m_input_cols_eff = (m_inputCols - 1) * m_col_inflate_strides + 1; - m_patch_rows_eff = op.patch_rows() + (op.patch_rows() - 1) * (m_in_row_strides - 1); - m_patch_cols_eff = op.patch_cols() + (op.patch_cols() - 1) * (m_in_col_strides - 1); - - if (op.padding_explicit()) { - m_outputRows = numext::ceil((m_input_rows_eff + op.padding_top() + op.padding_bottom() - m_patch_rows_eff + 1.f) / static_cast(m_row_strides)); - m_outputCols = numext::ceil((m_input_cols_eff + op.padding_left() + op.padding_right() - m_patch_cols_eff + 1.f) / static_cast(m_col_strides)); - m_rowPaddingTop = op.padding_top(); - m_colPaddingLeft = op.padding_left(); - } else { - // Computing padding from the type - switch (op.padding_type()) { - case PADDING_VALID: - m_outputRows = numext::ceil((m_input_rows_eff - m_patch_rows_eff + 1.f) / static_cast(m_row_strides)); - m_outputCols = numext::ceil((m_input_cols_eff - m_patch_cols_eff + 1.f) / static_cast(m_col_strides)); - // Calculate the padding - m_rowPaddingTop = numext::maxi(0, ((m_outputRows - 1) * m_row_strides + m_patch_rows_eff - m_input_rows_eff) / 2); - m_colPaddingLeft = numext::maxi(0, ((m_outputCols - 1) * m_col_strides + m_patch_cols_eff - m_input_cols_eff) / 2); - break; - case PADDING_SAME: - m_outputRows = numext::ceil(m_input_rows_eff / static_cast(m_row_strides)); - m_outputCols = numext::ceil(m_input_cols_eff / static_cast(m_col_strides)); - // Calculate the padding - m_rowPaddingTop = ((m_outputRows - 1) * m_row_strides + m_patch_rows_eff - m_input_rows_eff) / 2; - m_colPaddingLeft = ((m_outputCols - 1) * m_col_strides + m_patch_cols_eff - m_input_cols_eff) / 2; - break; - default: - eigen_assert(false && "unexpected padding"); - } - } - eigen_assert(m_outputRows > 0); - eigen_assert(m_outputCols > 0); - - // Dimensions for result of extraction. - if (static_cast(Layout) == static_cast(ColMajor)) { - // ColMajor - // 0: depth - // 1: patch_rows - // 2: patch_cols - // 3: number of patches - // 4 and beyond: anything else (such as batch). - m_dimensions[0] = input_dims[0]; - m_dimensions[1] = op.patch_rows(); - m_dimensions[2] = op.patch_cols(); - m_dimensions[3] = m_outputRows * m_outputCols; - for (int i = 4; i < NumDims; ++i) { - m_dimensions[i] = input_dims[i-1]; - } - } else { - // RowMajor - // NumDims-1: depth - // NumDims-2: patch_rows - // NumDims-3: patch_cols - // NumDims-4: number of patches - // NumDims-5 and beyond: anything else (such as batch). - m_dimensions[NumDims-1] = input_dims[NumInputDims-1]; - m_dimensions[NumDims-2] = op.patch_rows(); - m_dimensions[NumDims-3] = op.patch_cols(); - m_dimensions[NumDims-4] = m_outputRows * m_outputCols; - for (int i = NumDims-5; i >= 0; --i) { - m_dimensions[i] = input_dims[i]; - } - } - - // Strides for moving the patch in various dimensions. - if (static_cast(Layout) == static_cast(ColMajor)) { - m_colStride = m_dimensions[1]; - m_patchStride = m_colStride * m_dimensions[2] * m_dimensions[0]; - m_otherStride = m_patchStride * m_dimensions[3]; - } else { - m_colStride = m_dimensions[NumDims-2]; - m_patchStride = m_colStride * m_dimensions[NumDims-3] * m_dimensions[NumDims-1]; - m_otherStride = m_patchStride * m_dimensions[NumDims-4]; - } - - // Strides for navigating through the input tensor. - m_rowInputStride = m_inputDepth; - m_colInputStride = m_inputDepth * m_inputRows; - m_patchInputStride = m_inputDepth * m_inputRows * m_inputCols; - - // Fast representations of different variables. - m_fastOtherStride = internal::TensorIntDivisor(m_otherStride); - m_fastPatchStride = internal::TensorIntDivisor(m_patchStride); - m_fastColStride = internal::TensorIntDivisor(m_colStride); - m_fastInflateRowStride = internal::TensorIntDivisor(m_row_inflate_strides); - m_fastInflateColStride = internal::TensorIntDivisor(m_col_inflate_strides); - m_fastInputColsEff = internal::TensorIntDivisor(m_input_cols_eff); - - // Number of patches in the width dimension. - m_fastOutputRows = internal::TensorIntDivisor(m_outputRows); - if (static_cast(Layout) == static_cast(ColMajor)) { - m_fastOutputDepth = internal::TensorIntDivisor(m_dimensions[0]); - } else { - m_fastOutputDepth = internal::TensorIntDivisor(m_dimensions[NumDims-1]); - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - // Patch index corresponding to the passed in index. - const Index patchIndex = index / m_fastPatchStride; - // Find the offset of the element wrt the location of the first element. - const Index patchOffset = (index - patchIndex * m_patchStride) / m_fastOutputDepth; - - // Other ways to index this element. - const Index otherIndex = (NumDims == 4) ? 0 : index / m_fastOtherStride; - const Index patch2DIndex = (NumDims == 4) ? patchIndex : (index - otherIndex * m_otherStride) / m_fastPatchStride; - - // Calculate col index in the input original tensor. - const Index colIndex = patch2DIndex / m_fastOutputRows; - const Index colOffset = patchOffset / m_fastColStride; - const Index inputCol = colIndex * m_col_strides + colOffset * m_in_col_strides - m_colPaddingLeft; - const Index origInputCol = (m_col_inflate_strides == 1) ? inputCol : ((inputCol >= 0) ? (inputCol / m_fastInflateColStride) : 0); - if (inputCol < 0 || inputCol >= m_input_cols_eff || - ((m_col_inflate_strides != 1) && (inputCol != origInputCol * m_col_inflate_strides))) { - return Scalar(m_paddingValue); - } - - // Calculate row index in the original input tensor. - const Index rowIndex = patch2DIndex - colIndex * m_outputRows; - const Index rowOffset = patchOffset - colOffset * m_colStride; - const Index inputRow = rowIndex * m_row_strides + rowOffset * m_in_row_strides - m_rowPaddingTop; - const Index origInputRow = (m_row_inflate_strides == 1) ? inputRow : ((inputRow >= 0) ? (inputRow / m_fastInflateRowStride) : 0); - if (inputRow < 0 || inputRow >= m_input_rows_eff || - ((m_row_inflate_strides != 1) && (inputRow != origInputRow * m_row_inflate_strides))) { - return Scalar(m_paddingValue); - } - - const int depth_index = static_cast(Layout) == static_cast(ColMajor) ? 0 : NumDims - 1; - const Index depth = index - (index / m_fastOutputDepth) * m_dimensions[depth_index]; - - const Index inputIndex = depth + origInputRow * m_rowInputStride + origInputCol * m_colInputStride + otherIndex * m_patchInputStride; - return m_impl.coeff(inputIndex); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - if (m_in_row_strides != 1 || m_in_col_strides != 1 || m_row_inflate_strides != 1 || m_col_inflate_strides != 1) { - return packetWithPossibleZero(index); - } - - const Index indices[2] = {index, index + PacketSize - 1}; - const Index patchIndex = indices[0] / m_fastPatchStride; - if (patchIndex != indices[1] / m_fastPatchStride) { - return packetWithPossibleZero(index); - } - const Index otherIndex = (NumDims == 4) ? 0 : indices[0] / m_fastOtherStride; - eigen_assert(otherIndex == indices[1] / m_fastOtherStride); - - // Find the offset of the element wrt the location of the first element. - const Index patchOffsets[2] = {(indices[0] - patchIndex * m_patchStride) / m_fastOutputDepth, - (indices[1] - patchIndex * m_patchStride) / m_fastOutputDepth}; - - const Index patch2DIndex = (NumDims == 4) ? patchIndex : (indices[0] - otherIndex * m_otherStride) / m_fastPatchStride; - eigen_assert(patch2DIndex == (indices[1] - otherIndex * m_otherStride) / m_fastPatchStride); - - const Index colIndex = patch2DIndex / m_fastOutputRows; - const Index colOffsets[2] = {patchOffsets[0] / m_fastColStride, patchOffsets[1] / m_fastColStride}; - - // Calculate col indices in the original input tensor. - const Index inputCols[2] = {colIndex * m_col_strides + colOffsets[0] - - m_colPaddingLeft, colIndex * m_col_strides + colOffsets[1] - m_colPaddingLeft}; - if (inputCols[1] < 0 || inputCols[0] >= m_inputCols) { - return internal::pset1(Scalar(m_paddingValue)); - } - - if (inputCols[0] == inputCols[1]) { - const Index rowIndex = patch2DIndex - colIndex * m_outputRows; - const Index rowOffsets[2] = {patchOffsets[0] - colOffsets[0]*m_colStride, patchOffsets[1] - colOffsets[1]*m_colStride}; - eigen_assert(rowOffsets[0] <= rowOffsets[1]); - // Calculate col indices in the original input tensor. - const Index inputRows[2] = {rowIndex * m_row_strides + rowOffsets[0] - - m_rowPaddingTop, rowIndex * m_row_strides + rowOffsets[1] - m_rowPaddingTop}; - - if (inputRows[1] < 0 || inputRows[0] >= m_inputRows) { - return internal::pset1(Scalar(m_paddingValue)); - } - - if (inputRows[0] >= 0 && inputRows[1] < m_inputRows) { - // no padding - const int depth_index = static_cast(Layout) == static_cast(ColMajor) ? 0 : NumDims - 1; - const Index depth = index - (index / m_fastOutputDepth) * m_dimensions[depth_index]; - const Index inputIndex = depth + inputRows[0] * m_rowInputStride + inputCols[0] * m_colInputStride + otherIndex * m_patchInputStride; - return m_impl.template packet(inputIndex); - } - } - - return packetWithPossibleZero(index); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - const TensorEvaluator& impl() const { return m_impl; } - - Index rowPaddingTop() const { return m_rowPaddingTop; } - Index colPaddingLeft() const { return m_colPaddingLeft; } - Index outputRows() const { return m_outputRows; } - Index outputCols() const { return m_outputCols; } - Index userRowStride() const { return m_row_strides; } - Index userColStride() const { return m_col_strides; } - Index userInRowStride() const { return m_in_row_strides; } - Index userInColStride() const { return m_in_col_strides; } - Index rowInflateStride() const { return m_row_inflate_strides; } - Index colInflateStride() const { return m_col_inflate_strides; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost - costPerCoeff(bool vectorized) const { - // We conservatively estimate the cost for the code path where the computed - // index is inside the original image and - // TensorEvaluator::CoordAccess is false. - const double compute_cost = 3 * TensorOpCost::DivCost() + - 6 * TensorOpCost::MulCost() + - 8 * TensorOpCost::MulCost(); - return m_impl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, compute_cost, vectorized, PacketSize); - } - - protected: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const - { - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - for (int i = 0; i < PacketSize; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - - Dimensions m_dimensions; - - Index m_otherStride; - Index m_patchStride; - Index m_colStride; - Index m_row_strides; - Index m_col_strides; - - Index m_in_row_strides; - Index m_in_col_strides; - Index m_row_inflate_strides; - Index m_col_inflate_strides; - - Index m_input_rows_eff; - Index m_input_cols_eff; - Index m_patch_rows_eff; - Index m_patch_cols_eff; - - internal::TensorIntDivisor m_fastOtherStride; - internal::TensorIntDivisor m_fastPatchStride; - internal::TensorIntDivisor m_fastColStride; - internal::TensorIntDivisor m_fastInflateRowStride; - internal::TensorIntDivisor m_fastInflateColStride; - internal::TensorIntDivisor m_fastInputColsEff; - - Index m_rowInputStride; - Index m_colInputStride; - Index m_patchInputStride; - - Index m_inputDepth; - Index m_inputRows; - Index m_inputCols; - - Index m_outputRows; - Index m_outputCols; - - Index m_rowPaddingTop; - Index m_colPaddingLeft; - - internal::TensorIntDivisor m_fastOutputRows; - internal::TensorIntDivisor m_fastOutputDepth; - - Scalar m_paddingValue; - - TensorEvaluator m_impl; -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_IMAGE_PATCH_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h deleted file mode 100644 index 3209fecd..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h +++ /dev/null @@ -1,725 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H -#define EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H - - -#if EIGEN_HAS_CONSTEXPR && EIGEN_HAS_VARIADIC_TEMPLATES - -#define EIGEN_HAS_INDEX_LIST - -namespace Eigen { - -/** \internal - * - * \class TensorIndexList - * \ingroup CXX11_Tensor_Module - * - * \brief Set of classes used to encode a set of Tensor dimensions/indices. - * - * The indices in the list can be known at compile time or at runtime. A mix - * of static and dynamic indices can also be provided if needed. The tensor - * code will attempt to take advantage of the indices that are known at - * compile time to optimize the code it generates. - * - * This functionality requires a c++11 compliant compiler. If your compiler - * is older you need to use arrays of indices instead. - * - * Several examples are provided in the cxx11_tensor_index_list.cpp file. - * - * \sa Tensor - */ - -template -struct type2index { - static const DenseIndex value = n; - EIGEN_DEVICE_FUNC constexpr operator DenseIndex() const { return n; } - EIGEN_DEVICE_FUNC void set(DenseIndex val) { - eigen_assert(val == n); - } -}; - -// This can be used with IndexPairList to get compile-time constant pairs, -// such as IndexPairList, type2indexpair<3,4>>(). -template -struct type2indexpair { - static const DenseIndex first = f; - static const DenseIndex second = s; - - constexpr EIGEN_DEVICE_FUNC operator IndexPair() const { - return IndexPair(f, s); - } - - EIGEN_DEVICE_FUNC void set(const IndexPair& val) { - eigen_assert(val.first == f); - eigen_assert(val.second == s); - } -}; - - -template struct NumTraits > -{ - typedef DenseIndex Real; - enum { - IsComplex = 0, - RequireInitialization = false, - ReadCost = 1, - AddCost = 1, - MulCost = 1 - }; - - EIGEN_DEVICE_FUNC static inline Real epsilon() { return 0; } - EIGEN_DEVICE_FUNC static inline Real dummy_precision() { return 0; } - EIGEN_DEVICE_FUNC static inline Real highest() { return n; } - EIGEN_DEVICE_FUNC static inline Real lowest() { return n; } -}; - -namespace internal { -template -EIGEN_DEVICE_FUNC void update_value(T& val, DenseIndex new_val) { - val = new_val; -} -template -EIGEN_DEVICE_FUNC void update_value(type2index& val, DenseIndex new_val) { - val.set(new_val); -} - -template -EIGEN_DEVICE_FUNC void update_value(T& val, IndexPair new_val) { - val = new_val; -} -template -EIGEN_DEVICE_FUNC void update_value(type2indexpair& val, IndexPair new_val) { - val.set(new_val); -} - - -template -struct is_compile_time_constant { - static constexpr bool value = false; -}; - -template -struct is_compile_time_constant > { - static constexpr bool value = true; -}; -template -struct is_compile_time_constant > { - static constexpr bool value = true; -}; -template -struct is_compile_time_constant& > { - static constexpr bool value = true; -}; -template -struct is_compile_time_constant& > { - static constexpr bool value = true; -}; - -template -struct is_compile_time_constant > { - static constexpr bool value = true; -}; -template -struct is_compile_time_constant > { - static constexpr bool value = true; -}; -template -struct is_compile_time_constant& > { - static constexpr bool value = true; -}; -template -struct is_compile_time_constant& > { - static constexpr bool value = true; -}; - - -template -struct IndexTuple; - -template -struct IndexTuple { - EIGEN_DEVICE_FUNC constexpr IndexTuple() : head(), others() { } - EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v, const O... o) : head(v), others(o...) { } - - constexpr static int count = 1 + sizeof...(O); - T head; - IndexTuple others; - typedef T Head; - typedef IndexTuple Other; -}; - -template - struct IndexTuple { - EIGEN_DEVICE_FUNC constexpr IndexTuple() : head() { } - EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v) : head(v) { } - - constexpr static int count = 1; - T head; - typedef T Head; -}; - - -template -struct IndexTupleExtractor; - -template -struct IndexTupleExtractor { - - typedef typename IndexTupleExtractor::ValType ValType; - - EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple& val) { - return IndexTupleExtractor::get_val(val.others); - } - - EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple& val) { - return IndexTupleExtractor::get_val(val.others); - } - template - EIGEN_DEVICE_FUNC static void set_val(IndexTuple& val, V& new_val) { - IndexTupleExtractor::set_val(val.others, new_val); - } - -}; - -template - struct IndexTupleExtractor<0, T, O...> { - - typedef T ValType; - - EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple& val) { - return val.head; - } - EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple& val) { - return val.head; - } - template - EIGEN_DEVICE_FUNC static void set_val(IndexTuple& val, V& new_val) { - val.head = new_val; - } -}; - - - -template -EIGEN_DEVICE_FUNC constexpr typename IndexTupleExtractor::ValType& array_get(IndexTuple& tuple) { - return IndexTupleExtractor::get_val(tuple); -} -template -EIGEN_DEVICE_FUNC constexpr const typename IndexTupleExtractor::ValType& array_get(const IndexTuple& tuple) { - return IndexTupleExtractor::get_val(tuple); -} -template - struct array_size > { - static const size_t value = IndexTuple::count; -}; -template - struct array_size > { - static const size_t value = IndexTuple::count; -}; - - - - -template -struct tuple_coeff { - template - EIGEN_DEVICE_FUNC static constexpr ValueT get(const DenseIndex i, const IndexTuple& t) { - // return array_get(t) * (i == Idx) + tuple_coeff::get(i, t) * (i != Idx); - return (i == Idx ? array_get(t) : tuple_coeff::get(i, t)); - } - template - EIGEN_DEVICE_FUNC static void set(const DenseIndex i, IndexTuple& t, const ValueT& value) { - if (i == Idx) { - update_value(array_get(t), value); - } else { - tuple_coeff::set(i, t, value); - } - } - - template - EIGEN_DEVICE_FUNC static constexpr bool value_known_statically(const DenseIndex i, const IndexTuple& t) { - return ((i == Idx) & is_compile_time_constant::ValType>::value) || - tuple_coeff::value_known_statically(i, t); - } - - template - EIGEN_DEVICE_FUNC static constexpr bool values_up_to_known_statically(const IndexTuple& t) { - return is_compile_time_constant::ValType>::value && - tuple_coeff::values_up_to_known_statically(t); - } - - template - EIGEN_DEVICE_FUNC static constexpr bool values_up_to_statically_known_to_increase(const IndexTuple& t) { - return is_compile_time_constant::ValType>::value && - is_compile_time_constant::ValType>::value && - array_get(t) > array_get(t) && - tuple_coeff::values_up_to_statically_known_to_increase(t); - } -}; - -template -struct tuple_coeff<0, ValueT> { - template - EIGEN_DEVICE_FUNC static constexpr ValueT get(const DenseIndex /*i*/, const IndexTuple& t) { - // eigen_assert (i == 0); // gcc fails to compile assertions in constexpr - return array_get<0>(t)/* * (i == 0)*/; - } - template - EIGEN_DEVICE_FUNC static void set(const DenseIndex i, IndexTuple& t, const ValueT value) { - eigen_assert (i == 0); - update_value(array_get<0>(t), value); - } - template - EIGEN_DEVICE_FUNC static constexpr bool value_known_statically(const DenseIndex i, const IndexTuple&) { - return is_compile_time_constant::ValType>::value & (i == 0); - } - - template - EIGEN_DEVICE_FUNC static constexpr bool values_up_to_known_statically(const IndexTuple&) { - return is_compile_time_constant::ValType>::value; - } - - template - EIGEN_DEVICE_FUNC static constexpr bool values_up_to_statically_known_to_increase(const IndexTuple&) { - return true; - } -}; -} // namespace internal - - - -template -struct IndexList : internal::IndexTuple { - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr DenseIndex operator[] (const DenseIndex i) const { - return internal::tuple_coeff >::value-1, DenseIndex>::get(i, *this); - } - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr DenseIndex get(const DenseIndex i) const { - return internal::tuple_coeff >::value-1, DenseIndex>::get(i, *this); - } - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC void set(const DenseIndex i, const DenseIndex value) { - return internal::tuple_coeff >::value-1, DenseIndex>::set(i, *this, value); - } - - EIGEN_DEVICE_FUNC constexpr IndexList(const internal::IndexTuple& other) : internal::IndexTuple(other) { } - EIGEN_DEVICE_FUNC constexpr IndexList(FirstType& first, OtherTypes... other) : internal::IndexTuple(first, other...) { } - EIGEN_DEVICE_FUNC constexpr IndexList() : internal::IndexTuple() { } - - EIGEN_DEVICE_FUNC constexpr bool value_known_statically(const DenseIndex i) const { - return internal::tuple_coeff >::value-1, DenseIndex>::value_known_statically(i, *this); - } - EIGEN_DEVICE_FUNC constexpr bool all_values_known_statically() const { - return internal::tuple_coeff >::value-1, DenseIndex>::values_up_to_known_statically(*this); - } - - EIGEN_DEVICE_FUNC constexpr bool values_statically_known_to_increase() const { - return internal::tuple_coeff >::value-1, DenseIndex>::values_up_to_statically_known_to_increase(*this); - } -}; - - -template -constexpr IndexList make_index_list(FirstType val1, OtherTypes... other_vals) { - return IndexList(val1, other_vals...); -} - - -template -struct IndexPairList : internal::IndexTuple { - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr IndexPair operator[] (const DenseIndex i) const { - return internal::tuple_coeff >::value-1, IndexPair>::get(i, *this); - } - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC void set(const DenseIndex i, const IndexPair value) { - return internal::tuple_coeff>::value-1, IndexPair >::set(i, *this, value); - } - - EIGEN_DEVICE_FUNC constexpr IndexPairList(const internal::IndexTuple& other) : internal::IndexTuple(other) { } - EIGEN_DEVICE_FUNC constexpr IndexPairList() : internal::IndexTuple() { } - - EIGEN_DEVICE_FUNC constexpr bool value_known_statically(const DenseIndex i) const { - return internal::tuple_coeff >::value-1, DenseIndex>::value_known_statically(i, *this); - } -}; - -namespace internal { - -template size_t array_prod(const IndexList& sizes) { - size_t result = 1; - for (int i = 0; i < array_size >::value; ++i) { - result *= sizes[i]; - } - return result; -} - -template struct array_size > { - static const size_t value = array_size >::value; -}; -template struct array_size > { - static const size_t value = array_size >::value; -}; - -template struct array_size > { - static const size_t value = std::tuple_size >::value; -}; -template struct array_size > { - static const size_t value = std::tuple_size >::value; -}; - -template EIGEN_DEVICE_FUNC constexpr DenseIndex array_get(IndexList& a) { - return IndexTupleExtractor::get_val(a); -} -template EIGEN_DEVICE_FUNC constexpr DenseIndex array_get(const IndexList& a) { - return IndexTupleExtractor::get_val(a); -} - -template -struct index_known_statically_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) { - return false; - } -}; - -template -struct index_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i) { - return IndexList().value_known_statically(i); - } -}; - -template -struct index_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i) { - return IndexList().value_known_statically(i); - } -}; - - -template -struct all_indices_known_statically_impl { - static constexpr bool run() { - return false; - } -}; - -template -struct all_indices_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return IndexList().all_values_known_statically(); - } -}; - -template -struct all_indices_known_statically_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return IndexList().all_values_known_statically(); - } -}; - - -template -struct indices_statically_known_to_increase_impl { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return false; - } -}; - -template - struct indices_statically_known_to_increase_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return Eigen::IndexList().values_statically_known_to_increase(); - } -}; - -template - struct indices_statically_known_to_increase_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run() { - return Eigen::IndexList().values_statically_known_to_increase(); - } -}; - - -template -struct index_statically_eq_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) == value); - } -}; - -template -struct index_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) == value); - } -}; - - -template -struct index_statically_ne_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_ne_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) != value); - } -}; - -template -struct index_statically_ne_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) != value); - } -}; - - -template -struct index_statically_gt_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_gt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) > value); - } -}; - -template -struct index_statically_gt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) > value); - } -}; - - - -template -struct index_statically_lt_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_lt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) < value); - } -}; - -template -struct index_statically_lt_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexList().value_known_statically(i) & - (IndexList().get(i) < value); - } -}; - - - -template -struct index_pair_first_statically_eq_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_pair_first_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexPairList().value_known_statically(i) & - (IndexPairList().operator[](i).first == value); - } -}; - -template -struct index_pair_first_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexPairList().value_known_statically(i) & - (IndexPairList().operator[](i).first == value); - } -}; - - - -template -struct index_pair_second_statically_eq_impl { - EIGEN_DEVICE_FUNC static constexpr bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_pair_second_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexPairList().value_known_statically(i) & - (IndexPairList().operator[](i).second == value); - } -}; - -template -struct index_pair_second_statically_eq_impl > { - EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { - return IndexPairList().value_known_statically(i) & - (IndexPairList().operator[](i).second == value); - } -}; - - -} // end namespace internal -} // end namespace Eigen - -#else - -namespace Eigen { -namespace internal { - -template -struct index_known_statically_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex) { - return false; - } -}; - -template -struct all_indices_known_statically_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() { - return false; - } -}; - -template -struct indices_statically_known_to_increase_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() { - return false; - } -}; - -template -struct index_statically_eq_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_ne_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_gt_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_statically_lt_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_pair_first_statically_eq_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { - return false; - } -}; - -template -struct index_pair_second_statically_eq_impl { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(DenseIndex, DenseIndex) { - return false; - } -}; - - - -} // end namespace internal -} // end namespace Eigen - -#endif - - -namespace Eigen { -namespace internal { -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_known_statically(DenseIndex i) { - return index_known_statically_impl::run(i); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool all_indices_known_statically() { - return all_indices_known_statically_impl::run(); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool indices_statically_known_to_increase() { - return indices_statically_known_to_increase_impl::run(); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_eq(DenseIndex i, DenseIndex value) { - return index_statically_eq_impl::run(i, value); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_ne(DenseIndex i, DenseIndex value) { - return index_statically_ne_impl::run(i, value); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_gt(DenseIndex i, DenseIndex value) { - return index_statically_gt_impl::run(i, value); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_statically_lt(DenseIndex i, DenseIndex value) { - return index_statically_lt_impl::run(i, value); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_pair_first_statically_eq(DenseIndex i, DenseIndex value) { - return index_pair_first_statically_eq_impl::run(i, value); -} - -template -static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bool index_pair_second_statically_eq(DenseIndex i, DenseIndex value) { - return index_pair_second_statically_eq_impl::run(i, value); -} - -} // end namespace internal -} // end namespace Eigen - - -#endif // EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h deleted file mode 100644 index f391fb9e..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h +++ /dev/null @@ -1,229 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Ke Yang -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_INFLATION_H -#define EIGEN_CXX11_TENSOR_TENSOR_INFLATION_H - -namespace Eigen { - -/** \class TensorInflation - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor inflation class. - * - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorInflationOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorInflationOp type; -}; - -} // end namespace internal - -template -class TensorInflationOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorInflationOp(const XprType& expr, const Strides& strides) - : m_xpr(expr), m_strides(strides) {} - - EIGEN_DEVICE_FUNC - const Strides& strides() const { return m_strides; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const Strides m_strides; -}; - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorInflationOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::Dimensions>::value; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = /*TensorEvaluator::IsAligned*/ false, - PacketAccess = TensorEvaluator::PacketAccess, - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_strides(op.strides()) - { - m_dimensions = m_impl.dimensions(); - // Expand each dimension to the inflated dimension. - for (int i = 0; i < NumDims; ++i) { - m_dimensions[i] = (m_dimensions[i] - 1) * op.strides()[i] + 1; - } - - // Remember the strides for fast division. - for (int i = 0; i < NumDims; ++i) { - m_fastStrides[i] = internal::TensorIntDivisor(m_strides[i]); - } - - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - if (static_cast(Layout) == static_cast(ColMajor)) { - m_outputStrides[0] = 1; - m_inputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1]; - m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1]; - } - } else { // RowMajor - m_outputStrides[NumDims-1] = 1; - m_inputStrides[NumDims-1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1]; - m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - // Computes the input index given the output index. Returns true if the output - // index doesn't fall into a hole. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool getInputIndex(Index index, Index* inputIndex) const - { - eigen_assert(index < dimensions().TotalSize()); - *inputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_outputStrides[i]; - if (idx != idx / m_fastStrides[i] * m_strides[i]) { - return false; - } - *inputIndex += idx / m_strides[i] * m_inputStrides[i]; - index -= idx * m_outputStrides[i]; - } - if (index != index / m_fastStrides[0] * m_strides[0]) { - return false; - } - *inputIndex += index / m_strides[0]; - return true; - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_outputStrides[i]; - if (idx != idx / m_fastStrides[i] * m_strides[i]) { - return false; - } - *inputIndex += idx / m_strides[i] * m_inputStrides[i]; - index -= idx * m_outputStrides[i]; - } - if (index != index / m_fastStrides[NumDims-1] * m_strides[NumDims-1]) { - return false; - } - *inputIndex += index / m_strides[NumDims - 1]; - } - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - Index inputIndex = 0; - if (getInputIndex(index, &inputIndex)) { - return m_impl.coeff(inputIndex); - } else { - return Scalar(0); - } - } - - // TODO(yangke): optimize this function so that we can detect and produce - // all-zero packets - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - for (int i = 0; i < PacketSize; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - const double compute_cost = NumDims * (3 * TensorOpCost::DivCost() + - 3 * TensorOpCost::MulCost() + - 2 * TensorOpCost::AddCost()); - const double input_size = m_impl.dimensions().TotalSize(); - const double output_size = m_dimensions.TotalSize(); - if (output_size == 0) - return TensorOpCost(); - return m_impl.costPerCoeff(vectorized) + - TensorOpCost(sizeof(CoeffReturnType) * input_size / output_size, 0, - compute_cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - protected: - Dimensions m_dimensions; - array m_outputStrides; - array m_inputStrides; - TensorEvaluator m_impl; - const Strides m_strides; - array, NumDims> m_fastStrides; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_INFLATION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h deleted file mode 100644 index 33edc49e..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h +++ /dev/null @@ -1,82 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_INITIALIZER_H -#define EIGEN_CXX11_TENSOR_TENSOR_INITIALIZER_H - -#if EIGEN_HAS_VARIADIC_TEMPLATES - -#include - -namespace Eigen { - -/** \class TensorInitializer - * \ingroup CXX11_Tensor_Module - * - * \brief Helper template to initialize Tensors from std::initializer_lists. - */ -namespace internal { - -template -struct Initializer { - typedef std::initializer_list< - typename Initializer::InitList> InitList; - - static void run(TensorEvaluator& tensor, - Eigen::array::Index, traits::NumDimensions>* indices, - const InitList& vals) { - int i = 0; - for (auto v : vals) { - (*indices)[traits::NumDimensions - N] = i++; - Initializer::run(tensor, indices, v); - } - } -}; - -template -struct Initializer { - typedef std::initializer_list::Scalar> InitList; - - static void run(TensorEvaluator& tensor, - Eigen::array::Index, traits::NumDimensions>* indices, - const InitList& vals) { - int i = 0; - // There is likely a faster way to do that than iterating. - for (auto v : vals) { - (*indices)[traits::NumDimensions - 1] = i++; - tensor.coeffRef(*indices) = v; - } - } -}; - -template -struct Initializer { - typedef typename traits::Scalar InitList; - - static void run(TensorEvaluator& tensor, - Eigen::array::Index, traits::NumDimensions>*, - const InitList& v) { - tensor.coeffRef(0) = v; - } -}; - - -template -void initialize_tensor(TensorEvaluator& tensor, - const typename Initializer::NumDimensions>::InitList& vals) { - Eigen::array::Index, traits::NumDimensions> indices; - Initializer::NumDimensions>::run(tensor, &indices, vals); -} - -} // namespace internal -} // namespace Eigen - -#endif // EIGEN_HAS_VARIADIC_TEMPLATES - -#endif // EIGEN_CXX11_TENSOR_TENSOR_INITIALIZER_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h deleted file mode 100644 index ef1c9c42..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h +++ /dev/null @@ -1,263 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H -#define EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H - - -namespace Eigen { - -/** \internal - * - * \class TensorIntDiv - * \ingroup CXX11_Tensor_Module - * - * \brief Fast integer division by a constant. - * - * See the paper from Granlund and Montgomery for explanation. - * (at http://dx.doi.org/10.1145/773473.178249) - * - * \sa Tensor - */ - -namespace internal { - -namespace { - - // Note: result is undefined if val == 0 - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE - typename internal::enable_if::type count_leading_zeros(const T val) - { -#ifdef __CUDA_ARCH__ - return __clz(val); -#elif defined(__SYCL_DEVICE_ONLY__) - return cl::sycl::clz(val); -#elif EIGEN_COMP_MSVC - unsigned long index; - _BitScanReverse(&index, val); - return 31 - index; -#else - EIGEN_STATIC_ASSERT(sizeof(unsigned long long) == 8, YOU_MADE_A_PROGRAMMING_MISTAKE); - return __builtin_clz(static_cast(val)); -#endif - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE - typename internal::enable_if::type count_leading_zeros(const T val) - { -#ifdef __CUDA_ARCH__ - return __clzll(val); -#elif defined(__SYCL_DEVICE_ONLY__) - return cl::sycl::clz(val); -#elif EIGEN_COMP_MSVC && EIGEN_ARCH_x86_64 - unsigned long index; - _BitScanReverse64(&index, val); - return 63 - index; -#elif EIGEN_COMP_MSVC - // MSVC's _BitScanReverse64 is not available for 32bits builds. - unsigned int lo = (unsigned int)(val&0xffffffff); - unsigned int hi = (unsigned int)((val>>32)&0xffffffff); - int n; - if(hi==0) - n = 32 + count_leading_zeros(lo); - else - n = count_leading_zeros(hi); - return n; -#else - EIGEN_STATIC_ASSERT(sizeof(unsigned long long) == 8, YOU_MADE_A_PROGRAMMING_MISTAKE); - return __builtin_clzll(static_cast(val)); -#endif - } - - template - struct UnsignedTraits { - typedef typename conditional::type type; - }; - - template - struct DividerTraits { - typedef typename UnsignedTraits::type type; - static const int N = sizeof(T) * 8; - }; - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t muluh(const uint32_t a, const T b) { -#if defined(__CUDA_ARCH__) - return __umulhi(a, b); -#elif defined(__SYCL_DEVICE_ONLY__) - return cl::sycl::mul_hi(a, static_cast(b)); -#else - return (static_cast(a) * b) >> 32; -#endif - } - - template - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t muluh(const uint64_t a, const T b) { -#if defined(__CUDA_ARCH__) - return __umul64hi(a, b); -#elif defined(__SYCL_DEVICE_ONLY__) - return cl::sycl::mul_hi(a, static_cast(b)); -#elif defined(__SIZEOF_INT128__) - __uint128_t v = static_cast<__uint128_t>(a) * static_cast<__uint128_t>(b); - return static_cast(v >> 64); -#else - return (TensorUInt128, uint64_t>(a) * TensorUInt128, uint64_t>(b)).upper(); -#endif - } - - template - struct DividerHelper { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t computeMultiplier(const int log_div, const T divider) { - EIGEN_STATIC_ASSERT(N == 32, YOU_MADE_A_PROGRAMMING_MISTAKE); - return static_cast((static_cast(1) << (N+log_div)) / divider - (static_cast(1) << N) + 1); - } - }; - - template - struct DividerHelper<64, T> { - static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t computeMultiplier(const int log_div, const T divider) { -#if defined(__SIZEOF_INT128__) && !defined(__CUDA_ARCH__) && !defined(__SYCL_DEVICE_ONLY__) - return static_cast((static_cast<__uint128_t>(1) << (64+log_div)) / static_cast<__uint128_t>(divider) - (static_cast<__uint128_t>(1) << 64) + 1); -#else - const uint64_t shift = 1ULL << log_div; - TensorUInt128 result = TensorUInt128 >(shift, 0) / TensorUInt128, uint64_t>(divider) - - TensorUInt128, static_val<0> >(1, 0) - + TensorUInt128, static_val<1> >(1); - return static_cast(result); -#endif - } - }; -} - - -template -struct TensorIntDivisor { - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor() { - multiplier = 0; - shift1 = 0; - shift2 = 0; - } - - // Must have 0 < divider < 2^31. This is relaxed to - // 0 < divider < 2^63 when using 64-bit indices on platforms that support - // the __uint128_t type. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor(const T divider) { - const int N = DividerTraits::N; - eigen_assert(static_cast::type>(divider) < NumTraits::highest()/2); - eigen_assert(divider > 0); - - // fast ln2 - const int leading_zeros = count_leading_zeros(static_cast(divider)); - int log_div = N - leading_zeros; - // if divider is a power of two then log_div is 1 more than it should be. - if ((static_cast::type>(1) << (log_div-1)) == static_cast::type>(divider)) - log_div--; - - multiplier = DividerHelper::computeMultiplier(log_div, divider); - shift1 = log_div > 1 ? 1 : log_div; - shift2 = log_div > 1 ? log_div-1 : 0; - } - - // Must have 0 <= numerator. On platforms that dont support the __uint128_t - // type numerator should also be less than 2^32-1. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T divide(const T numerator) const { - eigen_assert(static_cast::type>(numerator) < NumTraits::highest()/2); - //eigen_assert(numerator >= 0); // this is implicitly asserted by the line above - - UnsignedType t1 = muluh(multiplier, numerator); - UnsignedType t = (static_cast(numerator) - t1) >> shift1; - return (t1 + t) >> shift2; - } - - private: - typedef typename DividerTraits::type UnsignedType; - UnsignedType multiplier; - int32_t shift1; - int32_t shift2; -}; - - -// Optimized version for signed 32 bit integers. -// Derived from Hacker's Delight. -// Only works for divisors strictly greater than one -template <> -class TensorIntDivisor { - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor() { - magic = 0; - shift = 0; - } - // Must have 2 <= divider - EIGEN_DEVICE_FUNC TensorIntDivisor(int32_t divider) { - eigen_assert(divider >= 2); - calcMagic(divider); - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE int divide(const int32_t n) const { -#ifdef __CUDA_ARCH__ - return (__umulhi(magic, n) >> shift); -#elif defined(__SYCL_DEVICE_ONLY__) - return (cl::sycl::mul_hi(static_cast(magic), static_cast(n)) >> shift); -#else - uint64_t v = static_cast(magic) * static_cast(n); - return (static_cast(v >> 32) >> shift); -#endif - } - -private: - // Compute the magic numbers. See Hacker's Delight section 10 for an in - // depth explanation. - EIGEN_DEVICE_FUNC void calcMagic(int32_t d) { - const unsigned two31 = 0x80000000; // 2**31. - unsigned ad = d; - unsigned t = two31 + (ad >> 31); - unsigned anc = t - 1 - t%ad; // Absolute value of nc. - int p = 31; // Init. p. - unsigned q1 = two31/anc; // Init. q1 = 2**p/|nc|. - unsigned r1 = two31 - q1*anc; // Init. r1 = rem(2**p, |nc|). - unsigned q2 = two31/ad; // Init. q2 = 2**p/|d|. - unsigned r2 = two31 - q2*ad; // Init. r2 = rem(2**p, |d|). - unsigned delta = 0; - do { - p = p + 1; - q1 = 2*q1; // Update q1 = 2**p/|nc|. - r1 = 2*r1; // Update r1 = rem(2**p, |nc|). - if (r1 >= anc) { // (Must be an unsigned - q1 = q1 + 1; // comparison here). - r1 = r1 - anc;} - q2 = 2*q2; // Update q2 = 2**p/|d|. - r2 = 2*r2; // Update r2 = rem(2**p, |d|). - if (r2 >= ad) { // (Must be an unsigned - q2 = q2 + 1; // comparison here). - r2 = r2 - ad;} - delta = ad - r2; - } while (q1 < delta || (q1 == delta && r1 == 0)); - - magic = (unsigned)(q2 + 1); - shift = p - 32; - } - - uint32_t magic; - int32_t shift; -}; - - -template -static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator / (const T& numerator, const TensorIntDivisor& divisor) { - return divisor.divide(numerator); -} - - -} // end namespace internal -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h deleted file mode 100644 index cd0109ef..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h +++ /dev/null @@ -1,209 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_LAYOUT_SWAP_H -#define EIGEN_CXX11_TENSOR_TENSOR_LAYOUT_SWAP_H - -namespace Eigen { - -/** \class TensorLayoutSwap - * \ingroup CXX11_Tensor_Module - * - * \brief Swap the layout from col-major to row-major, or row-major - * to col-major, and invert the order of the dimensions. - * - * Beware: the dimensions are reversed by this operation. If you want to - * preserve the ordering of the dimensions, you need to combine this - * operation with a shuffle. - * - * \example: - * Tensor input(2, 4); - * Tensor output = input.swap_layout(); - * eigen_assert(output.dimension(0) == 4); - * eigen_assert(output.dimension(1) == 2); - * - * array shuffle(1, 0); - * output = input.swap_layout().shuffle(shuffle); - * eigen_assert(output.dimension(0) == 2); - * eigen_assert(output.dimension(1) == 4); - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = traits::NumDimensions; - static const int Layout = (traits::Layout == ColMajor) ? RowMajor : ColMajor; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorLayoutSwapOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorLayoutSwapOp type; -}; - -} // end namespace internal - - - -template -class TensorLayoutSwapOp : public TensorBase, WriteAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorLayoutSwapOp(const XprType& expr) - : m_xpr(expr) {} - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorLayoutSwapOp& operator = (const TensorLayoutSwapOp& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorLayoutSwapOp& operator = (const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - protected: - typename XprType::Nested m_xpr; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorLayoutSwapOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::Dimensions>::value; - typedef DSizes Dimensions; - - enum { - IsAligned = TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = (static_cast(TensorEvaluator::Layout) == static_cast(ColMajor)) ? RowMajor : ColMajor, - CoordAccess = false, // to be implemented - RawAccess = TensorEvaluator::RawAccess - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device) - { - for(int i = 0; i < NumDims; ++i) { - m_dimensions[i] = m_impl.dimensions()[NumDims-1-i]; - } - } - - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* data) { - return m_impl.evalSubExprsIfNeeded(data); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_impl.coeff(index); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return m_impl.template packet(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return m_impl.costPerCoeff(vectorized); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return m_impl.data(); } - - const TensorEvaluator& impl() const { return m_impl; } - - protected: - TensorEvaluator m_impl; - Dimensions m_dimensions; -}; - - -// Eval as lvalue -template - struct TensorEvaluator, Device> - : public TensorEvaluator, Device> -{ - typedef TensorEvaluator, Device> Base; - typedef TensorLayoutSwapOp XprType; - - enum { - IsAligned = TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = (static_cast(TensorEvaluator::Layout) == static_cast(ColMajor)) ? RowMajor : ColMajor, - CoordAccess = false // to be implemented - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : Base(op, device) - { } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) - { - return this->m_impl.coeffRef(index); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketReturnType& x) - { - this->m_impl.template writePacket(index, x); - } -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_LAYOUT_SWAP_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h deleted file mode 100644 index f92e39d6..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h +++ /dev/null @@ -1,62 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_META_MACROS_H -#define EIGEN_CXX11_TENSOR_TENSOR_META_MACROS_H - - -/** use this macro in sfinae selection in templated functions - * - * template::value , int >::type = 0 - * > - * void foo(){} - * - * becomes => - * - * template::value ) - * > - * void foo(){} - */ - -// SFINAE requires variadic templates -#ifndef __CUDACC__ -#if EIGEN_HAS_VARIADIC_TEMPLATES - // SFINAE doesn't work for gcc <= 4.7 - #ifdef EIGEN_COMP_GNUC - #if EIGEN_GNUC_AT_LEAST(4,8) - #define EIGEN_HAS_SFINAE - #endif - #else - #define EIGEN_HAS_SFINAE - #endif -#endif -#endif - -#define EIGEN_SFINAE_ENABLE_IF( __condition__ ) \ - typename internal::enable_if< ( __condition__ ) , int >::type = 0 - - -#if EIGEN_HAS_CONSTEXPR -#define EIGEN_CONSTEXPR constexpr -#else -#define EIGEN_CONSTEXPR -#endif - - -#if EIGEN_OS_WIN || EIGEN_OS_WIN64 -#define EIGEN_SLEEP(n) Sleep(n) -#elif EIGEN_OS_GNULINUX -#define EIGEN_SLEEP(n) usleep(n * 1000); -#else -#define EIGEN_SLEEP(n) sleep(std::max(1, n/1000)) -#endif - -#endif diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h deleted file mode 100644 index a8e55757..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h +++ /dev/null @@ -1,321 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_MAP_H -#define EIGEN_CXX11_TENSOR_TENSOR_MAP_H - -namespace Eigen { - -/** \class TensorMap - * \ingroup CXX11_Tensor_Module - * - * \brief A tensor expression mapping an existing array of data. - * - */ -/// template class MakePointer_ is added to convert the host pointer to the device pointer. -/// It is added due to the fact that for our device compiler T* is not allowed. -/// If we wanted to use the same Evaluator functions we have to convert that type to our pointer T. -/// This is done through our MakePointer_ class. By default the Type in the MakePointer_ is T* . -/// Therefore, by adding the default value, we managed to convert the type and it does not break any -/// existing code as its default value is T*. -template class MakePointer_> class TensorMap : public TensorBase > -{ - public: - typedef TensorMap Self; - typedef typename PlainObjectType::Base Base; - typedef typename Eigen::internal::nested::type Nested; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - typedef typename internal::traits::Scalar Scalar; - typedef typename NumTraits::Real RealScalar; - typedef typename Base::CoeffReturnType CoeffReturnType; - - /* typedef typename internal::conditional< - bool(internal::is_lvalue::value), - Scalar *, - const Scalar *>::type - PointerType;*/ - typedef typename MakePointer_::Type PointerType; - typedef PointerType PointerArgType; - - static const int Options = Options_; - - static const Index NumIndices = PlainObjectType::NumIndices; - typedef typename PlainObjectType::Dimensions Dimensions; - - enum { - IsAligned = ((int(Options_)&Aligned)==Aligned), - Layout = PlainObjectType::Layout, - CoordAccess = true, - RawAccess = true - }; - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr) : m_data(dataPtr), m_dimensions() { - // The number of dimensions used to construct a tensor must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT((0 == NumIndices || NumIndices == Dynamic), YOU_MADE_A_PROGRAMMING_MISTAKE) - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, Index firstDimension, IndexTypes... otherDimensions) : m_data(dataPtr), m_dimensions(firstDimension, otherDimensions...) { - // The number of dimensions used to construct a tensor must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT((sizeof...(otherDimensions) + 1 == NumIndices || NumIndices == Dynamic), YOU_MADE_A_PROGRAMMING_MISTAKE) - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, Index firstDimension) : m_data(dataPtr), m_dimensions(firstDimension) { - // The number of dimensions used to construct a tensor must be equal to the rank of the tensor. - EIGEN_STATIC_ASSERT((1 == NumIndices || NumIndices == Dynamic), YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, Index dim1, Index dim2) : m_data(dataPtr), m_dimensions(dim1, dim2) { - EIGEN_STATIC_ASSERT(2 == NumIndices || NumIndices == Dynamic, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, Index dim1, Index dim2, Index dim3) : m_data(dataPtr), m_dimensions(dim1, dim2, dim3) { - EIGEN_STATIC_ASSERT(3 == NumIndices || NumIndices == Dynamic, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, Index dim1, Index dim2, Index dim3, Index dim4) : m_data(dataPtr), m_dimensions(dim1, dim2, dim3, dim4) { - EIGEN_STATIC_ASSERT(4 == NumIndices || NumIndices == Dynamic, YOU_MADE_A_PROGRAMMING_MISTAKE) - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, Index dim1, Index dim2, Index dim3, Index dim4, Index dim5) : m_data(dataPtr), m_dimensions(dim1, dim2, dim3, dim4, dim5) { - EIGEN_STATIC_ASSERT(5 == NumIndices || NumIndices == Dynamic, YOU_MADE_A_PROGRAMMING_MISTAKE) - } -#endif - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, const array& dimensions) - : m_data(dataPtr), m_dimensions(dimensions) - { } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(PointerArgType dataPtr, const Dimensions& dimensions) - : m_data(dataPtr), m_dimensions(dimensions) - { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(PlainObjectType& tensor) - : m_data(tensor.data()), m_dimensions(tensor.dimensions()) - { } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index rank() const { return m_dimensions.rank(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index dimension(Index n) const { return m_dimensions[n]; } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Index size() const { return m_dimensions.TotalSize(); } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE PointerType data() { return m_data; } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const PointerType data() const { return m_data; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(const array& indices) const - { - // eigen_assert(checkIndexRange(indices)); - if (PlainObjectType::Options&RowMajor) { - const Index index = m_dimensions.IndexOfRowMajor(indices); - return m_data[index]; - } else { - const Index index = m_dimensions.IndexOfColMajor(indices); - return m_data[index]; - } - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()() const - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE) - return m_data[0]; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const - { - eigen_internal_assert(index >= 0 && index < size()); - return m_data[index]; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const - { - EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE) - if (PlainObjectType::Options&RowMajor) { - const Index index = m_dimensions.IndexOfRowMajor(array{{firstIndex, secondIndex, otherIndices...}}); - return m_data[index]; - } else { - const Index index = m_dimensions.IndexOfColMajor(array{{firstIndex, secondIndex, otherIndices...}}); - return m_data[index]; - } - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1) const - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i1 + i0 * m_dimensions[1]; - return m_data[index]; - } else { - const Index index = i0 + i1 * m_dimensions[0]; - return m_data[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2) const - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i2 + m_dimensions[2] * (i1 + m_dimensions[1] * i0); - return m_data[index]; - } else { - const Index index = i0 + m_dimensions[0] * (i1 + m_dimensions[1] * i2); - return m_data[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3) const - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i3 + m_dimensions[3] * (i2 + m_dimensions[2] * (i1 + m_dimensions[1] * i0)); - return m_data[index]; - } else { - const Index index = i0 + m_dimensions[0] * (i1 + m_dimensions[1] * (i2 + m_dimensions[2] * i3)); - return m_data[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) const - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i4 + m_dimensions[4] * (i3 + m_dimensions[3] * (i2 + m_dimensions[2] * (i1 + m_dimensions[1] * i0))); - return m_data[index]; - } else { - const Index index = i0 + m_dimensions[0] * (i1 + m_dimensions[1] * (i2 + m_dimensions[2] * (i3 + m_dimensions[3] * i4))); - return m_data[index]; - } - } -#endif - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(const array& indices) - { - // eigen_assert(checkIndexRange(indices)); - if (PlainObjectType::Options&RowMajor) { - const Index index = m_dimensions.IndexOfRowMajor(indices); - return m_data[index]; - } else { - const Index index = m_dimensions.IndexOfColMajor(indices); - return m_data[index]; - } - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()() - { - EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE) - return m_data[0]; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index index) - { - eigen_internal_assert(index >= 0 && index < size()); - return m_data[index]; - } - -#if EIGEN_HAS_VARIADIC_TEMPLATES - template EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) - { - static_assert(sizeof...(otherIndices) + 2 == NumIndices || NumIndices == Dynamic, "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor."); - const std::size_t NumDims = sizeof...(otherIndices) + 2; - if (PlainObjectType::Options&RowMajor) { - const Index index = m_dimensions.IndexOfRowMajor(array{{firstIndex, secondIndex, otherIndices...}}); - return m_data[index]; - } else { - const Index index = m_dimensions.IndexOfColMajor(array{{firstIndex, secondIndex, otherIndices...}}); - return m_data[index]; - } - } -#else - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1) - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i1 + i0 * m_dimensions[1]; - return m_data[index]; - } else { - const Index index = i0 + i1 * m_dimensions[0]; - return m_data[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2) - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i2 + m_dimensions[2] * (i1 + m_dimensions[1] * i0); - return m_data[index]; - } else { - const Index index = i0 + m_dimensions[0] * (i1 + m_dimensions[1] * i2); - return m_data[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2, Index i3) - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i3 + m_dimensions[3] * (i2 + m_dimensions[2] * (i1 + m_dimensions[1] * i0)); - return m_data[index]; - } else { - const Index index = i0 + m_dimensions[0] * (i1 + m_dimensions[1] * (i2 + m_dimensions[2] * i3)); - return m_data[index]; - } - } - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE Scalar& operator()(Index i0, Index i1, Index i2, Index i3, Index i4) - { - if (PlainObjectType::Options&RowMajor) { - const Index index = i4 + m_dimensions[4] * (i3 + m_dimensions[3] * (i2 + m_dimensions[2] * (i1 + m_dimensions[1] * i0))); - return m_data[index]; - } else { - const Index index = i0 + m_dimensions[0] * (i1 + m_dimensions[1] * (i2 + m_dimensions[2] * (i3 + m_dimensions[3] * i4))); - return m_data[index]; - } - } -#endif - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Self& operator=(const Self& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Self& operator=(const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - private: - typename MakePointer_::Type m_data; - Dimensions m_dimensions; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_MAP_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h deleted file mode 100644 index b5ef31d5..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h +++ /dev/null @@ -1,219 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2015 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_META_H -#define EIGEN_CXX11_TENSOR_TENSOR_META_H - -namespace Eigen { - -template struct Cond {}; - -template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -const T1& choose(Cond, const T1& first, const T2&) { - return first; -} - -template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -const T2& choose(Cond, const T1&, const T2& second) { - return second; -} - - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T divup(const X x, const Y y) { - return static_cast((x + y - 1) / y); -} - -template -EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE -T divup(const T x, const T y) { - return static_cast((x + y - 1) / y); -} - -template struct max_n_1 { - static const size_t size = n; -}; -template <> struct max_n_1<0> { - static const size_t size = 1; -}; - - -// Default packet types -template -struct PacketType : internal::packet_traits { - typedef typename internal::packet_traits::type type; -}; - -// For CUDA packet types when using a GpuDevice -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) && defined(EIGEN_HAS_CUDA_FP16) -template <> -struct PacketType { - typedef half2 type; - static const int size = 2; - enum { - HasAdd = 1, - HasSub = 1, - HasMul = 1, - HasNegate = 1, - HasAbs = 1, - HasArg = 0, - HasAbs2 = 0, - HasMin = 1, - HasMax = 1, - HasConj = 0, - HasSetLinear = 0, - HasBlend = 0, - - HasDiv = 1, - HasSqrt = 1, - HasRsqrt = 1, - HasExp = 1, - HasExpm1 = 0, - HasLog = 1, - HasLog1p = 0, - HasLog10 = 0, - HasPow = 1, - }; -}; -#endif - -#if defined(EIGEN_USE_SYCL) -template - struct PacketType { - typedef T type; - static const int size = 1; - enum { - HasAdd = 0, - HasSub = 0, - HasMul = 0, - HasNegate = 0, - HasAbs = 0, - HasArg = 0, - HasAbs2 = 0, - HasMin = 0, - HasMax = 0, - HasConj = 0, - HasSetLinear = 0, - HasBlend = 0 - }; -}; -#endif - - -// Tuple mimics std::pair but works on e.g. nvcc. -template struct Tuple { - public: - U first; - V second; - - typedef U first_type; - typedef V second_type; - - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Tuple() : first(), second() {} - - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Tuple(const U& f, const V& s) : first(f), second(s) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Tuple& operator= (const Tuple& rhs) { - if (&rhs == this) return *this; - first = rhs.first; - second = rhs.second; - return *this; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void swap(Tuple& rhs) { - using numext::swap; - swap(first, rhs.first); - swap(second, rhs.second); - } -}; - -template -EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -bool operator==(const Tuple& x, const Tuple& y) { - return (x.first == y.first && x.second == y.second); -} - -template -EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -bool operator!=(const Tuple& x, const Tuple& y) { - return !(x == y); -} - - -// Can't use std::pairs on cuda devices -template struct IndexPair { - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE IndexPair() : first(0), second(0) {} - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE IndexPair(Idx f, Idx s) : first(f), second(s) {} - - EIGEN_DEVICE_FUNC void set(IndexPair val) { - first = val.first; - second = val.second; - } - - Idx first; - Idx second; -}; - - -#ifdef EIGEN_HAS_SFINAE -namespace internal { - - template - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - array customIndices2Array(IndexType& idx, numeric_list) { - return { idx[Is]... }; - } - template - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - array customIndices2Array(IndexType&, numeric_list) { - return array(); - } - - /** Make an array (for index/dimensions) out of a custom index */ - template - EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - array customIndices2Array(IndexType& idx) { - return customIndices2Array(idx, typename gen_numeric_list::type{}); - } - - - template - struct is_base_of - { - - typedef char (&yes)[1]; - typedef char (&no)[2]; - - template - struct Host - { - operator BB*() const; - operator DD*(); - }; - - template - static yes check(D*, T); - static no check(B*, int); - - static const bool value = sizeof(check(Host(), int())) == sizeof(yes); - }; - -} -#endif - - - -} // namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_META_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h deleted file mode 100644 index 6ddd2ca1..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h +++ /dev/null @@ -1,921 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H -#define EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H - -namespace Eigen { - -/** \class TensorReshaping - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor reshaping class. - * - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = array_size::value; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorReshapingOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorReshapingOp type; -}; - -} // end namespace internal - - - -template -class TensorReshapingOp : public TensorBase, WriteAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReshapingOp(const XprType& expr, const NewDimensions& dims) - : m_xpr(expr), m_dims(dims) {} - - EIGEN_DEVICE_FUNC - const NewDimensions& dimensions() const { return m_dims; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorReshapingOp& operator = (const TensorReshapingOp& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorReshapingOp& operator = (const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - protected: - typename XprType::Nested m_xpr; - const NewDimensions m_dims; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorReshapingOp XprType; - typedef NewDimensions Dimensions; - - enum { - IsAligned = TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = TensorEvaluator::RawAccess - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_dimensions(op.dimensions()) - { - // The total size of the reshaped tensor must be equal to the total size - // of the input tensor. - eigen_assert(internal::array_prod(m_impl.dimensions()) == internal::array_prod(op.dimensions())); - } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* data) { - return m_impl.evalSubExprsIfNeeded(data); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_impl.coeff(index); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - return m_impl.template packet(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return m_impl.costPerCoeff(vectorized); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return const_cast(m_impl.data()); } - - EIGEN_DEVICE_FUNC const TensorEvaluator& impl() const { return m_impl; } - - protected: - TensorEvaluator m_impl; - NewDimensions m_dimensions; -}; - - -// Eval as lvalue -template - struct TensorEvaluator, Device> - : public TensorEvaluator, Device> - -{ - typedef TensorEvaluator, Device> Base; - typedef TensorReshapingOp XprType; - typedef NewDimensions Dimensions; - - enum { - IsAligned = TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = TensorEvaluator::RawAccess - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : Base(op, device) - { } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) - { - return this->m_impl.coeffRef(index); - } - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketReturnType& x) - { - this->m_impl.template writePacket(index, x); - } -}; - - -/** \class TensorSlicing - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor slicing class. - * - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = array_size::value; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorSlicingOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorSlicingOp type; -}; - -} // end namespace internal - - - -template -class TensorSlicingOp : public TensorBase > -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorSlicingOp(const XprType& expr, const StartIndices& indices, const Sizes& sizes) - : m_xpr(expr), m_indices(indices), m_sizes(sizes) {} - - EIGEN_DEVICE_FUNC - const StartIndices& startIndices() const { return m_indices; } - EIGEN_DEVICE_FUNC - const Sizes& sizes() const { return m_sizes; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorSlicingOp& operator = (const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorSlicingOp& operator = (const TensorSlicingOp& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run(assign, DefaultDevice()); - return *this; - } - - - protected: - typename XprType::Nested m_xpr; - const StartIndices m_indices; - const Sizes m_sizes; -}; - - -// Fixme: figure out the exact threshold -namespace { -template struct MemcpyTriggerForSlicing { - EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const Device& device) : threshold_(2 * device.numThreads()) { } - EIGEN_DEVICE_FUNC bool operator ()(Index val) const { return val > threshold_; } - - private: - Index threshold_; -}; - -// It is very expensive to start the memcpy kernel on GPU: we therefore only -// use it for large copies. -#ifdef EIGEN_USE_GPU -template struct MemcpyTriggerForSlicing { - EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const GpuDevice&) { } - EIGEN_DEVICE_FUNC bool operator ()(Index val) const { return val > 4*1024*1024; } -}; -#endif - -// It is very expensive to start the memcpy kernel on GPU: we therefore only -// use it for large copies. -#ifdef EIGEN_USE_SYCL -template struct MemcpyTriggerForSlicing { - EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const SyclDevice&) { } - EIGEN_DEVICE_FUNC bool operator ()(Index val) const { return val > 4*1024*1024; } -}; -#endif - -} - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorSlicingOp XprType; - static const int NumDims = internal::array_size::value; - - enum { - // Alignment can't be guaranteed at compile time since it depends on the - // slice offsets and sizes. - IsAligned = /*TensorEvaluator::IsAligned*/false, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_device(device), m_dimensions(op.sizes()), m_offsets(op.startIndices()) - { - for (std::size_t i = 0; i < internal::array_size::value; ++i) { - eigen_assert(m_impl.dimensions()[i] >= op.sizes()[i] + op.startIndices()[i]); - } - - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - const Sizes& output_dims = op.sizes(); - if (static_cast(Layout) == static_cast(ColMajor)) { - m_inputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1]; - } - - // Don't initialize m_fastOutputStrides[0] since it won't ever be accessed. - m_outputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_outputStrides[i] = m_outputStrides[i-1] * output_dims[i-1]; - m_fastOutputStrides[i] = internal::TensorIntDivisor(m_outputStrides[i]); - } - } else { - m_inputStrides[NumDims-1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1]; - } - - // Don't initialize m_fastOutputStrides[NumDims-1] since it won't ever be accessed. - m_outputStrides[NumDims-1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_outputStrides[i] = m_outputStrides[i+1] * output_dims[i+1]; - m_fastOutputStrides[i] = internal::TensorIntDivisor(m_outputStrides[i]); - } - } - } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef Sizes Dimensions; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType* data) { - m_impl.evalSubExprsIfNeeded(NULL); - if (!NumTraits::type>::RequireInitialization && data && m_impl.data()) { - Index contiguous_values = 1; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < NumDims; ++i) { - contiguous_values *= dimensions()[i]; - if (dimensions()[i] != m_impl.dimensions()[i]) { - break; - } - } - } else { - for (int i = NumDims-1; i >= 0; --i) { - contiguous_values *= dimensions()[i]; - if (dimensions()[i] != m_impl.dimensions()[i]) { - break; - } - } - } - // Use memcpy if it's going to be faster than using the regular evaluation. - const MemcpyTriggerForSlicing trigger(m_device); - if (trigger(contiguous_values)) { - Scalar* src = (Scalar*)m_impl.data(); - for (int i = 0; i < internal::array_prod(dimensions()); i += contiguous_values) { - Index offset = srcCoeff(i); - m_device.memcpy((void*)(data+i), src+offset, contiguous_values * sizeof(Scalar)); - } - return false; - } - } - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_impl.coeff(srcCoeff(index)); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - const int packetSize = internal::unpacket_traits::size; - EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+packetSize-1 < internal::array_prod(dimensions())); - - Index inputIndices[] = {0, 0}; - Index indices[] = {index, index + packetSize - 1}; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx0 = indices[0] / m_fastOutputStrides[i]; - const Index idx1 = indices[1] / m_fastOutputStrides[i]; - inputIndices[0] += (idx0 + m_offsets[i]) * m_inputStrides[i]; - inputIndices[1] += (idx1 + m_offsets[i]) * m_inputStrides[i]; - indices[0] -= idx0 * m_outputStrides[i]; - indices[1] -= idx1 * m_outputStrides[i]; - } - inputIndices[0] += (indices[0] + m_offsets[0]); - inputIndices[1] += (indices[1] + m_offsets[0]); - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx0 = indices[0] / m_fastOutputStrides[i]; - const Index idx1 = indices[1] / m_fastOutputStrides[i]; - inputIndices[0] += (idx0 + m_offsets[i]) * m_inputStrides[i]; - inputIndices[1] += (idx1 + m_offsets[i]) * m_inputStrides[i]; - indices[0] -= idx0 * m_outputStrides[i]; - indices[1] -= idx1 * m_outputStrides[i]; - } - inputIndices[0] += (indices[0] + m_offsets[NumDims-1]); - inputIndices[1] += (indices[1] + m_offsets[NumDims-1]); - } - if (inputIndices[1] - inputIndices[0] == packetSize - 1) { - PacketReturnType rslt = m_impl.template packet(inputIndices[0]); - return rslt; - } - else { - EIGEN_ALIGN_MAX typename internal::remove_const::type values[packetSize]; - values[0] = m_impl.coeff(inputIndices[0]); - values[packetSize-1] = m_impl.coeff(inputIndices[1]); - for (int i = 1; i < packetSize-1; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, NumDims); - } - - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar* data() const { - Scalar* result = m_impl.data(); - if (result) { - Index offset = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < NumDims; ++i) { - if (m_dimensions[i] != m_impl.dimensions()[i]) { - offset += m_offsets[i] * m_inputStrides[i]; - for (int j = i+1; j < NumDims; ++j) { - if (m_dimensions[j] > 1) { - return NULL; - } - offset += m_offsets[j] * m_inputStrides[j]; - } - break; - } - } - } else { - for (int i = NumDims - 1; i >= 0; --i) { - if (m_dimensions[i] != m_impl.dimensions()[i]) { - offset += m_offsets[i] * m_inputStrides[i]; - for (int j = i-1; j >= 0; --j) { - if (m_dimensions[j] > 1) { - return NULL; - } - offset += m_offsets[j] * m_inputStrides[j]; - } - break; - } - } - } - return result + offset; - } - return NULL; - } - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator& impl() const{ - return m_impl; - } - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const StartIndices& startIndices() const{ - return m_offsets; - } - protected: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const - { - Index inputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_fastOutputStrides[i]; - inputIndex += (idx + m_offsets[i]) * m_inputStrides[i]; - index -= idx * m_outputStrides[i]; - } - inputIndex += (index + m_offsets[0]); - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_fastOutputStrides[i]; - inputIndex += (idx + m_offsets[i]) * m_inputStrides[i]; - index -= idx * m_outputStrides[i]; - } - inputIndex += (index + m_offsets[NumDims-1]); - } - return inputIndex; - } - - array m_outputStrides; - array, NumDims> m_fastOutputStrides; - array m_inputStrides; - TensorEvaluator m_impl; - const Device& m_device; - Dimensions m_dimensions; - const StartIndices m_offsets; -}; - - -// Eval as lvalue -template -struct TensorEvaluator, Device> - : public TensorEvaluator, Device> -{ - typedef TensorEvaluator, Device> Base; - typedef TensorSlicingOp XprType; - static const int NumDims = internal::array_size::value; - - enum { - IsAligned = /*TensorEvaluator::IsAligned*/false, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : Base(op, device) - { } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef Sizes Dimensions; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) - { - return this->m_impl.coeffRef(this->srcCoeff(index)); - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void writePacket(Index index, const PacketReturnType& x) - { - const int packetSize = internal::unpacket_traits::size; - Index inputIndices[] = {0, 0}; - Index indices[] = {index, index + packetSize - 1}; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx0 = indices[0] / this->m_fastOutputStrides[i]; - const Index idx1 = indices[1] / this->m_fastOutputStrides[i]; - inputIndices[0] += (idx0 + this->m_offsets[i]) * this->m_inputStrides[i]; - inputIndices[1] += (idx1 + this->m_offsets[i]) * this->m_inputStrides[i]; - indices[0] -= idx0 * this->m_outputStrides[i]; - indices[1] -= idx1 * this->m_outputStrides[i]; - } - inputIndices[0] += (indices[0] + this->m_offsets[0]); - inputIndices[1] += (indices[1] + this->m_offsets[0]); - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx0 = indices[0] / this->m_fastOutputStrides[i]; - const Index idx1 = indices[1] / this->m_fastOutputStrides[i]; - inputIndices[0] += (idx0 + this->m_offsets[i]) * this->m_inputStrides[i]; - inputIndices[1] += (idx1 + this->m_offsets[i]) * this->m_inputStrides[i]; - indices[0] -= idx0 * this->m_outputStrides[i]; - indices[1] -= idx1 * this->m_outputStrides[i]; - } - inputIndices[0] += (indices[0] + this->m_offsets[NumDims-1]); - inputIndices[1] += (indices[1] + this->m_offsets[NumDims-1]); - } - if (inputIndices[1] - inputIndices[0] == packetSize - 1) { - this->m_impl.template writePacket(inputIndices[0], x); - } - else { - EIGEN_ALIGN_MAX CoeffReturnType values[packetSize]; - internal::pstore(values, x); - this->m_impl.coeffRef(inputIndices[0]) = values[0]; - this->m_impl.coeffRef(inputIndices[1]) = values[packetSize-1]; - for (int i = 1; i < packetSize-1; ++i) { - this->coeffRef(index+i) = values[i]; - } - } - } -}; - - - -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = array_size::value; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorStridingSlicingOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorStridingSlicingOp type; -}; - -} // end namespace internal - - -template -class TensorStridingSlicingOp : public TensorBase > -{ - public: - typedef typename internal::traits::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename internal::nested::type Nested; - typedef typename internal::traits::StorageKind StorageKind; - typedef typename internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingSlicingOp( - const XprType& expr, const StartIndices& startIndices, - const StopIndices& stopIndices, const Strides& strides) - : m_xpr(expr), m_startIndices(startIndices), m_stopIndices(stopIndices), - m_strides(strides) {} - - EIGEN_DEVICE_FUNC - const StartIndices& startIndices() const { return m_startIndices; } - EIGEN_DEVICE_FUNC - const StartIndices& stopIndices() const { return m_stopIndices; } - EIGEN_DEVICE_FUNC - const StartIndices& strides() const { return m_strides; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorStridingSlicingOp& operator = (const TensorStridingSlicingOp& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run( - assign, DefaultDevice()); - return *this; - } - - template - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE TensorStridingSlicingOp& operator = (const OtherDerived& other) - { - typedef TensorAssignOp Assign; - Assign assign(*this, other); - internal::TensorExecutor::run( - assign, DefaultDevice()); - return *this; - } - - protected: - typename XprType::Nested m_xpr; - const StartIndices m_startIndices; - const StopIndices m_stopIndices; - const Strides m_strides; -}; - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorStridingSlicingOp XprType; - static const int NumDims = internal::array_size::value; - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename internal::remove_const::type ScalarNonConst; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef Strides Dimensions; - - enum { - // Alignment can't be guaranteed at compile time since it depends on the - // slice offsets and sizes. - IsAligned = false, - PacketAccess = false, - BlockAccess = false, - Layout = TensorEvaluator::Layout, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_device(device), m_strides(op.strides()), m_exprStartIndices(op.startIndices()), m_exprStopIndices(op.stopIndices()) - { - // Handle degenerate intervals by gracefully clamping and allowing m_dimensions to be zero - DSizes startIndicesClamped, stopIndicesClamped; - for (size_t i = 0; i < internal::array_size::value; ++i) { - eigen_assert(m_strides[i] != 0 && "0 stride is invalid"); - if(m_strides[i]>0){ - startIndicesClamped[i] = clamp(op.startIndices()[i], 0, m_impl.dimensions()[i]); - stopIndicesClamped[i] = clamp(op.stopIndices()[i], 0, m_impl.dimensions()[i]); - }else{ - /* implies m_strides[i]<0 by assert */ - startIndicesClamped[i] = clamp(op.startIndices()[i], -1, m_impl.dimensions()[i] - 1); - stopIndicesClamped[i] = clamp(op.stopIndices()[i], -1, m_impl.dimensions()[i] - 1); - } - m_startIndices[i] = startIndicesClamped[i]; - } - - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - - // check for degenerate intervals and compute output tensor shape - bool degenerate = false;; - for(int i = 0; i < NumDims; i++){ - Index interval = stopIndicesClamped[i] - startIndicesClamped[i]; - if(interval == 0 || ((interval<0) != (m_strides[i]<0))){ - m_dimensions[i] = 0; - degenerate = true; - }else{ - m_dimensions[i] = interval / m_strides[i] - + (interval % m_strides[i] != 0 ? 1 : 0); - eigen_assert(m_dimensions[i] >= 0); - } - } - Strides output_dims = m_dimensions; - - if (static_cast(Layout) == static_cast(ColMajor)) { - m_inputStrides[0] = m_strides[0]; - m_offsets[0] = startIndicesClamped[0]; - Index previousDimProduct = 1; - for (int i = 1; i < NumDims; ++i) { - previousDimProduct *= input_dims[i-1]; - m_inputStrides[i] = previousDimProduct * m_strides[i]; - m_offsets[i] = startIndicesClamped[i] * previousDimProduct; - } - - // Don't initialize m_fastOutputStrides[0] since it won't ever be accessed. - m_outputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_outputStrides[i] = m_outputStrides[i-1] * output_dims[i-1]; - // NOTE: if tensor is degenerate, we send 1 to prevent TensorIntDivisor constructor crash - m_fastOutputStrides[i] = internal::TensorIntDivisor(degenerate ? 1 : m_outputStrides[i]); - } - } else { - m_inputStrides[NumDims-1] = m_strides[NumDims-1]; - m_offsets[NumDims-1] = startIndicesClamped[NumDims-1]; - Index previousDimProduct = 1; - for (int i = NumDims - 2; i >= 0; --i) { - previousDimProduct *= input_dims[i+1]; - m_inputStrides[i] = previousDimProduct * m_strides[i]; - m_offsets[i] = startIndicesClamped[i] * previousDimProduct; - } - - m_outputStrides[NumDims-1] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_outputStrides[i] = m_outputStrides[i+1] * output_dims[i+1]; - // NOTE: if tensor is degenerate, we send 1 to prevent TensorIntDivisor constructor crash - m_fastOutputStrides[i] = internal::TensorIntDivisor(degenerate ? 1 : m_outputStrides[i]); - } - } - m_block_total_size_max = numext::maxi(static_cast(1), - device.lastLevelCacheSize() / - sizeof(Scalar)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(CoeffReturnType*) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - return m_impl.coeff(srcCoeff(index)); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, NumDims); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar* data() const { - return NULL; - } - - //use by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const StartIndices& exprStartIndices() const { return m_exprStartIndices; } - //use by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const StartIndices& exprStopIndices() const { return m_exprStopIndices; } - //use by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const StartIndices& strides() const { return m_strides; } - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator& impl() const{return m_impl;} - - protected: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const - { - Index inputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i >= 0; --i) { - const Index idx = index / m_fastOutputStrides[i]; - inputIndex += idx * m_inputStrides[i] + m_offsets[i]; - index -= idx * m_outputStrides[i]; - } - } else { - for (int i = 0; i < NumDims; ++i) { - const Index idx = index / m_fastOutputStrides[i]; - inputIndex += idx * m_inputStrides[i] + m_offsets[i]; - index -= idx * m_outputStrides[i]; - } - } - return inputIndex; - } - - static EIGEN_STRONG_INLINE Index clamp(Index value, Index min, Index max) { -#ifndef __SYCL_DEVICE_ONLY__ - return numext::maxi(min, numext::mini(max,value)); -#else - return cl::sycl::clamp(value, min, max); -#endif - } - - array m_outputStrides; - array, NumDims> m_fastOutputStrides; - array m_inputStrides; - TensorEvaluator m_impl; - const Device& m_device; - DSizes m_startIndices; // clamped startIndices - DSizes m_dimensions; - DSizes m_offsets; // offset in a flattened shape - const Strides m_strides; - std::size_t m_block_total_size_max; - //use by sycl - const StartIndices m_exprStartIndices; - //use by sycl - const StopIndices m_exprStopIndices; -}; - -// Eval as lvalue -template -struct TensorEvaluator, Device> - : public TensorEvaluator, Device> -{ - typedef TensorEvaluator, Device> Base; - typedef TensorStridingSlicingOp XprType; - static const int NumDims = internal::array_size::value; - - enum { - IsAligned = false, - PacketAccess = false, - BlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = TensorEvaluator::CoordAccess, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : Base(op, device) - { } - - typedef typename XprType::Index Index; - typedef typename XprType::Scalar Scalar; - typedef typename internal::remove_const::type ScalarNonConst; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - typedef Strides Dimensions; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) - { - return this->m_impl.coeffRef(this->srcCoeff(index)); - } -}; - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h deleted file mode 100644 index a8e25524..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h +++ /dev/null @@ -1,404 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_PADDING_H -#define EIGEN_CXX11_TENSOR_TENSOR_PADDING_H - -namespace Eigen { - -/** \class TensorPadding - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor padding class. - * At the moment only padding with a constant value is supported. - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorPaddingOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorPaddingOp type; -}; - -} // end namespace internal - - - -template -class TensorPaddingOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPaddingOp(const XprType& expr, const PaddingDimensions& padding_dims, const Scalar padding_value) - : m_xpr(expr), m_padding_dims(padding_dims), m_padding_value(padding_value) {} - - EIGEN_DEVICE_FUNC - const PaddingDimensions& padding() const { return m_padding_dims; } - EIGEN_DEVICE_FUNC - Scalar padding_value() const { return m_padding_value; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const PaddingDimensions m_padding_dims; - const Scalar m_padding_value; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorPaddingOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::value; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = true, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = true, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_padding(op.padding()), m_paddingValue(op.padding_value()) - { - // The padding op doesn't change the rank of the tensor. Directly padding a scalar would lead - // to a vector, which doesn't make sense. Instead one should reshape the scalar into a vector - // of 1 element first and then pad. - EIGEN_STATIC_ASSERT((NumDims > 0), YOU_MADE_A_PROGRAMMING_MISTAKE); - - // Compute dimensions - m_dimensions = m_impl.dimensions(); - for (int i = 0; i < NumDims; ++i) { - m_dimensions[i] += m_padding[i].first + m_padding[i].second; - } - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - if (static_cast(Layout) == static_cast(ColMajor)) { - m_inputStrides[0] = 1; - m_outputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1]; - m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1]; - } - m_outputStrides[NumDims] = m_outputStrides[NumDims-1] * m_dimensions[NumDims-1]; - } else { - m_inputStrides[NumDims - 1] = 1; - m_outputStrides[NumDims] = 1; - for (int i = NumDims - 2; i >= 0; --i) { - m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1]; - m_outputStrides[i+1] = m_outputStrides[i+2] * m_dimensions[i+1]; - } - m_outputStrides[0] = m_outputStrides[1] * m_dimensions[0]; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar*) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - eigen_assert(index < dimensions().TotalSize()); - Index inputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 1; i > 0; --i) { - const Index idx = index / m_outputStrides[i]; - if (isPaddingAtIndexForDim(idx, i)) { - return m_paddingValue; - } - inputIndex += (idx - m_padding[i].first) * m_inputStrides[i]; - index -= idx * m_outputStrides[i]; - } - if (isPaddingAtIndexForDim(index, 0)) { - return m_paddingValue; - } - inputIndex += (index - m_padding[0].first); - } else { - for (int i = 0; i < NumDims - 1; ++i) { - const Index idx = index / m_outputStrides[i+1]; - if (isPaddingAtIndexForDim(idx, i)) { - return m_paddingValue; - } - inputIndex += (idx - m_padding[i].first) * m_inputStrides[i]; - index -= idx * m_outputStrides[i+1]; - } - if (isPaddingAtIndexForDim(index, NumDims-1)) { - return m_paddingValue; - } - inputIndex += (index - m_padding[NumDims-1].first); - } - return m_impl.coeff(inputIndex); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - if (static_cast(Layout) == static_cast(ColMajor)) { - return packetColMajor(index); - } - return packetRowMajor(index); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - TensorOpCost cost = m_impl.costPerCoeff(vectorized); - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < NumDims; ++i) - updateCostPerDimension(cost, i, i == 0); - } else { - for (int i = NumDims - 1; i >= 0; --i) - updateCostPerDimension(cost, i, i == NumDims - 1); - } - return cost; - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PaddingDimensions& padding() const { return m_padding; } - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& padding_value() const { return m_paddingValue; } - /// used by sycl - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator& impl() const{return m_impl;} - - private: - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isPaddingAtIndexForDim( - Index index, int dim_index) const { -#if defined(EIGEN_HAS_INDEX_LIST) - return (!internal::index_pair_first_statically_eq(dim_index, 0) && - index < m_padding[dim_index].first) || - (!internal::index_pair_second_statically_eq(dim_index, 0) && - index >= m_dimensions[dim_index] - m_padding[dim_index].second); -#else - return (index < m_padding[dim_index].first) || - (index >= m_dimensions[dim_index] - m_padding[dim_index].second); -#endif - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isLeftPaddingCompileTimeZero( - int dim_index) const { -#if defined(EIGEN_HAS_INDEX_LIST) - return internal::index_pair_first_statically_eq(dim_index, 0); -#else - EIGEN_UNUSED_VARIABLE(dim_index); - return false; -#endif - } - - EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isRightPaddingCompileTimeZero( - int dim_index) const { -#if defined(EIGEN_HAS_INDEX_LIST) - return internal::index_pair_second_statically_eq(dim_index, 0); -#else - EIGEN_UNUSED_VARIABLE(dim_index); - return false; -#endif - } - - - void updateCostPerDimension(TensorOpCost& cost, int i, bool first) const { - const double in = static_cast(m_impl.dimensions()[i]); - const double out = in + m_padding[i].first + m_padding[i].second; - if (out == 0) - return; - const double reduction = in / out; - cost *= reduction; - if (first) { - cost += TensorOpCost(0, 0, 2 * TensorOpCost::AddCost() + - reduction * (1 * TensorOpCost::AddCost())); - } else { - cost += TensorOpCost(0, 0, 2 * TensorOpCost::AddCost() + - 2 * TensorOpCost::MulCost() + - reduction * (2 * TensorOpCost::MulCost() + - 1 * TensorOpCost::DivCost())); - } - } - - protected: - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetColMajor(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - const Index initialIndex = index; - Index inputIndex = 0; - for (int i = NumDims - 1; i > 0; --i) { - const Index first = index; - const Index last = index + PacketSize - 1; - const Index lastPaddedLeft = m_padding[i].first * m_outputStrides[i]; - const Index firstPaddedRight = (m_dimensions[i] - m_padding[i].second) * m_outputStrides[i]; - const Index lastPaddedRight = m_outputStrides[i+1]; - - if (!isLeftPaddingCompileTimeZero(i) && last < lastPaddedLeft) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if (!isRightPaddingCompileTimeZero(i) && first >= firstPaddedRight && last < lastPaddedRight) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if ((isLeftPaddingCompileTimeZero(i) && isRightPaddingCompileTimeZero(i)) || (first >= lastPaddedLeft && last < firstPaddedRight)) { - // all the coefficient are between the 2 padding zones. - const Index idx = index / m_outputStrides[i]; - inputIndex += (idx - m_padding[i].first) * m_inputStrides[i]; - index -= idx * m_outputStrides[i]; - } - else { - // Every other case - return packetWithPossibleZero(initialIndex); - } - } - - const Index last = index + PacketSize - 1; - const Index first = index; - const Index lastPaddedLeft = m_padding[0].first; - const Index firstPaddedRight = (m_dimensions[0] - m_padding[0].second); - const Index lastPaddedRight = m_outputStrides[1]; - - if (!isLeftPaddingCompileTimeZero(0) && last < lastPaddedLeft) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if (!isRightPaddingCompileTimeZero(0) && first >= firstPaddedRight && last < lastPaddedRight) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if ((isLeftPaddingCompileTimeZero(0) && isRightPaddingCompileTimeZero(0)) || (first >= lastPaddedLeft && last < firstPaddedRight)) { - // all the coefficient are between the 2 padding zones. - inputIndex += (index - m_padding[0].first); - return m_impl.template packet(inputIndex); - } - // Every other case - return packetWithPossibleZero(initialIndex); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetRowMajor(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - const Index initialIndex = index; - Index inputIndex = 0; - - for (int i = 0; i < NumDims - 1; ++i) { - const Index first = index; - const Index last = index + PacketSize - 1; - const Index lastPaddedLeft = m_padding[i].first * m_outputStrides[i+1]; - const Index firstPaddedRight = (m_dimensions[i] - m_padding[i].second) * m_outputStrides[i+1]; - const Index lastPaddedRight = m_outputStrides[i]; - - if (!isLeftPaddingCompileTimeZero(i) && last < lastPaddedLeft) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if (!isRightPaddingCompileTimeZero(i) && first >= firstPaddedRight && last < lastPaddedRight) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if ((isLeftPaddingCompileTimeZero(i) && isRightPaddingCompileTimeZero(i)) || (first >= lastPaddedLeft && last < firstPaddedRight)) { - // all the coefficient are between the 2 padding zones. - const Index idx = index / m_outputStrides[i+1]; - inputIndex += (idx - m_padding[i].first) * m_inputStrides[i]; - index -= idx * m_outputStrides[i+1]; - } - else { - // Every other case - return packetWithPossibleZero(initialIndex); - } - } - - const Index last = index + PacketSize - 1; - const Index first = index; - const Index lastPaddedLeft = m_padding[NumDims-1].first; - const Index firstPaddedRight = (m_dimensions[NumDims-1] - m_padding[NumDims-1].second); - const Index lastPaddedRight = m_outputStrides[NumDims-1]; - - if (!isLeftPaddingCompileTimeZero(NumDims-1) && last < lastPaddedLeft) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if (!isRightPaddingCompileTimeZero(NumDims-1) && first >= firstPaddedRight && last < lastPaddedRight) { - // all the coefficient are in the padding zone. - return internal::pset1(m_paddingValue); - } - else if ((isLeftPaddingCompileTimeZero(NumDims-1) && isRightPaddingCompileTimeZero(NumDims-1)) || (first >= lastPaddedLeft && last < firstPaddedRight)) { - // all the coefficient are between the 2 padding zones. - inputIndex += (index - m_padding[NumDims-1].first); - return m_impl.template packet(inputIndex); - } - // Every other case - return packetWithPossibleZero(initialIndex); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const - { - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - for (int i = 0; i < PacketSize; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - - Dimensions m_dimensions; - array m_outputStrides; - array m_inputStrides; - TensorEvaluator m_impl; - PaddingDimensions m_padding; - - Scalar m_paddingValue; -}; - - - - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_PADDING_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h deleted file mode 100644 index 886a254f..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h +++ /dev/null @@ -1,269 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_PATCH_H -#define EIGEN_CXX11_TENSOR_TENSOR_PATCH_H - -namespace Eigen { - -/** \class TensorPatch - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor patch class. - * - * - */ -namespace internal { -template -struct traits > : public traits -{ - typedef typename XprType::Scalar Scalar; - typedef traits XprTraits; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - typedef typename remove_reference::type _Nested; - static const int NumDimensions = XprTraits::NumDimensions + 1; - static const int Layout = XprTraits::Layout; -}; - -template -struct eval, Eigen::Dense> -{ - typedef const TensorPatchOp& type; -}; - -template -struct nested, 1, typename eval >::type> -{ - typedef TensorPatchOp type; -}; - -} // end namespace internal - - - -template -class TensorPatchOp : public TensorBase, ReadOnlyAccessors> -{ - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPatchOp(const XprType& expr, const PatchDim& patch_dims) - : m_xpr(expr), m_patch_dims(patch_dims) {} - - EIGEN_DEVICE_FUNC - const PatchDim& patch_dims() const { return m_patch_dims; } - - EIGEN_DEVICE_FUNC - const typename internal::remove_all::type& - expression() const { return m_xpr; } - - protected: - typename XprType::Nested m_xpr; - const PatchDim m_patch_dims; -}; - - -// Eval as rvalue -template -struct TensorEvaluator, Device> -{ - typedef TensorPatchOp XprType; - typedef typename XprType::Index Index; - static const int NumDims = internal::array_size::Dimensions>::value + 1; - typedef DSizes Dimensions; - typedef typename XprType::Scalar Scalar; - typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - - enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, - RawAccess = false - }; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device) - { - Index num_patches = 1; - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - const PatchDim& patch_dims = op.patch_dims(); - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = 0; i < NumDims-1; ++i) { - m_dimensions[i] = patch_dims[i]; - num_patches *= (input_dims[i] - patch_dims[i] + 1); - } - m_dimensions[NumDims-1] = num_patches; - - m_inputStrides[0] = 1; - m_patchStrides[0] = 1; - for (int i = 1; i < NumDims-1; ++i) { - m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1]; - m_patchStrides[i] = m_patchStrides[i-1] * (input_dims[i-1] - patch_dims[i-1] + 1); - } - m_outputStrides[0] = 1; - for (int i = 1; i < NumDims; ++i) { - m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1]; - } - } else { - for (int i = 0; i < NumDims-1; ++i) { - m_dimensions[i+1] = patch_dims[i]; - num_patches *= (input_dims[i] - patch_dims[i] + 1); - } - m_dimensions[0] = num_patches; - - m_inputStrides[NumDims-2] = 1; - m_patchStrides[NumDims-2] = 1; - for (int i = NumDims-3; i >= 0; --i) { - m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1]; - m_patchStrides[i] = m_patchStrides[i+1] * (input_dims[i+1] - patch_dims[i+1] + 1); - } - m_outputStrides[NumDims-1] = 1; - for (int i = NumDims-2; i >= 0; --i) { - m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1]; - } - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar* /*data*/) { - m_impl.evalSubExprsIfNeeded(NULL); - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - Index output_stride_index = (static_cast(Layout) == static_cast(ColMajor)) ? NumDims - 1 : 0; - // Find the location of the first element of the patch. - Index patchIndex = index / m_outputStrides[output_stride_index]; - // Find the offset of the element wrt the location of the first element. - Index patchOffset = index - patchIndex * m_outputStrides[output_stride_index]; - Index inputIndex = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 2; i > 0; --i) { - const Index patchIdx = patchIndex / m_patchStrides[i]; - patchIndex -= patchIdx * m_patchStrides[i]; - const Index offsetIdx = patchOffset / m_outputStrides[i]; - patchOffset -= offsetIdx * m_outputStrides[i]; - inputIndex += (patchIdx + offsetIdx) * m_inputStrides[i]; - } - } else { - for (int i = 0; i < NumDims - 2; ++i) { - const Index patchIdx = patchIndex / m_patchStrides[i]; - patchIndex -= patchIdx * m_patchStrides[i]; - const Index offsetIdx = patchOffset / m_outputStrides[i+1]; - patchOffset -= offsetIdx * m_outputStrides[i+1]; - inputIndex += (patchIdx + offsetIdx) * m_inputStrides[i]; - } - } - inputIndex += (patchIndex + patchOffset); - return m_impl.coeff(inputIndex); - } - - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index+PacketSize-1 < dimensions().TotalSize()); - - Index output_stride_index = (static_cast(Layout) == static_cast(ColMajor)) ? NumDims - 1 : 0; - Index indices[2] = {index, index + PacketSize - 1}; - Index patchIndices[2] = {indices[0] / m_outputStrides[output_stride_index], - indices[1] / m_outputStrides[output_stride_index]}; - Index patchOffsets[2] = {indices[0] - patchIndices[0] * m_outputStrides[output_stride_index], - indices[1] - patchIndices[1] * m_outputStrides[output_stride_index]}; - - Index inputIndices[2] = {0, 0}; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumDims - 2; i > 0; --i) { - const Index patchIdx[2] = {patchIndices[0] / m_patchStrides[i], - patchIndices[1] / m_patchStrides[i]}; - patchIndices[0] -= patchIdx[0] * m_patchStrides[i]; - patchIndices[1] -= patchIdx[1] * m_patchStrides[i]; - - const Index offsetIdx[2] = {patchOffsets[0] / m_outputStrides[i], - patchOffsets[1] / m_outputStrides[i]}; - patchOffsets[0] -= offsetIdx[0] * m_outputStrides[i]; - patchOffsets[1] -= offsetIdx[1] * m_outputStrides[i]; - - inputIndices[0] += (patchIdx[0] + offsetIdx[0]) * m_inputStrides[i]; - inputIndices[1] += (patchIdx[1] + offsetIdx[1]) * m_inputStrides[i]; - } - } else { - for (int i = 0; i < NumDims - 2; ++i) { - const Index patchIdx[2] = {patchIndices[0] / m_patchStrides[i], - patchIndices[1] / m_patchStrides[i]}; - patchIndices[0] -= patchIdx[0] * m_patchStrides[i]; - patchIndices[1] -= patchIdx[1] * m_patchStrides[i]; - - const Index offsetIdx[2] = {patchOffsets[0] / m_outputStrides[i+1], - patchOffsets[1] / m_outputStrides[i+1]}; - patchOffsets[0] -= offsetIdx[0] * m_outputStrides[i+1]; - patchOffsets[1] -= offsetIdx[1] * m_outputStrides[i+1]; - - inputIndices[0] += (patchIdx[0] + offsetIdx[0]) * m_inputStrides[i]; - inputIndices[1] += (patchIdx[1] + offsetIdx[1]) * m_inputStrides[i]; - } - } - inputIndices[0] += (patchIndices[0] + patchOffsets[0]); - inputIndices[1] += (patchIndices[1] + patchOffsets[1]); - - if (inputIndices[1] - inputIndices[0] == PacketSize - 1) { - PacketReturnType rslt = m_impl.template packet(inputIndices[0]); - return rslt; - } - else { - EIGEN_ALIGN_MAX CoeffReturnType values[PacketSize]; - values[0] = m_impl.coeff(inputIndices[0]); - values[PacketSize-1] = m_impl.coeff(inputIndices[1]); - for (int i = 1; i < PacketSize-1; ++i) { - values[i] = coeff(index+i); - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - const double compute_cost = NumDims * (TensorOpCost::DivCost() + - TensorOpCost::MulCost() + - 2 * TensorOpCost::AddCost()); - return m_impl.costPerCoeff(vectorized) + - TensorOpCost(0, 0, compute_cost, vectorized, PacketSize); - } - - EIGEN_DEVICE_FUNC Scalar* data() const { return NULL; } - - protected: - Dimensions m_dimensions; - array m_outputStrides; - array m_inputStrides; - array m_patchStrides; - - TensorEvaluator m_impl; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_PATCH_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h deleted file mode 100644 index 1655a813..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h +++ /dev/null @@ -1,276 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_RANDOM_H -#define EIGEN_CXX11_TENSOR_TENSOR_RANDOM_H - -namespace Eigen { -namespace internal { - -namespace { - -EIGEN_DEVICE_FUNC uint64_t get_random_seed() { -#ifdef __CUDA_ARCH__ - // We don't support 3d kernels since we currently only use 1 and - // 2d kernels. - assert(threadIdx.z == 0); - return clock64() + - blockIdx.x * blockDim.x + threadIdx.x + - gridDim.x * blockDim.x * (blockIdx.y * blockDim.y + threadIdx.y); - -#elif defined _WIN32 - // Use the current time as a baseline. - SYSTEMTIME st; - GetSystemTime(&st); - int time = st.wSecond + 1000 * st.wMilliseconds; - // Mix in a random number to make sure that we get different seeds if - // we try to generate seeds faster than the clock resolution. - // We need 2 random values since the generator only generate 16 bits at - // a time (https://msdn.microsoft.com/en-us/library/398ax69y.aspx) - int rnd1 = ::rand(); - int rnd2 = ::rand(); - uint64_t rnd = (rnd1 | rnd2 << 16) ^ time; - return rnd; - -#elif defined __APPLE__ - // Same approach as for win32, except that the random number generator - // is better (// https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/random.3.html#//apple_ref/doc/man/3/random). - uint64_t rnd = ::random() ^ mach_absolute_time(); - return rnd; - -#else - // Augment the current time with pseudo random number generation - // to ensure that we get different seeds if we try to generate seeds - // faster than the clock resolution. - timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); - uint64_t rnd = ::random() ^ ts.tv_nsec; - return rnd; -#endif -} - -static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE unsigned PCG_XSH_RS_generator(uint64_t* state) { - // TODO: Unify with the implementation in the non blocking thread pool. - uint64_t current = *state; - // Update the internal state - *state = current * 6364136223846793005ULL + 0xda3e39cb94b95bdbULL; - // Generate the random output (using the PCG-XSH-RS scheme) - return static_cast((current ^ (current >> 22)) >> (22 + (current >> 61))); -} - -static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint64_t PCG_XSH_RS_state(uint64_t seed) { - seed = seed ? seed : get_random_seed(); - return seed * 6364136223846793005ULL + 0xda3e39cb94b95bdbULL; -} - -} // namespace - - -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -T RandomToTypeUniform(uint64_t* state) { - unsigned rnd = PCG_XSH_RS_generator(state); - return static_cast(rnd); -} - - -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -Eigen::half RandomToTypeUniform(uint64_t* state) { - Eigen::half result; - // Generate 10 random bits for the mantissa - unsigned rnd = PCG_XSH_RS_generator(state); - result.x = static_cast(rnd & 0x3ffu); - // Set the exponent - result.x |= (static_cast(15) << 10); - // Return the final result - return result - Eigen::half(1.0f); -} - - -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -float RandomToTypeUniform(uint64_t* state) { - typedef union { - uint32_t raw; - float fp; - } internal; - internal result; - // Generate 23 random bits for the mantissa mantissa - const unsigned rnd = PCG_XSH_RS_generator(state); - result.raw = rnd & 0x7fffffu; - // Set the exponent - result.raw |= (static_cast(127) << 23); - // Return the final result - return result.fp - 1.0f; -} - -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -double RandomToTypeUniform(uint64_t* state) { - typedef union { - uint64_t raw; - double dp; - } internal; - internal result; - result.raw = 0; - // Generate 52 random bits for the mantissa - // First generate the upper 20 bits - unsigned rnd1 = PCG_XSH_RS_generator(state) & 0xfffffu; - // The generate the lower 32 bits - unsigned rnd2 = PCG_XSH_RS_generator(state); - result.raw = (static_cast(rnd1) << 32) | rnd2; - // Set the exponent - result.raw |= (static_cast(1023) << 52); - // Return the final result - return result.dp - 1.0; -} - -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -std::complex RandomToTypeUniform >(uint64_t* state) { - return std::complex(RandomToTypeUniform(state), - RandomToTypeUniform(state)); -} -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -std::complex RandomToTypeUniform >(uint64_t* state) { - return std::complex(RandomToTypeUniform(state), - RandomToTypeUniform(state)); -} - -template class UniformRandomGenerator { - public: - static const bool PacketAccess = true; - - // Uses the given "seed" if non-zero, otherwise uses a random seed. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UniformRandomGenerator( - uint64_t seed = 0) { - m_state = PCG_XSH_RS_state(seed); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UniformRandomGenerator( - const UniformRandomGenerator& other) { - m_state = other.m_state; - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - T operator()(Index i) const { - uint64_t local_state = m_state + i; - T result = RandomToTypeUniform(&local_state); - m_state = local_state; - return result; - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Packet packetOp(Index i) const { - const int packetSize = internal::unpacket_traits::size; - EIGEN_ALIGN_MAX T values[packetSize]; - uint64_t local_state = m_state + i; - for (int j = 0; j < packetSize; ++j) { - values[j] = RandomToTypeUniform(&local_state); - } - m_state = local_state; - return internal::pload(values); - } - - private: - mutable uint64_t m_state; -}; - -template -struct functor_traits > { - enum { - // Rough estimate for floating point, multiplied by ceil(sizeof(T) / sizeof(float)). - Cost = 12 * NumTraits::AddCost * - ((sizeof(Scalar) + sizeof(float) - 1) / sizeof(float)), - PacketAccess = UniformRandomGenerator::PacketAccess - }; -}; - - - -template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -T RandomToTypeNormal(uint64_t* state) { - // Use the ratio of uniform method to generate numbers following a normal - // distribution. See for example Numerical Recipes chapter 7.3.9 for the - // details. - T u, v, q; - do { - u = RandomToTypeUniform(state); - v = T(1.7156) * (RandomToTypeUniform(state) - T(0.5)); - const T x = u - T(0.449871); - const T y = numext::abs(v) + T(0.386595); - q = x*x + y * (T(0.196)*y - T(0.25472)*x); - } while (q > T(0.27597) && - (q > T(0.27846) || v*v > T(-4) * numext::log(u) * u*u)); - - return v/u; -} - -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -std::complex RandomToTypeNormal >(uint64_t* state) { - return std::complex(RandomToTypeNormal(state), - RandomToTypeNormal(state)); -} -template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -std::complex RandomToTypeNormal >(uint64_t* state) { - return std::complex(RandomToTypeNormal(state), - RandomToTypeNormal(state)); -} - - -template class NormalRandomGenerator { - public: - static const bool PacketAccess = true; - - // Uses the given "seed" if non-zero, otherwise uses a random seed. - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE NormalRandomGenerator(uint64_t seed = 0) { - m_state = PCG_XSH_RS_state(seed); - } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE NormalRandomGenerator( - const NormalRandomGenerator& other) { - m_state = other.m_state; - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - T operator()(Index i) const { - uint64_t local_state = m_state + i; - T result = RandomToTypeNormal(&local_state); - m_state = local_state; - return result; - } - - template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Packet packetOp(Index i) const { - const int packetSize = internal::unpacket_traits::size; - EIGEN_ALIGN_MAX T values[packetSize]; - uint64_t local_state = m_state + i; - for (int j = 0; j < packetSize; ++j) { - values[j] = RandomToTypeNormal(&local_state); - } - m_state = local_state; - return internal::pload(values); - } - - private: - mutable uint64_t m_state; -}; - - -template -struct functor_traits > { - enum { - // On average, we need to generate about 3 random numbers - // 15 mul, 8 add, 1.5 logs - Cost = 3 * functor_traits >::Cost + - 15 * NumTraits::AddCost + 8 * NumTraits::AddCost + - 3 * functor_traits >::Cost / 2, - PacketAccess = NormalRandomGenerator::PacketAccess - }; -}; - - -} // end namespace internal -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_RANDOM_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h deleted file mode 100644 index e341e2e9..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h +++ /dev/null @@ -1,799 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// Copyright (C) 2016 Mehdi Goli, Codeplay Software Ltd -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_H -#define EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_H - -// clang is incompatible with the CUDA syntax wrt making a kernel a class friend, -// so we'll use a macro to make clang happy. -#ifndef KERNEL_FRIEND -#if defined(__clang__) && defined(__CUDA__) -#define KERNEL_FRIEND friend __global__ -#else -#define KERNEL_FRIEND friend -#endif -#endif - - -namespace Eigen { - - -/** \class TensorReduction - * \ingroup CXX11_Tensor_Module - * - * \brief Tensor reduction class. - * - */ - -namespace internal { - template class MakePointer_ > - struct traits > - : traits -{ - typedef traits XprTraits; - typedef typename XprTraits::Scalar Scalar; - typedef typename XprTraits::StorageKind StorageKind; - typedef typename XprTraits::Index Index; - typedef typename XprType::Nested Nested; - static const int NumDimensions = XprTraits::NumDimensions - array_size::value; - static const int Layout = XprTraits::Layout; - - template struct MakePointer { - // Intermediate typedef to workaround MSVC issue. - typedef MakePointer_ MakePointerT; - typedef typename MakePointerT::Type Type; - }; -}; - -template class MakePointer_> -struct eval, Eigen::Dense> -{ - typedef const TensorReductionOp& type; -}; - -template class MakePointer_> -struct nested, 1, typename eval >::type> -{ - typedef TensorReductionOp type; -}; - - -template struct DimInitializer { - template EIGEN_DEVICE_FUNC - static void run(const InputDims& input_dims, - const array::value>& reduced, - OutputDims* output_dims, ReducedDims* reduced_dims) { - const int NumInputDims = internal::array_size::value; - int outputIndex = 0; - int reduceIndex = 0; - for (int i = 0; i < NumInputDims; ++i) { - if (reduced[i]) { - (*reduced_dims)[reduceIndex] = input_dims[i]; - ++reduceIndex; - } else { - (*output_dims)[outputIndex] = input_dims[i]; - ++outputIndex; - } - } - } -}; - -template <> struct DimInitializer > { - template EIGEN_DEVICE_FUNC - static void run(const InputDims& input_dims, const array&, - Sizes<>*, array* reduced_dims) { - const int NumInputDims = internal::array_size::value; - for (int i = 0; i < NumInputDims; ++i) { - (*reduced_dims)[i] = input_dims[i]; - } - } -}; - - -template -struct are_inner_most_dims { - static const bool value = false; -}; -template -struct preserve_inner_most_dims { - static const bool value = false; -}; - -#if EIGEN_HAS_CONSTEXPR && EIGEN_HAS_VARIADIC_TEMPLATES -template -struct are_inner_most_dims{ - static const bool tmp1 = indices_statically_known_to_increase(); - static const bool tmp2 = index_statically_eq(0, 0); - static const bool tmp3 = index_statically_eq(array_size::value-1, array_size::value-1); - static const bool value = tmp1 & tmp2 & tmp3; -}; -template -struct are_inner_most_dims{ - static const bool tmp1 = indices_statically_known_to_increase(); - static const bool tmp2 = index_statically_eq(0, NumTensorDims - array_size::value); - static const bool tmp3 = index_statically_eq(array_size::value - 1, NumTensorDims - 1); - static const bool value = tmp1 & tmp2 & tmp3; - -}; -template -struct preserve_inner_most_dims{ - static const bool tmp1 = indices_statically_known_to_increase(); - static const bool tmp2 = index_statically_gt(0, 0); - static const bool value = tmp1 & tmp2; - -}; -template -struct preserve_inner_most_dims{ - static const bool tmp1 = indices_statically_known_to_increase(); - static const bool tmp2 = index_statically_lt(array_size::value - 1, NumTensorDims - 1); - static const bool value = tmp1 & tmp2; -}; -#endif - - -template -struct GenericDimReducer { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::CoeffReturnType* accum) { - EIGEN_STATIC_ASSERT((DimIndex > 0), YOU_MADE_A_PROGRAMMING_MISTAKE); - for (int j = 0; j < self.m_reducedDims[DimIndex]; ++j) { - const typename Self::Index input = firstIndex + j * self.m_reducedStrides[DimIndex]; - GenericDimReducer::reduce(self, input, reducer, accum); - } - } -}; -template -struct GenericDimReducer<0, Self, Op> { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::CoeffReturnType* accum) { - for (int j = 0; j < self.m_reducedDims[0]; ++j) { - const typename Self::Index input = firstIndex + j * self.m_reducedStrides[0]; - reducer.reduce(self.m_impl.coeff(input), accum); - } - } -}; -template -struct GenericDimReducer<-1, Self, Op> { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index index, Op& reducer, typename Self::CoeffReturnType* accum) { - reducer.reduce(self.m_impl.coeff(index), accum); - } -}; - -template -struct InnerMostDimReducer { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer) { - typename Self::CoeffReturnType accum = reducer.initialize(); - for (typename Self::Index j = 0; j < numValuesToReduce; ++j) { - reducer.reduce(self.m_impl.coeff(firstIndex + j), &accum); - } - return reducer.finalize(accum); - } -}; - -template -struct InnerMostDimReducer { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer) { - const int packetSize = internal::unpacket_traits::size; - const typename Self::Index VectorizedSize = (numValuesToReduce / packetSize) * packetSize; - typename Self::PacketReturnType p = reducer.template initializePacket(); - for (typename Self::Index j = 0; j < VectorizedSize; j += packetSize) { - reducer.reducePacket(self.m_impl.template packet(firstIndex + j), &p); - } - typename Self::CoeffReturnType accum = reducer.initialize(); - for (typename Self::Index j = VectorizedSize; j < numValuesToReduce; ++j) { - reducer.reduce(self.m_impl.coeff(firstIndex + j), &accum); - } - return reducer.finalizeBoth(accum, p); - } -}; - -template -struct InnerMostDimPreserver { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self&, typename Self::Index, Op&, typename Self::PacketReturnType*) { - eigen_assert(false && "should never be called"); - } -}; - -template -struct InnerMostDimPreserver { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::PacketReturnType* accum) { - EIGEN_STATIC_ASSERT((DimIndex > 0), YOU_MADE_A_PROGRAMMING_MISTAKE); - for (typename Self::Index j = 0; j < self.m_reducedDims[DimIndex]; ++j) { - const typename Self::Index input = firstIndex + j * self.m_reducedStrides[DimIndex]; - InnerMostDimPreserver::reduce(self, input, reducer, accum); - } - } -}; - -template -struct InnerMostDimPreserver<0, Self, Op, true> { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::PacketReturnType* accum) { - for (typename Self::Index j = 0; j < self.m_reducedDims[0]; ++j) { - const typename Self::Index input = firstIndex + j * self.m_reducedStrides[0]; - reducer.reducePacket(self.m_impl.template packet(input), accum); - } - } -}; -template -struct InnerMostDimPreserver<-1, Self, Op, true> { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self&, typename Self::Index, Op&, typename Self::PacketReturnType*) { - eigen_assert(false && "should never be called"); - } -}; - -// Default full reducer -template -struct FullReducer { - static const bool HasOptimizedImplementation = false; - - static EIGEN_DEVICE_FUNC void run(const Self& self, Op& reducer, const Device&, typename Self::CoeffReturnType* output) { - const typename Self::Index num_coeffs = array_prod(self.m_impl.dimensions()); - *output = InnerMostDimReducer::reduce(self, 0, num_coeffs, reducer); - } -}; - - -#ifdef EIGEN_USE_THREADS -// Multithreaded full reducers -template -struct FullReducerShard { - static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Self& self, typename Self::Index firstIndex, - typename Self::Index numValuesToReduce, Op& reducer, - typename Self::CoeffReturnType* output) { - *output = InnerMostDimReducer::reduce( - self, firstIndex, numValuesToReduce, reducer); - } -}; - -// Multithreaded full reducer -template -struct FullReducer { - static const bool HasOptimizedImplementation = !Op::IsStateful; - static const int PacketSize = - unpacket_traits::size; - - // launch one reducer per thread and accumulate the result. - static void run(const Self& self, Op& reducer, const ThreadPoolDevice& device, - typename Self::CoeffReturnType* output) { - typedef typename Self::Index Index; - const Index num_coeffs = array_prod(self.m_impl.dimensions()); - if (num_coeffs == 0) { - *output = reducer.finalize(reducer.initialize()); - return; - } - const TensorOpCost cost = - self.m_impl.costPerCoeff(Vectorizable) + - TensorOpCost(0, 0, internal::functor_traits::Cost, Vectorizable, - PacketSize); - const int num_threads = TensorCostModel::numThreads( - num_coeffs, cost, device.numThreads()); - if (num_threads == 1) { - *output = - InnerMostDimReducer::reduce(self, 0, num_coeffs, reducer); - return; - } - const Index blocksize = - std::floor(static_cast(num_coeffs) / num_threads); - const Index numblocks = blocksize > 0 ? num_coeffs / blocksize : 0; - eigen_assert(num_coeffs >= numblocks * blocksize); - - Barrier barrier(internal::convert_index(numblocks)); - MaxSizeVector shards(numblocks, reducer.initialize()); - for (Index i = 0; i < numblocks; ++i) { - device.enqueue_with_barrier(&barrier, &FullReducerShard::run, - self, i * blocksize, blocksize, reducer, - &shards[i]); - } - typename Self::CoeffReturnType finalShard; - if (numblocks * blocksize < num_coeffs) { - finalShard = InnerMostDimReducer::reduce( - self, numblocks * blocksize, num_coeffs - numblocks * blocksize, - reducer); - } else { - finalShard = reducer.initialize(); - } - barrier.Wait(); - - for (Index i = 0; i < numblocks; ++i) { - reducer.reduce(shards[i], &finalShard); - } - *output = reducer.finalize(finalShard); - } -}; - -#endif - - -// Default inner reducer -template -struct InnerReducer { - static const bool HasOptimizedImplementation = false; - - EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*, typename Self::Index, typename Self::Index) { - eigen_assert(false && "Not implemented"); - return true; - } -}; - -// Default outer reducer -template -struct OuterReducer { - static const bool HasOptimizedImplementation = false; - - EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*, typename Self::Index, typename Self::Index) { - eigen_assert(false && "Not implemented"); - return true; - } -}; - - -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) -template -__global__ void FullReductionKernel(R, const S, I, typename S::CoeffReturnType*, unsigned int*); - - -#ifdef EIGEN_HAS_CUDA_FP16 -template -__global__ void ReductionInitFullReduxKernelHalfFloat(R, const S, I, half2*); -template -__global__ void FullReductionKernelHalfFloat(R, const S, I, half*, half2*); -template -__global__ void InnerReductionKernelHalfFloat(R, const S, I, I, half*); - -#endif - -template -__global__ void InnerReductionKernel(R, const S, I, I, typename S::CoeffReturnType*); - -template -__global__ void OuterReductionKernel(R, const S, I, I, typename S::CoeffReturnType*); -#endif - -} // end namespace internal - - -template class MakePointer_> -class TensorReductionOp : public TensorBase, ReadOnlyAccessors> { - public: - typedef typename Eigen::internal::traits::Scalar Scalar; - typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorReductionOp(const XprType& expr, const Dims& dims) : m_expr(expr), m_dims(dims) - { } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - TensorReductionOp(const XprType& expr, const Dims& dims, const Op& reducer) : m_expr(expr), m_dims(dims), m_reducer(reducer) - { } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const XprType& expression() const { return m_expr; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Dims& dims() const { return m_dims; } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Op& reducer() const { return m_reducer; } - - protected: - typename XprType::Nested m_expr; - const Dims m_dims; - const Op m_reducer; -}; - - -// Eval as rvalue -template class MakePointer_, typename Device> -struct TensorEvaluator, Device> -{ - typedef TensorReductionOp XprType; - typedef typename XprType::Index Index; - typedef ArgType ChildType; - typedef typename TensorEvaluator::Dimensions InputDimensions; - static const int NumInputDims = internal::array_size::value; - static const int NumReducedDims = internal::array_size::value; - static const int NumOutputDims = NumInputDims - NumReducedDims; - typedef typename internal::conditional, DSizes >::type Dimensions; - typedef typename XprType::Scalar Scalar; - typedef TensorEvaluator, Device> Self; - static const bool InputPacketAccess = TensorEvaluator::PacketAccess; - typedef typename internal::remove_const::type CoeffReturnType; - typedef typename PacketType::type PacketReturnType; - static const int PacketSize = internal::unpacket_traits::size; - - enum { - IsAligned = false, - PacketAccess = Self::InputPacketAccess && Op::PacketAccess, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false - }; - - static const bool ReducingInnerMostDims = internal::are_inner_most_dims::value; - static const bool PreservingInnerMostDims = internal::preserve_inner_most_dims::value; - static const bool RunningFullReduction = (NumOutputDims==0); - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) - : m_impl(op.expression(), device), m_reducer(op.reducer()), m_result(NULL), m_device(device), m_xpr_dims(op.dims()) - { - EIGEN_STATIC_ASSERT((NumInputDims >= NumReducedDims), YOU_MADE_A_PROGRAMMING_MISTAKE); - EIGEN_STATIC_ASSERT((!ReducingInnerMostDims | !PreservingInnerMostDims | (NumReducedDims == NumInputDims)), - YOU_MADE_A_PROGRAMMING_MISTAKE); - - // Build the bitmap indicating if an input dimension is reduced or not. - for (int i = 0; i < NumInputDims; ++i) { - m_reduced[i] = false; - } - for (int i = 0; i < NumReducedDims; ++i) { - eigen_assert(op.dims()[i] >= 0); - eigen_assert(op.dims()[i] < NumInputDims); - m_reduced[op.dims()[i]] = true; - } - - const typename TensorEvaluator::Dimensions& input_dims = m_impl.dimensions(); - internal::DimInitializer::run(input_dims, m_reduced, &m_dimensions, &m_reducedDims); - - // Precompute output strides. - if (NumOutputDims > 0) { - if (static_cast(Layout) == static_cast(ColMajor)) { - m_outputStrides[0] = 1; - for (int i = 1; i < NumOutputDims; ++i) { - m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1]; - } - } else { - m_outputStrides.back() = 1; - for (int i = NumOutputDims - 2; i >= 0; --i) { - m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1]; - } - } - } - - // Precompute input strides. - if (NumInputDims > 0) { - array input_strides; - if (static_cast(Layout) == static_cast(ColMajor)) { - input_strides[0] = 1; - for (int i = 1; i < NumInputDims; ++i) { - input_strides[i] = input_strides[i-1] * input_dims[i-1]; - } - } else { - input_strides.back() = 1; - for (int i = NumInputDims - 2; i >= 0; --i) { - input_strides[i] = input_strides[i + 1] * input_dims[i + 1]; - } - } - - int outputIndex = 0; - int reduceIndex = 0; - for (int i = 0; i < NumInputDims; ++i) { - if (m_reduced[i]) { - m_reducedStrides[reduceIndex] = input_strides[i]; - ++reduceIndex; - } else { - m_preservedStrides[outputIndex] = input_strides[i]; - ++outputIndex; - } - } - } - - // Special case for full reductions - if (NumOutputDims == 0) { - m_preservedStrides[0] = internal::array_prod(input_dims); - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; } - - EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool evalSubExprsIfNeeded(typename MakePointer_::Type data) { - m_impl.evalSubExprsIfNeeded(NULL); - - // Use the FullReducer if possible. - if ((RunningFullReduction && RunningOnSycl) ||(RunningFullReduction && - internal::FullReducer::HasOptimizedImplementation && - ((RunningOnGPU && (m_device.majorDeviceVersion() >= 3)) || - !RunningOnGPU))) { - bool need_assign = false; - if (!data) { - m_result = static_cast(m_device.allocate(sizeof(CoeffReturnType))); - data = m_result; - need_assign = true; - } - Op reducer(m_reducer); - internal::FullReducer::run(*this, reducer, m_device, data); - return need_assign; - } - else if(RunningOnSycl){ - const Index num_values_to_reduce = internal::array_prod(m_reducedDims); - const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions); - if (!data) { - data = static_cast(m_device.allocate(sizeof(CoeffReturnType) * num_coeffs_to_preserve)); - m_result = data; - } - Op reducer(m_reducer); - internal::InnerReducer::run(*this, reducer, m_device, data, num_values_to_reduce, num_coeffs_to_preserve); - return (m_result != NULL); - } - - // Attempt to use an optimized reduction. - else if (RunningOnGPU && (m_device.majorDeviceVersion() >= 3)) { - bool reducing_inner_dims = true; - for (int i = 0; i < NumReducedDims; ++i) { - if (static_cast(Layout) == static_cast(ColMajor)) { - reducing_inner_dims &= m_reduced[i]; - } else { - reducing_inner_dims &= m_reduced[NumInputDims - 1 - i]; - } - } - if (internal::InnerReducer::HasOptimizedImplementation && - (reducing_inner_dims || ReducingInnerMostDims)) { - const Index num_values_to_reduce = internal::array_prod(m_reducedDims); - const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions); - if (!data) { - if (num_coeffs_to_preserve < 1024 && num_values_to_reduce > num_coeffs_to_preserve && num_values_to_reduce > 128) { - data = static_cast(m_device.allocate(sizeof(CoeffReturnType) * num_coeffs_to_preserve)); - m_result = data; - } - else { - return true; - } - } - Op reducer(m_reducer); - if (internal::InnerReducer::run(*this, reducer, m_device, data, num_values_to_reduce, num_coeffs_to_preserve)) { - if (m_result) { - m_device.deallocate(m_result); - m_result = NULL; - } - return true; - } else { - return (m_result != NULL); - } - } - - bool preserving_inner_dims = true; - for (int i = 0; i < NumReducedDims; ++i) { - if (static_cast(Layout) == static_cast(ColMajor)) { - preserving_inner_dims &= m_reduced[NumInputDims - 1 - i]; - } else { - preserving_inner_dims &= m_reduced[i]; - } - } - if (internal::OuterReducer::HasOptimizedImplementation && - preserving_inner_dims) { - const Index num_values_to_reduce = internal::array_prod(m_reducedDims); - const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions); - if (!data) { - if (num_coeffs_to_preserve < 1024 && num_values_to_reduce > num_coeffs_to_preserve && num_values_to_reduce > 32) { - data = static_cast(m_device.allocate(sizeof(CoeffReturnType) * num_coeffs_to_preserve)); - m_result = data; - } - else { - return true; - } - } - Op reducer(m_reducer); - if (internal::OuterReducer::run(*this, reducer, m_device, data, num_values_to_reduce, num_coeffs_to_preserve)) { - if (m_result) { - m_device.deallocate(m_result); - m_result = NULL; - } - return true; - } else { - return (m_result != NULL); - } - } - } - return true; - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup() { - m_impl.cleanup(); - if (m_result) { - m_device.deallocate(m_result); - m_result = NULL; - } - } - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const - { - if ((RunningOnSycl || RunningFullReduction || RunningOnGPU) && m_result) { - return *(m_result + index); - } - Op reducer(m_reducer); - if (ReducingInnerMostDims || RunningFullReduction) { - const Index num_values_to_reduce = - (static_cast(Layout) == static_cast(ColMajor)) ? m_preservedStrides[0] : m_preservedStrides[NumPreservedStrides - 1]; - return internal::InnerMostDimReducer::reduce(*this, firstInput(index), - num_values_to_reduce, reducer); - } else { - typename Self::CoeffReturnType accum = reducer.initialize(); - internal::GenericDimReducer::reduce(*this, firstInput(index), reducer, &accum); - return reducer.finalize(accum); - } - } - - // TODO(bsteiner): provide a more efficient implementation. - template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const - { - EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE) - eigen_assert(index + PacketSize - 1 < Index(internal::array_prod(dimensions()))); - - if (RunningOnGPU && m_result) { - return internal::pload(m_result + index); - } - - EIGEN_ALIGN_MAX typename internal::remove_const::type values[PacketSize]; - if (ReducingInnerMostDims) { - const Index num_values_to_reduce = - (static_cast(Layout) == static_cast(ColMajor)) ? m_preservedStrides[0] : m_preservedStrides[NumPreservedStrides - 1]; - const Index firstIndex = firstInput(index); - for (Index i = 0; i < PacketSize; ++i) { - Op reducer(m_reducer); - values[i] = internal::InnerMostDimReducer::reduce(*this, firstIndex + i * num_values_to_reduce, - num_values_to_reduce, reducer); - } - } else if (PreservingInnerMostDims) { - const Index firstIndex = firstInput(index); - const int innermost_dim = (static_cast(Layout) == static_cast(ColMajor)) ? 0 : NumOutputDims - 1; - // TBD: extend this the the n innermost dimensions that we preserve. - if (((firstIndex % m_dimensions[innermost_dim]) + PacketSize - 1) < m_dimensions[innermost_dim]) { - Op reducer(m_reducer); - typename Self::PacketReturnType accum = reducer.template initializePacket(); - internal::InnerMostDimPreserver::reduce(*this, firstIndex, reducer, &accum); - return reducer.finalizePacket(accum); - } else { - for (int i = 0; i < PacketSize; ++i) { - values[i] = coeff(index + i); - } - } - } else { - for (int i = 0; i < PacketSize; ++i) { - values[i] = coeff(index + i); - } - } - PacketReturnType rslt = internal::pload(values); - return rslt; - } - - // Must be called after evalSubExprsIfNeeded(). - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const { - if (RunningFullReduction && m_result) { - return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize); - } else { - const Index num_values_to_reduce = internal::array_prod(m_reducedDims); - const double compute_cost = num_values_to_reduce * internal::functor_traits::Cost; - return m_impl.costPerCoeff(vectorized) * num_values_to_reduce + - TensorOpCost(0, 0, compute_cost, vectorized, PacketSize); - } - } - - EIGEN_DEVICE_FUNC typename MakePointer_::Type data() const { return m_result; } - /// required by sycl in order to extract the accessor - const TensorEvaluator& impl() const { return m_impl; } - /// added for sycl in order to construct the buffer from the sycl device - const Device& device() const{return m_device;} - /// added for sycl in order to re-construct the reduction eval on the device for the sub-kernel - const Dims& xprDims() const {return m_xpr_dims;} - - - private: - template friend struct internal::GenericDimReducer; - template friend struct internal::InnerMostDimReducer; - template friend struct internal::InnerMostDimPreserver; - template friend struct internal::FullReducer; -#ifdef EIGEN_USE_THREADS - template friend struct internal::FullReducerShard; -#endif -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) - template KERNEL_FRIEND void internal::FullReductionKernel(R, const S, I, typename S::CoeffReturnType*, unsigned int*); -#ifdef EIGEN_HAS_CUDA_FP16 - template KERNEL_FRIEND void internal::ReductionInitFullReduxKernelHalfFloat(R, const S, I, half2*); - template KERNEL_FRIEND void internal::FullReductionKernelHalfFloat(R, const S, I, half*, half2*); - template KERNEL_FRIEND void internal::InnerReductionKernelHalfFloat(R, const S, I, I, half*); -#endif - template KERNEL_FRIEND void internal::InnerReductionKernel(R, const S, I, I, typename S::CoeffReturnType*); - - template KERNEL_FRIEND void internal::OuterReductionKernel(R, const S, I, I, typename S::CoeffReturnType*); -#endif - -#if defined(EIGEN_USE_SYCL) - template < typename HostExpr_, typename FunctorExpr_, typename Tuple_of_Acc_, typename Dims_, typename Op_, typename Index_> friend class TensorSycl::internal::ReductionFunctor; - template friend class TensorSycl::internal::FullReductionKernelFunctor; -#endif - - - template friend struct internal::InnerReducer; - - // Returns the Index in the input tensor of the first value that needs to be - // used to compute the reduction at output index "index". - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index firstInput(Index index) const { - if (ReducingInnerMostDims) { - if (static_cast(Layout) == static_cast(ColMajor)) { - return index * m_preservedStrides[0]; - } else { - return index * m_preservedStrides[NumPreservedStrides - 1]; - } - } - // TBD: optimize the case where we preserve the innermost dimensions. - Index startInput = 0; - if (static_cast(Layout) == static_cast(ColMajor)) { - for (int i = NumOutputDims - 1; i > 0; --i) { - // This is index_i in the output tensor. - const Index idx = index / m_outputStrides[i]; - startInput += idx * m_preservedStrides[i]; - index -= idx * m_outputStrides[i]; - } - if (PreservingInnerMostDims) { - eigen_assert(m_preservedStrides[0] == 1); - startInput += index; - } else { - startInput += index * m_preservedStrides[0]; - } - } else { - for (int i = 0; i < NumOutputDims - 1; ++i) { - // This is index_i in the output tensor. - const Index idx = index / m_outputStrides[i]; - startInput += idx * m_preservedStrides[i]; - index -= idx * m_outputStrides[i]; - } - if (PreservingInnerMostDims) { - eigen_assert(m_preservedStrides[NumPreservedStrides - 1] == 1); - startInput += index; - } else { - startInput += index * m_preservedStrides[NumPreservedStrides - 1]; - } - } - return startInput; - } - - // Bitmap indicating if an input dimension is reduced or not. - array m_reduced; - // Dimensions of the output of the operation. - Dimensions m_dimensions; - // Precomputed strides for the output tensor. - array m_outputStrides; - // Subset of strides of the input tensor for the non-reduced dimensions. - // Indexed by output dimensions. - static const int NumPreservedStrides = max_n_1::size; - array m_preservedStrides; - - // Subset of strides of the input tensor for the reduced dimensions. - // Indexed by reduced dimensions. - array m_reducedStrides; - // Size of the input dimensions that are reduced. - // Indexed by reduced dimensions. - array m_reducedDims; - - // Evaluator for the input expression. - TensorEvaluator m_impl; - - // Operation to apply for computing the reduction. - Op m_reducer; - - // For full reductions -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) - static const bool RunningOnGPU = internal::is_same::value; - static const bool RunningOnSycl = false; -#elif defined(EIGEN_USE_SYCL) -static const bool RunningOnSycl = internal::is_same::type, Eigen::SyclDevice>::value; -static const bool RunningOnGPU = false; -#else - static const bool RunningOnGPU = false; - static const bool RunningOnSycl = false; -#endif - typename MakePointer_::Type m_result; - - const Device& m_device; - const Dims& m_xpr_dims; -}; - -} // end namespace Eigen - -#endif // EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_H diff --git a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h b/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h deleted file mode 100644 index edb0ab28..00000000 --- a/testbed/nanogui/ext/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h +++ /dev/null @@ -1,749 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2014 Benoit Steiner -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_CUDA_H -#define EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_CUDA_H - -namespace Eigen { -namespace internal { - - -#if defined(EIGEN_USE_GPU) && defined(__CUDACC__) -// Full reducers for GPU, don't vectorize for now - -// Reducer function that enables multiple cuda thread to safely accumulate at the same -// output address. It basically reads the current value of the output variable, and -// attempts to update it with the new value. If in the meantime another cuda thread -// updated the content of the output address it will try again. -template -__device__ EIGEN_ALWAYS_INLINE void atomicReduce(T* output, T accum, R& reducer) { -#if __CUDA_ARCH__ >= 300 - if (sizeof(T) == 4) - { - unsigned int oldval = *reinterpret_cast(output); - unsigned int newval = oldval; - reducer.reduce(accum, reinterpret_cast(&newval)); - if (newval == oldval) { - return; - } - unsigned int readback; - while ((readback = atomicCAS((unsigned int*)output, oldval, newval)) != oldval) { - oldval = readback; - newval = oldval; - reducer.reduce(accum, reinterpret_cast(&newval)); - if (newval == oldval) { - return; - } - } - } - else if (sizeof(T) == 8) { - unsigned long long oldval = *reinterpret_cast(output); - unsigned long long newval = oldval; - reducer.reduce(accum, reinterpret_cast(&newval)); - if (newval == oldval) { - return; - } - unsigned long long readback; - while ((readback = atomicCAS((unsigned long long*)output, oldval, newval)) != oldval) { - oldval = readback; - newval = oldval; - reducer.reduce(accum, reinterpret_cast(&newval)); - if (newval == oldval) { - return; - } - } - } - else { - assert(0 && "Wordsize not supported"); - } -#else - assert(0 && "Shouldn't be called on unsupported device"); -#endif -} - -// We extend atomicExch to support extra data types -template -__device__ inline Type atomicExchCustom(Type* address, Type val) { - return atomicExch(address, val); -} - -template <> -__device__ inline double atomicExchCustom(double* address, double val) { - unsigned long long int* address_as_ull = reinterpret_cast(address); - return __longlong_as_double(atomicExch(address_as_ull, __double_as_longlong(val))); -} - -#ifdef EIGEN_HAS_CUDA_FP16 -template