1
2import c3py # import the python interface to the c3 library
3import pycback as pcb
4import numpy as np
5import matplotlib.pyplot as plt
6
7dim = 3  # number of features
8def func2(x,param=None):
9    if (param is not None):
10        print("param = ", param)
11    out = np.sin(2*np.pi*np.sum(x,axis=1))
12    return out
13
14if __name__ == "__main__":
15
16    lb = -1      # lower bounds of features
17    ub = 1       # upper bounds of features
18    nparam = 3   # number of parameters per univariate function
19
20    ## Run a rank-adaptive regression routine to approximate the first function
21    ft = c3py.FunctionTrain(dim)
22    for ii in range(dim):
23        ft.set_dim_opts(ii,"legendre",lb,ub,nparam)
24
25    verbose=0
26    init_rank=2
27    adapt=1
28    ft.build_approximation(func2,None,init_rank,verbose,adapt)
29
30    # collect functions
31    ranks = ft.get_ranks()
32    funcs = [[]]*dim
33    for ii in range(dim):
34        funcs[ii] = [None]*ranks[ii]
35        f, axis = plt.subplots(ranks[ii],ranks[ii+1])
36        for row in range(ranks[ii]):
37            funcs[ii][row] = [None]*ranks[ii+1]
38            for col in range(ranks[ii+1]):
39                funcs[ii][row][col] = ft.get_uni_func(ii,row,col)
40                x = np.linspace(-1,1,100)
41                evals = funcs[ii][row][col].eval(x)
42                title = "$f_{0}^{{({1},{2})}}$".format(ii,row,col)
43                if axis.ndim == 1:
44                    if ii == 0:
45                        axis[col].plot(x,evals,label=title)
46                        axis[col].legend()
47                    else:
48                        axis[row].plot(x,evals,label=title)
49                        axis[row].legend()
50                else:
51                    axis[row,col].plot(x,evals,label=title)
52                    axis[row,col].legend()
53
54    plt.show()
55
56
57
58
59
60
61
62