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