def test_least_interpolant_generalised_sparse_grid( self ): def f( x ): if ( x.ndim == 1) : x = x.reshape( x.shape[0], 1 ) assert x.shape[0] > 1 y = numpy.sum( x**10+1, axis = 0 ) + \ numpy.sum( x[1:,:]**2 * x[:-1,:], axis = 0 ) if y.shape[0] == 1: return numpy.array( y[0] ) else: return y m = CppModel( f ) rng = numpy.random.RandomState( 0 ) num_dims = 2 quadrature_rule_1d = ClenshawCurtisQuadRule1D() basis = LagrangePolynomialBasis() tpqr = self.get_tensor_product_quadrature_rule_single(num_dims, quadrature_rule_1d, basis ) tol = 0. domain = numpy.array( [-1.,1,-1.,1], numpy.double ) sg = GeneralisedSparseGrid() test_pts = rng.uniform( -1., 1., ( num_dims, 100 ) ) x = test_pts test_vals = m.evaluate_set( test_pts ) max_levels = range( 1, 8 ) for i, max_level in enumerate( max_levels ): sg.max_num_points( numpy.iinfo( numpy.int32 ).max ) sg.tolerance( tol ) sg.max_level( max_level ) sg.initialise_default( m, domain, tpqr ) sg.build() rng = numpy.random.RandomState( 0 ) test_pts = rng.uniform( 0., 1., ( num_dims, 1000 ) ) from utilities.math_utils import map_from_unit_hypercube test_pts = map_from_unit_hypercube( test_pts, domain ) test_vals = m.evaluate_set( test_pts )[:,0] sg_error = numpy.linalg.norm( test_vals - sg.evaluate_set( test_pts ).squeeze() ) #print 'sparse grid error: ', sg_error #print 'num sparse grid points: ', sg.num_points() poly_1d = [ LegendrePolynomial1D() ] basis = TensorProductBasis( num_dims, poly_1d ) domain_py = TensorProductDomain( num_dims, [[-1,1]] ) pce = convert_sparse_grid_to_pce( sg, basis, domain_py ) pce_error = numpy.linalg.norm( test_vals - pce.evaluate_set( test_pts ).squeeze() ) #print 'pce error: ', pce_error assert numpy.allclose( pce_error, sg_error ) sg.clear()
def test_genseralised_sparse_grid_aposteriori_error_based_refinement( self ): from sparse_grid_cpp import AposterioriGeneralisedSparseGrid num_dims = 1 quadrature_rule_1d = ClenshawCurtisQuadRule1D() basis = LagrangePolynomialBasis() tpqr = self.get_tensor_product_quadrature_rule_single(num_dims, quadrature_rule_1d, basis ) m = AdjointModel() print 'Initialised model' forward_solution_num_DOF, adjoint_solution_num_DOF = m.get_num_dof() print 'forward ndof: %d\n adjoint ndof: %d' %(forward_solution_num_DOF, adjoint_solution_num_DOF) domain = numpy.array( [-1.,1.], numpy.double ) sg = AposterioriGeneralisedSparseGrid() sg.tolerance( 0.0 ) sg.max_num_points( 40 ) sg.max_level( 10 ) sg.forward_solution_num_DOF( int( forward_solution_num_DOF ) ) sg.adjoint_solution_num_DOF( int( adjoint_solution_num_DOF ) ) from utilities.visualisation import plot_surface_from_function sg.initialise( m, domain, tpqr, 0 ) sg.build() print 'sparse grid built successfully' # need to set this before evaluate is called or # quantities_of_interest will be whatever internal sg routines # 3 have set it as. todo move this to the end of build sg.quantities_of_interest( numpy.array( [0], numpy.int32 ) ) evaluate_enhanced_sparse_grid = lambda x: (sg.evaluate_set( x ) + \ sg.compute_error_estimates( x ) ).squeeze() grid = sg.get_coordinates() rng = numpy.random.RandomState( 0 ) test_pts = rng.uniform( -1., 1., ( num_dims, 1000 ) ) test_vals = m.evaluate_set( test_pts )[:,0] sg_error = numpy.linalg.norm( test_vals - sg.evaluate_set( test_pts ).squeeze() ) print 'done1' print 'sparse grid error: ', sg_error assert sg_error < 4e-10 enhanced_sg_error = numpy.linalg.norm( test_vals - evaluate_enhanced_sparse_grid( test_pts ) ) print 'enhanced sparse grid error: ', enhanced_sg_error assert enhanced_sg_error < 8e-15 print 'done' num_dims = 2 quadrature_rule_1d = ClenshawCurtisQuadRule1D() basis = LagrangePolynomialBasis() tpqr = self.get_tensor_product_quadrature_rule_single(num_dims, quadrature_rule_1d, basis ) m = AdjointModel() print 'Initialised model' forward_solution_num_DOF, adjoint_solution_num_DOF = m.get_num_dof() print 'forward ndof: %d\n adjoint ndof: %d' %(forward_solution_num_DOF, adjoint_solution_num_DOF) domain = numpy.array( [-1.,1.,0.4,0.8], numpy.double ) sg = AposterioriGeneralisedSparseGrid() sg.tolerance( 0.0 ) sg.max_num_points( 1000 ) sg.max_level( 10 ) sg.forward_solution_num_DOF( int( forward_solution_num_DOF ) ) sg.adjoint_solution_num_DOF( int( adjoint_solution_num_DOF ) ) from utilities.visualisation import plot_surface_from_function sg.initialise( m, domain, tpqr, 0 ) sg.build() print 'sparse grid built successfully' # need to set this before evaluate is called or # quantities_of_interest will be whatever internal sg routines # 3 have set it as. todo move this to the end of build sg.quantities_of_interest( numpy.array( [0], numpy.int32 ) ) evaluate_enhanced_sparse_grid = lambda x: (sg.evaluate_set( x ) + \ sg.compute_error_estimates( x ) ).squeeze() grid = sg.get_coordinates() rng = numpy.random.RandomState( 0 ) test_pts = rng.uniform( 0., 1., ( num_dims, 1000 ) ) from utilities.math_utils import map_from_unit_hypercube test_pts = map_from_unit_hypercube( test_pts, domain ) test_vals = m.evaluate_set( test_pts )[:,0] print test_pts.max(axis=1), test_pts.min(axis=1) sg_error = numpy.linalg.norm( test_vals - sg.evaluate_set( test_pts ).squeeze() ) print 'sparse grid error: ', sg_error assert sg_error < 4e-10 enhanced_sg_error = numpy.linalg.norm( test_vals - evaluate_enhanced_sparse_grid( test_pts ) ) print 'enhanced sparse grid error: ', enhanced_sg_error assert enhanced_sg_error < 8e-15 #plot_surface_from_function( m.evaluate_set, domain, 100 ) import pylab import mpl_toolkits.mplot3d.axes3d as p3 fig = pylab.figure( 1 ) ax = p3.Axes3D( fig ) grid = sg.get_coordinates() fv = sg.get_function_values() ax.scatter3D( grid[0,:], grid[1,:], fv[0,:] )