Esempio n. 1
0
def build_sparse_grid_cpp( quadrature_rule_1d, basis, domain, f, 
                           num_dims, max_level, max_num_points,
                           tolerance = 0., test_pts = None, 
                           test_vals = None, breaks = None ):

    tpqr = get_tensor_product_quadrature_rule_single( num_dims, 
                                                      quadrature_rule_1d,
                                                      basis )

    sg = GeneralisedSparseGrid()

    sg.quantities_of_interest( numpy.array( [0], dtype = numpy.int32 ) )
    sg.tolerance( 0.0 )
    sg.max_num_points( max_num_points )
    sg.max_level( max_level )

    break_cnt = 0
    if breaks is None:
        breaks = numpy.logspace( 1, numpy.log10( max_num_points ), 10 )

    if test_pts is not None and test_vals is None:
        test_vals = f( test_pts ).squeeze()
        
    error = []
    num_pts = []

    sg.initialise( f, domain, tpqr, 0 )
    #sg.build()
    sg.initialise_build();
    while ( True ):
        sg.prioritise();
        if ( not sg.grid_warrants_refinement() ): break;
        sg.refine();

        if ( test_pts is not None and break_cnt < breaks.shape[0] and sg.num_points() > breaks[break_cnt] ):
            pred_vals = sg.evaluate_set( test_pts ).squeeze()
            l2_error = get_l2_error( test_vals, pred_vals )
            error.append( l2_error )
            num_pts.append( sg.num_points() )
            #print 'e', error
            #print 'n', sg.num_points()
            break_cnt += 1
            tmp = SubSpaceVector()
            sg.get_subspaces( tmp )

    if ( test_pts is not None  ):
        pred_vals = sg.evaluate_set( test_pts ).squeeze()
        l2_error = get_l2_error( test_vals, pred_vals )
        error.append( l2_error )
        num_pts.append( sg.num_points() )

    
    return sg, numpy.asarray( error ), numpy.asarray( num_pts )