@@ -23,11 +23,17 @@ using fdapde::core::fem_order;
2323using fdapde::core::laplacian;
2424using fdapde::core::PDE;
2525using fdapde::core::Triangulation;
26+ using fdapde::core::GradientDescent;
27+ using fdapde::core::BacktrackingLineSearch;
28+ using fdapde::core::WolfeLineSearch;
29+ using fdapde::core::BFGS;
2630
2731#include " ../../fdaPDE/models/density_estimation/depde.h"
2832#include " ../../fdaPDE/models/sampling_design.h"
2933using fdapde::models::DEPDE;
3034using fdapde::models::Sampling;
35+ #include " ../../fdaPDE/calibration/kfold_cv.h"
36+ using fdapde::calibration::KCV;
3137
3238#include " utils/constants.h"
3339#include " utils/mesh_loader.h"
@@ -38,30 +44,125 @@ using fdapde::testing::read_csv;
3844
3945// test 1
4046// domain: unit square [1,1] x [1,1]
41- // sampling: locations = nodes
42- // penalization: simple laplacian
43- // covariates: no
44- // BC: no
47+ // optimizer: BGFS, fixed step
48+ // lambda: fixed
4549// order FE: 1
46- TEST (depde_test, test1 ) {
47- // define domain
50+ TEST (depde_test, fixed_smoothing_bfgs_fixed_step ) {
51+ // define domain
4852 MeshLoader<Triangulation<2 , 2 >> domain (" square_density" );
4953 // define regularizing PDE
5054 auto L = -laplacian<FEM>();
5155 DMatrix<double > u = DMatrix<double >::Zero (domain.mesh .n_cells () * 3 , 1 );
52- PDE<decltype (domain. mesh ) , decltype (L), DMatrix<double >, FEM, fem_order<1 >> problem (domain.mesh , L, u);
56+ PDE<Triangulation< 2 , 2 > , decltype (L), DMatrix<double >, FEM, fem_order<1 >> problem (domain.mesh , L, u);
5357 // define model
5458 double lambda = 0.1 ;
5559 DEPDE<SpaceOnly> model (problem);
5660 model.set_lambda_D (lambda);
61+ model.set_tolerance (1e-15 ); // to let the optimization process stop for maximum number of iterations
62+ // set model's data
63+ BlockFrame<double , int > df;
64+ df.insert (SPACE_LOCS, read_csv<double >(" ../data/models/depde/2D_test1/data.csv" ));
65+ model.set_data (df);
66+ model.set_optimizer (BFGS<fdapde::Dynamic> {500 , 1e-5 , 1e-2 });
67+ model.set_g_init (read_csv<double >(" ../data/models/depde/2D_test1/f_init.csv" ).array ().log ());
68+ // solve density estimation problem
69+ model.init ();
70+ model.solve (); // this stops at maximum number of iterations (expected)
71+ // test correctness
72+ EXPECT_TRUE (almost_equal (model.g (), " ../data/models/depde/2D_test1/g.mtx" ));
73+ }
74+
75+ // test 2
76+ // domain: unit square [1,1] x [1,1]
77+ // optimizer: gradient descent, backtracking adaptive step
78+ // lambda: fixed
79+ // order FE: 1
80+ TEST (depde_test, fixed_smoothing_gradient_descent_backtracking_step) {
81+ // define domain
82+ MeshLoader<Triangulation<2 , 2 >> domain (" square_density" );
83+ // define regularizing PDE
84+ auto L = -laplacian<FEM>();
85+ DMatrix<double > u = DMatrix<double >::Zero (domain.mesh .n_cells () * 3 , 1 );
86+ PDE<Triangulation<2 , 2 >, decltype (L), DMatrix<double >, FEM, fem_order<1 >> problem (domain.mesh , L, u);
87+ // define model
88+ double lambda = 0.1 ;
89+ DEPDE<SpaceOnly> model (problem);
90+ model.set_lambda_D (lambda);
91+ // set model's data
92+ BlockFrame<double , int > df;
93+ df.insert (SPACE_LOCS, read_csv<double >(" ../data/models/depde/2D_test2/data.csv" ));
94+ model.set_data (df);
95+ model.set_optimizer (GradientDescent<fdapde::Dynamic, BacktrackingLineSearch> {1000 , 1e-5 , 1e-2 });
96+ model.set_g_init (read_csv<double >(" ../data/models/depde/2D_test2/f_init.csv" ).array ().log ());
97+ // solve density estimation problem
98+ model.init ();
99+ model.solve ();
100+ // test correctness
101+ EXPECT_TRUE (almost_equal (model.g (), " ../data/models/depde/2D_test2/g.mtx" ));
102+ }
57103
58- DMatrix<double > locs = read_csv<double >(" ../data/models/depde/2D_test1/data.csv" );
59- DVector<double > f_init = read_csv<double >(" ../data/models/depde/2D_test1/f_init.csv" );
60- model.set_spatial_locations (locs);
104+ // test 3
105+ // domain: unit square [1,1] x [1,1]
106+ // optimizer: BFGS, wolfe adaptive step
107+ // lambda: fixed
108+ // order FE: 1
109+ TEST (depde_test, fixed_smoothing_bfgs_wolfe_step) {
110+ // define domain
111+ MeshLoader<Triangulation<2 , 2 >> domain (" square_density" );
112+ // define regularizing PDE
113+ auto L = -laplacian<FEM>();
114+ DMatrix<double > u = DMatrix<double >::Zero (domain.mesh .n_cells () * 3 , 1 );
115+ PDE<Triangulation<2 , 2 >, decltype (L), DMatrix<double >, FEM, fem_order<1 >> problem (domain.mesh , L, u);
116+ // define model
117+ double lambda = 0.1 ;
118+ DEPDE<SpaceOnly> model (problem);
119+ model.set_lambda_D (lambda);
120+ // set model's data
121+ BlockFrame<double , int > df;
122+ df.insert (SPACE_LOCS, read_csv<double >(" ../data/models/depde/2D_test3/data.csv" ));
123+ model.set_data (df);
124+ model.set_optimizer (BFGS<fdapde::Dynamic, WolfeLineSearch> {1000 , 1e-5 , 1e-2 });
125+ model.set_g_init (read_csv<double >(" ../data/models/depde/2D_test3/f_init.csv" ).array ().log ());
126+ // solve density estimation problem
61127 model.init ();
62-
63- fdapde::core::BFGS<fdapde::Dynamic> opt (500 , 1e-5 , 1e-2 );
64- opt.optimize (model, f_init.array ().log ());
65-
66- std::cout << opt.optimum () << std::endl;
128+ model.solve ();
129+ // test correctness
130+ EXPECT_TRUE (almost_equal (model.g (), " ../data/models/depde/2D_test3/g.mtx" ));
131+ }
132+
133+ // test 4
134+ // domain: unit square [1,1] x [1,1]
135+ // optimizer: BFGS, backtracking adaptive step
136+ // lambda: K-fold cross validation, 5 folds
137+ // order FE: 1
138+ TEST (depde_test, kcv_smoothing_bfgs_backtracking_step) {
139+ // define domain
140+ MeshLoader<Triangulation<2 , 2 >> domain (" square_density" );
141+ // define regularizing PDE
142+ auto L = -laplacian<FEM>();
143+ DMatrix<double > u = DMatrix<double >::Zero (domain.mesh .n_cells () * 3 , 1 );
144+ PDE<Triangulation<2 , 2 >, decltype (L), DMatrix<double >, FEM, fem_order<1 >> problem (domain.mesh , L, u);
145+ // define model
146+ DVector<double > lambda_vect;
147+ lambda_vect.resize (4 );
148+ lambda_vect << 0.001 , 0.01 , 0.1 , 1 ;
149+ DEPDE<SpaceOnly> model (problem);
150+ // set model's data
151+ BlockFrame<double , int > df;
152+ df.insert (SPACE_LOCS, read_csv<double >(" ../data/models/depde/2D_test4/data.csv" ));
153+ model.set_data (df);
154+ model.set_optimizer (BFGS<fdapde::Dynamic, WolfeLineSearch> {1000 , 1e-5 , 1e-2 });
155+ DMatrix<double > f_init = read_csv<double >(" ../data/models/depde/2D_test4/f_init.csv" );
156+ // declare cross validation engine
157+ KCV kcv (5 , 10 );
158+ DVector<double > cv_error;
159+ cv_error.resize (lambda_vect.size ());
160+
161+ for (int i = 0 ; i < lambda_vect.rows (); ++i) {
162+ model.set_g_init (f_init.col (i).array ().log ());
163+ kcv.fit (model, SVector<1 >(lambda_vect[i]), DEPDE<SpaceOnly>::CVScore (model));
164+ cv_error[i] = kcv.avg_scores ()[0 ];
165+ }
166+ // test correctness
167+ EXPECT_TRUE (almost_equal (cv_error, " ../data/models/depde/2D_test4/cv_error.mtx" ));
67168}
0 commit comments