def test_2d(self): print("\n|Test_Trapz:test_2d()|") from kalepy import utils extr = [sorted(np.random.uniform(-10, 10, 2)) for ii in range(2)] edges = [np.linspace(*ex, 100) for ex in extr] grid = np.meshgrid(*edges, indexing='ij') shp = np.shape(grid[0]) vals = np.random.uniform(0.0, 1.0, size=shp) test = utils.trapz_nd(vals, edges) def sum_corner(ii, jj): area = np.diff(edges[0]) * np.diff(edges[1]) temp = area * vals[ii, jj] return np.sum(temp) tot = 0.0 for ii in range(2): for jj in range(2): cuts = [] for kk in [ii, jj]: if kk == 0: cuts.append(slice(None, -1, None)) else: cuts.append(slice(1, None, None)) tot += sum_corner(*cuts) * 0.25 print("test = {}, tot = {}".format(test, tot)) utils.allclose(test, tot) return
def test_1d(self): print("\n|Test_Trapz:test_1d()|") from kalepy import utils extr = sorted(np.random.uniform(-10, 10, 2)) xx = np.linspace(*extr, 1000) yy = np.random.uniform(0.0, 1.0, xx.size) np_trapz = np.trapz(yy, xx) test = utils.trapz_nd(yy, xx) utils.allclose(test, np_trapz) return
def _test_dim(dim, num=1e7): from kalepy import utils num_per_dim = int(np.power(num, 1 / dim)) norm = np.random.normal(10.0, 1.0) extr = [sorted(np.random.uniform(-10, 10, 2)) for ii in range(dim)] edges = [np.linspace(*ex, num_per_dim) for ex in extr] shp = [len(ed) for ed in edges] vals = norm * np.ones(shp) tot = utils.trapz_nd(vals, edges) truth = np.product(np.diff(extr, axis=-1)) * norm print("\t{:.4e} vs {:.4e}".format(tot, truth)) utils.allclose(tot, truth) return
def _test_ndim(self, ndim): from kalepy import utils print("`ndim` = {}".format(ndim)) BIN_SIZE_RANGE = [10, 30] extr = [[0.0, np.random.uniform(0.0, 2.0)] for ii in range(ndim)] norm = np.random.uniform(0.0, 10.0) # extr = [[0.0, 1.0] for ii in range(ndim)] # norm = 1.0 edges = [ np.linspace(*ex, np.random.randint(*BIN_SIZE_RANGE)) for ex in extr ] grid = np.meshgrid(*edges, indexing='ij') lengths = np.max(extr, axis=-1) xx = np.min(np.moveaxis(grid, 0, -1) / lengths, axis=-1) pdf = norm * xx area = np.product(lengths) pmf = utils.trapz_dens_to_mass(pdf, edges) # Known area of a pyramid in ndim vol = area * norm / (ndim + 1) tot = np.sum(pmf) print("Volume = {:.4e}, Total Mass = {:.4e}; ratio = {:.4e}".format( vol, tot, tot / vol)) utils.allclose(vol, tot, rtol=1e-2, msg="total volume does {fail:}match analytic value") test = utils.trapz_nd(pdf, edges) print("Volume = {:.4e}, Total Mass = {:.4e}; ratio = {:.4e}".format( test, tot, tot / test)) utils.allclose(vol, tot, rtol=1e-2, msg="total volume does {fail:}match `trapz_nd` value") return