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