Skip to content

Commit

Permalink
Merge pull request #134 from grlee77/max_level_fix
Browse files Browse the repository at this point in the history
dwt_max_level: avoid taking uint_log2 of values<1
  • Loading branch information
grlee77 committed Dec 9, 2015
2 parents 935c55b + 9f9bb36 commit a5058b8
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
18 changes: 10 additions & 8 deletions pywt/src/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,23 @@ void *wtcalloc(size_t len, size_t size){

/* Returns the floor of the base-2 log of it's input
*
* x = 0
* MSVC: returns 0
* Undefined on GCC/clang
* Undefined for x = 0
*/
unsigned char uint_log2(unsigned long x){
unsigned char size_log2(size_t x){
#if defined(_MSC_VER)
unsigned long i;
#if defined (_WIN64)
_BitScanReverse64(&i, x);
#else
_BitScanReverse(&i, x);
#endif /* _WIN64 */
return i;
#else
// GCC and clang
// Safe cast: 0 <= clzl < arch_bits (64) where result is defined
unsigned char leading_zeros = (unsigned char) __builtin_clzl(x);
return sizeof(unsigned long) * 8 - leading_zeros - 1;
#endif
return sizeof(size_t) * 8 - leading_zeros - 1;
#endif /* _MSC_VER */
}

/* buffers and max levels params */
Expand Down Expand Up @@ -66,10 +68,10 @@ size_t swt_buffer_length(size_t input_len){
}

unsigned char dwt_max_level(size_t input_len, size_t filter_len){
if(input_len < 1 || filter_len < 2)
if(filter_len <= 1 || input_len < (filter_len-1))
return 0;

return uint_log2(input_len/(filter_len-1));
return size_log2(input_len/(filter_len-1));
}

unsigned char swt_max_level(size_t input_len){
Expand Down
8 changes: 8 additions & 0 deletions pywt/tests/test__pywt.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,13 @@ def test_wavelet_repr():
assert_(wavelet.__repr__() == repr_wavelet.__repr__())


def test_dwt_max_level():
assert_(pywt.dwt_max_level(16, 2) == 4)
assert_(pywt.dwt_max_level(16, 8) == 1)
assert_(pywt.dwt_max_level(16, 9) == 1)
assert_(pywt.dwt_max_level(16, 10) == 0)
assert_(pywt.dwt_max_level(16, 18) == 0)


if __name__ == '__main__':
run_module_suite()

0 comments on commit a5058b8

Please sign in to comment.