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] )
Example #2
0
    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 )