def test_tensor_product_basis( self ): # test orthogonal basis functions num_dims = 2 #domain = TensorProductDomain( num_dims, ranges = [[-1.,1.]] ) domain = get_symmetric_hypercube( -1., 1., num_dims ) poly_1d = OrthogPolyVector(); poly_1d.resize( 1 ) poly_1d[0] = JacobiPolynomial1D( 0.5, 0.5 ) #basis = TensorProductBasis( num_dims, poly_1d ) basis = TensorProductBasis() basis.set_domain( domain ) basis.set_bases( poly_1d, [numpy.arange( num_dims,dtype=numpy.int32 )], num_dims ) #assert basis.num_dims == num_dims x = numpy.random.uniform( -1., 1., ( num_dims, 20 ) ) index = PolynomialIndex( numpy.array( [[1, 1]], numpy.int32 ) ) true_val = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[0].value_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.value_set( x, index), true_val ) #true_grad = poly_1d[0].gradient_set( x[0,:], index.level( 0 ), -1., 1. ) * \ # poly_1d[0].value_set( x[1,:], index.level(1), -1., 1. ) #assert numpy.allclose( basis.gradient( x, index, 0), # true_grad ) #true_grad = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ # poly_1d[0].gradient_set( x[1,:], index.level(1), -1., 1. ) #assert numpy.allclose( basis.gradient( x, index, 1), # true_grad ) num_dims = 2 poly_1d = OrthogPolyVector(); poly_1d.resize( 2 ) poly_1d[0] = JacobiPolynomial1D( 0.5, 0.5 ) poly_1d[1] = JacobiPolynomial1D( 0.5, 1.5 ) #basis = TensorProductBasis( num_dims, poly_1d ) basis = TensorProductBasis() basis.set_domain( domain ) basis.set_bases( poly_1d, [numpy.array([0],numpy.int32), numpy.array([1],numpy.int32)], num_dims ) x_1 = numpy.random.uniform( -1., 1., ( 1, 20 ) ) x_2 = numpy.random.normal( 0., 1., ( 1, 20 ) ) x = numpy.vstack( ( x_1, x_2 ) ) index = PolynomialIndex( numpy.array( [[1,1]], numpy.int32 ) ) true_val = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[1].value_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.value_set( x, index ), true_val ) #true_grad = poly_1d[0].gradient_set( x[0,:], index.level(0), -1., 1. ) * \ # poly_1d[1].value_set( x[1,:], index.level(1), -1., 1. ) #assert numpy.allclose( basis.gradient( x, index, 0), # true_grad ) #true_grad = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ # poly_1d[1].gradient_set( x[1,:], index.level(1), -1., 1. ) #assert numpy.allclose( basis.gradient( x, index, 1), # true_grad ) num_dims = 3 domain = get_symmetric_hypercube( -1., 1., num_dims ) basis = TensorProductBasis() basis.set_domain( domain ) basis.set_bases( poly_1d, [numpy.array([0,2],numpy.int32), numpy.array([1],numpy.int32)], num_dims ) indices = PolyIndexVector() indices.resize( 3 ) indices[0] = PolynomialIndex( numpy.array( [[1,1]], numpy.int32 ) ) indices[1] = PolynomialIndex( numpy.array( [[2,1]], numpy.int32 ) ) indices[2] = PolynomialIndex( numpy.array( [[0,2],[2,3]], numpy.int32 ) ) indices[2] = PolynomialIndex( numpy.array( [[0,3],[1,1],[2,2]], numpy.int32 ) ) x_1 = numpy.random.uniform( -1., 1., ( 1, 20 ) ) x_2 = numpy.random.normal( 0., 1., ( 1, 20 ) ) x_3 = numpy.random.normal( 0., 1., ( 1, 20 ) ) x = numpy.vstack( ( x_1, x_2, x_3 ) ) vals_m = basis.value_set_multiple( x, indices ) for i, index in enumerate( indices ): true_vals = poly_1d[0].value_set( x[0,:], index.level(0), domain[0], domain[1] ) * poly_1d[1].value_set( x[1,:], index.level(1), domain[2], domain[3] ) * poly_1d[0].value_set( x[2,:], index.level(2), domain[4], domain[5] ) vals = basis.value_set( x, index ) assert numpy.allclose( true_vals, vals ) assert numpy.allclose( true_vals, vals_m[:,i] )
def test_tensor_product_basis( self ): # test orthogonal basis functions num_dims = 2 domain = TensorProductDomain( num_dims, ranges = [[-1.,1.]] ) poly_1d = [ JacobiPolynomial1D( 0.5, 0.5 ) ] basis = TensorProductBasis( num_dims, poly_1d ) assert basis.num_dims == num_dims x = numpy.random.uniform( -1., 1., ( num_dims, 20 ) ) index = PolynomialIndex( numpy.array( [[1, 1]], numpy.int32 ) ) true_val = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[0].value_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.value( x, index, domain ), true_val ) true_grad = poly_1d[0].gradient_set( x[0,:], index.level( 0 ), -1., 1. ) * \ poly_1d[0].value_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.gradient( x, index, 0, domain ), true_grad ) true_grad = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[0].gradient_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.gradient( x, index, 1, domain ), true_grad ) num_dims = 2 poly_1d = [ JacobiPolynomial1D( 0.5, 0.5 ), HermitePolynomial1D() ] basis = TensorProductBasis( num_dims, poly_1d ) assert basis.num_dims == num_dims x_1 = numpy.random.uniform( -1., 1., ( 1, 20 ) ) x_2 = numpy.random.normal( 0., 1., ( 1, 20 ) ) x = numpy.vstack( ( x_1, x_2 ) ) index = PolynomialIndex( numpy.array( [[1,1]], numpy.int32 ) ) true_val = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[1].value_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.value( x, index, domain ), true_val ) true_grad = poly_1d[0].gradient_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[1].value_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.gradient( x, index, 0, domain ), true_grad ) true_grad = poly_1d[0].value_set( x[0,:], index.level(0), -1., 1. ) * \ poly_1d[1].gradient_set( x[1,:], index.level(1), -1., 1. ) assert numpy.allclose( basis.gradient( x, index, 1, domain ), true_grad )