Source code for pyrtools.tools.compare_matpyrtools

import numpy as np
import math
from ..pyramids import convert_pyr_coeffs_to_pyr


[docs] def comparePyr(matPyr, pyPyr, rtol=1e-5, atol=1e-8): '''compare two pyramids returns True if they are the same with in desired precision and False if not. written for unit testing code. ''' # compare two pyramids - return 0 for !=, 1 for == # correct number of elements? matSz = sum(matPyr.shape) try: pySz = 1 + sum([np.asarray(size).prod() for size in pyPyr.pyr_size.values()]) except AttributeError: pySz = 1 + sum([np.asarray(size).prod() for size in pyPyr.pyrSize]) if(matSz != pySz): print("size difference: %d != %d, returning False" % (matSz, pySz)) return False # values are close to each other? matStart = 0 try: pyCoeffs, pyHigh, pyLow = convert_pyr_coeffs_to_pyr(pyPyr.pyr_coeffs) if pyHigh is not None: pyCoeffs.insert(0, pyHigh) if pyLow is not None: pyCoeffs.append(pyLow) except AttributeError: pyCoeffs = pyPyr.pyr for idx, pyTmp in enumerate(pyCoeffs): matTmp = matPyr[matStart:matStart + pyTmp.size] matStart = matStart + pyTmp.size matTmp = np.reshape(matTmp, pyTmp.shape, order='F') # relative tolerance rtol # absolute tolerance atol isclose = np.isclose(matTmp, pyTmp, rtol, atol) if not isclose.all(): print("some pyramid elements not identical: checking...") for i in range(isclose.shape[0]): for j in range(isclose.shape[1]): if not isclose[i, j]: print("failed level:%d element:%d %d value:%.15f %.15f" % (idx, i, j, matTmp[i, j], pyTmp[i, j])) return False return True
[docs] def compareRecon(recon1, recon2, rtol=1e-5, atol=1e-10): '''compare two arrays returns True is they are the same within specified precision and False if not. function was made to accompany unit test code. This function is deprecated. Instead use the builtin numpy: np.allclose(recon1, recon2, rtol=1e-05, atol=1e-08, equal_nan=False) This will not tell you where the error is, but you can find that yourself ''' # NOTE builtin numpy: # BUT won't print where and what the first error is if recon1.shape != recon2.shape: print('shape is different!') print(recon1.shape) print(recon2.shape) return False prec = -1 for i in range(recon1.shape[0]): for j in range(recon2.shape[1]): if np.absolute(recon1[i, j].real - recon2[i, j].real) > math.pow(10, -11): print("real: i=%d j=%d %.15f %.15f diff=%.15f" % (i, j, recon1[i, j].real, recon2[i, j].real, np.absolute(recon1[i, j].real-recon2[i, j].real))) return False # FIX: need a better way to test # if we have many significant digits to the left of decimal we # need to be less stringent about digits to the right. # The code below works, but there must be a better way. if isinstance(recon1, complex): if int(math.log(np.abs(recon1[i, j].imag), 10)) > 1: prec = prec + int(math.log(np.abs(recon1[i, j].imag), 10)) if prec > 0: prec = -1 print(prec) if np.absolute(recon1[i, j].imag - recon2[i, j].imag) > math.pow(10, prec): print("imag: i=%d j=%d %.15f %.15f diff=%.15f" % (i, j, recon1[i, j].imag, recon2[i, j].imag, np.absolute(recon1[i, j].imag-recon2[i, j].imag))) return False return True