1import c3py # import the python interface to the c3 library
2import numpy as np
3
4DIM = 5  # number of features
5def func2(x, param=None):
6    # print("x = ",x)
7    # print("shape ", x.shape)
8    if param is not None:
9        # print("param = ", param)
10        # print(x[:, 2])
11        for ii in range(DIM):
12            x[:, ii] = x[:, ii] * param[ii]
13    #     print(x[:, 2])
14    # print("\n\n\n\n\n")
15    out = np.sin(np.sum(x, axis=1))
16    return out
17
18if __name__ == "__main__":
19
20    lb = [-1]*DIM    # lower bounds of features
21    ub = [1]*DIM     # upper bounds of features
22
23    # number of parameters per univariate function
24    nparam = [3]*DIM
25
26    ## Run a rank-adaptive regression routine to approximate the first function
27    ft = c3py.FunctionTrain(DIM)
28    for ii in range(DIM):
29        ft.set_dim_opts(ii, "legendre", lb[ii], ub[ii],
30                        nparam[ii])
31
32    verbose = 1
33    init_rank = 2
34    adapt = 1
35    maxrank = 10
36    kickrank = 2
37    roundtol = 1e-8
38    maxiter = 5
39    scales = [2]*DIM; scales[2] = 0.2
40    ft.build_approximation(func2,scales,init_rank,verbose,adapt,
41                           maxrank=maxrank, round_tol=roundtol,
42                           kickrank=kickrank, maxiter=maxiter)
43
44    ## Generate test point
45    test_pt = np.random.rand(DIM)*2.0-1.0
46    ft_adapt_eval = ft.eval(test_pt)
47    eval2s = func2(test_pt.reshape((1,DIM)))
48    print("Second function with CrossApproximation:  Fteval =",ft_adapt_eval, "Should be =",eval2s)
49
50
51    print("SAVE")
52    filename = "saving_test.c3"
53    ft.save(filename)
54
55    ft_loaded = c3py.FunctionTrain(DIM)
56    for ii in range(DIM):
57        ft_loaded.set_dim_opts(ii, "legendre", lb[ii], ub[ii],
58                        nparam[ii])
59    ft_loaded.load(filename)
60
61    ftdiff = ft - ft_loaded
62    norm2 = ftdiff.norm2()
63
64    print("Norm = ", norm2)
65
66
67
68    ft2 = ft + ft + ft + ft
69    print("ft2 ranks = ", ft2.get_ranks())
70
71    ft3 = ft2 * ft
72    print("ft3 ranks = ", ft3.get_ranks())
73
74    ft3.round(eps=1e-3)
75    print("ft3 rounded ranks = ", ft3.get_ranks())
76
77
78    inner_product = ft.inner(ft)
79    print("Inner product = ", inner_product)
80
81    integral = ft.integrate()
82    print("Integral = ", integral)
83
84
85
86
87
88