def test_PeriodicIdentity(): world = vp.BoundingBox(pbc=True) pbc = vp.MultiResolutionAnalysis(box=world, order=k) pfunc = ffunc.periodify([1.0]) ftree = vp.FunctionTree(mra=pbc) vp.advanced.build_grid(out=ftree, inp=pfunc) vp.advanced.project(prec=epsilon, out=ftree, inp=pfunc) I = vp.IdentityConvolution(mra=pbc, prec=epsilon, root=0, reach=5) gtree = vp.FunctionTree(mra=pbc) vp.advanced.apply(prec=epsilon, out=gtree, oper=I, inp=ftree) assert gtree.integrate() == pytest.approx(ftree.integrate(), rel=epsilon)
def test_Identity(): I = vp.IdentityConvolution(mra, prec=epsilon) ftree = vp.FunctionTree(mra) vp.advanced.build_grid(out=ftree, inp=ffunc) vp.advanced.project(prec=epsilon, out=ftree, inp=ffunc) gtree = vp.FunctionTree(mra) vp.advanced.apply(prec=epsilon, out=gtree, oper=I, inp=ftree) assert gtree.integrate() == pytest.approx(ftree.integrate(), rel=epsilon) gtree2 = I(ftree) assert gtree2.integrate() == pytest.approx(ftree.integrate(), rel=epsilon)
def test_BuildProjectSemiPeriodicGauss(): sfac = [np.pi / 3] periodic_world = vp.BoundingBox(scaling=sfac, pbc=True) pbc = vp.MultiResolutionAnalysis(box=periodic_world, order=k) tree_1 = vp.FunctionTree(pbc) vp.advanced.build_grid(out=tree_1, inp=gauss) vp.advanced.project(out=tree_1, inp=gauss) assert tree_1.integrate() < 1.0 pgauss = gauss.periodify(period=sfac, std_dev=6.0) assert pgauss.size() > 0 tree_2 = vp.FunctionTree(pbc) vp.advanced.build_grid(out=tree_2, inp=pgauss) vp.advanced.project(out=tree_2, inp=pgauss) assert tree_2.integrate() == pytest.approx(1.0, rel=epsilon)
def test_ClearProjectRefine(): tree = vp.FunctionTree(mra) nsplit = 1 while nsplit > 0: vp.advanced.clear_grid(out=tree) vp.advanced.project(out=tree, inp=func) nsplit = vp.advanced.refine_grid(out=tree, prec=epsilon) assert tree.norm() > 0.0 assert tree.integrate() == pytest.approx(1.0, rel=epsilon)
def test_Addition(): tree_1 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_1, inp=gauss) vp.advanced.project(prec=epsilon, out=tree_1, inp=gauss) tree_2 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_2, inp=tree_1) vp.advanced.add(out=tree_2, inp_a=tree_1, b=-0.5, inp_b=tree_1) assert tree_2.nNodes() == tree_1.nNodes() assert tree_2.integrate() == pytest.approx(0.5 * tree_1.integrate(), rel=epsilon) tree_vec_1 = [] tree_vec_1.append((1.0, tree_1)) tree_vec_1.append((-0.5, tree_1)) tree_3 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_3, inp=tree_vec_1) vp.advanced.add(out=tree_3, inp=tree_vec_1) assert tree_3.nNodes() == tree_1.nNodes() assert tree_3.integrate() == pytest.approx(0.5 * tree_1.integrate(), rel=epsilon) tree_vec_2 = [] tree_vec_2.append(tree_1) tree_vec_2.append(tree_1) tree_4 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_4, inp=tree_vec_2) vp.advanced.add(out=tree_4, inp=tree_vec_2) assert tree_4.nNodes() == tree_1.nNodes() assert tree_4.integrate() == pytest.approx(2.0 * tree_1.integrate(), rel=epsilon) tree_5 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_5, inp=tree_1) tree_5.setZero() tree_5 += tree_1 tree_5 += 1.0 * tree_1 assert tree_5.nNodes() == tree_1.nNodes() assert tree_5.integrate() == pytest.approx(2.0 * tree_1.integrate(), rel=epsilon)
def test_BuildProjectCopyClear(): tree_1 = vp.FunctionTree(mra) tree_2 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_1, inp=gauss) assert tree_1.depth() > 1 vp.advanced.project(prec=epsilon, out=tree_1, inp=gauss, abs_prec=True) assert tree_1.integrate() == pytest.approx(1.0, rel=epsilon) vp.advanced.copy_grid(out=tree_2, inp=tree_1) assert tree_2.depth() == tree_1.depth() vp.advanced.copy_func(out=tree_2, inp=tree_1) assert tree_2.integrate() == pytest.approx(tree_1.integrate(), rel=epsilon) assert tree_2.norm() == pytest.approx(tree_1.norm(), rel=epsilon) vp.advanced.clear_grid(out=tree_2) assert tree_2.depth() == tree_1.depth() assert tree_2.norm() < 0.0
def test_DerivativeBS_1(): D = vp.BSDerivative(mra, order=1) assert D.getOrder() == 1 dh = vp.FunctionTree(mra) vp.advanced.apply(out=dh, oper=D, inp=f, dir=0) assert dh.integrate() == pytest.approx(df.integrate(), abs=epsilon) assert dh.norm() == pytest.approx(df.norm(), rel=epsilon) dh2 = D(f) assert dh2.integrate() == pytest.approx(df.integrate(), abs=epsilon) assert dh2.norm() == pytest.approx(df.norm(), rel=epsilon)
def test_BuildUnionGrid(): # building sharp grid tree_1 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_1, inp=gauss) assert tree_1.depth() > 1 # building wide grid tree_2 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_2, scales=s) assert tree_2.depth() > 1 # building union grid tree_3 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_3, inp=tree_1) vp.advanced.build_grid(out=tree_3, inp=tree_2) assert tree_3.norm() < 0.0 assert tree_3.nNodes() > tree_1.nNodes() assert tree_3.nNodes() > tree_2.nNodes() # refining union grid tree_4 = vp.FunctionTree(mra) tree_4.setZero() while vp.advanced.refine_grid(out=tree_4, inp=tree_1) > 0: pass while vp.advanced.refine_grid(out=tree_4, inp=tree_2) > 0: pass assert tree_4.norm() == pytest.approx(0.0, abs=epsilon) assert tree_4.nNodes() == tree_3.nNodes() # building union grid from vector tree_vec = [] tree_vec.append(tree_1) tree_vec.append(tree_2) tree_5 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_5, inp=tree_vec) assert tree_5.norm() < 0.0 assert tree_5.nNodes() == tree_3.nNodes()
def test_FunctionTreeSave(): tree.setZero() tree.saveTree(filename=name) tree_2 = vp.FunctionTree(mra) tree_2.setName("func_2") tree_2.loadTree(filename=name) assert tree_2.name() == "func_2" assert tree_2.norm() == 0.0 assert tree_2.squaredNorm() == 0.0 assert tree_2.integrate() == 0.0 assert tree_2.MRA() == tree.MRA() assert tree_2(r0) == 0.0 assert tree_2(r1) == 0.0
def test_BuildProjectRefineCrop(): tree = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree, scales=s) assert tree.fetchEndNode(0).center()[0] == pytest.approx(0.5) assert tree.depth() == s + 1 assert tree.nEndNodes() == 2**(s * D) vp.advanced.project(out=tree, inp=func) assert tree.depth() == s + 1 assert tree.nEndNodes() == 2**(s * D) assert tree.integrate() == pytest.approx(1.0, rel=epsilon) vp.advanced.refine_grid(out=tree, scales=1) assert tree.depth() == s + 2 assert tree.nEndNodes() == 2**((s + 1) * D) assert tree.integrate() == pytest.approx(1.0, rel=epsilon) pre_crop = tree.nNodes() tree.crop(prec=epsilon) post_crop = tree.nNodes() assert pre_crop > post_crop
def test_FunctionMap(): g_tree = vp.FunctionTree(mra) vp.advanced.map(prec=epsilon, out=g_tree, inp=f_tree, fmap=gmap) assert g_tree.norm() == pytest.approx(g_ref.norm(), rel=epsilon) assert g_tree(r_0) == pytest.approx(g_ref(r_0), rel=epsilon)
r1 = [-0.1] D = 1 k = 5 N = -1 n = 1 l = [2] name = "func" two_d = 2**D kp1_d = (k + 1)**D world = vp.BoundingBox(scale=N) root = vp.NodeIndex(scale=N) idx = vp.NodeIndex(scale=n, translation=l) mra = vp.MultiResolutionAnalysis(box=world, order=k) tree = vp.FunctionTree(mra, name) def test_FunctionTree(): assert tree.norm() < 0.0 assert tree.squaredNorm() < 0.0 assert tree.nNodes() == 1 assert tree.nEndNodes() == 1 assert tree.nGenNodes() == 0 assert tree.rootScale() == N assert tree.depth() == 1 assert tree.name() == name assert tree.MRA() == mra def test_FunctionTreeZero():
def test_Multiplication(): tree_1 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_1, inp=gauss) vp.advanced.project(prec=epsilon, out=tree_1, inp=gauss) assert vp.dot(tree_1, tree_1) == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_2 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_2, inp=tree_1) vp.advanced.multiply(out=tree_2, inp_a=tree_1, inp_b=tree_1) assert tree_2.nNodes() == tree_1.nNodes() assert tree_2.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_vec_1 = [] tree_vec_1.append((1.0, tree_1)) tree_vec_1.append((1.0, tree_1)) tree_3 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_3, inp=tree_vec_1) vp.advanced.multiply(out=tree_3, inp=tree_vec_1) assert tree_3.nNodes() == tree_1.nNodes() assert tree_3.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_vec_2 = [] tree_vec_2.append(tree_1) tree_vec_2.append(tree_1) tree_4 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_4, inp=tree_vec_2) vp.advanced.multiply(out=tree_4, inp=tree_vec_2) assert tree_4.nNodes() == tree_1.nNodes() assert tree_4.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_5 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_5, inp=tree_1) vp.advanced.power(out=tree_5, inp=tree_1, pow=2.0) assert tree_5.nNodes() == tree_1.nNodes() assert tree_5.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_6 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_6, inp=tree_1) vp.advanced.square(out=tree_6, inp=tree_1) assert tree_6.nNodes() == tree_1.nNodes() assert tree_6.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_7 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_7, inp=tree_1) vp.advanced.copy_func(out=tree_7, inp=tree_1) tree_7 *= tree_1 assert tree_7.nNodes() > tree_1.nNodes() assert tree_7.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_8 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_8, inp=tree_1) vp.advanced.copy_func(out=tree_8, inp=tree_1) tree_8 **= 2.0 assert tree_8.nNodes() > tree_1.nNodes() assert tree_8.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon) tree_9 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_9, inp=tree_1) vp.advanced.copy_func(out=tree_9, inp=tree_1) tree_9 **= 2.0 assert tree_9.nNodes() > tree_1.nNodes() assert tree_9.integrate() == pytest.approx(tree_1.squaredNorm(), rel=epsilon)
def test_OverloadedOperators(): tree_1 = vp.FunctionTree(mra) vp.advanced.build_grid(out=tree_1, inp=gauss) vp.advanced.project(out=tree_1, inp=gauss) ref_int = tree_1.integrate() ref_norm = tree_1.squaredNorm() ref_nodes = tree_1.nNodes() tree_2 = +tree_1 assert tree_2.nNodes() == ref_nodes assert tree_2.integrate() == pytest.approx(ref_int, rel=epsilon) tree_2 *= -2.0 assert tree_2.nNodes() == ref_nodes assert tree_2.integrate() == pytest.approx(-2.0 * ref_int, rel=epsilon) tree_3 = -tree_1 assert tree_3.nNodes() == ref_nodes assert tree_3.integrate() == pytest.approx(-ref_int, rel=epsilon) tree_3 /= 2.0 assert tree_3.nNodes() == ref_nodes assert tree_3.integrate() == pytest.approx(-0.5 * ref_int, rel=epsilon) tree_3 *= tree_2 assert tree_3.nNodes() > ref_nodes assert tree_3.integrate() == pytest.approx(ref_norm, rel=epsilon) tree_4 = tree_1 * 2.0 assert tree_4.nNodes() == ref_nodes assert tree_4.integrate() == pytest.approx(2.0 * ref_int, rel=epsilon) tree_5 = 2.0 * tree_1 assert tree_5.nNodes() == ref_nodes assert tree_5.integrate() == pytest.approx(2.0 * ref_int, rel=epsilon) tree_6 = tree_1 / 2.0 + 1.5 * tree_1 assert tree_6.nNodes() == ref_nodes assert tree_6.integrate() == pytest.approx(2.0 * ref_int, rel=epsilon) tree_6 += tree_1 assert tree_6.nNodes() == ref_nodes assert tree_6.integrate() == pytest.approx(3.0 * ref_int, rel=epsilon) tree_6 -= 2.0 * tree_4 assert tree_6.nNodes() == ref_nodes assert tree_6.integrate() == pytest.approx(-1.0 * ref_int, rel=epsilon) tree_6 **= 2.0 assert tree_6.nNodes() > ref_nodes assert tree_6.integrate() == pytest.approx(ref_norm, rel=epsilon) tree_7 = tree_1 - tree_2 assert tree_7.nNodes() == ref_nodes assert tree_7.integrate() == pytest.approx(3.0 * ref_int, rel=epsilon) tree_8 = tree_1**2.0 assert tree_8.nNodes() > ref_nodes assert tree_8.integrate() == pytest.approx(ref_norm, rel=epsilon) tree_9 = tree_1 * tree_1 assert tree_9.nNodes() > ref_nodes assert tree_9.integrate() == pytest.approx(ref_norm, rel=epsilon) tree_10 = (tree_1 * tree_1).crop(epsilon) + (tree_1**2).crop(epsilon) assert tree_10.nNodes() > tree_1.nNodes() assert tree_10.nNodes() < tree_9.nNodes() assert tree_10.integrate() == pytest.approx(2.0 * ref_norm, rel=epsilon) tree_vec_1 = [] tree_vec_1.append((1.0, tree_1)) tree_vec_1.append((-0.5, tree_1)) tree_11 = vp.sum(tree_vec_1) assert tree_11.nNodes() == tree_1.nNodes() assert tree_11.integrate() == pytest.approx(0.5 * ref_int, rel=epsilon) tree_12 = vp.prod(tree_vec_1) assert tree_12.nNodes() > tree_1.nNodes() assert tree_12.integrate() == pytest.approx(-0.5 * ref_norm, rel=epsilon) tree_vec_2 = [] tree_vec_2.append(tree_1) tree_vec_2.append(tree_1) tree_13 = vp.sum(tree_vec_2) assert tree_13.nNodes() == tree_1.nNodes() assert tree_13.integrate() == pytest.approx(2.0 * ref_int, rel=epsilon) tree_14 = vp.prod(tree_vec_2) assert tree_14.nNodes() > tree_1.nNodes() assert tree_14.integrate() == pytest.approx(ref_norm, rel=epsilon)
epsilon = 1.0e-3 D = 1 k = 5 N = -2 world = vp.BoundingBox(scale=N) mra = vp.MultiResolutionAnalysis(box=world, order=k) r0 = [0.4] beta = 100.0 alpha = (beta / np.pi)**(D / 2.0) g = vp.GaussFunc(coef=alpha, exp=beta, pos=r0) dg = g.differentiate(dir=0) ddg = dg.differentiate(dir=0) f = vp.FunctionTree(mra) vp.advanced.build_grid(out=f, inp=g) vp.advanced.project(prec=epsilon / 10, out=f, inp=g) df = vp.FunctionTree(mra) vp.advanced.build_grid(out=df, inp=dg) vp.advanced.project(prec=epsilon / 10, out=df, inp=dg) ddf = vp.FunctionTree(mra) vp.advanced.build_grid(out=ddf, inp=ddg) vp.advanced.project(prec=epsilon / 10, out=ddf, inp=ddg) def test_DerivativeABGV_00(): D = vp.ABGVDerivative(mra, a=0.0, b=0.0) assert D.getOrder() == 1