diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8122d6d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,36 @@ +sudo: false +language: cpp +os: + - linux + - osx + +compiler: + - gcc + - clang + +addons: + apt: + sources: + - boost-latest + - ubuntu-toolchain-r-test + packages: + - libboost1.55-all-dev + +matrix: + allow_failures: + - compiler: clang + +before_install: + # linux prereqisite packages + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then wget --no-check-certificate https://www.cmake.org/files/v3.2/cmake-3.2.3-Linux-x86_64.tar.gz; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then tar -xzvf cmake-3.2.3-Linux-x86_64.tar.gz; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then export PATH=$PWD/cmake-3.2.3-Linux-x86_64/bin:$PATH; fi + +before_script: + + +script: + - mkdir build.ci && cd build.ci + - cmake .. -DBUILD_UT=ON -DCMAKE_BUILD_TYPE=$BUILD_CONFIG -DUSE_STATIC_BOOST=YES + - cmake --build . + - ctest -VV diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..095ec64 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 2.8.0 FATAL_ERROR) + +set(PROJECT_NAME wavelib) +project(${PROJECT_NAME} CXX C) + + +# src root path +set(WAVELIB_SRC_ROOT ${PROJECT_SOURCE_DIR} CACHE PATH "Wavelib source root") +# binary output by default +set(COMMON_BIN_PATH ${CMAKE_BINARY_DIR}/Bin) +set(LIBRARY_OUTPUT_PATH ${COMMON_BIN_PATH}/${CMAKE_BUILD_TYPE}) +set(EXECUTABLE_OUTPUT_PATH ${COMMON_BIN_PATH}/${CMAKE_BUILD_TYPE}) +# set where to find additional cmake modules if any +set(CMAKE_MODULE_PATH ${WAVELIB_SRC_ROOT}/cmake ${CMAKE_MODULE_PATH}) + + +set(WAVELIB_VERSION "1.0.0" CACHE STRING "Wavelib version" FORCE) +message(">>> Building Wavelib version: ${WAVELIB_VERSION}") +message(">>> EXECUTABLE_OUTPUT_PATH = ${EXECUTABLE_OUTPUT_PATH}") + +option(BUILD_UT "Enable Unit test" ON) + +# cleanup prefix lib for Unix-like OSes +set(CMAKE_SHARED_MODULE_PREFIX) + +# install target to this folder by default +set(WAVELIB_BINARY_DIR ${WAVELIB_SRC_ROOT}/bin) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${WAVELIB_BINARY_DIR}" CACHE PATH "default install path" FORCE) +endif() + +# make include globaly visible +set(PROJECT_WIDE_INCLUDE ${WAVELIB_SRC_ROOT}/include) +include_directories(${PROJECT_WIDE_INCLUDE}) + +# TODO: need to handle this with option +set(Boost_USE_MULTITHREADED ON) +set(Boost_USE_STATIC_RUNTIME OFF) + +set(Boost_USE_STATIC_LIBS ${USE_STATIC_BOOST}) +set(Boost_USE_MULTITHREADED ON) +unset(Boost_INCLUDE_DIR CACHE) +unset(Boost_LIBRARY_DIRS CACHE) +find_package(Boost REQUIRED COMPONENTS unit_test_framework) +if(USE_STATIC_BOOST) + message(STATUS "Linking against boost static libraries") +else(USE_STATIC_BOOST) + message(STATUS "Linking against boost dynamic libraries") +endif(USE_STATIC_BOOST) + + # disable autolinking feature +add_definitions(-DBOOST_ALL_NO_LIB) +include_directories(${Boost_INCLUDE_DIRS}) + + +include_directories(${COMMON_BIN_PATH}) + +if(BUILD_UT) + include(CTest) + enable_testing() + add_subdirectory(unitTests) +endif() + +add_subdirectory(src) + +install(DIRECTORY ${WAVELIB_SRC_ROOT}/include/ DESTINATION include FILES_MATCHING PATTERN "*.h") \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..f6eaa8d --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,16 @@ +os: Visual Studio 2015 + +platform: x64 + +environment: + BOOST_ROOT: C:\Libraries\boost_1_59_0 + BOOST_LIBRARYDIR: C:\Libraries\boost_1_59_0\lib64-msvc-14.0 + +build_script: + - mkdir build + - cd build + - cmake -G "Visual Studio 14 2015 Win64" -DUSE_STATIC_BOOST=NO .. + - cmake --build . --config Debug + +test_script: + - ctest -VV -C Debug \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..58f085e --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,26 @@ + + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + +set(SOURCE_FILES conv.c + hsfft.c + real.c + wavefilt.c + wavelib.c + wtmath.c + ) + +set(HEADER_FILES conv.h + hsfft.h + real.h + wavefilt.h + wavelib.h + wtmath.h + ) + +add_library(wavelib STATIC ${SOURCE_FILES} ${HEADER_FILES}) + +set_property(TARGET wavelib PROPERTY FOLDER "lib") + +target_include_directories(wavelib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + diff --git a/unitTests/CMakeLists.txt b/unitTests/CMakeLists.txt new file mode 100644 index 0000000..dbee49a --- /dev/null +++ b/unitTests/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_subdirectory(wavelibBoostTests) + diff --git a/unitTests/wavelibBoostTests/CMakeLists.txt b/unitTests/wavelibBoostTests/CMakeLists.txt new file mode 100644 index 0000000..ecca34b --- /dev/null +++ b/unitTests/wavelibBoostTests/CMakeLists.txt @@ -0,0 +1,35 @@ + +set(SOURCE_FILES + tst_dwt.cpp + BoostTest.cpp + ) + +set(HEADER_FILES + BoostTest.h + ) + + + + + +add_executable(wavelibLibTests ${SOURCE_FILES} ${HEADER_FILES}) + +add_test(NAME wavelibLibTests WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/test COMMAND wavelibLibTests) + +add_dependencies(wavelibLibTests wavelib) +target_link_libraries(wavelibLibTests ${Boost_LIBRARIES} + wavelib) + +target_include_directories(wavelibLibTests PUBLIC + ${CMAKE_SOURCE_DIR}/../../header + ${Boost_INCLUDE_DIR} + ) + +target_compile_definitions(wavelibLibTests PUBLIC BOOST_ALL_NO_LIB UNIT_TEST) + + +install(TARGETS wavelibLibTests + RUNTIME DESTINATION bin + LIBRARY DESTINATION tests + ARCHIVE DESTINATION tests + ) \ No newline at end of file diff --git a/unitTests/wavelibBoostTests/tst_dwt.cpp b/unitTests/wavelibBoostTests/tst_dwt.cpp index b086a20..d9d96b8 100644 --- a/unitTests/wavelibBoostTests/tst_dwt.cpp +++ b/unitTests/wavelibBoostTests/tst_dwt.cpp @@ -6,13 +6,11 @@ #include #include -#include -#include -#include -#include -#include "../../header/wavelib.h" -#include +#include +#include +#include "wavelib.h" +#include namespace patch { @@ -107,22 +105,10 @@ BOOST_AUTO_TEST_CASE(ReconstructionTest) wave_object obj; wt_object wt; - double *inp,*out,*diff; + double *inp,*out; int N, i,J; double epsilon = 1e-15; - FILE *ifp; - double temp[79926]; - - ifp = fopen("s1.txt", "r"); - //ifp = fopen("signal.txt", "r"); - i = 0; - BOOST_REQUIRE(ifp); - - while (!feof(ifp)) { - fscanf(ifp, "%lf \n", &temp[i]); - i++; - } N = 79926; //N = 256; @@ -132,7 +118,7 @@ BOOST_AUTO_TEST_CASE(ReconstructionTest) //wmean = mean(temp, N); for (i = 0; i < N; ++i) { - inp[i] = temp[i]; + inp[i] = (rand() / (double)(RAND_MAX + 1)); } std::vector waveletNames; @@ -224,7 +210,6 @@ BOOST_AUTO_TEST_CASE(ReconstructionTest) } } - fclose(ifp); free(out); free(inp); } @@ -247,9 +232,9 @@ BOOST_AUTO_TEST_CASE(DBCoefTests) char * name = new char[waveletNames[j].size() + 1]; memcpy(name, waveletNames[j].c_str(), waveletNames[j].size() + 1); obj = wave_init(name);// Initialize the wavelet - BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); BOOST_CHECK_SMALL(sum4(obj->lpr, obj->lpr_len) - 1., epsilon); for (int m = 1; m < (obj->lpr_len / 2) - 1;m++) BOOST_CHECK_SMALL(sum5(obj->lpr, obj->lpr_len, m), epsilon); @@ -275,9 +260,9 @@ BOOST_AUTO_TEST_CASE(CoifCoefTests) char * name = new char[waveletNames[j].size() + 1]; memcpy(name, waveletNames[j].c_str(), waveletNames[j].size() + 1); obj = wave_init(name);// Initialize the wavelet - BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); BOOST_CHECK_SMALL(sum4(obj->lpr, obj->lpr_len) - 1., epsilon); for (int m = 1; m < (obj->lpr_len / 2) - 1; m++) BOOST_CHECK_SMALL(sum5(obj->lpr, obj->lpr_len, m), epsilon); @@ -301,9 +286,9 @@ BOOST_AUTO_TEST_CASE(SymCoefTests) char * name = new char[waveletNames[j].size() + 1]; memcpy(name, waveletNames[j].c_str(), waveletNames[j].size() + 1); obj = wave_init(name);// Initialize the wavelet - BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); BOOST_CHECK_SMALL(sum4(obj->lpr, obj->lpr_len) - 1., epsilon); for (int m = 1; m < (obj->lpr_len / 2) - 1; m++) BOOST_CHECK_SMALL(sum5(obj->lpr, obj->lpr_len, m), epsilon); @@ -338,13 +323,13 @@ BOOST_AUTO_TEST_CASE(BiorCoefTests) char * name = new char[waveletNames[j].size() + 1]; memcpy(name, waveletNames[j].c_str(), waveletNames[j].size() + 1); obj = wave_init(name);// Initialize the wavelet - BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum1(obj->lpd, obj->lpd_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpd, obj->lpd_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpd, obj->lpd_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpd, obj->lpd_len) - 1. / sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpd, obj->lpd_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpd, obj->lpd_len) - 1. / sqrt(2.0), epsilon); wave_free(obj); delete[] name; } @@ -376,13 +361,13 @@ BOOST_AUTO_TEST_CASE(RBiorCoefTests) char * name = new char[waveletNames[j].size() + 1]; memcpy(name, waveletNames[j].c_str(), waveletNames[j].size() + 1); obj = wave_init(name);// Initialize the wavelet - BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum1(obj->lpd, obj->lpd_len) - std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum2(obj->lpd, obj->lpd_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpr, obj->lpr_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum1(obj->lpd, obj->lpd_len) - sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum2(obj->lpd, obj->lpd_len) - 1. / sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / std::sqrt(2.0), epsilon); - BOOST_CHECK_SMALL(sum3(obj->lpd, obj->lpd_len) - 1. / std::sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpr, obj->lpr_len) - 1. / sqrt(2.0), epsilon); + BOOST_CHECK_SMALL(sum3(obj->lpd, obj->lpd_len) - 1. / sqrt(2.0), epsilon); wave_free(obj); delete[] name; }