1import c3py # import the python interface to the c3 library
2import numpy as np
3
4## Define two functions
5def func1(x,param=None):
6    return np.sum(x,axis=1)
7
8def func2(x,param=None):
9    return np.sum(x**2,axis=1)
10
11DIM = 10                                # number of features
12NDATA = 100                            # number of data points
13X = np.random.rand(NDATA,DIM)*2.0-1.0  # training samples
14Y = func1(X)                           # function values
15
16LB = -1                                # lower bounds of features
17UB = 1                                 # upper bounds of features
18NPARAM = 2                             # number of parameters per univariate function
19
20
21# This should output an equal amount of allocates and trues
22def build_ft_adapt(dim):
23    ft = c3py.FunctionTrain(dim)
24    for ii in range(dim):
25        ft.set_dim_opts(ii, "legendre", LB, UB, NPARAM)
26    verbose = 0
27    init_rank = 2
28    adapt = 0
29    ft.build_approximation(func1, None, init_rank, verbose, adapt)
30    return ft
31
32def build_ft_regress(dim):
33    ft = c3py.FunctionTrain(dim)
34    for ii in range(dim):
35        ft.set_dim_opts(ii, "legendre", LB, UB, NPARAM)
36
37    ranks = [5]*(DIM+1)
38    ranks[0] = 1
39    ranks[DIM] = 1
40    ft.set_ranks(ranks)
41    verbose = 0
42    adaptrank = 1
43    ft.build_data_model(NDATA, X, Y,
44                        alg="AIO", obj="LS", adaptrank=adaptrank,
45                        kickrank=1, roundtol=1e-10, verbose=verbose)
46    return ft
47
48ft_adapt = build_ft_adapt(DIM)
49ft_regress = build_ft_regress(DIM)
50ft_diff = ft_adapt - ft_regress
51
52for ii in range(100):
53    pt = np.random.rand(DIM)*2.0-1.0
54    diff_eval = ft_diff.eval(pt)
55    adapt_eval = ft_adapt.eval(pt)
56    regress_eval = ft_regress.eval(pt)
57    print("adapt_eval, regress_eval, diff_eval ", adapt_eval, regress_eval, diff_eval)
58    # assert np.abs(diff_eval) < 1e-3
59
60print("\n\n\n")
61print("Tests Passed!")
62print("Bye!")
63