From 4aed0d3ae0399298a57a65334b1bdc6276ed08ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Laboissi=C3=A8re?= Date: Wed, 2 Mar 2022 03:37:21 -0300 Subject: Import octave-stk_2.7.0.orig.tar.gz [dgit import orig octave-stk_2.7.0.orig.tar.gz] --- CITATION | 23 + COPYING | 674 ++ ChangeLog | 8816 ++++++++++++++++++++ DESCRIPTION | 30 + INDEX | 568 ++ NEWS | 1255 +++ doc/AUTHORS.md | 33 + doc/README.md | 204 + inst/arrays/@stk_dataframe/abs.m | 38 + inst/arrays/@stk_dataframe/acos.m | 38 + inst/arrays/@stk_dataframe/acosd.m | 38 + inst/arrays/@stk_dataframe/acosh.m | 38 + inst/arrays/@stk_dataframe/and.m | 33 + inst/arrays/@stk_dataframe/apply.m | 74 + inst/arrays/@stk_dataframe/asin.m | 38 + inst/arrays/@stk_dataframe/asind.m | 38 + inst/arrays/@stk_dataframe/asinh.m | 38 + inst/arrays/@stk_dataframe/atan.m | 38 + inst/arrays/@stk_dataframe/atand.m | 38 + inst/arrays/@stk_dataframe/atanh.m | 38 + inst/arrays/@stk_dataframe/bsxfun.m | 126 + inst/arrays/@stk_dataframe/cat.m | 69 + inst/arrays/@stk_dataframe/cos.m | 38 + inst/arrays/@stk_dataframe/cosd.m | 38 + inst/arrays/@stk_dataframe/cosh.m | 38 + inst/arrays/@stk_dataframe/ctranspose.m | 47 + inst/arrays/@stk_dataframe/diff.m | 33 + inst/arrays/@stk_dataframe/disp.m | 65 + inst/arrays/@stk_dataframe/display.m | 50 + inst/arrays/@stk_dataframe/double.m | 52 + inst/arrays/@stk_dataframe/end.m | 63 + inst/arrays/@stk_dataframe/eq.m | 33 + inst/arrays/@stk_dataframe/exp.m | 38 + inst/arrays/@stk_dataframe/expm1.m | 38 + inst/arrays/@stk_dataframe/fieldnames.m | 56 + inst/arrays/@stk_dataframe/find.m | 45 + inst/arrays/@stk_dataframe/ge.m | 33 + inst/arrays/@stk_dataframe/get.m | 55 + inst/arrays/@stk_dataframe/gt.m | 33 + inst/arrays/@stk_dataframe/horzcat.m | 178 + inst/arrays/@stk_dataframe/isempty.m | 33 + inst/arrays/@stk_dataframe/isfinite.m | 38 + inst/arrays/@stk_dataframe/isinf.m | 38 + inst/arrays/@stk_dataframe/ismember.m | 70 + inst/arrays/@stk_dataframe/isnan.m | 38 + inst/arrays/@stk_dataframe/ldivide.m | 37 + inst/arrays/@stk_dataframe/le.m | 33 + inst/arrays/@stk_dataframe/length.m | 37 + inst/arrays/@stk_dataframe/log.m | 38 + inst/arrays/@stk_dataframe/log10.m | 38 + inst/arrays/@stk_dataframe/log1p.m | 38 + inst/arrays/@stk_dataframe/log2.m | 38 + inst/arrays/@stk_dataframe/logical.m | 52 + inst/arrays/@stk_dataframe/lt.m | 33 + inst/arrays/@stk_dataframe/max.m | 69 + inst/arrays/@stk_dataframe/mean.m | 43 + inst/arrays/@stk_dataframe/median.m | 43 + inst/arrays/@stk_dataframe/min.m | 69 + inst/arrays/@stk_dataframe/minus.m | 37 + inst/arrays/@stk_dataframe/mldivide.m | 88 + inst/arrays/@stk_dataframe/mode.m | 43 + inst/arrays/@stk_dataframe/mrdivide.m | 88 + inst/arrays/@stk_dataframe/mtimes.m | 98 + inst/arrays/@stk_dataframe/ne.m | 33 + inst/arrays/@stk_dataframe/not.m | 33 + inst/arrays/@stk_dataframe/openvar.m | 65 + inst/arrays/@stk_dataframe/or.m | 33 + inst/arrays/@stk_dataframe/plot.m | 326 + inst/arrays/@stk_dataframe/plotmatrix.m | 125 + inst/arrays/@stk_dataframe/plus.m | 38 + inst/arrays/@stk_dataframe/power.m | 37 + .../@stk_dataframe/private/get_column_number.m | 30 + inst/arrays/@stk_dataframe/private/names_errmsg.m | 44 + .../@stk_dataframe/private/process_cell_indices.m | 42 + .../@stk_dataframe/private/process_char_indices.m | 42 + .../@stk_dataframe/private/reserved_field_names.m | 34 + inst/arrays/@stk_dataframe/prod.m | 43 + inst/arrays/@stk_dataframe/quantile.m | 45 + inst/arrays/@stk_dataframe/rdivide.m | 37 + inst/arrays/@stk_dataframe/realpow.m | 37 + inst/arrays/@stk_dataframe/reshape.m | 45 + inst/arrays/@stk_dataframe/set.m | 110 + inst/arrays/@stk_dataframe/set_data.m | 58 + inst/arrays/@stk_dataframe/sin.m | 38 + inst/arrays/@stk_dataframe/sind.m | 38 + inst/arrays/@stk_dataframe/sinh.m | 38 + inst/arrays/@stk_dataframe/size.m | 45 + inst/arrays/@stk_dataframe/sort.m | 98 + inst/arrays/@stk_dataframe/sqrt.m | 38 + inst/arrays/@stk_dataframe/std.m | 47 + inst/arrays/@stk_dataframe/stk_boundingbox.m | 45 + inst/arrays/@stk_dataframe/stk_conditioning.m | 99 + inst/arrays/@stk_dataframe/stk_dataframe.m | 366 + inst/arrays/@stk_dataframe/stk_get_sample_size.m | 40 + inst/arrays/@stk_dataframe/stk_length.m | 42 + inst/arrays/@stk_dataframe/stk_normalize.m | 64 + inst/arrays/@stk_dataframe/stk_rescale.m | 53 + inst/arrays/@stk_dataframe/stk_sprintf.m | 181 + inst/arrays/@stk_dataframe/stk_sprintf_colnames.m | 45 + inst/arrays/@stk_dataframe/stk_sprintf_rownames.m | 45 + inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m | 36 + inst/arrays/@stk_dataframe/subsasgn.m | 424 + inst/arrays/@stk_dataframe/subsref.m | 170 + inst/arrays/@stk_dataframe/sum.m | 43 + inst/arrays/@stk_dataframe/tan.m | 38 + inst/arrays/@stk_dataframe/tand.m | 38 + inst/arrays/@stk_dataframe/tanh.m | 38 + inst/arrays/@stk_dataframe/times.m | 37 + inst/arrays/@stk_dataframe/transpose.m | 44 + inst/arrays/@stk_dataframe/uminus.m | 33 + inst/arrays/@stk_dataframe/unique.m | 55 + inst/arrays/@stk_dataframe/uplus.m | 31 + inst/arrays/@stk_dataframe/var.m | 47 + inst/arrays/@stk_dataframe/vertcat.m | 207 + inst/arrays/@stk_dataframe/xlim.m | 43 + inst/arrays/@stk_dataframe/xor.m | 33 + inst/arrays/@stk_dataframe/ylim.m | 43 + inst/arrays/@stk_factorialdesign/contour.m | 36 + inst/arrays/@stk_factorialdesign/fieldnames.m | 43 + inst/arrays/@stk_factorialdesign/get.m | 44 + inst/arrays/@stk_factorialdesign/ismember.m | 108 + inst/arrays/@stk_factorialdesign/mesh.m | 36 + inst/arrays/@stk_factorialdesign/meshc.m | 36 + inst/arrays/@stk_factorialdesign/meshz.m | 36 + inst/arrays/@stk_factorialdesign/ndgrid.m | 100 + inst/arrays/@stk_factorialdesign/pcolor.m | 36 + .../private/plot_surfmeshcontour.m | 170 + inst/arrays/@stk_factorialdesign/set.m | 61 + inst/arrays/@stk_factorialdesign/stk_boundingbox.m | 52 + inst/arrays/@stk_factorialdesign/stk_dataframe.m | 90 + .../@stk_factorialdesign/stk_factorialdesign.m | 282 + inst/arrays/@stk_factorialdesign/stk_normalize.m | 49 + inst/arrays/@stk_factorialdesign/stk_rescale.m | 51 + inst/arrays/@stk_factorialdesign/stk_sprintf.m | 71 + .../@stk_factorialdesign/stk_sprintf_levels.m | 57 + inst/arrays/@stk_factorialdesign/subsasgn.m | 60 + inst/arrays/@stk_factorialdesign/surf.m | 36 + inst/arrays/@stk_factorialdesign/uminus.m | 40 + inst/arrays/@stk_hrect/axis.m | 70 + inst/arrays/@stk_hrect/disp.m | 33 + inst/arrays/@stk_hrect/display.m | 39 + inst/arrays/@stk_hrect/get.m | 53 + inst/arrays/@stk_hrect/horzcat.m | 90 + inst/arrays/@stk_hrect/ismember.m | 96 + inst/arrays/@stk_hrect/stk_boundingbox.m | 46 + inst/arrays/@stk_hrect/stk_dataframe.m | 91 + inst/arrays/@stk_hrect/stk_hrect.m | 115 + inst/arrays/@stk_hrect/stk_normalize.m | 76 + inst/arrays/@stk_hrect/stk_rescale.m | 125 + inst/arrays/@stk_hrect/subsasgn.m | 48 + inst/arrays/@stk_hrect/subsref.m | 71 + inst/arrays/@stk_hrect/vertcat.m | 60 + inst/arrays/generic/stk_boundingbox.m | 64 + inst/arrays/generic/stk_commonsize.m | 82 + inst/arrays/generic/stk_feval.m | 370 + inst/arrays/generic/stk_get_sample_size.m | 41 + inst/arrays/generic/stk_length.m | 40 + inst/arrays/generic/stk_normalize.m | 59 + inst/arrays/generic/stk_rescale.m | 65 + inst/arrays/generic/stk_sprintf.m | 83 + inst/arrays/generic/stk_sprintf_colnames.m | 48 + inst/arrays/generic/stk_sprintf_rownames.m | 48 + inst/arrays/generic/stk_sprintf_sizetype.m | 49 + inst/core/@stk_kreq_qr/disp.m | 33 + inst/core/@stk_kreq_qr/display.m | 37 + inst/core/@stk_kreq_qr/get.m | 109 + inst/core/@stk_kreq_qr/linsolve.m | 44 + inst/core/@stk_kreq_qr/private/compute_P_scaling.m | 36 + inst/core/@stk_kreq_qr/stk_kreq_qr.m | 78 + inst/core/@stk_kreq_qr/stk_set_righthandside.m | 46 + inst/core/@stk_kreq_qr/stk_squared_seminorm.m | 52 + inst/core/@stk_kreq_qr/subsref.m | 51 + inst/core/stk_cholcov.m | 114 + inst/core/stk_make_matcov.m | 124 + inst/core/stk_model_update.m | 58 + inst/core/stk_predict.m | 164 + inst/core/stk_predict_leaveoneout.m | 118 + inst/covfcs/rbf/stk_rbf_exponential.m | 116 + inst/covfcs/rbf/stk_rbf_gauss.m | 86 + inst/covfcs/rbf/stk_rbf_matern.m | 160 + inst/covfcs/rbf/stk_rbf_matern32.m | 102 + inst/covfcs/rbf/stk_rbf_matern52.m | 102 + inst/covfcs/rbf/stk_rbf_spherical.m | 93 + inst/covfcs/rbf/stk_sf_gausscorr.m | 35 + inst/covfcs/rbf/stk_sf_matern.m | 35 + inst/covfcs/rbf/stk_sf_matern32.m | 35 + inst/covfcs/rbf/stk_sf_matern52.m | 35 + inst/covfcs/stk_discretecov.m | 106 + inst/covfcs/stk_expcov_aniso.m | 201 + inst/covfcs/stk_expcov_iso.m | 172 + inst/covfcs/stk_gausscov_aniso.m | 201 + inst/covfcs/stk_gausscov_iso.m | 171 + inst/covfcs/stk_materncov32_aniso.m | 203 + inst/covfcs/stk_materncov32_iso.m | 172 + inst/covfcs/stk_materncov52_aniso.m | 195 + inst/covfcs/stk_materncov52_iso.m | 172 + inst/covfcs/stk_materncov_aniso.m | 201 + inst/covfcs/stk_materncov_iso.m | 179 + inst/covfcs/stk_noisecov.m | 93 + inst/covfcs/stk_sphcov_aniso.m | 202 + inst/covfcs/stk_sphcov_iso.m | 172 + inst/examples/01_kriging_basics/stk_example_kb01.m | 110 + .../examples/01_kriging_basics/stk_example_kb01n.m | 111 + inst/examples/01_kriging_basics/stk_example_kb02.m | 89 + .../examples/01_kriging_basics/stk_example_kb02n.m | 95 + inst/examples/01_kriging_basics/stk_example_kb03.m | 156 + inst/examples/01_kriging_basics/stk_example_kb04.m | 33 + inst/examples/01_kriging_basics/stk_example_kb05.m | 124 + inst/examples/01_kriging_basics/stk_example_kb06.m | 101 + inst/examples/01_kriging_basics/stk_example_kb07.m | 97 + inst/examples/01_kriging_basics/stk_example_kb08.m | 97 + inst/examples/01_kriging_basics/stk_example_kb09.m | 85 + inst/examples/01_kriging_basics/stk_example_kb10.m | 70 + .../02_design_of_experiments/stk_example_doe01.m | 77 + .../02_design_of_experiments/stk_example_doe02.m | 87 + .../02_design_of_experiments/stk_example_doe03.m | 183 + .../02_design_of_experiments/stk_example_doe04.m | 103 + .../02_design_of_experiments/stk_example_doe05.m | 205 + .../02_design_of_experiments/stk_example_doe06.m | 246 + .../examples/03_miscellaneous/stk_example_misc01.m | 76 + .../examples/03_miscellaneous/stk_example_misc02.m | 136 + .../examples/03_miscellaneous/stk_example_misc03.m | 95 + .../examples/03_miscellaneous/stk_example_misc04.m | 102 + .../examples/03_miscellaneous/stk_example_misc05.m | 106 + inst/examples/datasets/stk_dataset_twobumps.m | 152 + inst/examples/test_functions/stk_testcase_truss3.m | 242 + .../examples/test_functions/stk_testfun_borehole.m | 95 + .../test_functions/stk_testfun_braninhoo.m | 57 + .../test_functions/stk_testfun_goldsteinprice.m | 97 + .../test_functions/stk_testfun_truss3_bb.m | 129 + .../test_functions/stk_testfun_truss3_vol.m | 71 + .../examples/test_functions/stk_testfun_twobumps.m | 57 + inst/lm/@stk_lm_affine/feval.m | 41 + inst/lm/@stk_lm_affine/stk_lm_affine.m | 41 + inst/lm/@stk_lm_constant/feval.m | 41 + inst/lm/@stk_lm_constant/stk_lm_constant.m | 41 + inst/lm/@stk_lm_cubic/feval.m | 62 + inst/lm/@stk_lm_cubic/stk_lm_cubic.m | 41 + inst/lm/@stk_lm_matrix/feval.m | 40 + inst/lm/@stk_lm_matrix/stk_lm_matrix.m | 61 + inst/lm/@stk_lm_null/feval.m | 40 + inst/lm/@stk_lm_null/stk_lm_null.m | 41 + inst/lm/@stk_lm_quadratic/feval.m | 51 + inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m | 41 + inst/lm/stk_lm_polynomial.m | 85 + inst/misc/benchmarks/stk_benchmark_.m | 63 + inst/misc/benchmarks/stk_benchmark_bivnorm.m | 69 + inst/misc/benchmarks/stk_benchmark_cov1.m | 49 + inst/misc/benchmarks/stk_benchmark_cov2.m | 127 + inst/misc/benchmarks/stk_benchmark_examples.m | 93 + inst/misc/benchmarks/stk_benchmark_init.m | 43 + inst/misc/benchmarks/stk_benchmark_logdet.m | 62 + inst/misc/benchmarks/stk_benchmark_loocv.m | 85 + inst/misc/benchmarks/stk_benchmark_paramestim.m | 94 + inst/misc/benchmarks/stk_benchmark_predict.m | 92 + .../benchmarks/stk_benchmark_uppertriangular.m | 92 + inst/misc/design/stk_maxabscorr.m | 76 + inst/misc/design/stk_phipcrit.m | 124 + inst/misc/dist/stk_dist.m | 136 + inst/misc/dist/stk_filldist.m | 201 + inst/misc/dist/stk_filldist_discretized.m | 138 + inst/misc/dist/stk_filldist_exact.m | 200 + inst/misc/dist/stk_gpquadform.m | 183 + inst/misc/dist/stk_mindist.m | 117 + inst/misc/distrib/stk_distrib_bivnorm_cdf.m | 187 + inst/misc/distrib/stk_distrib_logpdf.m | 55 + inst/misc/distrib/stk_distrib_logpdf_grad.m | 55 + inst/misc/distrib/stk_distrib_normal_cdf.m | 117 + inst/misc/distrib/stk_distrib_normal_crps.m | 142 + inst/misc/distrib/stk_distrib_normal_ei.m | 145 + inst/misc/distrib/stk_distrib_normal_pdf.m | 74 + inst/misc/distrib/stk_distrib_student_cdf.m | 98 + inst/misc/distrib/stk_distrib_student_ei.m | 139 + inst/misc/distrib/stk_distrib_student_pdf.m | 82 + inst/misc/error/stk_assert_box.m | 74 + inst/misc/error/stk_assert_model_struct.m | 45 + inst/misc/error/stk_assert_no_duplicates.m | 51 + inst/misc/error/stk_error.m | 95 + .../stk_minimize_boxconstrained.m | 49 + .../optim/@stk_optim_fmincon/stk_optim_fmincon.m | 81 + .../stk_minimize_boxconstrained.m | 62 + .../stk_minimize_unconstrained.m | 48 + .../@stk_optim_fminsearch/stk_optim_fminsearch.m | 62 + .../@stk_optim_octavesqp/private/sqp_quadprog.m | 830 ++ .../private/sqp_quadprog_testf.m | 5 + .../private/sqp_quadprog_testg.m | 7 + .../stk_minimize_boxconstrained.m | 62 + .../stk_minimize_unconstrained.m | 48 + .../@stk_optim_octavesqp/stk_optim_octavesqp.m | 99 + .../@stk_optim_optimizer_/stk_optim_isavailable.m | 43 + .../@stk_optim_optimizer_/stk_optim_optimizer_.m | 58 + inst/misc/optim/stk_minimize_boxconstrained.m | 87 + inst/misc/optim/stk_minimize_unconstrained.m | 87 + inst/misc/optim/stk_optim_isavailable.m | 59 + inst/misc/optim/stk_optim_testmin_box.m | 79 + inst/misc/optim/stk_optim_testmin_unc.m | 72 + inst/misc/options/stk_options_get.m | 88 + inst/misc/options/stk_options_set.m | 192 + .../stk_parallel_engine_none.m | 37 + .../@stk_parallel_engine_none/stk_parallel_feval.m | 48 + .../@stk_parallel_engine_none/stk_parallel_stop.m | 33 + .../stk_parallel_engine_parfor.m | 59 + .../stk_parallel_feval.m | 60 + .../stk_parallel_stop.m | 39 + inst/misc/parallel/stk_parallel_cutblocks.m | 56 + inst/misc/parallel/stk_parallel_engine_get.m | 33 + inst/misc/parallel/stk_parallel_engine_set.m | 51 + inst/misc/parallel/stk_parallel_feval.m | 42 + inst/misc/parallel/stk_parallel_start.m | 50 + inst/misc/parallel/stk_parallel_stop.m | 33 + inst/misc/pareto/stk_dominatedhv.m | 374 + inst/misc/pareto/stk_isdominated.m | 117 + inst/misc/pareto/stk_paretofind.m | 102 + inst/misc/plot/stk_axes.m | 45 + inst/misc/plot/stk_figure.m | 61 + inst/misc/plot/stk_labels.m | 49 + inst/misc/plot/stk_legend.m | 64 + inst/misc/plot/stk_plot_getaxesarg.m | 60 + inst/misc/plot/stk_plot_shadedci.m | 111 + inst/misc/plot/stk_subplot.m | 50 + inst/misc/plot/stk_title.m | 53 + inst/misc/plot/stk_xlabel.m | 49 + inst/misc/plot/stk_ylabel.m | 49 + inst/misc/plot/stk_zlabel.m | 49 + inst/misc/test/stk_is_lhs.m | 96 + inst/misc/test/stk_isequal_tolabs.m | 129 + inst/misc/test/stk_isequal_tolrel.m | 139 + inst/misc/test/stk_runtests.m | 319 + inst/misc/test/stk_test.m | 704 ++ inst/misc/test/stk_test_class.m | 110 + inst/misc/test/stk_test_critgrad.m | 171 + inst/misc/test/stk_test_dfbinaryop.m | 67 + inst/misc/text/stk_disp_examplewelcome.m | 48 + inst/misc/text/stk_disp_getformat.m | 120 + inst/misc/text/stk_disp_isloose.m | 48 + inst/misc/text/stk_disp_progress.m | 71 + inst/misc/text/stk_sprintf_colvect.m | 59 + inst/misc/text/stk_sprintf_colvect_fixedpoint.m | 147 + inst/misc/text/stk_sprintf_colvect_scientific.m | 232 + inst/misc/text/stk_sprintf_framed.m | 35 + inst/model/@stk_model_/cat.m | 34 + inst/model/@stk_model_/disp.m | 47 + inst/model/@stk_model_/display.m | 48 + inst/model/@stk_model_/get.m | 39 + inst/model/@stk_model_/horzcat.m | 34 + inst/model/@stk_model_/set.m | 38 + inst/model/@stk_model_/stk_covmat_noise.m | 37 + inst/model/@stk_model_/stk_get_input_data.m | 37 + .../@stk_model_/stk_get_observation_variances.m | 35 + inst/model/@stk_model_/stk_get_output_data.m | 35 + inst/model/@stk_model_/stk_get_prior_model.m | 37 + inst/model/@stk_model_/stk_get_sample_size.m | 35 + inst/model/@stk_model_/stk_model_.m | 41 + inst/model/@stk_model_/stk_predict_.m | 36 + inst/model/@stk_model_/subsasgn.m | 48 + inst/model/@stk_model_/subsref.m | 45 + inst/model/@stk_model_/vertcat.m | 34 + inst/model/@stk_model_gpposterior/disp.m | 76 + inst/model/@stk_model_gpposterior/fieldnames.m | 37 + inst/model/@stk_model_gpposterior/get.m | 64 + inst/model/@stk_model_gpposterior/set.m | 75 + .../@stk_model_gpposterior/stk_covmat_noise.m | 47 + .../stk_generate_samplepaths.m | 80 + .../@stk_model_gpposterior/stk_get_input_data.m | 33 + .../stk_get_observation_variances.m | 33 + .../stk_get_optimizable_noise_parameters.m | 33 + .../stk_get_optimizable_parameters.m | 41 + .../@stk_model_gpposterior/stk_get_output_data.m | 33 + .../@stk_model_gpposterior/stk_get_prior_model.m | 33 + .../@stk_model_gpposterior/stk_get_sample_size.m | 33 + inst/model/@stk_model_gpposterior/stk_isnoisy.m | 34 + inst/model/@stk_model_gpposterior/stk_make_kreq.m | 38 + .../@stk_model_gpposterior/stk_model_gpposterior.m | 145 + .../@stk_model_gpposterior/stk_model_update.m | 113 + inst/model/@stk_model_gpposterior/stk_predict_.m | 255 + .../stk_predict_leaveoneout.m | 122 + .../stk_predict_leaveoneout_direct.m | 90 + .../stk_set_optimizable_parameters.m | 41 + inst/model/noise/@stk_gaussiannoise_/disp.m | 52 + inst/model/noise/@stk_gaussiannoise_/stk_covmat.m | 78 + .../noise/@stk_gaussiannoise_/stk_covmat_noise.m | 47 + .../noise/@stk_gaussiannoise_/stk_gaussiannoise_.m | 33 + inst/model/noise/@stk_gaussiannoise_/stk_isnoisy.m | 33 + .../model/noise/@stk_gaussiannoise_/stk_predict_.m | 51 + inst/model/noise/@stk_gaussiannoise_het0/disp.m | 59 + .../noise/@stk_gaussiannoise_het0/fieldnames.m | 33 + inst/model/noise/@stk_gaussiannoise_het0/get.m | 49 + inst/model/noise/@stk_gaussiannoise_het0/set.m | 65 + .../stk_gaussiannoise_het0.m | 73 + .../stk_get_optimizable_parameters.m | 33 + .../stk_param_getdefaultbounds.m | 55 + .../stk_set_optimizable_parameters.m | 54 + .../@stk_gaussiannoise_het0/stk_variance_eval.m | 73 + inst/model/prior_struct/stk_covmat_noise.m | 199 + inst/model/prior_struct/stk_get_input_data.m | 50 + .../prior_struct/stk_get_observation_variances.m | 41 + .../stk_get_optimizable_model_parameters.m | 51 + .../stk_get_optimizable_noise_parameters.m | 60 + inst/model/prior_struct/stk_get_output_data.m | 42 + inst/model/prior_struct/stk_get_prior_model.m | 42 + inst/model/prior_struct/stk_isnoisy.m | 73 + inst/model/prior_struct/stk_model.m | 195 + inst/model/prior_struct/stk_model_fixlm.m | 79 + inst/model/prior_struct/stk_ortho_func.m | 105 + inst/model/prior_struct/stk_predict_.m | 76 + .../stk_set_optimizable_model_parameters.m | 72 + .../param/classes/stk_get_optimizable_parameters.m | 88 + .../param/classes/stk_set_optimizable_parameters.m | 81 + inst/param/estim/stk_param_estim.m | 304 + inst/param/estim/stk_param_estim_optim.m | 148 + inst/param/estim/stk_param_getdefaultbounds.m | 152 + inst/param/estim/stk_param_getdefaultbounds_lnv.m | 66 + inst/param/estim/stk_param_gls.m | 105 + inst/param/estim/stk_param_init.m | 506 ++ inst/param/estim/stk_param_init_lnv.m | 117 + inst/param/estim/stk_param_init_remlgls.m | 114 + inst/param/estim/stk_param_relik.m | 257 + inst/sampling/@stk_function/disp.m | 63 + inst/sampling/@stk_function/display.m | 48 + inst/sampling/@stk_function/feval.m | 36 + inst/sampling/@stk_function/get.m | 33 + inst/sampling/@stk_function/horzcat.m | 36 + inst/sampling/@stk_function/stk_function.m | 66 + inst/sampling/@stk_function/subsasgn.m | 50 + inst/sampling/@stk_function/subsref.m | 53 + inst/sampling/@stk_function/vertcat.m | 36 + inst/sampling/@stk_sampcrit_akg/disp.m | 64 + inst/sampling/@stk_sampcrit_akg/feval.m | 57 + inst/sampling/@stk_sampcrit_akg/get.m | 33 + inst/sampling/@stk_sampcrit_akg/set.m | 89 + inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m | 186 + inst/sampling/@stk_sampcrit_ei/disp.m | 56 + inst/sampling/@stk_sampcrit_ei/feval.m | 37 + inst/sampling/@stk_sampcrit_ei/get.m | 33 + inst/sampling/@stk_sampcrit_ei/set.m | 69 + inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m | 109 + inst/sampling/@stk_sampcrit_eqi/disp.m | 64 + inst/sampling/@stk_sampcrit_eqi/feval.m | 70 + inst/sampling/@stk_sampcrit_eqi/get.m | 33 + inst/sampling/@stk_sampcrit_eqi/set.m | 127 + inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m | 203 + inst/sampling/stk_halfpintl.m | 194 + inst/sampling/stk_sampcrit_akg_eval.m | 228 + inst/sampling/stk_sampcrit_ehvi_eval.m | 135 + inst/sampling/stk_sampcrit_ei_eval.m | 95 + inst/sampling/stk_sampcrit_emmi_eval.m | 117 + inst/sampling/stk_sampling_halton_rr2.m | 138 + inst/sampling/stk_sampling_maximinlhs.m | 161 + inst/sampling/stk_sampling_nesteddesign.m | 223 + inst/sampling/stk_sampling_nestedlhs.m | 278 + inst/sampling/stk_sampling_olhs.m | 275 + inst/sampling/stk_sampling_randomlhs.m | 104 + inst/sampling/stk_sampling_randunif.m | 120 + inst/sampling/stk_sampling_regulargrid.m | 144 + inst/sampling/stk_sampling_sobol.m | 117 + inst/sampling/stk_sampling_vdc_rr2.m | 59 + inst/stk_init.m | 274 + inst/stk_version.m | 34 + inst/utils/stk_conditioning.m | 163 + inst/utils/stk_generate_samplepaths.m | 234 + inst/utils/stk_plot1d.m | 122 + inst/utils/stk_plot_histnormres.m | 93 + inst/utils/stk_plot_predvsobs.m | 70 + inst/utils/stk_plot_probdom2d.m | 166 + inst/utils/stk_pmisclass.m | 101 + inst/utils/stk_simulate_noise.m | 73 + src/Makefile | 37 + src/get_column_number.c | 194 + src/pareto.h | 293 + src/primes.h | 1013 +++ src/stk_dist_matrixx.c | 97 + src/stk_dist_matrixy.c | 97 + src/stk_dist_pairwise.c | 94 + src/stk_distrib_bivnorm0_cdf.c | 485 ++ src/stk_dominatedhv_mex.c | 298 + src/stk_filldist_discr_mex.c | 121 + src/stk_gpquadform_matrixx.c | 119 + src/stk_gpquadform_matrixy.c | 135 + src/stk_gpquadform_pairwise.c | 113 + src/stk_isdominated_mex.c | 109 + src/stk_mex.h | 117 + src/stk_mindist_mex.c | 106 + src/stk_paretofind_mex.c | 91 + src/stk_sampling_sobol_mex.c | 1267 +++ src/stk_sampling_vdc_rr2.c | 372 + src/wfg.c | 1095 +++ src/wfg.h | 99 + 487 files changed, 57603 insertions(+) create mode 100644 CITATION create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 DESCRIPTION create mode 100644 INDEX create mode 100644 NEWS create mode 100644 doc/AUTHORS.md create mode 100644 doc/README.md create mode 100644 inst/arrays/@stk_dataframe/abs.m create mode 100644 inst/arrays/@stk_dataframe/acos.m create mode 100644 inst/arrays/@stk_dataframe/acosd.m create mode 100644 inst/arrays/@stk_dataframe/acosh.m create mode 100644 inst/arrays/@stk_dataframe/and.m create mode 100644 inst/arrays/@stk_dataframe/apply.m create mode 100644 inst/arrays/@stk_dataframe/asin.m create mode 100644 inst/arrays/@stk_dataframe/asind.m create mode 100644 inst/arrays/@stk_dataframe/asinh.m create mode 100644 inst/arrays/@stk_dataframe/atan.m create mode 100644 inst/arrays/@stk_dataframe/atand.m create mode 100644 inst/arrays/@stk_dataframe/atanh.m create mode 100644 inst/arrays/@stk_dataframe/bsxfun.m create mode 100644 inst/arrays/@stk_dataframe/cat.m create mode 100644 inst/arrays/@stk_dataframe/cos.m create mode 100644 inst/arrays/@stk_dataframe/cosd.m create mode 100644 inst/arrays/@stk_dataframe/cosh.m create mode 100644 inst/arrays/@stk_dataframe/ctranspose.m create mode 100644 inst/arrays/@stk_dataframe/diff.m create mode 100644 inst/arrays/@stk_dataframe/disp.m create mode 100644 inst/arrays/@stk_dataframe/display.m create mode 100644 inst/arrays/@stk_dataframe/double.m create mode 100644 inst/arrays/@stk_dataframe/end.m create mode 100644 inst/arrays/@stk_dataframe/eq.m create mode 100644 inst/arrays/@stk_dataframe/exp.m create mode 100644 inst/arrays/@stk_dataframe/expm1.m create mode 100644 inst/arrays/@stk_dataframe/fieldnames.m create mode 100644 inst/arrays/@stk_dataframe/find.m create mode 100644 inst/arrays/@stk_dataframe/ge.m create mode 100644 inst/arrays/@stk_dataframe/get.m create mode 100644 inst/arrays/@stk_dataframe/gt.m create mode 100644 inst/arrays/@stk_dataframe/horzcat.m create mode 100644 inst/arrays/@stk_dataframe/isempty.m create mode 100644 inst/arrays/@stk_dataframe/isfinite.m create mode 100644 inst/arrays/@stk_dataframe/isinf.m create mode 100644 inst/arrays/@stk_dataframe/ismember.m create mode 100644 inst/arrays/@stk_dataframe/isnan.m create mode 100644 inst/arrays/@stk_dataframe/ldivide.m create mode 100644 inst/arrays/@stk_dataframe/le.m create mode 100644 inst/arrays/@stk_dataframe/length.m create mode 100644 inst/arrays/@stk_dataframe/log.m create mode 100644 inst/arrays/@stk_dataframe/log10.m create mode 100644 inst/arrays/@stk_dataframe/log1p.m create mode 100644 inst/arrays/@stk_dataframe/log2.m create mode 100644 inst/arrays/@stk_dataframe/logical.m create mode 100644 inst/arrays/@stk_dataframe/lt.m create mode 100644 inst/arrays/@stk_dataframe/max.m create mode 100644 inst/arrays/@stk_dataframe/mean.m create mode 100644 inst/arrays/@stk_dataframe/median.m create mode 100644 inst/arrays/@stk_dataframe/min.m create mode 100644 inst/arrays/@stk_dataframe/minus.m create mode 100644 inst/arrays/@stk_dataframe/mldivide.m create mode 100644 inst/arrays/@stk_dataframe/mode.m create mode 100644 inst/arrays/@stk_dataframe/mrdivide.m create mode 100644 inst/arrays/@stk_dataframe/mtimes.m create mode 100644 inst/arrays/@stk_dataframe/ne.m create mode 100644 inst/arrays/@stk_dataframe/not.m create mode 100644 inst/arrays/@stk_dataframe/openvar.m create mode 100644 inst/arrays/@stk_dataframe/or.m create mode 100644 inst/arrays/@stk_dataframe/plot.m create mode 100644 inst/arrays/@stk_dataframe/plotmatrix.m create mode 100644 inst/arrays/@stk_dataframe/plus.m create mode 100644 inst/arrays/@stk_dataframe/power.m create mode 100644 inst/arrays/@stk_dataframe/private/get_column_number.m create mode 100644 inst/arrays/@stk_dataframe/private/names_errmsg.m create mode 100644 inst/arrays/@stk_dataframe/private/process_cell_indices.m create mode 100644 inst/arrays/@stk_dataframe/private/process_char_indices.m create mode 100644 inst/arrays/@stk_dataframe/private/reserved_field_names.m create mode 100644 inst/arrays/@stk_dataframe/prod.m create mode 100644 inst/arrays/@stk_dataframe/quantile.m create mode 100644 inst/arrays/@stk_dataframe/rdivide.m create mode 100644 inst/arrays/@stk_dataframe/realpow.m create mode 100644 inst/arrays/@stk_dataframe/reshape.m create mode 100644 inst/arrays/@stk_dataframe/set.m create mode 100644 inst/arrays/@stk_dataframe/set_data.m create mode 100644 inst/arrays/@stk_dataframe/sin.m create mode 100644 inst/arrays/@stk_dataframe/sind.m create mode 100644 inst/arrays/@stk_dataframe/sinh.m create mode 100644 inst/arrays/@stk_dataframe/size.m create mode 100644 inst/arrays/@stk_dataframe/sort.m create mode 100644 inst/arrays/@stk_dataframe/sqrt.m create mode 100644 inst/arrays/@stk_dataframe/std.m create mode 100644 inst/arrays/@stk_dataframe/stk_boundingbox.m create mode 100644 inst/arrays/@stk_dataframe/stk_conditioning.m create mode 100644 inst/arrays/@stk_dataframe/stk_dataframe.m create mode 100644 inst/arrays/@stk_dataframe/stk_get_sample_size.m create mode 100644 inst/arrays/@stk_dataframe/stk_length.m create mode 100644 inst/arrays/@stk_dataframe/stk_normalize.m create mode 100644 inst/arrays/@stk_dataframe/stk_rescale.m create mode 100644 inst/arrays/@stk_dataframe/stk_sprintf.m create mode 100644 inst/arrays/@stk_dataframe/stk_sprintf_colnames.m create mode 100644 inst/arrays/@stk_dataframe/stk_sprintf_rownames.m create mode 100644 inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m create mode 100644 inst/arrays/@stk_dataframe/subsasgn.m create mode 100644 inst/arrays/@stk_dataframe/subsref.m create mode 100644 inst/arrays/@stk_dataframe/sum.m create mode 100644 inst/arrays/@stk_dataframe/tan.m create mode 100644 inst/arrays/@stk_dataframe/tand.m create mode 100644 inst/arrays/@stk_dataframe/tanh.m create mode 100644 inst/arrays/@stk_dataframe/times.m create mode 100644 inst/arrays/@stk_dataframe/transpose.m create mode 100644 inst/arrays/@stk_dataframe/uminus.m create mode 100644 inst/arrays/@stk_dataframe/unique.m create mode 100644 inst/arrays/@stk_dataframe/uplus.m create mode 100644 inst/arrays/@stk_dataframe/var.m create mode 100644 inst/arrays/@stk_dataframe/vertcat.m create mode 100644 inst/arrays/@stk_dataframe/xlim.m create mode 100644 inst/arrays/@stk_dataframe/xor.m create mode 100644 inst/arrays/@stk_dataframe/ylim.m create mode 100644 inst/arrays/@stk_factorialdesign/contour.m create mode 100644 inst/arrays/@stk_factorialdesign/fieldnames.m create mode 100644 inst/arrays/@stk_factorialdesign/get.m create mode 100644 inst/arrays/@stk_factorialdesign/ismember.m create mode 100644 inst/arrays/@stk_factorialdesign/mesh.m create mode 100644 inst/arrays/@stk_factorialdesign/meshc.m create mode 100644 inst/arrays/@stk_factorialdesign/meshz.m create mode 100644 inst/arrays/@stk_factorialdesign/ndgrid.m create mode 100644 inst/arrays/@stk_factorialdesign/pcolor.m create mode 100644 inst/arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m create mode 100644 inst/arrays/@stk_factorialdesign/set.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_boundingbox.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_dataframe.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_factorialdesign.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_normalize.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_rescale.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_sprintf.m create mode 100644 inst/arrays/@stk_factorialdesign/stk_sprintf_levels.m create mode 100644 inst/arrays/@stk_factorialdesign/subsasgn.m create mode 100644 inst/arrays/@stk_factorialdesign/surf.m create mode 100644 inst/arrays/@stk_factorialdesign/uminus.m create mode 100644 inst/arrays/@stk_hrect/axis.m create mode 100644 inst/arrays/@stk_hrect/disp.m create mode 100644 inst/arrays/@stk_hrect/display.m create mode 100644 inst/arrays/@stk_hrect/get.m create mode 100644 inst/arrays/@stk_hrect/horzcat.m create mode 100644 inst/arrays/@stk_hrect/ismember.m create mode 100644 inst/arrays/@stk_hrect/stk_boundingbox.m create mode 100644 inst/arrays/@stk_hrect/stk_dataframe.m create mode 100644 inst/arrays/@stk_hrect/stk_hrect.m create mode 100644 inst/arrays/@stk_hrect/stk_normalize.m create mode 100644 inst/arrays/@stk_hrect/stk_rescale.m create mode 100644 inst/arrays/@stk_hrect/subsasgn.m create mode 100644 inst/arrays/@stk_hrect/subsref.m create mode 100644 inst/arrays/@stk_hrect/vertcat.m create mode 100644 inst/arrays/generic/stk_boundingbox.m create mode 100644 inst/arrays/generic/stk_commonsize.m create mode 100644 inst/arrays/generic/stk_feval.m create mode 100644 inst/arrays/generic/stk_get_sample_size.m create mode 100644 inst/arrays/generic/stk_length.m create mode 100644 inst/arrays/generic/stk_normalize.m create mode 100644 inst/arrays/generic/stk_rescale.m create mode 100644 inst/arrays/generic/stk_sprintf.m create mode 100644 inst/arrays/generic/stk_sprintf_colnames.m create mode 100644 inst/arrays/generic/stk_sprintf_rownames.m create mode 100644 inst/arrays/generic/stk_sprintf_sizetype.m create mode 100644 inst/core/@stk_kreq_qr/disp.m create mode 100644 inst/core/@stk_kreq_qr/display.m create mode 100644 inst/core/@stk_kreq_qr/get.m create mode 100644 inst/core/@stk_kreq_qr/linsolve.m create mode 100644 inst/core/@stk_kreq_qr/private/compute_P_scaling.m create mode 100644 inst/core/@stk_kreq_qr/stk_kreq_qr.m create mode 100644 inst/core/@stk_kreq_qr/stk_set_righthandside.m create mode 100644 inst/core/@stk_kreq_qr/stk_squared_seminorm.m create mode 100644 inst/core/@stk_kreq_qr/subsref.m create mode 100644 inst/core/stk_cholcov.m create mode 100644 inst/core/stk_make_matcov.m create mode 100644 inst/core/stk_model_update.m create mode 100644 inst/core/stk_predict.m create mode 100644 inst/core/stk_predict_leaveoneout.m create mode 100644 inst/covfcs/rbf/stk_rbf_exponential.m create mode 100644 inst/covfcs/rbf/stk_rbf_gauss.m create mode 100644 inst/covfcs/rbf/stk_rbf_matern.m create mode 100644 inst/covfcs/rbf/stk_rbf_matern32.m create mode 100644 inst/covfcs/rbf/stk_rbf_matern52.m create mode 100644 inst/covfcs/rbf/stk_rbf_spherical.m create mode 100644 inst/covfcs/rbf/stk_sf_gausscorr.m create mode 100644 inst/covfcs/rbf/stk_sf_matern.m create mode 100644 inst/covfcs/rbf/stk_sf_matern32.m create mode 100644 inst/covfcs/rbf/stk_sf_matern52.m create mode 100644 inst/covfcs/stk_discretecov.m create mode 100644 inst/covfcs/stk_expcov_aniso.m create mode 100644 inst/covfcs/stk_expcov_iso.m create mode 100644 inst/covfcs/stk_gausscov_aniso.m create mode 100644 inst/covfcs/stk_gausscov_iso.m create mode 100644 inst/covfcs/stk_materncov32_aniso.m create mode 100644 inst/covfcs/stk_materncov32_iso.m create mode 100644 inst/covfcs/stk_materncov52_aniso.m create mode 100644 inst/covfcs/stk_materncov52_iso.m create mode 100644 inst/covfcs/stk_materncov_aniso.m create mode 100644 inst/covfcs/stk_materncov_iso.m create mode 100644 inst/covfcs/stk_noisecov.m create mode 100644 inst/covfcs/stk_sphcov_aniso.m create mode 100644 inst/covfcs/stk_sphcov_iso.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb01.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb01n.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb02.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb02n.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb03.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb04.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb05.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb06.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb07.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb08.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb09.m create mode 100644 inst/examples/01_kriging_basics/stk_example_kb10.m create mode 100644 inst/examples/02_design_of_experiments/stk_example_doe01.m create mode 100644 inst/examples/02_design_of_experiments/stk_example_doe02.m create mode 100644 inst/examples/02_design_of_experiments/stk_example_doe03.m create mode 100644 inst/examples/02_design_of_experiments/stk_example_doe04.m create mode 100644 inst/examples/02_design_of_experiments/stk_example_doe05.m create mode 100644 inst/examples/02_design_of_experiments/stk_example_doe06.m create mode 100644 inst/examples/03_miscellaneous/stk_example_misc01.m create mode 100644 inst/examples/03_miscellaneous/stk_example_misc02.m create mode 100644 inst/examples/03_miscellaneous/stk_example_misc03.m create mode 100644 inst/examples/03_miscellaneous/stk_example_misc04.m create mode 100644 inst/examples/03_miscellaneous/stk_example_misc05.m create mode 100644 inst/examples/datasets/stk_dataset_twobumps.m create mode 100644 inst/examples/test_functions/stk_testcase_truss3.m create mode 100644 inst/examples/test_functions/stk_testfun_borehole.m create mode 100644 inst/examples/test_functions/stk_testfun_braninhoo.m create mode 100644 inst/examples/test_functions/stk_testfun_goldsteinprice.m create mode 100644 inst/examples/test_functions/stk_testfun_truss3_bb.m create mode 100644 inst/examples/test_functions/stk_testfun_truss3_vol.m create mode 100644 inst/examples/test_functions/stk_testfun_twobumps.m create mode 100644 inst/lm/@stk_lm_affine/feval.m create mode 100644 inst/lm/@stk_lm_affine/stk_lm_affine.m create mode 100644 inst/lm/@stk_lm_constant/feval.m create mode 100644 inst/lm/@stk_lm_constant/stk_lm_constant.m create mode 100644 inst/lm/@stk_lm_cubic/feval.m create mode 100644 inst/lm/@stk_lm_cubic/stk_lm_cubic.m create mode 100644 inst/lm/@stk_lm_matrix/feval.m create mode 100644 inst/lm/@stk_lm_matrix/stk_lm_matrix.m create mode 100644 inst/lm/@stk_lm_null/feval.m create mode 100644 inst/lm/@stk_lm_null/stk_lm_null.m create mode 100644 inst/lm/@stk_lm_quadratic/feval.m create mode 100644 inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m create mode 100644 inst/lm/stk_lm_polynomial.m create mode 100644 inst/misc/benchmarks/stk_benchmark_.m create mode 100644 inst/misc/benchmarks/stk_benchmark_bivnorm.m create mode 100644 inst/misc/benchmarks/stk_benchmark_cov1.m create mode 100644 inst/misc/benchmarks/stk_benchmark_cov2.m create mode 100644 inst/misc/benchmarks/stk_benchmark_examples.m create mode 100644 inst/misc/benchmarks/stk_benchmark_init.m create mode 100644 inst/misc/benchmarks/stk_benchmark_logdet.m create mode 100644 inst/misc/benchmarks/stk_benchmark_loocv.m create mode 100644 inst/misc/benchmarks/stk_benchmark_paramestim.m create mode 100644 inst/misc/benchmarks/stk_benchmark_predict.m create mode 100644 inst/misc/benchmarks/stk_benchmark_uppertriangular.m create mode 100644 inst/misc/design/stk_maxabscorr.m create mode 100644 inst/misc/design/stk_phipcrit.m create mode 100644 inst/misc/dist/stk_dist.m create mode 100644 inst/misc/dist/stk_filldist.m create mode 100644 inst/misc/dist/stk_filldist_discretized.m create mode 100644 inst/misc/dist/stk_filldist_exact.m create mode 100644 inst/misc/dist/stk_gpquadform.m create mode 100644 inst/misc/dist/stk_mindist.m create mode 100644 inst/misc/distrib/stk_distrib_bivnorm_cdf.m create mode 100644 inst/misc/distrib/stk_distrib_logpdf.m create mode 100644 inst/misc/distrib/stk_distrib_logpdf_grad.m create mode 100644 inst/misc/distrib/stk_distrib_normal_cdf.m create mode 100644 inst/misc/distrib/stk_distrib_normal_crps.m create mode 100644 inst/misc/distrib/stk_distrib_normal_ei.m create mode 100644 inst/misc/distrib/stk_distrib_normal_pdf.m create mode 100644 inst/misc/distrib/stk_distrib_student_cdf.m create mode 100644 inst/misc/distrib/stk_distrib_student_ei.m create mode 100644 inst/misc/distrib/stk_distrib_student_pdf.m create mode 100644 inst/misc/error/stk_assert_box.m create mode 100644 inst/misc/error/stk_assert_model_struct.m create mode 100644 inst/misc/error/stk_assert_no_duplicates.m create mode 100644 inst/misc/error/stk_error.m create mode 100644 inst/misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m create mode 100644 inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m create mode 100644 inst/misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m create mode 100644 inst/misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m create mode 100644 inst/misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m create mode 100644 inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m create mode 100644 inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m create mode 100644 inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m create mode 100644 inst/misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m create mode 100644 inst/misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m create mode 100644 inst/misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m create mode 100644 inst/misc/optim/@stk_optim_optimizer_/stk_optim_isavailable.m create mode 100644 inst/misc/optim/@stk_optim_optimizer_/stk_optim_optimizer_.m create mode 100644 inst/misc/optim/stk_minimize_boxconstrained.m create mode 100644 inst/misc/optim/stk_minimize_unconstrained.m create mode 100644 inst/misc/optim/stk_optim_isavailable.m create mode 100644 inst/misc/optim/stk_optim_testmin_box.m create mode 100644 inst/misc/optim/stk_optim_testmin_unc.m create mode 100644 inst/misc/options/stk_options_get.m create mode 100644 inst/misc/options/stk_options_set.m create mode 100644 inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m create mode 100644 inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_feval.m create mode 100644 inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_stop.m create mode 100644 inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m create mode 100644 inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_feval.m create mode 100644 inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_stop.m create mode 100644 inst/misc/parallel/stk_parallel_cutblocks.m create mode 100644 inst/misc/parallel/stk_parallel_engine_get.m create mode 100644 inst/misc/parallel/stk_parallel_engine_set.m create mode 100644 inst/misc/parallel/stk_parallel_feval.m create mode 100644 inst/misc/parallel/stk_parallel_start.m create mode 100644 inst/misc/parallel/stk_parallel_stop.m create mode 100644 inst/misc/pareto/stk_dominatedhv.m create mode 100644 inst/misc/pareto/stk_isdominated.m create mode 100644 inst/misc/pareto/stk_paretofind.m create mode 100644 inst/misc/plot/stk_axes.m create mode 100644 inst/misc/plot/stk_figure.m create mode 100644 inst/misc/plot/stk_labels.m create mode 100644 inst/misc/plot/stk_legend.m create mode 100644 inst/misc/plot/stk_plot_getaxesarg.m create mode 100644 inst/misc/plot/stk_plot_shadedci.m create mode 100644 inst/misc/plot/stk_subplot.m create mode 100644 inst/misc/plot/stk_title.m create mode 100644 inst/misc/plot/stk_xlabel.m create mode 100644 inst/misc/plot/stk_ylabel.m create mode 100644 inst/misc/plot/stk_zlabel.m create mode 100644 inst/misc/test/stk_is_lhs.m create mode 100644 inst/misc/test/stk_isequal_tolabs.m create mode 100644 inst/misc/test/stk_isequal_tolrel.m create mode 100644 inst/misc/test/stk_runtests.m create mode 100644 inst/misc/test/stk_test.m create mode 100644 inst/misc/test/stk_test_class.m create mode 100644 inst/misc/test/stk_test_critgrad.m create mode 100644 inst/misc/test/stk_test_dfbinaryop.m create mode 100644 inst/misc/text/stk_disp_examplewelcome.m create mode 100644 inst/misc/text/stk_disp_getformat.m create mode 100644 inst/misc/text/stk_disp_isloose.m create mode 100644 inst/misc/text/stk_disp_progress.m create mode 100644 inst/misc/text/stk_sprintf_colvect.m create mode 100644 inst/misc/text/stk_sprintf_colvect_fixedpoint.m create mode 100644 inst/misc/text/stk_sprintf_colvect_scientific.m create mode 100644 inst/misc/text/stk_sprintf_framed.m create mode 100644 inst/model/@stk_model_/cat.m create mode 100644 inst/model/@stk_model_/disp.m create mode 100644 inst/model/@stk_model_/display.m create mode 100644 inst/model/@stk_model_/get.m create mode 100644 inst/model/@stk_model_/horzcat.m create mode 100644 inst/model/@stk_model_/set.m create mode 100644 inst/model/@stk_model_/stk_covmat_noise.m create mode 100644 inst/model/@stk_model_/stk_get_input_data.m create mode 100644 inst/model/@stk_model_/stk_get_observation_variances.m create mode 100644 inst/model/@stk_model_/stk_get_output_data.m create mode 100644 inst/model/@stk_model_/stk_get_prior_model.m create mode 100644 inst/model/@stk_model_/stk_get_sample_size.m create mode 100644 inst/model/@stk_model_/stk_model_.m create mode 100644 inst/model/@stk_model_/stk_predict_.m create mode 100644 inst/model/@stk_model_/subsasgn.m create mode 100644 inst/model/@stk_model_/subsref.m create mode 100644 inst/model/@stk_model_/vertcat.m create mode 100644 inst/model/@stk_model_gpposterior/disp.m create mode 100644 inst/model/@stk_model_gpposterior/fieldnames.m create mode 100644 inst/model/@stk_model_gpposterior/get.m create mode 100644 inst/model/@stk_model_gpposterior/set.m create mode 100644 inst/model/@stk_model_gpposterior/stk_covmat_noise.m create mode 100644 inst/model/@stk_model_gpposterior/stk_generate_samplepaths.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_input_data.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_observation_variances.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_optimizable_parameters.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_output_data.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_prior_model.m create mode 100644 inst/model/@stk_model_gpposterior/stk_get_sample_size.m create mode 100644 inst/model/@stk_model_gpposterior/stk_isnoisy.m create mode 100644 inst/model/@stk_model_gpposterior/stk_make_kreq.m create mode 100644 inst/model/@stk_model_gpposterior/stk_model_gpposterior.m create mode 100644 inst/model/@stk_model_gpposterior/stk_model_update.m create mode 100644 inst/model/@stk_model_gpposterior/stk_predict_.m create mode 100644 inst/model/@stk_model_gpposterior/stk_predict_leaveoneout.m create mode 100644 inst/model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m create mode 100644 inst/model/@stk_model_gpposterior/stk_set_optimizable_parameters.m create mode 100644 inst/model/noise/@stk_gaussiannoise_/disp.m create mode 100644 inst/model/noise/@stk_gaussiannoise_/stk_covmat.m create mode 100644 inst/model/noise/@stk_gaussiannoise_/stk_covmat_noise.m create mode 100644 inst/model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m create mode 100644 inst/model/noise/@stk_gaussiannoise_/stk_isnoisy.m create mode 100644 inst/model/noise/@stk_gaussiannoise_/stk_predict_.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/disp.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/fieldnames.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/get.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/set.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/stk_get_optimizable_parameters.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/stk_param_getdefaultbounds.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/stk_set_optimizable_parameters.m create mode 100644 inst/model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m create mode 100644 inst/model/prior_struct/stk_covmat_noise.m create mode 100644 inst/model/prior_struct/stk_get_input_data.m create mode 100644 inst/model/prior_struct/stk_get_observation_variances.m create mode 100644 inst/model/prior_struct/stk_get_optimizable_model_parameters.m create mode 100644 inst/model/prior_struct/stk_get_optimizable_noise_parameters.m create mode 100644 inst/model/prior_struct/stk_get_output_data.m create mode 100644 inst/model/prior_struct/stk_get_prior_model.m create mode 100644 inst/model/prior_struct/stk_isnoisy.m create mode 100644 inst/model/prior_struct/stk_model.m create mode 100644 inst/model/prior_struct/stk_model_fixlm.m create mode 100644 inst/model/prior_struct/stk_ortho_func.m create mode 100644 inst/model/prior_struct/stk_predict_.m create mode 100644 inst/model/prior_struct/stk_set_optimizable_model_parameters.m create mode 100644 inst/param/classes/stk_get_optimizable_parameters.m create mode 100644 inst/param/classes/stk_set_optimizable_parameters.m create mode 100644 inst/param/estim/stk_param_estim.m create mode 100644 inst/param/estim/stk_param_estim_optim.m create mode 100644 inst/param/estim/stk_param_getdefaultbounds.m create mode 100644 inst/param/estim/stk_param_getdefaultbounds_lnv.m create mode 100644 inst/param/estim/stk_param_gls.m create mode 100644 inst/param/estim/stk_param_init.m create mode 100644 inst/param/estim/stk_param_init_lnv.m create mode 100644 inst/param/estim/stk_param_init_remlgls.m create mode 100644 inst/param/estim/stk_param_relik.m create mode 100644 inst/sampling/@stk_function/disp.m create mode 100644 inst/sampling/@stk_function/display.m create mode 100644 inst/sampling/@stk_function/feval.m create mode 100644 inst/sampling/@stk_function/get.m create mode 100644 inst/sampling/@stk_function/horzcat.m create mode 100644 inst/sampling/@stk_function/stk_function.m create mode 100644 inst/sampling/@stk_function/subsasgn.m create mode 100644 inst/sampling/@stk_function/subsref.m create mode 100644 inst/sampling/@stk_function/vertcat.m create mode 100644 inst/sampling/@stk_sampcrit_akg/disp.m create mode 100644 inst/sampling/@stk_sampcrit_akg/feval.m create mode 100644 inst/sampling/@stk_sampcrit_akg/get.m create mode 100644 inst/sampling/@stk_sampcrit_akg/set.m create mode 100644 inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m create mode 100644 inst/sampling/@stk_sampcrit_ei/disp.m create mode 100644 inst/sampling/@stk_sampcrit_ei/feval.m create mode 100644 inst/sampling/@stk_sampcrit_ei/get.m create mode 100644 inst/sampling/@stk_sampcrit_ei/set.m create mode 100644 inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m create mode 100644 inst/sampling/@stk_sampcrit_eqi/disp.m create mode 100644 inst/sampling/@stk_sampcrit_eqi/feval.m create mode 100644 inst/sampling/@stk_sampcrit_eqi/get.m create mode 100644 inst/sampling/@stk_sampcrit_eqi/set.m create mode 100644 inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m create mode 100644 inst/sampling/stk_halfpintl.m create mode 100644 inst/sampling/stk_sampcrit_akg_eval.m create mode 100644 inst/sampling/stk_sampcrit_ehvi_eval.m create mode 100644 inst/sampling/stk_sampcrit_ei_eval.m create mode 100644 inst/sampling/stk_sampcrit_emmi_eval.m create mode 100644 inst/sampling/stk_sampling_halton_rr2.m create mode 100644 inst/sampling/stk_sampling_maximinlhs.m create mode 100644 inst/sampling/stk_sampling_nesteddesign.m create mode 100644 inst/sampling/stk_sampling_nestedlhs.m create mode 100644 inst/sampling/stk_sampling_olhs.m create mode 100644 inst/sampling/stk_sampling_randomlhs.m create mode 100644 inst/sampling/stk_sampling_randunif.m create mode 100644 inst/sampling/stk_sampling_regulargrid.m create mode 100644 inst/sampling/stk_sampling_sobol.m create mode 100644 inst/sampling/stk_sampling_vdc_rr2.m create mode 100644 inst/stk_init.m create mode 100644 inst/stk_version.m create mode 100644 inst/utils/stk_conditioning.m create mode 100644 inst/utils/stk_generate_samplepaths.m create mode 100644 inst/utils/stk_plot1d.m create mode 100644 inst/utils/stk_plot_histnormres.m create mode 100644 inst/utils/stk_plot_predvsobs.m create mode 100644 inst/utils/stk_plot_probdom2d.m create mode 100644 inst/utils/stk_pmisclass.m create mode 100644 inst/utils/stk_simulate_noise.m create mode 100644 src/Makefile create mode 100644 src/get_column_number.c create mode 100644 src/pareto.h create mode 100644 src/primes.h create mode 100644 src/stk_dist_matrixx.c create mode 100644 src/stk_dist_matrixy.c create mode 100644 src/stk_dist_pairwise.c create mode 100644 src/stk_distrib_bivnorm0_cdf.c create mode 100644 src/stk_dominatedhv_mex.c create mode 100644 src/stk_filldist_discr_mex.c create mode 100644 src/stk_gpquadform_matrixx.c create mode 100644 src/stk_gpquadform_matrixy.c create mode 100644 src/stk_gpquadform_pairwise.c create mode 100644 src/stk_isdominated_mex.c create mode 100644 src/stk_mex.h create mode 100644 src/stk_mindist_mex.c create mode 100644 src/stk_paretofind_mex.c create mode 100644 src/stk_sampling_sobol_mex.c create mode 100644 src/stk_sampling_vdc_rr2.c create mode 100644 src/wfg.c create mode 100644 src/wfg.h diff --git a/CITATION b/CITATION new file mode 100644 index 0000000..b7f7ff5 --- /dev/null +++ b/CITATION @@ -0,0 +1,23 @@ +-------------------------------------------------------------------- + +To cite this release of STK in publications use: + + Julien Bect, Emmanuel Vazquez and others (2022). + STK: a Small (Matlab/Octave) Toolbox for Kriging. Release 2.7. + URL https://github.com/stk-kriging/stk/ + +A BibTeX entry for LaTeX users is: + + @misc{, + author = {Bect, Julien and Vazquez, Emmanuel and others}, + title = {{STK}: a {S}mall ({M}atlab/{O}ctave) {T}oolbox + for {K}riging. {R}elease 2.7}, + year = {2022}, + url = {https://github.com/stk-kriging/stk/} + } + +We have invested a lot of time and effort in the development of STK. +Please cite it if you use it. + +-------------------------------------------------------------------- + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..d691ae9 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,8816 @@ +2022-02-23 Julien Bect + + stk_init.m: Update the list of functions that contain persistents + + * stk_init.m (stk_init__clear_persistents): Update the list of + functions that contain persistent variables. + +2022-02-15 Julien Bect + + README.md: Explain how to initialize STK when using the PCT + + * README.md: Explain how to initialize STK when using the Parallel + Computing Toolbox in Matlab, by means of the `pctRunOnAll` function. + * NEWS.md: Advertise the change. + + Remove two deprecated functions + + * misc/optim/stk_optim_hasfmincon.m: Remove deprecated function. + * misc/optim/stk_select_optimizer.m: Remove deprecated function. + * admin/octpkg/INDEX: Update Octave package index. + * admin/build_tools/build_octpkg.m: Update build process. + * NEWS.md: Advertise the removal. + + stk_init.m: Call stk_options_set with the 'default' argument + + * stk_init.m: Call stk_options_set with the 'default' argument. + This can make a different in situations where stk_init is called + during a Matlab/Octave session where STK was previously + initialized. + + stk_options_set.m: Fix copyright notice + + * misc/options/stk_options_set.m: Fix copyright notice. + +2022-02-14 Julien Bect + + .gitattributes: Convert CRLF to LF automatically for text files + + * .gitattributes: Convert CRLF to LF automatically for text files. + +2022-02-11 Julien Bect + + run-tests.yml: Test the all purpose release on ubuntu-latest + + * .github/workflows/run-tests.yml: Test the all purpose release on + ubuntu-latest + +2022-02-10 Julien Bect + + run-tests.yml: Test Octage package tarball on ubuntu-latest + + * .github/workflows/run-tests.yml: Test Octage package tarball on + Ubuntu latest. + +2022-02-05 Julien Bect + + Rename github action: run-unit-tests.yml -> run-tests.yml + + * .github/workflows/run-unit-tests.yml: Rename from. + * .github/workflows/run-tests.yml: Rename to. + * README.md: Update badge. + + build_octpkg.m: Exclude misc/mole entirely + + * admin/build_tools/build_octpkg.m: Exclude misc/mole entirely. + * admin/octpkg/patches/stk-init-mole-delete.patch: Simplify patch. + + startup.m: Run stk_init automatically for in-place use + + * startup.m: New script that runs stk_init automatically for + in-place use. + * admin/build_tools/build_octpkg.m: Do not include startup.m in + the Octave package release. + * NEWS.md: Advertise new script. + +2022-02-04 Julien Bect + + Remove old (hg) release instructions + + * admin/RELEASE.md: Deleted + +2022-02-03 Julien Bect + + stk_predict_leaveoneout.m: Avoid complex-valued norm_res + + * model/@stk_model_gpposterior/stk_predict_leaveoneout.m: Prevent + norm_res from being complex-valued by cancelling negative elements + in dR. + + stk_plot_histnormres.m: Ensure non-zero binsize + + * utils/stk_plot_histnormres.m: Introduce a safety net for samples + with small (possibly zero) IQR. + +2022-01-31 Julien Bect + + stk_plot_histnormres.m: Ensure non-zero number of bins + + * utils/stk_plot_histnormres.m: Make sure that we have a non-zero + number of bins using Sturges' rule. + +2022-01-28 Julien Bect + + Remove the MOLE from the Octave package entirely + + * stk_init.m: Update comments. + * admin/octpkg/patches/stk-init-mole-cleanup.patch: Rename from. + * admin/octpkg/patches/stk-init-mole-delete.patch: Rename to. + Delete everything related to the MOLE inside stk_init. + * admin/octpkg/patches/series: Refresh. + * admin/octpkg/post_install.m: Delete (no longer needed). + * admin/build_tools/build_octpkg.m: Refresh. + + Raise required Octave version number to 4.0.0 + + * README.md: Raise required Octave version number to 4.0.0. + * admin/build_tools/build_octpkg.m: Iem. + * admin/CODING_GUIDELINES: Update. + * arrays/@stk_hrect/stk_hrect.m: Refer to CG#08. + * misc/test/stk_runtests.m: Remove reference to 3.8.2. + + Avoid using isrow + + * admin/CODING_GUIDELINES: Explain why. + * misc/mole/isrow/isrow.m: Delete. + * stk_init.m: isrow removed from the MOLE. + * misc/mole/README: Minor update. + * admin/octpkg/patches/stk-init-mole-cleanup.patch: Refresh patch. + * arrays/@stk_dataframe/plot.m: Don't use isrow. + * misc/pareto/stk_dominatedhv.m: Don't use isrow. + +2022-01-26 Julien Bect + + MOLE: linsolve is no longer needed + + * misc/mole/linsolve/linsolve.m: Deleted. + * admin/octpkg/patches/stk-init-mole-cleanup.patch: Refresh patch. + * misc/mole/README: Remove linsolve. + * stk_init.m: Remove linsolve. + + build: Fix path issue + + * admin/build.m: Do not add root dir to the path. + * admin/build_tools/check_index_file.m: Remove unused portion. + * admin/build_tools/get_public_mfile_list.m: Take extra precautions. + * admin/build_tools/get_version_number.m: Add root dir to the path. + + build: Makefile: Remove reference to Mercurial + + * Makefile: Remove reference to Mercurial + + build: New patch for stk_init + + * admin/octpkg/patches/stk-init-mole-cleanup.patch: New patch to + trim some Matlab-related things out of stk_init. + * admin/octpkg/patches/series: Add the patch to the series. + + build: Wrap system calls in asserts + + * admin/build_tools/build_allpurpose.m: Wrap system calls in asserts. + * admin/build_tools/build_octpkg.m: Idem. + * admin/build_tools/generate_htmldoc.m: Idem. + + admin/octpkg/patches: Refresh patches + + * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: Refresh. + * admin/octpkg/patches/remove-buildmex.patch: Refresh. + * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: Refresh. + + Refresh README.md + + * README.md: Update sourceforge -> github + other changes. + +2022-01-25 Julien Bect + + Add missing 'hold off' in some plotting functions + + * utils/stk_plot_histnormres.m: Add missing 'hold off'. + * utils/stk_plot_predvsobs.m: Idem. + + stk_example_kb10.m: Fix typo. + + * stk_example_kb10.m: Fix typo. + +2022-01-23 Julien Bect + + Makefile: sourceforge -> github in variable names & targets + + * Makefile: sourceforge -> github in variable names & targets. + +2022-01-20 Julien Bect + + stk_generate_samplepaths.m: Fix copyright notice + + * utils/stk_generate_samplepaths.m: Fix copyright notice. + +2022-01-10 Julien Bect + + Calling stk_model with a function handle is better + + * core/stk_make_matcov.m: Call stk_model with a function handle. + * core/stk_model_update.m: Idem. + * core/stk_predict.m: Idem. + * core/stk_predict_leaveoneout.m: Idem. + * covfcs/stk_discretecov.m: Idem. + * examples/01_kriging_basics/stk_example_kb01.m: Idem. + * examples/01_kriging_basics/stk_example_kb01n.m: Idem. + * examples/01_kriging_basics/stk_example_kb02.m: Idem. + * examples/01_kriging_basics/stk_example_kb02n.m: Idem. + * examples/01_kriging_basics/stk_example_kb03.m: Idem. + * examples/01_kriging_basics/stk_example_kb05.m: Idem. + * examples/01_kriging_basics/stk_example_kb06.m: Idem. + * examples/01_kriging_basics/stk_example_kb07.m: Idem. + * examples/01_kriging_basics/stk_example_kb08.m: Idem. + * examples/01_kriging_basics/stk_example_kb09.m: Idem. + * examples/02_design_of_experiments/stk_example_doe03.m: Idem. + * examples/02_design_of_experiments/stk_example_doe04.m: Idem. + * examples/02_design_of_experiments/stk_example_doe05.m: Idem. + * examples/02_design_of_experiments/stk_example_doe06.m: Idem. + * examples/03_miscellaneous/stk_example_misc02.m: Idem. + * examples/03_miscellaneous/stk_example_misc03.m: Idem. + * examples/03_miscellaneous/stk_example_misc04.m: Idem. + * examples/03_miscellaneous/stk_example_misc05.m: Idem. + * iago/crit/stk_optim_crit_EI.m: Idem. + * iago/crit/stk_optim_crit_SUR.m: Idem. + * iago/crit/stk_optim_crit_iago.m: Idem. + * iago/utils/stk_optim_init.m: Idem. + * misc/benchmarks/stk_benchmark_logdet.m: Idem. + * misc/benchmarks/stk_benchmark_loocv.m: Idem. + * misc/benchmarks/stk_benchmark_paramestim.m: Idem. + * misc/benchmarks/stk_benchmark_predict.m: Idem. + * model/@stk_model_gpposterior/get.m: Idem. + * model/@stk_model_gpposterior/set.m: Idem. + * model/@stk_model_gpposterior/stk_model_gpposterior.m: Idem. + * model/@stk_model_gpposterior/stk_model_update.m: Idem. + * model/@stk_model_gpposterior/stk_predict_.m: Idem. + * model/@stk_model_gpposterior/stk_predict_leaveoneout.m: Idem. + * model/noise/@stk_gaussiannoise_het0/set.m: Idem. + * model/prior_struct/stk_covmat_noise.m: Idem. + * model/prior_struct/stk_model.m: Idem. + * model/prior_struct/stk_ortho_func.m: Idem. + * param/estim/stk_param_estim.m: Idem. + * param/estim/stk_param_gls.m: Idem. + * param/estim/stk_param_init.m: Idem. + * param/estim/stk_param_init_lnv.m: Idem. + * param/estim/stk_param_loomse.m: Idem. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * sampling/stk_sampcrit_akg_eval.m: Idem. + * sampling/stk_sampcrit_ei_eval.m: Idem. + * utils/stk_conditioning.m: Idem. + * utils/stk_generate_samplepaths.m: Idem. + + Source formatting: Space after function name + + * iago/crit/stk_optim_crit_EI.m: Space after function name. + * iago/crit/stk_optim_crit_SUR.m: Idem. + * model/prior_struct/stk_model.m: Idem. + * param/estim/stk_param_loomse.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * sampling/stk_sampcrit_akg_eval.m: Idem. + * sampling/stk_sampcrit_ei_eval.m: Idem. + +2022-01-03 Julien Bect + + Fix some linter messages + + * admin/stk_mlint_all.m: Make some linter errors 'critical', which + means that the corresponding github action will fail if one of + these reappears. + * .github/workflows/run-linter.yml: Let the github fail if the + linter status flag is false. + * README.md: Display linter action badge. + * admin/build_tools/generate_htmldoc.m: Fix some linter messages. + * admin/octpkg/post_install.m: Idem. + * misc/benchmarks/stk_benchmark_uppertriangular.m: Idem. + * misc/mole/linsolve/linsolve.m: Idem. + * misc/mole/matlab/index.m: Idem. + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Idem. + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: Idem. + * misc/test/stk_test.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * stk_init.m: Idem. + +2021-12-08 Julien Bect + + github: Run linter + + * admin/stk_mlint_all.m: A function to run the linter on + all the M-files of the toolbox. + * .github/workflows/run-linter.yml: Github action. + +2021-11-20 Julien Bect + + github: Run unit tests in Octave too + + * .github/workflows/run-unit-tests.yml: Run unit tests in Octave + too (in Ubuntu). + + tests: Deal with expected failures + + * misc/test/stk_test.m: Expected failures are no longer reported + as successes. + * misc/test/stk_runtests.m: Deal with expected failures. + * .github/workflows/run-unit-tests.yml: Do not fail when all + failures were expected. + + iago: Remove 'showprogress' option + + * iago/crit/stk_optim_crit_SUR.m: Remove 'showprogress' option. + * iago/crit/stk_optim_crit_iago.m: Idem + * iago/stk_optim.m: Idem + * iago/stk_optimscript.m: Idem + * iago/utils/stk_optim_init.m: Idem + +2021-11-14 Julien Bect + + README.md: Use default style for licence badge + + * README.md: Use default style for licence badge. + + .github/workflows/run-unit-tests.yml: Rename last step + + * .github/workflows/run-unit-tests.yml: Rename last step + + stk_parallel_engine_parfor.m: Remove unit test + + * misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m: + Remove unit test, which was creating problems for continuous + integration using Github Actions. Not a very interesting test anyway. + +2021-11-13 Julien Bect + + github: Run unit tests in MATLAB with Github Actions + + * .github/workflows/run-unit-tests.yml: Run unit tests in MATLAB + with Github Actions on several recent releases. Save the logs as + artifacts. + * README.md: Add a few badges. + +2021-06-14 Julien Bect + + stk_example_kb07.m: Add a second figure + + * examples/01_kriging_basics/stk_example_kb07.m: Add a second + figure where nu is fixed to 5/2 and rho varies. + +2021-03-28 Julien Bect + + Deprecate CG#07 + + * admin/CODING_GUIDELINES: Deprecated CG#07. + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Use ~. + * iago/rep/stk_gather_repetitions.m: Use ~. + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: Use ~. + * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: Use ~. + * misc/text/stk_disp_getformat.m: Use ~. + * misc/text/stk_disp_isloose.m: Use ~. + * param/estim/stk_param_init_remlgls.m: Use ~. + * sampling/stk_sampcrit_akg_eval.m: Use ~. + * sampling/stk_sampling_maximinlhs.m: Use ~. + * sampling/stk_sampling_nesteddesign.m: Use ~. + * sampling/stk_sampling_nestedlhs.m: Use ~. + * utils/stk_generate_samplepaths.m: Use ~. + + README.md: Raise minimal Matlab version to R2009b + + * README.md: Raise minimal Matlab version to R2009b (we are in + 2021 after all...). + + stk_param_gls.m: Rely on mldivide + + * param/estim/stk_param_gls.m: Rely on mldivide to do the job, + instead of writing the normal equations explicitely. + +2021-15-01 Julien Bect + + stk_param_gls.m: Use linsolve to solve triangular systems + + * param/estim/stk_param_gls.m: Use linsolve to solve triangular + systems. + +2021-14-01 Julien Bect + + stk_test_critgrad.m: New function to check partial derivatives + + * misc/test/stk_test_critgrad.m: New function to check partial + derivatives of parameter selection criteria. + * param/estim/stk_param_loomse.m: More unit tests. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * misc/test/stk_test_class.m: Internal function warning. + * misc/test/stk_test_dfbinaryop.m: Idem. + * admin/octpkg/INDEX: Update index. + +2020-09-16 Julien Bect + + @stk_dataframe/plot.m: Fix argument parsing + + * arrays/@stk_dataframe/plot.m: Fix argument parsing. + +2020-09-10 Julien Bect + + stk_sampcrit_emmi_eval.m: Fix bibliography + + * sampling/stk_sampcrit_emmi_eval.m: Cite the published paper of + Svenson and Santner instead of the technical report. + +2020-06-20 Julien Bect + + INDEX: Add dedicated category for simulation functions + + * admin/octpkg/INDEX: Create a dedicated category for + simulation-related functions. + +2020-05-29 Julien Bect + + stk_*cov_iso.m: Check param length + + * covfcs/stk_expcov_iso.m: Check param length, add unit test. + * covfcs/stk_gausscov_iso.m: Idem. + * covfcs/stk_materncov32_iso.m: Idem. + * covfcs/stk_materncov52_iso.m: Idem. + * covfcs/stk_materncov_iso.m: Idem. + * covfcs/stk_sphcov_iso.m: Idem. + +2020-04-26 Julien Bect + + stk_example_doe06.m: New example script + + * examples/02_design_of_experiments/stk_example_doe06.m: New script. + * examples/02_design_of_experiments/stk_example_doe03.m: Minor changes. + * admin/octpkg/INDEX: Add new script to the index. + +2020-04-21 Julien Bect + + examples/02_design_of_experiments: Fix comments in two scripts + + * examples/02_design_of_experiments/stk_example_doe03.m: Fix comment. + * examples/02_design_of_experiments/stk_example_doe05.m: Idem. + +2020-04-13 Julien Bect + + Remove some deprecated functions + + * model/@stk_model_gpposterior/get_input_data.m: Remove deprecated function. + * model/@stk_model_gpposterior/get_output_data.m: Idem. + * model/@stk_model_gpposterior/get_prior_model.m: Idem. + * model/prior_struct/@struct/README: Remove no-longer-needed explanation. + * model/prior_struct/@struct/get_input_data.m: Idem. + * model/prior_struct/@struct/get_output_data.m: Idem. + * model/prior_struct/@struct/get_prior_model.m: Idem. + * admin/octpkg/INDEX: Update index. + +2020-04-11 Julien Bect + + Delete unused internal function @stk_kreq_qr/stk_update.m + + * core/@stk_kreq_qr/stk_update.m: Delete unused internal function. + * model/@stk_model_gpposterior/stk_model_update.m: Remove comment. + * admin/octpkg/INDEX: Update index. + +2020-02-20 Julien Bect + + stk_example_doe05.m: Fix comments + + * examples/02_design_of_experiments/stk_example_doe05.m: Fix comments. + + stk_example_doe05.m: Various minor improvements + + * examples/02_design_of_experiments/stk_example_doe05.m: Various + minor improvements. + +2020-02-19 Julien Bect + + Remove deprecated CG#12 marks + + * examples/02_design_of_experiments/stk_example_doe03.m: Remove + deprecated CG#12 mark. + * examples/02_design_of_experiments/stk_example_doe05.m: Idem. + + stk_example_doe05.m: Fix figure title + + * examples/02_design_of_experiments/stk_example_doe05.m: Fix + figure title to reflect the actual name of the example. + + * examples/02_design_of_experiments/stk_example_doe05.m: Fix the + final display for the case where the algorithm stops prematurely, + and add a warning too. + + stk_example_doe05.m: Make it possible to use the exact KG + + * examples/02_design_of_experiments/stk_example_doe05.m: Make it + possible to use the exact KG criterion instead of Scott's + approximation (previously, only the latter was proposed). + + @stk_sampcrit_akg/set.m: Remove replicated input points in xr + + * sampling/@stk_sampcrit_akg/set.m: Remove replicated input points + when the AKG reference grid is construted using Scott's original + method. + +2020-02-07 Julien Bect + + stk_param_estim_optim.m: Generate a warning instead of an error + + * param/estim/stk_param_estim_optim.m: Generate a warning instead + of an error when the optimization algorithms returns a points that + is not better than the starting point. + +2020-01-08 Julien Bect + + Re-organise prediction code + + * core/stk_predict.m: Now reduced to a simple gateway that + processes all possible calling syntaxes and then delegates to + `stk_predict` for the actual computations, for all types of + models. The shorter calling syntax is now documented. + * model/@stk_model_/stk_predict_.m: New function, that simply + raises an error message. Derived classes must implement it. + * model/@stk_model_gpposterior/stk_predict.m: Renamed from. + * model/@stk_model_gpposterior/stk_predict_.m: Renamed to. + * model/prior_struct/stk_predict_.m: New function, which computes + a trivial prediction for prior models. + * model/noise/@stk_gaussiannoise_/stk_predict_.m: New function, + which computes a trivial prediction for noise models. + * admin/octpkg/INDEX: Update index. + + @stk_gaussiannoise_het0/stk_variance_eval.m: Fix empty x case + + * model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m: Return + the correct output when x is empty. + + stk_gaussiannoise_het0.m: Provide a default constructor + + * model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m: + Provide a default constructor. + +2020-01-07 Julien Bect + + Minor changes relative to `stk_isnoisy`. + + * admin/octpkg/INDEX: Classify as model property getter. + * model/prior_struct/stk_isnoisy.m: Polish help text. + + Use `sample_size` property + + * iago/crit/private/stk_optim_crit_fig02.m: Use `sample_size` property. + * iago/crit/private/view_samplingcrit_2d.m: Idem. + * iago/crit/stk_optim_crit_EI.m: Idem. + * iago/crit/stk_optim_crit_SUR.m: Idem. + * iago/crit/stk_optim_crit_iago.m: Idem. + * iago/rep/stk_gather_repetitions.m: Idem. + * iago/stk_optim.m: Idem. + * iago/stk_optimscript2.m: Idem. + * iago/utils/stk_optim_init.m: Idem. + * param/estim/stk_param_estim.m: Idem. + * param/estim/stk_param_init.m: Idem. + * param/estim/stk_param_init_lnv.m: Idem. + * sampling/@stk_sampcrit_eqi/feval.m: Idem. + * model/@stk_model_gpposterior/stk_model_update.m: Idem. + * model/@stk_model_gpposterior/stk_predict.m: Idem. + * model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m: Idem. + + Add `sample_size` property to models + + * model/@stk_model_gpposterior/fieldnames.m: Add `sample_size` to + the list of field names. Fix output orientation for consistency + with the base function. + * model/@stk_model_gpposterior/get.m: Implement `sample_size` + property. + * model/@stk_model_gpposterior/disp.m: Display `sample_size` + property. + * model/@stk_model_gpposterior/stk_get_sample_size.m: Fast getter. + * model/@stk_model_/stk_get_prior_model.m: Update design note. + * model/@stk_model_/stk_get_input_data.m: Idem. + * model/@stk_model_/stk_get_observation_variances.m: Idem. + * model/@stk_model_/stk_get_output_data.m: Idem. + * admin/octpkg/INDEX: Update index. + + Add `sample_size` property to arrays + + * arrays/@stk_dataframe/private/reserved_field_names.m: Add + `sample_size` to the list of field names. Return a column. + * arrays/@stk_dataframe/get.m: Implement `sample_size` property. + * arrays/@stk_dataframe/private/get_column_number.c: Idem. + * arrays/@stk_dataframe/stk_get_sample_size.m: Fast getter. + * arrays/generic/stk_get_sample_size.m: Idem for generic arrays. + * arrays/@stk_dataframe/fieldnames.m: Fix output orientation for + consistency with the base function. Fix unit test. + * arrays/@stk_factorialdesign/fieldnames.m: Idem. + * arrays/@stk_dataframe/stk_length.m: Deprecate. + * arrays/generic/stk_length.m: Deprecate. + * admin/octpkg/INDEX: Update index. + +2020-01-06 Julien Bect + + admin/octpkg/patches: Update patches + + * admin/octpkg/patches/remove-buildmex.patch: Update patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Update patch. + +2020-01-03 Julien Bect + + stk_make_matcov.m: Do not convert inputs to double + + * core/stk_make_matcov.m: Do not convert inputs to double. Each + particular covariance function should be able to decide what kind + of input it accepts. + + @stk_model_gpposterior/stk_model_update.m: Improve clarity + + * model/@stk_model_gpposterior/stk_model_update.m: Add comments + and rename a variable for clarity. + + @stk_model_gpposterior/stk_{set,get}_optimizable_parameters.m: Fix bug + + * model/@stk_model_gpposterior/stk_get_optimizable_parameters.m: + Fix erroneous property name. + * model/@stk_model_gpposterior/stk_set_optimizable_parameters.m: + Idem. + +2020-01-02 Julien Bect + + stk_generate_samplepaths.m: Remove outdated comment + + * utils/stk_generate_samplepaths.m: Remove outdated comment. + +2019-12-04 Julien Bect + + 01_kriging_basics/stk_example_kb03.m: Fix comment + + * examples/01_kriging_basics/stk_example_kb03.m: Fix comment about + "numerical noise". + + 01_kriging_basics/stk_example_kb03.m: Source formatting + + * examples/01_kriging_basics/stk_example_kb03.m: Source formatting. + +2019-12-03 Julien Bect + + Make STK startup faster + + * stk_init.m: Make STK startup faster using a better way of + checking if -silent is supported by mex. + +2019-10-12 Julien Bect + + Polish/uniformize one-line help for deprecated functions + + * covfcs/rbf/stk_sf_gausscorr.m: Polish one-line help text. + * covfcs/rbf/stk_sf_matern.m: Idem. + * covfcs/rbf/stk_sf_matern32.m: Idem. + * covfcs/rbf/stk_sf_matern52.m: Idem. + * covfcs/stk_noisecov.m: Idem. + * misc/optim/stk_optim_hasfmincon.m: Idem. + * misc/optim/stk_select_optimizer.m: Idem. + * model/prior_struct/stk_ortho_func.m: Idem. + + stk_factorialdesign.m: Provide missing help text (ticket #91) + + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Provide + missing help text. + +2019-09-06 Julien Bect + + INDEX: Fix sections and re-organize a little + + * admin/octpkg/INDEX: Fix sections and re-organize a little. + * model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m: Mark as + internal. + + RELEASE.md: Fix release instructions + + * admin/RELEASE.md: Fix release instructions. + + CITATION: Make bibtex reference year configurable + + * CITATION: Make bibtex reference year configurable. + +2019-09-03 Julien Bect + + Makefile: Use ${OCTAVE} from environment if defined + + * Makefile: Use ${OCTAVE} from environment if defined. + +2019-08-14 Julien Bect + + Move @stk_model_gpposterior to model/ directory + + * core/@stk_model_gpposterior/disp.m: Move from + * core/@stk_model_gpposterior/fieldnames.m: Move from + * core/@stk_model_gpposterior/get.m: Move from + * core/@stk_model_gpposterior/get_input_data.m: Move from + * core/@stk_model_gpposterior/get_output_data.m: Move from + * core/@stk_model_gpposterior/get_prior_model.m: Move from + * core/@stk_model_gpposterior/set.m: Move from + * core/@stk_model_gpposterior/stk_covmat_noise.m: Move from + * core/@stk_model_gpposterior/stk_generate_samplepaths.m: Move from + * core/@stk_model_gpposterior/stk_get_input_data.m: Move from + * core/@stk_model_gpposterior/stk_get_observation_variances.m: Move from + * core/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m: Move from + * core/@stk_model_gpposterior/stk_get_optimizable_parameters.m: Move from + * core/@stk_model_gpposterior/stk_get_output_data.m: Move from + * core/@stk_model_gpposterior/stk_get_prior_model.m: Move from + * core/@stk_model_gpposterior/stk_isnoisy.m: Move from + * core/@stk_model_gpposterior/stk_make_kreq.m: Move from + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Move from + * core/@stk_model_gpposterior/stk_model_update.m: Move from + * core/@stk_model_gpposterior/stk_predict.m: Move from + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Move from + * core/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m: Move from + * core/@stk_model_gpposterior/stk_set_optimizable_parameters.m: Move from + * model/@stk_model_gpposterior/disp.m: Move to + * model/@stk_model_gpposterior/fieldnames.m: Move to + * model/@stk_model_gpposterior/get.m: Move to + * model/@stk_model_gpposterior/get_input_data.m: Move to + * model/@stk_model_gpposterior/get_output_data.m: Move to + * model/@stk_model_gpposterior/get_prior_model.m: Move to + * model/@stk_model_gpposterior/set.m: Move to + * model/@stk_model_gpposterior/stk_covmat_noise.m: Move to + * model/@stk_model_gpposterior/stk_generate_samplepaths.m: Move to + * model/@stk_model_gpposterior/stk_get_input_data.m: Move to + * model/@stk_model_gpposterior/stk_get_observation_variances.m: Move to + * model/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m: Move to + * model/@stk_model_gpposterior/stk_get_optimizable_parameters.m: Move to + * model/@stk_model_gpposterior/stk_get_output_data.m: Move to + * model/@stk_model_gpposterior/stk_get_prior_model.m: Move to + * model/@stk_model_gpposterior/stk_isnoisy.m: Move to + * model/@stk_model_gpposterior/stk_make_kreq.m: Move to + * model/@stk_model_gpposterior/stk_model_gpposterior.m: Move to + * model/@stk_model_gpposterior/stk_model_update.m: Move to + * model/@stk_model_gpposterior/stk_predict.m: Move to + * model/@stk_model_gpposterior/stk_predict_leaveoneout.m: Move to + * model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m: Move to + * model/@stk_model_gpposterior/stk_set_optimizable_parameters.m: Move to + + Implement stk_covmat_noise for all models + + * core/stk_covmat_noise.m: Move from + * model/prior_struct/stk_covmat_noise.m: Move to + * core/@stk_model_gpposterior/stk_covmat_noise.m: New function + * model/@stk_model_/stk_covmat_noise.m: New function + * model/noise/@stk_gaussiannoise_/stk_covmat_noise.m: New function + * admin/octpkg/INDEX: Update + + Implement stk_isnoisy for noise models + + * model/noise/@stk_gaussiannoise_/stk_isnoisy.m: New function + +2019-08-13 Julien Bect + + Move more functions to model/prior_struct/ + + * core/stk_isnoisy.m: Move from + * core/stk_model.m: Move from + * core/stk_model_fixlm.m: Move from + * core/stk_ortho_func.m: Move from + * model/prior_struct/stk_isnoisy.m: Move to + * model/prior_struct/stk_model.m: Move to + * model/prior_struct/stk_model_fixlm.m: Move to + * model/prior_struct/stk_ortho_func.m: Move to + + Rename experimental noise model classes + + * model/noise/@stk_model_gn/disp.m: Move from + * model/noise/@stk_model_gn/stk_covmat.m: Move from + * model/noise/@stk_model_gn/stk_model_gn.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/disp.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/fieldnames.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/get.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/set.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/stk_get_optimizable_parameters.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/stk_model_gn_heteroscedastic0.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/stk_param_getdefaultbounds.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/stk_set_optimizable_parameters.m: Move from + * model/noise/@stk_model_gn_heteroscedastic0/stk_variance_eval.m: Move from + * model/noise/@stk_gaussiannoise_/disp.m: Move to + * model/noise/@stk_gaussiannoise_/stk_covmat.m: Move to + * model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m: Move to + * model/noise/@stk_gaussiannoise_het0/disp.m: Move to + * model/noise/@stk_gaussiannoise_het0/fieldnames.m: Move to + * model/noise/@stk_gaussiannoise_het0/get.m: Move to + * model/noise/@stk_gaussiannoise_het0/set.m: Move to + * model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m: Move to + * model/noise/@stk_gaussiannoise_het0/stk_get_optimizable_parameters.m: Move to + * model/noise/@stk_gaussiannoise_het0/stk_param_getdefaultbounds.m: Move to + * model/noise/@stk_gaussiannoise_het0/stk_set_optimizable_parameters.m: Move to + * model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m: Move to + * examples/03_miscellaneous/stk_example_misc05.m: Update + * model/@stk_model_/stk_model_.m: Update + * admin/octpkg/INDEX: Update + +2019-08-12 Julien Bect + + Rename internal class @stk_optim_baseclass -> @stk_optim_optimizer_ + + * misc/optim/@stk_optim_baseclass/stk_optim_baseclass.m: Move from + * misc/optim/@stk_optim_baseclass/stk_optim_isavailable.m: Move from + * misc/optim/@stk_optim_optimizer_/stk_optim_isavailable.m: Move to + * misc/optim/@stk_optim_optimizer_/stk_optim_optimizer_.m: Move to + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Update + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Update + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Update + * admin/octpkg/INDEX: Update + + Rename internal class stk_model_base -> stk_model_ + + * model/@stk_model_base/cat.m: Move from + * model/@stk_model_base/disp.m: Move from + * model/@stk_model_base/display.m: Move from + * model/@stk_model_base/get.m: Move from + * model/@stk_model_base/horzcat.m: Move from + * model/@stk_model_base/set.m: Move from + * model/@stk_model_base/stk_get_input_data.m: Move from + * model/@stk_model_base/stk_get_observation_variances.m: Move from + * model/@stk_model_base/stk_get_output_data.m: Move from + * model/@stk_model_base/stk_get_prior_model.m: Move from + * model/@stk_model_base/stk_model_base.m: Move from + * model/@stk_model_base/subsasgn.m: Move from + * model/@stk_model_base/subsref.m: Move from + * model/@stk_model_base/vertcat.m: Move from + * model/@stk_model_/cat.m: Move to: + * model/@stk_model_/disp.m: Move to + * model/@stk_model_/display.m: Move to + * model/@stk_model_/get.m: Move to + * model/@stk_model_/horzcat.m: Move to + * model/@stk_model_/set.m: Move to + * model/@stk_model_/stk_get_input_data.m: Move to + * model/@stk_model_/stk_get_observation_variances.m: Move to + * model/@stk_model_/stk_get_output_data.m: Move to + * model/@stk_model_/stk_get_prior_model.m: Move to + * model/@stk_model_/stk_model_.m: Move to + * model/@stk_model_/subsasgn.m: Move to + * model/@stk_model_/subsref.m: Move to + * model/@stk_model_/vertcat.m: Move to + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Update + * model/noise/@stk_model_gn/stk_model_gn.m: Update + * admin/octpkg/INDEX: Update + + Mark @stk_model_gn_heteroscedastic0/stk_variance_eval.m as experimental + + * model/noise/@stk_model_gn_heteroscedastic0/stk_variance_eval.m: + Mark this new function as experimental. + * admin/octpkg/INDEX: update index. + +2019-08-11 Julien Bect + + Rename model/gn to model/noise + + * model/gn/@stk_model_gn/disp.m: Move from + * model/gn/@stk_model_gn/stk_covmat.m: Move from + * model/gn/@stk_model_gn/stk_model_gn.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/disp.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/fieldnames.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/get.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/set.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/stk_get_optimizable_parameters.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/stk_model_gn_heteroscedastic0.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/stk_param_getdefaultbounds.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/stk_set_optimizable_parameters.m: Move from + * model/gn/@stk_model_gn_heteroscedastic0/stk_variance_eval.m: Move from + * model/noise/@stk_model_gn/disp.m: Move to + * model/noise/@stk_model_gn/stk_covmat.m: Move to + * model/noise/@stk_model_gn/stk_model_gn.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/disp.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/fieldnames.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/get.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/set.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/stk_get_optimizable_parameters.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/stk_model_gn_heteroscedastic0.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/stk_param_getdefaultbounds.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/stk_set_optimizable_parameters.m: Move to + * model/noise/@stk_model_gn_heteroscedastic0/stk_variance_eval.m: Move to + * stk_init.m: Update path + + Rename stk_param_estim_remlgs to stk_param_init_remlgls + + * param/estim/stk_param_estim_remlgs.m: Renamed from this... + * param/estim/stk_param_init_remlgls.m: ...to this. + * param/estim/stk_param_init.m: Propagate rename. + * admin/octpkg/INDEX: Update index. + +2019-08-10 Julien Bect + + Turn stk_param_getblockselectors into a subfunction + + * model/prior_struct/stk_param_getblockselectors.m: Deleted. + * param/estim/stk_param_estim.m: New subfunction. + +2019-08-07 Julien Bect + + stk_options_set: Add help text. + + * misc/options/stk_options_set.m: Add help text. + +2019-08-07 Julien Bect + + Undo some changes from cs 00fdd8fa58d4 + + * misc/options/stk_options_get.m: Undo changes from cs 00fdd8fa58d4. + * arrays/@stk_dataframe/plotmatrix.m: Idem. + +2019-07-06 Julien Bect + + stk_cholcov: Honour optional arguments (ticket #94) + + * core/stk_cholcov.m: Honour optional arguments, such as 'lower', + when auto-nugget kicks in. + +2019-07-01 Julien Bect + + Move some model getters from core to model/prior_struct + + * core/stk_get_optimizable_model_parameters.m: Move from + * core/stk_set_optimizable_model_parameters.m: Move from + * model/prior_struct/stk_get_optimizable_model_parameters.m: Move to + * model/prior_struct/stk_set_optimizable_model_parameters.m: Move to + + core/@stk_model_gpposterior: Fix some help texts + + * core/@stk_model_gpposterior/stk_get_input_data.m: Fix help text. + * core/@stk_model_gpposterior/stk_get_output_data.m: Idem. + * core/@stk_model_gpposterior/stk_get_prior_model.m: Idem. + +2019-06-19 Julien Bect + + stk_example_misc04.m: Fix a typo + + * examples/03_miscellaneous/stk_example_misc04.m: Fix a typo. + +2019-02-15 Julien Bect + + Make it possible to set all the options at once. + + * misc/options/stk_options_set.m: Make it possible to set all the + options at once, using a struct argument. + + Make it possible to set customized bounds for log(nu). + + * misc/options/stk_options_set.m: Add new options nu_min_dimfun + and nu_max_dimfun for stk_param_getdefaultbounds. + * param/estim/stk_param_getdefaultbounds.m: Compute nu_min and + nu_max using the new options. + + stk_param_getdefaultbounds.m: Lower-case variables names + + * param/estim/stk_param_getdefaultbounds.m: Use lower-case + variables names for tolscale and tolvar. + +2019-02-13 Julien Bect + + stk_runtests.m: Return a struct of results + + * misc/test/stk_runtests.m: Return a struct of results. + +2019-02-04 Julien Bect + + stk_param_init: Deprecate the syntax with do_estim_lnv + + * param/estim/stk_param_init.m: Remove the syntax with + do_estim_lnv from the documention. Explain in the source code + that it is deprecated, and add a warning. + * examples/03_miscellaneous/stk_example_misc03.m: Remove useless + do_estim_lnv argument. + * examples/03_miscellaneous/stk_example_misc06.m: Idem. + * NEWS.md: Announce this change. This goes nicely with a similar + change made to the stk_model_gpposterior class. + +2019-02-03 Julien Bect + + Rename two examples + + * examples/03_miscellaneous/stk_example_misc05.m: Renamed from + misc06. This one is going to be release in STK 2.6.0. + * examples/03_miscellaneous/stk_example_misc06.m: Renamed from + misc05. This one is not goind to be release in STK 2.6.0. + * NEWS.md: Fix corresponding news item. + +2019-01-28 Julien Bect + + stk_plot_shadedci.m: Fix CI legend + + * misc/plot/stk_plot_shadedci.m: Fix CI legend. + +2019-01-23 Julien Bect + + stk_param_estim_remlgs.m: Make it work for parameter objects too + + * param/estim/stk_param_estim_remlgs.m: Make it work for parameter + objects too. + +2019-01-22 Julien Bect + + stk_param_estim_optim.m: Add safety nets. + + * param/estim/stk_param_estim_optim.m: Add safety nets around the + call to the optimizer. If the final value is not better than the + initial one, issue an error. + + stk_param_estim: Fix a small bug relative to the 'info' ouput. + + * param/estim/stk_param_estim.m: Fix bug. + * param/estim/stk_param_estim_optim.m: Fix bug. + +2019-01-21 Julien Bect + + Extract stk_param_init's core to a separate (internal) function + + * param/estim/stk_param_estim_remlgs.m: New internal function, + which implements a ReML grid search. This was previously hidden + in stk_param_init. + * param/estim/stk_param_init.m: Remove the extracted part. + * admin/octpkg/INDEX: Update the index. + + stk_param_estim.m: Internal changes + + * param/estim/stk_param_estim.m (provide_starting_point): Do not + try to cast parameter objects into objects of the appropriate + type, simply assume that they are of the appropriate type. The + use of stk_set_optimizable_parameters should be restricted to + numerical value arguments. + + stk_model.m: Internal changes + + * core/stk_model.m: Removed unused argument 'covariance_name' from + subfunction stk_model_. + +2019-01-18 Julien Bect + + stk_param_init.m: Call user-defined _param_init with correct nargout + + * param/estim/stk_param_init.m: Call user-defined _param_init + function with the correct number of output arguments. + + stk_model.m: Be more flexible if stk_param_init fails + + * core/stk_model.m: Be more flexible and simply issue a warning if + we fail to get a default parameter vector from stk_param_init. + Also, do not rely on stk_param_init to get a default value for + lnv. + +2019-01-17 Julien Bect + + Make it possible to use stk_model with user-defined covariances. + + * param/estim/stk_param_init.m: When used with only one input + argument, stk_param_init now returns defaults param and lnv values + to be used by stk_model. + * core/stk_model.m: Rely on stk_param_init to obtain default + values for param and lnv. User-defined covariance should do this + as well. + +2018-11-30 Julien Bect + + Relocate @struct/ inside model/prior_struct (ticket #90) + + * core/@struct/get_input_data.m: Moved from. + * core/@struct/get_output_data.m: Moved from. + * core/@struct/get_prior_model.m: Moved from. + * model/prior_struct/@struct/get_input_data.m: Moved to. + * model/prior_struct/@struct/get_output_data.m: Moved to. + * model/prior_struct/@struct/get_prior_model.m: Moved to. + * model/prior_struct/@struct/README: Provide an explanation. + * admin/build_tools/build_octpkg.m: Ignore the README file. + + Move stk_get_optimizable_noise_parameters.m out of @struct/ + + * core/@struct/stk_get_optimizable_noise_parameters.m: Moved from. + * model/prior_struct/stk_get_optimizable_noise_parameters.m: Moved + to. Check that model is a prior model structure. + * admin/octpkg/INDEX: Update the index. + +2018-11-14 Julien Bect + + Move stk_param_getblockselectors out of @struct/ + + * core/@struct/stk_param_getblockselectors.m: Moved from. + * model/prior_struct/stk_param_getblockselectors.m: Moved to. + * param/estim/stk_param_estim.m: Check that model is a prior model + structure. + * admin/octpkg/INDEX: Update the index. + + Rename stk_replicate_obs_noise, add help text + + * core/@struct/stk_replicate_obs_noise.m: Renamed from. + * A utils/stk_simulate_noise.m: Renamed to. Add help text. + Extract from @struct directory (see ticket #90). + * utils/stk_generate_samplepaths.m: Use the new name. + * admin/octpkg/INDEX: Update the index. + +2018-11-10 Julien Bect + + Rename stk_assert_struct_is_model + + * misc/error/stk_assert_struct_is_model.m: Renamed from. + * misc/error/stk_assert_model_struct.m: Renamed to. + * model/prior_struct/stk_get_input_data.m: Use new name. + * model/prior_struct/stk_get_observation_variances.m: Idem. + * model/prior_struct/stk_get_output_data.m: Idem. + * model/prior_struct/stk_get_prior_model.m: Idem. + * core/@struct/stk_replicate_obs_noise.m: Idem. + * param/estim/stk_param_init.m: Call stk_assert_model_struct + instead of re-inventing the wheel. + * core/stk_get_optimizable_model_parameters.m: Idem. + * core/stk_set_optimizable_model_parameters.m: Idem. + + Polish stk_get_observation_variances + + * core/stk_get_observation_variances.m: Moved to model/prior_struct. + * model/prior_struct/stk_get_observation_variances.m: Moved here + from core. Remove the syntax with two input arguments. + * model/@stk_model_base/stk_get_observation_variances.m: All + models behave as prior models if this is not overridden. + * core/@stk_model_gpposterior/stk_get_observation_variances.m: + Minor fix in help text. + * model/@stk_model_base/stk_get_input_data.m: Update design note. + * model/@stk_model_base/stk_get_output_data.m: Idem. + * model/@stk_model_base/stk_get_prior_model.m: Idem. + * core/@struct/stk_replicate_obs_noise.m: Call stk_covmat_noise + directly. + * param/estim/stk_param_init.m: Idem. + * admin/octpkg/INDEX: Update the index. + +2018-11-09 Julien Bect + + Add an stk_ prefix to some getters. + + * core/@struct/get_input_data.m: Deprecated. + * core/@struct/get_output_data.m: Deprecated. + * core/@struct/get_prior_model.m: Deprecated. + * model/prior_struct/stk_get_input_data.m: New function, which + replaces @struct/get_input_data.m. + * model/prior_struct/stk_get_output_data.m: New function, which + replaces @struct/get_output_data.m. + * model/prior_struct/stk_get_prior_model.m: New function, which + replaces @struct/get_prior_model.m. + * core/@stk_model_gpposterior/get_input_data.m: Deprecated. + * core/@stk_model_gpposterior/get_output_data.m: Deprecated. + * core/@stk_model_gpposterior/get_prior_model.m: Deprecated. + * core/@stk_model_gpposterior/stk_get_input_data.m: New function, + which replaces @stk_model_gpposterior/get_input_data.m. + * core/@stk_model_gpposterior/stk_get_output_data.m: New function, + which replaces @stk_model_gpposterior/get_output_data.m. + * core/@stk_model_gpposterior/stk_get_prior_model.m: New function, + which replaces @stk_model_gpposterior/get_prior_model.m. + * model/@stk_model_base/stk_get_input_data.m: New function. All + model classes derived from @stk_model_base will behave as prior + models unless this is overridden. + * model/@stk_model_base/stk_get_output_data.m: Idem. + * model/@stk_model_base/stk_get_prior_model.m: Idem. + * core/@stk_model_gpposterior/stk_generate_samplepaths.m: Use the + new form for the getters, i.e., add an stk_ prefix. + * sampling/@stk_sampcrit_akg/feval.m: Idem. + * sampling/@stk_sampcrit_akg/set.m: Idem. + * sampling/@stk_sampcrit_ei/set.m: Idem. + * sampling/@stk_sampcrit_eqi/set.m: Idem. + * utils/stk_plot_probdom2d.m: Idem. + * stk_init.m: Add new subdirectory to the path. + * admin/octpkg/INDEX: Update the index. + +2018-10-29 Julien Bect + + Rename assert_struct_is_model.m, adding an stk_ prefix. + + * core/@struct/private/assert_struct_is_model.m: Remove private + function, now exists with an stk_ prefix. + * misc/error/stk_assert_struct_is_model.m: Replacement for removed + private function. + * core/@struct/get_input_data.m: Use new function name. + * core/@struct/get_output_data.m: Idem. + * core/@struct/get_prior_model.m: Idem. + * core/@struct/stk_replicate_obs_noise.m: Idem. + * admin/octpkg/INDEX: Update INDEX. + + Octave version requirement: fine tuning + + * NEWS.md: Change 3.8.1 to 3.8, no need to be so specific here. + * README.md: Make it clear that we only test in 3.8.2. + * admin/build_tools/build_octpkg.m: Formally require 3.8.0. + + Raise minimal Octave version to 3.8.1 + + * admin/build_tools/build_octpkg.m: Raise minimal Octave version + to 3.8.1, which the version currently available in the oldest + Ubuntu LTS still supported (namely Trusty). For the record, the + current oldstable release of Debian (namely, Jessie) has Octave + 3.8.2. + * README.md: Modify accordingly. + * admin/CODING_GUIDELINES: CG#04, CG#06, CG#11 and CG#12 no longer + apply. + * arrays/@stk_dataframe/isequal.m: isequal overload is no longer + needed (cf CG#04). + * arrays/@stk_factorialdesign/isequal.m: Idem. + * core/@stk_kreq_qr/isequal.m: Idem. + * core/@stk_model_gpposterior/isequal.m: Idem. + * lm/@stk_lm_affine/isequal.m: Idem. + * lm/@stk_lm_constant/isequal.m: Idem. + * lm/@stk_lm_cubic/isequal.m: Idem. + * lm/@stk_lm_matrix/isequal.m: Idem. + * lm/@stk_lm_null/isequal.m: Idem. + * lm/@stk_lm_quadratic/isequal.m: Idem. + * misc/optim/@stk_optim_baseclass/isequal.m: Idem. + * misc/optim/@stk_optim_fmincon/isequal.m: Idem. + * misc/optim/@stk_optim_fminsearch/isequal.m: Idem. + * misc/optim/@stk_optim_octavesqp/isequal.m: Idem. + * misc/parallel/@stk_parallel_engine_none/isequal.m: Idem. + * misc/parallel/@stk_parallel_engine_parfor/isequal.m: Idem. + * examples/02_design_of_experiments/stk_example_doe02.m: Use + brackets instead of vertcat or horzcat (cf CG#11). + * examples/02_design_of_experiments/stk_example_doe03.m: Idem. + * examples/02_design_of_experiments/stk_example_doe05.m: Idem. + * utils/stk_plot_probdom2d.m: Idem. + * admin/octpkg/INDEX: Update the index. + +2018-10-24 Julien Bect + + Add a base class for model classes + + * model/@stk_model_base: New class, to be used as a base class for + all model objects. + * model/@stk_model_base/stk_model_base.m: Trivial class constructor. + * model/@stk_model_base/cat.m: This function is taken, untouched, + from @stk_model_gpposterior and @stk_model_gn. + * model/@stk_model_base/disp.m: Idem. + * model/@stk_model_base/display.m: Idem. + * model/@stk_model_base/get.m: Idem. + * model/@stk_model_base/set.m: Idem. + * model/@stk_model_base/subsasgn.m: Idem. + * model/@stk_model_base/subsref.m: Idem. + * model/@stk_model_base/horzcat.m: Idem. + * model/@stk_model_base/vertcat.m: Idem. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Derive from + the base class. + * model/gn/@stk_model_gn/stk_model_gn.m: Idem + * core/@stk_model_gpposterior/display.m: Removed. + * core/@stk_model_gpposterior/horzcat.m: Removed. + * core/@stk_model_gpposterior/subsasgn.m: Removed. + * core/@stk_model_gpposterior/subsref.m: Removed. + * core/@stk_model_gpposterior/vertcat.m: Removed. + * model/gn/@stk_model_gn/cat.m: Removed. + * model/gn/@stk_model_gn/display.m: Removed. + * model/gn/@stk_model_gn/get.m: Removed. + * model/gn/@stk_model_gn/horzcat.m: Removed. + * model/gn/@stk_model_gn/set.m: Removed. + * model/gn/@stk_model_gn/subsasgn.m: Removed. + * model/gn/@stk_model_gn/subsref.m: Removed. + * model/gn/@stk_model_gn/vertcat.m: Removed. + * stk_init.m: Add new directory to the path. + * admin/octpkg/INDEX: Update the index. + + Introduce noise model objects as an experimental feature (ticket #38) + + * model/gn/@stk_model_gn: Base class for noise model objects. + * model/gn/@stk_model_gn/stk_model_gn.m: Class constructor. + * model/gn/@stk_model_gn/stk_covmat.m: Compute covariance matrix. + * model/gn/@stk_model_gn/cat.m: Prevent concatenation. + * model/gn/@stk_model_gn/horzcat.m: Idem. + * model/gn/@stk_model_gn/vertcat.m: Idem. + * model/gn/@stk_model_gn/get.m: Empty getter. + * model/gn/@stk_model_gn/set.m: Empty setter. + * model/gn/@stk_model_gn/subsasgn.m: Redirect dot-indexing to set. + * model/gn/@stk_model_gn/subsref.m: Redirect dot-indexing to get. + * model/gn/@stk_model_gn/disp.m: Overload disp. + * model/gn/@stk_model_gn/display.m: Overload display. + * model/gn/@stk_model_gn_heteroscedastic0: Provide a first example + of noise model class derived from stk_model_gn. + * model/gn/@stk_model_gn_heteroscedastic0/stk_model_gn_heteroscedastic0.m: + Class constructor. + * model/gn/@stk_model_gn_heteroscedastic0/stk_variance_eval.m: + This is where the variance function is actually computed. + * model/gn/@stk_model_gn_heteroscedastic0/stk_get_optimizable_parameters.m: + Overload STK function. + * model/gn/@stk_model_gn_heteroscedastic0/stk_param_getdefaultbounds.m: Idem. + * model/gn/@stk_model_gn_heteroscedastic0/stk_set_optimizable_parameters.m: Idem. + * model/gn/@stk_model_gn_heteroscedastic0/disp.m: Overload disp. + * model/gn/@stk_model_gn_heteroscedastic0/fieldnames.m: Provide field names. + * model/gn/@stk_model_gn_heteroscedastic0/get.m: Getter. + * model/gn/@stk_model_gn_heteroscedastic0/set.m: setter. + * stk_init.m: Add new directory to the path. + * examples/03_miscellaneous/stk_example_misc06.m: An example. + * admin/octpkg/INDEX: Update the index. + +2018-10-01 Julien Bect + + stk_model_gpposterior.m: Estimate params when lnv is NaN (ticket #93) + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Trigger + parameter estimation when lognoisevariance (or some of its + optimizable hyperparameters in the object case) is NaN. + +2018-09-28 Julien Bect + + stk_set_optimizable_parameters: Remove the 'select' argument + + * param/classes/stk_set_optimizable_parameters.m: Remove the + optional 'select' argument. + * core/@stk_model_gpposterior/stk_set_optimizable_parameters.m: Idem. + * core/stk_set_optimizable_model_parameters.m: Idem. + * param/estim/stk_param_estim_optim.m: Implement selection + directly here. + +2018-09-20 Julien Bect + + stk_dataframe.m: Accept char arg when only one row/col (ticket #92) + + * arrays/@stk_dataframe/stk_dataframe.m: Accept char vectors (or + strings) as `colnames` or `rownames` argument when there is only + one column or one row. This was, previously, only partially + supported for char vectors, and not at all for strings. Also, + clarify a little bit the processing of `rownames` / `colnames' + arguments. + +2018-09-11 Julien Bect + + stk_param_estim.m: Check if the starting points are finite + + * param/estim/stk_param_estim.m: Check if the starting points + param0 and lnv0 are finite, i.e., do not contain NaNs or Infs. + + Refresh the index + + * admin/octpkg/INDEX: Update the index with recently introduced + internal functions. + + Refresh quilt patches + + * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: Refresh patch. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: Refresh patch. + * admin/octpkg/patches/workaround-octave-bug-46350.patch: Refresh patch. + + stk_param_estim.m: stk_set_optimizable_parameters accepts object values + + * param/estim/stk_param_estim.m: Assume that + stk_set_optimizable_parameters accepts object values as well. + * param/estim/private/stk_param_check_lnv0.m: Delete unused + private function. + +2018-09-08 Julien Bect + + stk_param_estim.m: Fix a corner case + + * param/estim/stk_param_estim.m: Fix a corner case. + +2018-09-07 Julien Bect + + Reorganize parameter estimation (optimization) code + + * param/estim/stk_param_estim_optim.m: New internal function, to + optimize a given estimation criterion over a given subset of the + parameters (both covariance parameters and lnv parameters). + * core/@struct/stk_param_getblockselectors.m: New internal funct. + * param/estim/stk_param_estim.m: Use the new internal functions. + +2018-09-06 Julien Bect + + stk_param_init.m: Noise parameter objects are not allowed + + * param/estim/stk_param_init.m (stk_param_init_): Make it clear + that, for the noise model, parameter estimation is only supported + in the usual homoscedastic case, and parameter objects are not + allowed. + + stk_param_init.m: Do not call stk_param_init_ if param is an object + + * param/estim/stk_param_init.m: Do not call STK's default + stk_param_init_ procedure if model.param is an object. + +2018-08-22 Julien Bect + + stk_param_init.m: Clarify how we determine the value of do_estim_lnv + + * param/estim/stk_param_init.m: Clarify how we determine the value + of do_estim_lnv. In the (undocumented) case of an heteroscedastic + noise represented by a vector of variances, we ne longer issue an + error is do_estim_lnv is true, we simply ignore it. At the same + time, this patch improves the way we deal with noise model + objects, since previously we had a few old-style lnv(:) + expressions in here. + +2018-08-16 Julien Bect + + stk_example_kb09.m: Update unit tests + + * examples/01_kriging_basics/stk_example_kb09.m: Update unit + tests, which still referred to the old HOMOSCEDASTIC_NOISE variable. + +2018-07-25 Julien Bect + + Introduce exceptions to the way missing lnv is handled + + * param/estim/stk_param_init.m: Considers that lnv is nan, instead + of -Inf as everywhere else, in case of missing lnv field if lnv + estimation is explicitely requested. + * param/estim/stk_param_init_lnv.m: Considers that lnv is nan in + case of missing lnv field. + + stk_param_init_lnv.m: Experimental support for noise model objects + + * param/estim/stk_param_init_lnv.m: Introduce experimental support + for noise model objects. + * param/estim/stk_param_estim.m: Let stk_param_init_lnv hande the + object case. + +2018-07-24 Julien Bect + + stk_param_init.m: Errors out if the first arg is not a structure + + * param/estim/stk_param_init.m: Errors out if the first argument + is not a structure, since we expect a model structure here. + + stk_param_estim.m: Fix recently introduced error + + * param/estim/stk_param_estim.m (provide_starting_point): Fix + recently introduced error in subfunction provide_starting_point. + Went unnoticed because this section is not covered by unit + tests... + + stk_param_init_lnv.m: Errors out for noiseless models + + * param/estim/stk_param_init_lnv.m: Errors out if called for a + noiseless model. + +2018-07-23 Julien Bect + + stk_param_check_lnv0.m: Fix a bug. + + * param/estim/private/stk_param_check_lnv0.m: Fix a bug. + + stk_runtests.m: Improve the function in various ways + + * misc/test/stk_runtests.m: Improve the function in various ways. + First, make it possible to run all the tests in a given set of + directories. Second, display runtime for each directory. Third, + use the internal function stk_runtests_ both in Matlab and in + Octave (instead of __run_test_suite__ in Octave). + + stk_param_getdefaultbounds.m: Return [] bounds when param0 is [] + + * param/estim/stk_param_getdefaultbounds.m: Return empty bounds + when param0 is empty. + +2018-07-22 Julien Bect + + Remove some useless try-catch blocks + + * param/classes/stk_get_optimizable_parameters.m: Remove useless + try-catch block, which sometimes hides the true cause of the + error. + * param/classes/stk_set_optimizable_parameters.m: Idem. + +2018-07-20 Julien Bect + + stk_param_estim.m: Gather all code related to starting point determination + + * param/estim/stk_param_estim.m: Gather all code related to + starting point determination in a single subfunction for clarity. + Also, improve support for lnv objects, I hope. + +2018-07-19 Julien Bect + + stk_make_matcov.m: Remove some recent experimental code + + * core/stk_make_matcov.m: Remove some recent experimental code. + +2018-07-18 Julien Bect + + stk_param_estim.m: One more tiny step toward lnv objects (bis) + + * param/estim/private/stk_param_check_lnv0.m: Gather all lnv0 + checks in this subfunction to reduce clutter in stk_param_estim. + At the same time, rewrite some of the checks in order to accept + objects as well. + * param/estim/stk_param_estim.m: Use the new private function. + Also, in the case where lnv0 is not provided, adapt to deal with + object case as well. + * examples/03_miscellaneous/stk_example_misc03.m: Declare noisy + models properly (estimating the variance of the noise for a + noiseless model is no longer accepted). + +2018-07-17 Julien Bect + + stk_param_estim.m: One more tiny step toward lnv objects + + * param/estim/stk_param_estim.m: Do not check directly if lnv0 is + OK, since lnv0 might be a parameter object. Instead, extract the + vector of optimizable parameters, and do the checking on it. + +2018-07-16 Julien Bect + + stk_make_matcov.m: Direct evaluation of covariance parameter objects + + * core/stk_make_matcov.m: Unofficial support for direct evaluation + of covariance parameter objects, ignoring + model.covariance_type. This is introduced temporarily to support + some code by R. Stroh but should not be advertised as it is... + +2018-07-15 Julien Bect + + Deprecate stk_noisecov + + * covfcs/stk_noisecov.m: Mark as deprecated. + * core/stk_covmat_noise.m: New function, cherry-picked from branch + covmat and then modified, to serve as a replacment for + stk_noisecov. Considered as internal for the time being. + * core/stk_get_observation_variances.m: Remove redundant code and + call stk_covmat_noise instead. + * core/@stk_model_gpposterior/stk_get_observation_variances.m: + Call stk_covmat_noise directly. + * core/stk_make_matcov.m: Use stk_covmat_noise instead of + stk_noisecov. + * param/estim/stk_param_loomse.m: Idem. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * admin/octpkg/INDEX: Add the new function, mark the old one as + deprecated. + + Deal with structs in base set/get optimizable parameters + + * core/@struct/stk_get_optimizable_parameters.m: Renamed from. + * core/stk_get_optimizable_model_parameters.m: Renamed to. + * core/@struct/stk_set_optimizable_parameters.m: Renamed from. + * core/stk_set_optimizable_model_parameters.m: Renamed to. + * param/classes/stk_get_optimizable_parameters.m: Deal with structs. + * param/classes/stk_set_optimizable_parameters.m: Idem. + +2018-07-14 Julien Bect + + stk_get_optimizable_parameters.m: Return [] for discrete cov structures + + * param/classes/stk_get_optimizable_parameters.m: Return [] if + param describes a discrete covariance structure. + + New function(s) to get the variance of the observations + + * core/@stk_model_gpposterior/stk_get_observation_variances.m: + Return the variance of the observation for a posterior model. + * core/stk_get_observation_variances.m: Same thing for a prior + model, at a given set of locations. + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Use the + new function. + * core/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m: Idem. + * core/@struct/stk_replicate_obs_noise.m: Idem. + + assert_struct_is_model.m: Fix error identifier + + * core/@struct/private/assert_struct_is_model.m: Fix error + identifier. + + New (internal) function to simulate noise sample replicates + + * core/@struct/stk_replicate_obs_noise.m: simulate noise sample + replicates. + * utils/stk_generate_samplepaths.m: Use the new function. + + Encapsulate Gaussian logpdf / logpdf_grad computations + + * misc/distrib/stk_distrib_logpdf.m: Compute the Gaussian logpdf, + still assuming the good ol' struct representation. + * misc/distrib/stk_distrib_logpdf_grad.m: Compute the gradient of + the Gaussian logpdf. + * param/estim/stk_param_relik.m: Simplify the code using the two + new internal functions. + +2018-07-13 Julien Bect + + stk_isnoisy.m: Clarify the case of noise model objects + + * core/stk_isnoisy.m: Clarify the case of noise model objects. + + stk_sampling_nestedlhs.m: Minor doc fix + + * sampling/stk_sampling_nestedlhs.m: Minor doc fix. + +2018-07-12 Julien Bect + + stk_param_estim.m (provide_param0_value): Fix the case of parameter objects + + * param/estim/stk_param_estim.m: Fix the case where param0 is a + parameter object instead of a vector of numeric parameter values. + + stk_param_estim.m: Rewrite nargin checks in a more efficient way + + * param/estim/stk_param_estim.m: Rewrite nargin checks in a more + efficient way. + +2018-07-11 Julien Bect + + Add an optional select argument to stk_set_optimizable_parameters + + * core/@stk_model_gpposterior/stk_set_optimizable_parameters.m: + Add an optional select argument to stk_set_optimizable_parameters. + * core/@struct/stk_set_optimizable_parameters.m: Idem. + * param/classes/stk_set_optimizable_parameters.m: Idem. + + Implement stk_set/get_optimizable_parameters for models + + * core/@stk_model_gpposterior/stk_set_optimizable_parameters.m: + Implement stk_set_optimizable_parameters for posterior models. + * core/@struct/stk_set_optimizable_parameters.m: Implement + stk_set_optimizable_parameters for prior models, currently + described by a structure. + * core/@stk_model_gpposterior/stk_get_optimizable_parameters.m: + Implement stk_get_optimizable_parameters for posterior models. + * core/@struct/stk_get_optimizable_parameters.m: Implement + stk_get_optimizable_parameters for prior models, currently + described by a structure. + +2018-07-10 Julien Bect + + Make get_defaultbounds_lnv a (renamed) standalone function for clarity. + + * param/estim/stk_param_getdefaultbounds_lnv.m: Replacement + function for subfunction get_defaultbounds_lnv in stk_param_estim. + Take this opportunity to support the case of parameter objects. + * param/estim/stk_param_estim.m: Use the new function. + +2018-07-07 Julien Bect + + Parameter estimation criteria: get noiseparam at the beginning + + * param/estim/stk_param_loomse.m: Get noiseparam at the beginning, + but only if it is really neededed. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + + Parameter estimation: improve the way we deal with noise parameters + + * core/@struct/stk_get_optimizable_noise_parameters.m: New + internal function to get the vector of optimizable parameters of + the noise model. + * core/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m: + Idem for posterior models. + * param/estim/stk_param_loomse.m: Use the new function. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + +2018-07-06 Julien Bect + + Parameter estimation criteria: check the size of XI and ZI + + * param/estim/stk_param_loomse.m: Check the size of XI and ZI. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + + Parameter estimation criteria: call the observations ZI + + * param/estim/stk_param_loomse.m: Call the observations ZI, as + ---more or less--- everywhere else in the toolbox. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + + Parameter estimation criteria: use consistent variable names + + * param/estim/stk_param_loomse.m: Rename some variables. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + + Parameter estimation criteria: return [] instead of NaN when... + + * param/estim/stk_param_loomse.m: Remove FIXME comment. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Return [] instead of NaN for when + the derivative with respect to lnv is requested for a noiseless + model. + +2018-07-02 Julien Bect + + param/estim: Use consistent output names + + * param/estim/stk_param_loomse.m: Rename outputs. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + +2018-07-01 Julien Bect + + stk_param_relik.m: Re-use the Cholesky factorization of K + + * param/estim/stk_param_relik.m: Re-use the Cholesky factorization + of K instead of doing it twice (this was inadvertently introduced + recently). Also, rename the Cholesky factor from C to U, which + stands for "Upper-triangular", thus freeing the letter C which + might be a good generic notation for "Criterion"... + +2018-06-23 Julien Bect + + stk_param_init.m: Fix the broken heteroscedastic case (ticket #88) + + * param/estim/stk_param_init.m (stk_param_init_): Clarify, at + least a little bit, what the subfunction does in the three cases, + and fix the broken behaviour in the heteroscedatic / known + variance case. + +2018-06-11 Julien Bect + + stk_dominatedhv_mex.c: Workaround for Octave 4.4 issue (ticket #89) + + * misc/pareto/private/stk_dominatedhv_mex.c: Workaround for Octave + 4.4 issue (see ticket #54096 on Octave's bug tracker for details). + +2018-06-07 Julien Bect + + Check for duplicated rows when ill-conditioning is detected (ticket #74) + + * misc/error/stk_assert_no_duplicates.m: New function. + * admin/octpkg/INDEX: Add new function to the index. + * core/@stk_kreq_qr/stk_kreq_qr.m: Check for duplicated rows when + ill-conditioning is detected. + * param/estim/stk_param_relik.m: Idem. + * core/stk_predict.m: Add unit test. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Source + formatting. + +2018-06-06 Julien Bect + + stk_cholcov.m: Return the value of epsi + + * core/stk_cholcov.m: Return the value of epsi, to make it + possible to detect that the original matrix A was not + numerically positive definite. + +2018-06-05 Julien Bect + + stk_param_relik.m: Just a little bit of optimization + + * param/estim/stk_param_relik.m: Just a little bit of optimization. + * misc/benchmarks/stk_benchmark_uppertriangular.m: A simple test + script to show that the best way to handle upper-triangular + matrices is not the same in Octave and in Matlab. + +2018-06-04 Julien Bect + + @stk_model_gpposterior/stk_model_gpposterior.m: Minor change + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Minor change. + +2018-06-03 Julien Bect + + @stk_dataframe/unique.m: Overload base function + + * arrays/@stk_dataframe/unique.m: Overload base function. + Yesterday's commit was intended to avoid this overload. It work + in matlab, but not in Octave, so here it is... + * arrays/@stk_dataframe/sort.m: Remove unit test. + +2018-06-02 Julien Bect + + @stk_dataframe/sort.m: Behave more like the base sort() function + + * arrays/@stk_dataframe/sort.m: Behave more like the base sort() + function. In particular, accept optional arguments, and deal with + that fact that the dimension argument is allowed to be skipped. + +2018-05-22 Julien Bect + + Use UNIX-type EOL + + * examples/03_miscellaneous/stk_example_misc05.m: Use UNIX-type EOL. + * param/estim/stk_param_loomse.m: Idem. + * param/estim/stk_param_loopvc.m: Idem. + +2018-05-22 Julien Bect + + Don't use UTF-8 in m-files + + * core/@stk_model_gpposterior/stk_isnoisy.m: Remove UTF-8 character. + * core/stk_isnoisy.m: Idem. + * misc/benchmarks/stk_benchmark_bivnorm.m: Idem. + * param/estim/stk_param_loomse.m: Idem. + * param/estim/stk_param_loopvc.m: Idem. + +2018-05-22 Julien Bect + + Remove nargin checks and update CG#01 + + * admin/CODING_GUIDELINES: Update CG#01. + * arrays/@stk_dataframe/max.m: Remove nargin check. + * arrays/@stk_dataframe/min.m: Idem. + * arrays/@stk_dataframe/plotmatrix.m: Idem. + * arrays/@stk_dataframe/stk_boundingbox.m: Idem. + * arrays/@stk_dataframe/stk_conditioning.m: Idem. + * arrays/@stk_dataframe/stk_dataframe.m: Idem. + * arrays/@stk_dataframe/stk_normalize.m: Idem. + * arrays/@stk_factorialdesign/ndgrid.m: Idem. + * arrays/@stk_factorialdesign/stk_boundingbox.m: Idem. + * arrays/@stk_hrect/stk_boundingbox.m: Idem. + * arrays/@stk_hrect/stk_hrect.m: Idem. + * arrays/@stk_hrect/stk_normalize.m: Idem. + * arrays/@stk_hrect/stk_rescale.m: Idem. + * arrays/generic/stk_boundingbox.m: Idem. + * arrays/generic/stk_feval.m: Idem. + * arrays/generic/stk_normalize.m: Idem. + * core/@stk_model_gpposterior/stk_generate_samplepaths.m: Idem. + * core/@stk_model_gpposterior/stk_predict.m: Idem. + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Idem. + * core/stk_make_matcov.m: Idem. + * core/stk_model.m: Idem. + * core/stk_ortho_func.m: Idem. + * core/stk_predict.m: Idem. + * core/stk_predict_leaveoneout.m: Idem. + * covfcs/rbf/stk_rbf_exponential.m: Idem. + * covfcs/rbf/stk_rbf_gauss.m: Idem. + * covfcs/rbf/stk_rbf_matern.m: Idem. + * covfcs/rbf/stk_rbf_matern32.m: Idem. + * covfcs/rbf/stk_rbf_matern52.m: Idem. + * covfcs/rbf/stk_rbf_spherical.m: Idem. + * covfcs/stk_expcov_aniso.m: Idem. + * covfcs/stk_expcov_iso.m: Idem. + * covfcs/stk_gausscov_aniso.m: Idem. + * covfcs/stk_gausscov_iso.m: Idem. + * covfcs/stk_materncov32_aniso.m: Idem. + * covfcs/stk_materncov32_iso.m: Idem. + * covfcs/stk_materncov52_aniso.m: Idem. + * covfcs/stk_materncov52_iso.m: Idem. + * covfcs/stk_materncov_aniso.m: Idem. + * covfcs/stk_materncov_iso.m: Idem. + * covfcs/stk_noisecov.m: Idem. + * covfcs/stk_sphcov_aniso.m: Idem. + * covfcs/stk_sphcov_iso.m: Idem. + * iago/rep/stk_fakenorep.m: Idem. + * iago/rep/stk_param_estim_withrep.m: Idem. + * iago/rep/stk_predict_withrep.m: Idem. + * lm/@stk_lm_affine/stk_lm_affine.m: Idem. + * lm/@stk_lm_constant/stk_lm_constant.m: Idem. + * lm/@stk_lm_cubic/stk_lm_cubic.m: Idem. + * lm/@stk_lm_matrix/stk_lm_matrix.m: Idem. + * lm/@stk_lm_null/stk_lm_null.m: Idem. + * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Idem. + * lm/stk_lm_polynomial.m: Idem. + * misc/design/stk_maxabscorr.m: Idem. + * misc/design/stk_phipcrit.m: Idem. + * misc/dist/stk_dist.m: Idem. + * misc/dist/stk_filldist.m: Idem. + * misc/dist/stk_filldist_discretized.m: Idem. + * misc/dist/stk_filldist_exact.m: Idem. + * misc/dist/stk_gpquadform.m: Idem. + * misc/dist/stk_mindist.m: Idem. + * misc/distrib/stk_distrib_bivnorm_cdf.m: Idem. + * misc/distrib/stk_distrib_normal_cdf.m: Idem. + * misc/distrib/stk_distrib_normal_crps.m: Idem. + * misc/distrib/stk_distrib_normal_ei.m: Idem. + * misc/distrib/stk_distrib_normal_pdf.m: Idem. + * misc/distrib/stk_distrib_student_cdf.m: Idem. + * misc/distrib/stk_distrib_student_ei.m: Idem. + * misc/distrib/stk_distrib_student_pdf.m: Idem. + * misc/optim/@stk_optim_baseclass/stk_optim_baseclass.m: Idem. + * misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m: Idem. + * misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m: Idem. + * misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m: Idem. + * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: Idem. + * misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m: Idem. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Idem. + * misc/optim/stk_optim_testmin_box.m: Idem. + * misc/optim/stk_optim_testmin_unc.m: Idem. + * misc/options/stk_options_get.m: Idem. + * misc/pareto/stk_dominatedhv.m: Idem. + * misc/plot/stk_legend.m: Idem. + * misc/test/stk_is_lhs.m: Idem. + * misc/test/stk_isequal_tolabs.m: Idem. + * misc/test/stk_isequal_tolrel.m: Idem. + * misc/text/stk_disp_progress.m: Idem. + * param/estim/stk_param_estim.m: Idem. + * param/estim/stk_param_init.m: Idem. + * param/estim/stk_param_init_lnv.m: Idem. + * param/estim/stk_param_loomse.m: Idem. + * param/estim/stk_param_loopvc.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * sampling/@stk_function/stk_function.m: Idem. + * sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m: Idem. + * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: Idem. + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Idem. + * sampling/stk_sampcrit_akg_eval.m: Idem. + * sampling/stk_sampcrit_ehvi_eval.m: Idem. + * sampling/stk_sampcrit_ei_eval.m: Idem. + * sampling/stk_sampcrit_emmi_eval.m: Idem. + * sampling/stk_sampling_halton_rr2.m: Idem. + * sampling/stk_sampling_maximinlhs.m: Idem. + * sampling/stk_sampling_nesteddesign.m: Idem. + * sampling/stk_sampling_nestedlhs.m: Idem. + * sampling/stk_sampling_olhs.m: Idem. + * sampling/stk_sampling_randomlhs.m: Idem. + * sampling/stk_sampling_randunif.m: Idem. + * sampling/stk_sampling_regulargrid.m: Idem. + * sampling/stk_sampling_sobol.m: Idem. + * utils/stk_conditioning.m: Idem. + * utils/stk_generate_samplepaths.m: Idem. + * utils/stk_plot_probdom2d.m: Idem. + +2018-05-17 Julien Bect + + stk_plot1d.m: Fix legend slowness problem (ticket #82) + + * utils/stk_plot1d.m: Do not create a legend systematically. + * misc/plot/stk_legend.m: New function to create a legend, using + the graphical objects for which a non-empty DisplayName has been + provided. + * misc/plot/stk_plot_shadedci.m: Provide a DisplayName for one of + the gray patches (the darker one). + * examples/01_kriging_basics/stk_example_kb01.m: Update. + * examples/01_kriging_basics/stk_example_kb01n.m: Update. + * examples/01_kriging_basics/stk_example_kb02.m: Update. + * examples/01_kriging_basics/stk_example_kb02n.m: Update. + * examples/01_kriging_basics/stk_example_kb05.m: Update. + * examples/01_kriging_basics/stk_example_kb07.m: Update. + * examples/01_kriging_basics/stk_example_kb08.m: Update. + * examples/01_kriging_basics/stk_example_kb09.m: Update. + * admin/octpkg/INDEX: Add stk_legend to the index. + +2018-03-14 Remi Stroh + + New functions to estimate the parameters based on leave-one-out (loo) + + * param/estim/stk_param_loomse.m: loo mean square error + * param/estim/stk_param_loopvc.m: loo predictive variance criterion + + Add an example to compare the criteria + + * examples/03_miscellaneous/stk_example_misc05.m + +2018-03-08 Julien Bect + + Write "covariance function" instead of "covariance kernel" in docs. + + * covfcs/stk_expcov_aniso.m: Write "covariance function" instead + of "covariance kernel" in the help text. + * covfcs/stk_materncov32_aniso.m: Idem. + * covfcs/stk_materncov32_iso.m: Idem. + * covfcs/stk_materncov52_aniso.m: Idem. + * covfcs/stk_materncov52_iso.m: Idem. + * covfcs/stk_materncov_aniso.m: Idem. + * covfcs/stk_materncov_iso.m: Idem. + * covfcs/stk_sphcov_aniso.m: Idem. + +2017-10-30 Julien Bect + + stk_dataframe.m: Improve help text + + * arrays/@stk_dataframe/stk_dataframe.m: Explain how to extract + the underlying numerical array. + + display.m: Fix EOL problem when display in verbose mode. + + * arrays/@stk_dataframe/display.m: Fix EOL problem in verbose mode. + + stk_options_set.m: Return option struct only if nargout > 0 + + * misc/options/stk_options_set.m: stk_options_set.m: Return option + struct only if nargout > 0. + +2017-09-14 Rémi Stroh + + Correct an error in the documentation + + * misc/test/stk_isequal_tolrel.m: replace "max" by "abs" + in the help message + +2017-09-12 Julien Bect + + CODING_GUIDELINES: Add (and apply) CG#12 guideline + + * admin/CODING_GUIDELINES: Document in CG#12 why it is better to + use "hold off" instead of "cla" when calling stk_plot1d in a loop. + * examples/02_design_of_experiments/stk_example_doe03.m: Apply CG#12. + * examples/02_design_of_experiments/stk_example_doe05.m: Apply CG#12. + + CODING_GUIDELINES: Add CG#11 guideline + + * admin/CODING_GUIDELINES: Document in CG#11 why horzcat and + vertcat must be called explicitely. + +2017-09-11 Julien Bect + + Workaround for get (0, 'Format') compatibility issue + + * misc/text/stk_disp_getformat.m: New function to get 'Format' and + 'FormatSpacing' properties in a Matlab/Octave comaptible way. + * misc/text/stk_disp_isloose.m: Rewrite using the new function. + * admin/octpkg/INDEX: Add new function to the INDEX. + * arrays/@stk_dataframe/disp.m: Use the new function. + * arrays/@stk_dataframe/stk_sprintf.m: Idem. + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Itou. + +2017-09-10 Julien Bect + + Raise Octave version requirement to 3.6 + + * README.md: Indicate that STK is tested to work on "GNU Octave + 3.6.2 or newer", which corresponds to the version currently + available in Debian old-old-stable, a.k.a. Wheezy. + * admin/CODING_GUIDELINES: Update coding guidelines. + * admin/build_tools/build_octpkg.m: Set octave depencency version + to 3.6.0 in the DESCRIPTION file. + * arrays/@stk_dataframe/stk_sprintf.m: Remove hacks. + * arrays/@stk_dataframe/subsasgn.m: Remove hacks. + * arrays/@stk_factorialdesign/subsasgn.m: Remove hacks. + * arrays/generic/stk_sprintf.m: Remove hacks. + * misc/error/stk_error.m: Remove hacks. + * misc/mole/quantile/quantile.m: Remove hacks. + * stk_init.m: Remove hacks. + * utils/stk_plot1d.m: Remove hacks. + * arrays/@stk_dataframe/isequal.m: Remove overloaded isequal + function, no longer needed. + * arrays/@stk_factorialdesign/isequal.m: Idem. + * core/@stk_kreq_qr/isequal.m: Idem. + * core/@stk_model_gpposterior/isequal.m: Idem. + * lm/@stk_lm_affine/isequal.m: Idem. + * lm/@stk_lm_constant/isequal.m: Idem. + * lm/@stk_lm_cubic/isequal.m: Idem. + * lm/@stk_lm_matrix/isequal.m: Idem. + * lm/@stk_lm_null/isequal.m: Idem. + * lm/@stk_lm_quadratic/isequal.m: Idem. + * misc/optim/@stk_optim_baseclass/isequal.m: Idem. + * misc/optim/@stk_optim_fmincon/isequal.m: Idem. + * misc/optim/@stk_optim_fminsearch/isequal.m: Idem. + * misc/optim/@stk_optim_octavesqp/isequal.m: Idem. + * misc/parallel/@stk_parallel_engine_none/isequal.m: Idem. + * misc/parallel/@stk_parallel_engine_parfor/isequal.m: Idem. + * admin/octpkg/INDEX: Update INDEX. + * admin/octpkg/patches/remove-buildmex.patch: Update patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Update patch. + * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: Update patch. + +2017-09-07 Julien Bect + + stk_plot_shadedci.m: Use area instead of fill for old Octave/Matlab + + * misc/plot/stk_plot_shadedci.m: Use area instead of fill for old + versions of Octave and Matlab. + +2017-09-05 Julien Bect + + stk_runtests.m: In Octave, check that __run_test_suite__ exists + + * misc/test/stk_runtests.m: In Octave, check that + __run_test_suite__ exists before actually trying to call it. + +2017-09-04 Julien Bect + + stk_sampcrit_ei_eval.m: Remove deprecated calling forms + + * sampling/stk_sampcrit_ei_eval.m: Remove deprecated calling forms. + + Make halfpintl public, with an stk_ prefix + + * sampling/private/halfpintl.m: Remove from private directory. + * sampling/stk_halfpintl.m: Renamed from halfpintl.m. + * admin/octpkg/INDEX: Expose stk_halfpintl in the INDEX. + * sampling/stk_sampcrit_akg_eval.m: Update. + * admin/octpkg/patches/comment-out-unit-tests-in-private-functions.patch: Remove. + * admin/octpkg/patches/series: Update. + + Use Octave's native test function on Octave + + * misc/test/stk_test.m: Use Octave's native test function on Octave. + * misc/test/stk_runtests.m: Similarly, use Octave's native + __run_test_suite__ function when running on Octave. + * admin/octpkg/patches/use-native-test-function.patch: Remove patch. + * admin/octpkg/patches/series: Remove patch. + * admin/octpkg/INDEX: Add stk_test to the INDEX. + +2017-09-01 Julien Bect + + Multiply/divide an stk_dataframe object by a scalar + + * arrays/@stk_dataframe/mtimes.m: Implement a special case for the + multiplication of an stk_dataframe object by a numerical scalar. + * arrays/@stk_dataframe/mldivide.m: Idem for left division. + * arrays/@stk_dataframe/mrdivide.m: Idem for right division. + + Overload left/right matrix division for stk_dataframe objects + + * arrays/@stk_dataframe/mldivide.m: New function. + * arrays/@stk_dataframe/mrdivide.m: New function. + * admin/octpkg/INDEX: Add new functions to the INDEX. + + stk_benchmark_predict.m: The boxplot function might be unavailable + + * misc/benchmarks/stk_benchmark_predict.m: Wrap call to boxplot in + try-catch block, since the boxplot function might be unavailable. + + @stk_sampcrit_ei/set.m: Remove unnecessary assert + + * sampling/@stk_sampcrit_ei/set.m: Remove unnecessary assert, + since only scalar output models are supported in STK at this time. + + Remove support for old-style .a structures + + * arrays/@stk_dataframe/private/get_column_number.c: Remove + support for old-style .a structures. + * misc/dist/stk_gpquadform.m: Idem. + * arrays/@struct/double.m: Removed. + * arrays/@struct/stk_boundingbox.m: Removed. + * arrays/@struct/stk_length.m: Removed. + * admin/octpkg/INDEX: Update. + * arrays/@stk_dataframe/subsref.m: Remove unit tests. + * core/@stk_model_gpposterior/stk_predict.m: Idem. + * core/stk_predict.m: Idem. + * arrays/generic/stk_feval.m: Idem. + * covfcs/stk_expcov_aniso.m: Idem. + * covfcs/stk_gausscov_aniso.m: Idem. + * covfcs/stk_materncov32_aniso.m: Idem. + * covfcs/stk_sphcov_aniso.m: Idem. + * NEWS.md: Advertise. + +2017-08-31 Julien Bect + + stk_generate_samplepaths.m: Remove xtest for ticket #14 + + * utils/stk_generate_samplepaths.m: Remove xtest for ticket #14 + since the problem as been solved, as expected, by the previous + commit. + + Exact predictions at obs points for noiseless models (ticket #49) + + * core/@stk_model_gpposterior/stk_predict.m: Ensure exact + prediction at observation points for noiseless models. + * core/stk_predict.m: Change xtest to test. + * sampling/@stk_sampcrit_eqi/feval.m: Fix EQI computation at the + points where the variance is zero. + + Insert HTML version of AUTHORS.md in the documentation + + * admin/build_tools/generate_htmldoc.m: Insert HTML version of + AUTHORS.md in the documentation. + + INDEX: Add @stk_factorialdesign/ismember + + * admin/octpkg/INDEX: INDEX: Add @stk_factorialdesign/ismember. + + Convert AUTHORS to markdown. + + * AUTHORS: Renamed to AUTHORS.md + * AUTHORS.md: Renamed from AUTHORS, and converted to md syntax. + * admin/find_nonstandard_characters.sh: Scan AUTHORS.md as well. + * admin/build_tools/build_octpkg.m: Update. + * README.md: Update. + * admin/RELEASE.md: Update. + + NEWS.md: Write Matérn with an accent on the "e" + + * NEWS.md: Write Matérn with an accent on the "e", since we are + already using UTF-8 in this file anyway (for the umlaut on the "u" + of Müller). + +2017-08-30 Julien Bect + + Overload ismember for stk_factorialdesign objects (ticket #29) + + * arrays/@stk_factorialdesign/ismember.m: New function + +2017-08-29 Julien Bect + + stk_sampcrit_ehvi_eval.m: Avoid OOM errors (ticket #48) + + * sampling/stk_sampcrit_ehvi_eval.m: Process batches of rectangles + to avoid OOM errors. + + Adapt html doc generation to changes in generate_html (fix) + + * admin/build_tools/get_allpurpose_html_options.m: Fix earlier + commit (a12753859a6a) with the same name. + + generate_htmldoc.m: Use HTML version of NEWS.md (ticket #61) + + * admin/build_tools/generate_htmldoc.m: Insert HTML version of + NEWS.md, produced by markdown, inside NEWS.html. + + NEWS.md: Fix markdown formatting + + * NEWS.md: Fix markdown formatting + +2017-08-28 Julien Bect + + Convert NEWS to markdown formatting (ticket #60) + + * NEWS.md: Convert NEWS to markdown formatting and rename to NEWS.md. + * NEWS: Removed. + * admin/build_tools/build_octpkg.m: Rename NEWS to NEWS.md. + +2017-08-26 Julien Bect + + @stk_dataframe/ismember.m: Do not assume 'rows' (ticket #50) + + * arrays/@stk_dataframe/ismember.m: Do not assume 'rows', in order + to have a behaviour that is consistent with that of the base + function on numerical matrices. + + Remove isoctave function + + * misc/mole/isoctave/isoctave.m: Deleted. + * stk_init.m: Use exist directly. Remove a few lines related to + the isoctave function. + * misc/mole/graphics_toolkit/graphics_toolkit.m: Use exist + directly. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Use exist + directly. + * misc/options/stk_options_set.m: Use exist directly. + * misc/parallel/stk_parallel_start.m: Use exist directly. + * misc/test/stk_test.m: Use exist directly. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: Refresh patch. + * admin/octpkg/patches/use-native-test-function.patch: Refresh patch. + + CG#10: Disable TeX interpreter for variable names + + * admin/CODING_GUIDELINES: Introduce new coding guideline, CG#10, + recommending to disable the TeX interpreter for variable names. + * arrays/@stk_dataframe/plot.m: Follow CG#10. + * arrays/@stk_dataframe/plotmatrix.m: Follow CG#10. + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Follow CG#10. + * arrays/@stk_hrect/axis.m: Follow CG#10. + +2017-08-25 Julien Bect + + Adapt html doc generation to changes in generate_html + + * admin/build_tools/get_allpurpose_html_options.m: Adapt html doc + generation to changes in generate_html. + +2017-07-25 Julien Bect + + @stk_dataframe/bsxfun.m: Fix colnames/rownames selection + + * arrays/@stk_dataframe/bsxfun.m: Fix colnames/rownames selection. + +2017-07-24 Julien Bect + + @stk_model_gpposterior/stk_predict_leaveoneout.m: Ensure var >= 0 + + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Make sure + that variances will always be non-negative. + + Benchmark virtual LOO-CV speedup + + * misc/benchmarks/stk_benchmark_loocv.m: New benchmark script to + evaluate to speedup brought by the implementation of virtual LOO + cross validation. + + Move some LOO-CV unit tests + + * core/stk_predict_leaveoneout.m: Move unit tests for correctness + of virtual LOO-CV formulas to + @stk_model_gpposterior/stk_predict_leaveoneout.m. + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Here. + + Keep a copy of the original "direct" implementation of LOO-CV. + + * core/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m: + Internal function, which is simply a copy of our original, + "direct" implementation of LOO-CV. Can be used to check + correctness of virtual LOO formulas, and for benchmarking. + * admin/octpkg/INDEX: Hide internal function from the index. + +2017-07-23 Rémi Stroh + + stk_predict_leaveoneout.m: Use virtual Leave-One-Out formula (ticket #35) + + * core\@stk_model_gpposterior\stk_predict_leaveoneout.m: Replace + the naive expression of the cross-validation, by the virtual + leave-one-out formula. + * core\stk_predict_leaveoneout.m: Add a test to check virtual + LOO formula. + +2017-07-12 Julien Bect + + stk_benchmark_predict.m: New function to benchmark stk_predict + + * misc/benchmarks/stk_benchmark_predict.m: New function to + benchmark stk_predict. + + stk_benchmark_.m: New function to help benchmark computation times + + * misc/benchmarks/stk_benchmark_.m: New function to help benchmark + computation times. + +2017-07-10 Julien Bect + + stk_example_misc04.m: Work-around for Octave bug #49267. + + * examples/03_miscellaneous/stk_example_misc04.m: Work-around for + Octave bug #49267. + + New octpkg patch to comment out unit tests in private functions + + * admin/octpkg/patches/comment-out-unit-tests-in-private-functions.patch: + New octpkg patch to comment out unit tests in private functions. + * admin/octpkg/patches/series: Add new test to the series. + +2017-07-09 Julien Bect + + stk_predict_leaveoneout.m: Update help text + + * core/stk_predict_leaveoneout.m: Update help text. + + Set release date based on hg date in the build process + + * Makefile: Pass hg date to build_* functions. + * admin/build_tools/build_allpurpose.m: Use hg date. + * admin/build_tools/build_octpkg.m: Use hg date. + * admin/build_tools/copy_citation.m: Use hg date. + * admin/build_tools/copy_readme.m: Use hg date. + +2017-07-05 Julien Bect + + stk_sampcrit_akg_eval.m: Fix unit tests + + * sampling/stk_sampcrit_akg_eval.m: Fix unit tests. + + stk_dominatedhv_mex.c: Avoid "uninitialized variable" warnings + + * misc/pareto/private/stk_dominatedhv_mex.c: Avoid "uninitialized + variable" compiler warnings. + + CG#09: Use erfcinv when norminv fails (ticket #78) + + * admin/CODING_GUIDELINES: Introduce new coding guideline, CG#09, + recommending to use erfcinv directly when norminv fails. + * sampling/@stk_sampcrit_eqi/set.m: Implement CG#09. + +2017-07-04 Rémi Stroh + + @stk_sampcrit_eqi\set.m: Change "norminv" by "erfcinv" (ticket #78) + + * sampling\@stk_sampcrit_eqi\set.m: Replace the use of "norminv" + function, available only with the statistical toolbox, by an + expression using "erfcinv", a special basis function. + + utils\stk_plot1d.m: Correct a bug + + * utils\@stk_plot1d.m: Correct a bug, in the case where xt is empty. + + utils/@stk_plot1d: sort data before plotting + + * utils/@stk_plot1d: sort xt as increasing order before plotting. + The output vectors zt, zp and zsim are similarly modified before + their drawings. + + arrays/@stk_dataframe: Overload 3 additional unitary test functions + + * arrays/@stk_dataframe/isnan.m: New overloaded test function + * arrays/@stk_dataframe/isinf.m: Idem. + * arrays/@stk_dataframe/isfinite.m: Idem. + +2017-07-03 Julien Bect + + stk_param_estim.m: Do not use model.param as a starting point + + * param/estim/stk_param_estim.m: Do not use model.param as a + starting point; if param0 is not provided, call stk_param_init. + Modify documentation accordingly; it wasn't up-to-date anyway. + +2017-07-02 Julien Bect + + @stk_model_gpposterior/stk_predict.m: Skip main loop when nt == 0 + + * core/@stk_model_gpposterior/stk_predict.m: Skip main loop when + nt == 0. + + stk_predict_leaveoneout.m: nargout == 0 => create plots + + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Calling + stk_predict_leaveoneout with no output arguments now automatically + create two cross-validation diagnostics in two subplots: + prediction VS observations, left panel, and normalized + + residuals, right panel. + * core/stk_predict_leaveoneout.m: Do not change nargout when + calling overloaded method. + * examples/01_kriging_basics/stk_example_kb10.m: Advertise the new + syntax at the end of the script. + + @stk_dataframe/stk_dataframe.m: Accept char colnames/rownames + + * arrays/@stk_dataframe/stk_dataframe.m: Tolerate char arguments + instead of cells for column and row names in the special case + where the expected number of elements is one. + +2017-07-01 Julien Bect + + stk_plot_probdom2d.m: New function + + * utils/stk_plot_probdom2d.m: New function to represent the + uncertainty about a 2D Pareto front. This function is currently + considered experimental and should not be expected to produce a + reliable representation of the uncertainty for difficult or + high-dimensional optimization problems. + * examples/03_miscellaneous/stk_example_misc04.m: Update the + example to use the new function. + * admin/octpkg/INDEX: Add the new function to the INDEX. + + @stk_model_gpposterior/stk_generate_samplepaths.m: Overload base + + * core/@stk_model_gpposterior/stk_generate_samplepaths.m: New + function, overload base STK function. + + Remove all occurences of response_name + + * core/stk_model.m: Do not mention response_name as an optional + field, since it isn't used anywhere in STK now. + * examples/03_miscellaneous/stk_example_misc04.m: No more + response_name. + + Return a plain numerical array from stk_generate_samplepaths + + * utils/stk_generate_samplepaths.m: Return a plain double + precision numerical array; no more data frames here. + * arrays/@stk_dataframe/stk_generate_samplepaths.m: Removed. + * examples/03_miscellaneous/stk_example_misc04.m: Updated. + * admin/octpkg/INDEX: Update the INDEX. + + @stk_model_gpposterior/stk_model_gpposterior.m: Check xi + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Check the + number of columns of input argument xi. + + Move important plotting functions to 'utils' directory + + * misc/plot/stk_plot1d.m: Moved to 'utils' directory. + * misc/plot/stk_plot_histnormres.m: Idem. + * misc/plot/stk_plot_predvsobs.m: Idem. + * utils/stk_plot1d.m: Moved from 'misc/plot' directory. + * utils/stk_plot_histnormres.m: Idem. + * utils/stk_plot_predvsobs.m: Idem. + +2017-06-29 Julien Bect + + Add a new test case named 'truss3' + + * examples/test_functions/stk_testcase_truss3.m: New function. + * examples/test_functions/stk_testfun_truss3_bb.m: New function. + * examples/test_functions/stk_testfun_truss3_vol.m: New function. + * admin/octpkg/INDEX: Add new functions to the INDEX. + + stk_plot_predvsobs.m: Lowercase labels + + * misc/plot/stk_plot_predvsobs.m: Lowercase labels. + +2017-06-28 Julien Bect + + Change mnemonic 'IncorrectArgument' to 'InvalidArgument' + + * arrays/@stk_dataframe/cat.m: Change mnemonic 'IncorrectArgument' + to 'InvalidArgument', since both of them were used interchangeably. + * arrays/@stk_dataframe/find.m: Idem. + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Idem. + * misc/dist/stk_gpquadform.m: Idem. + * misc/pareto/stk_dominatedhv.m: Idem. + * param/estim/stk_param_estim.m: Idem. + * param/estim/stk_param_init.m: Idem. + * sampling/stk_sampling_olhs.m: Idem. + * sampling/stk_sampling_sobol.m: Idem. + + @stk_dataframe/bsxfun.m: Remove annoying warnings + + * arrays/@stk_dataframe/bsxfun.m: Take the column names (or row + names) from the first argument in case of disagreement, as in R. + Remove the annoying warnings. + +2017-06-27 Julien Bect + + @stk_dataframe/set.m: Backout revision 29c5b2515988 + + * arrays/@stk_dataframe/set.m: *Do not* reject colnames and + rownames values with an insufficient number of elements. + + @stk_dataframe/subsasgn.m: Add (currently failing) unit tests + + * arrays/@stk_dataframe/subsasgn.m: Add (currently failing) unit + tests for the insertion of row/column names on data frames that + have none. + + @stk_model_gpposterior/stk_model_gpposterior.m: Check 'prior_model' arg + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Check that + input argument 'prior_model' is a structure. + + Logical-valued operators now return logical values on df as well + + * arrays/@stk_dataframe/and.m: Return logical result. + * arrays/@stk_dataframe/eq.m: Idem. + * arrays/@stk_dataframe/ge.m: Idem. + * arrays/@stk_dataframe/gt.m: Idem. + * arrays/@stk_dataframe/le.m: Idem. + * arrays/@stk_dataframe/lt.m: Idem. + * arrays/@stk_dataframe/ne.m: Idem. + * arrays/@stk_dataframe/or.m: Idem. + * arrays/@stk_dataframe/xor.m: Idem. + * arrays/@stk_dataframe/not.m: New function. + * admin/octpkg/INDEX: Add new function to the INDEX. + +2017-06-26 Rémi Stroh + + stk_distrib_normal_crps.m: Make unit test deterministic (ticket #77) + + * misc\distrib\stk_distrib_normal_crps.m: Replace the random + selection of data with fixed data. + + stk_distrib_normal_crps.m: Change the final test (ticket #77) + + * misc\distrib\stk_distrib_normal_crps.m: Modify the last test + to support compatibility with older versions of Matlab and + Octave. + +2017-06-26 Julien Bect + + @stk_dataframe/set.m: Check colnames and rownames values more strictly + + * arrays/@stk_dataframe/set.m: Reject colnames and rownames values + with an insufficient number of elements. + + @stk_dataframe/subsref.m: Fix empty indexing + + * arrays/@stk_dataframe/subsref.m: Fix empty indexing. + + @stk_dataframe/stk_dataframe.m: Fix typo + + * arrays/@stk_dataframe/stk_dataframe.m: Fix typo. + +2017-06-25 Julien Bect + + @stk_dataframe/fieldnames.m: Add row names to the list + + * arrays/@stk_dataframe/fieldnames.m: Add row names. Also, do not + include empty row or column names in the list. + +2017-06-24 Julien Bect + + stk_sampling_sobol.m: Fix help text + + * sampling/stk_sampling_sobol.m: Fix help text. + + build_octpkg.m: Add 'License:' in DESCRIPTION + + * admin/build_tools/build_octpkg.m: Add 'License:' in DESCRIPTION. + * admin/build_tools/generate_htmldoc.m: Remove 'Read License" subst. + + @stk_dataframe/stk_sprintf.m: Improve formatting for empty data frames + + * arrays/@stk_dataframe/stk_sprintf.m: Improve formatting for + empty data frames. In particular, display column names or row + names if appropriate. + * arrays/@stk_dataframe/disp.m: Source formatting. + * arrays/generic/stk_sprintf.m: Fix help text. Source formatting. + +2017-06-23 Julien Bect + + stk_dataframe.m: Guess the size when the first input is empty + + * arrays/@stk_dataframe/stk_dataframe.m: Deduce the number of + columns and rows from the length of colnames and rownames, + respectively, when the first input argument is empty. Note that + this patch changes the object generated by the default constructor. + +2017-06-20 Julien Bect + + stk_dominatedhv.m: Accept @stk_dataframe inputs + + * misc/pareto/stk_dominatedhv.m: Tolerate any kind of input + argument that can be converted to a double precision matrix, in + particular @stk_dataframe objects. + +2017-06-16 Julien Bect + + Don't use ~ to ignore output arguments (see CG#07) + + * admin/CODING_GUIDELINES: Improve CG#07 + * sampling/stk_sampcrit_akg_eval.m: Apply CG#07 + * sampling/stk_sampling_nesteddesign.m: Apply CG#07 + * sampling/stk_sampling_nestedlhs.m: Apply CG#07 + + @stk_sampcrit_eqi/disp.m: Fix display bug + + * sampling/@stk_sampcrit_eqi/disp.m: Fix display bug for the case + where point_batch_size is a function handle. + + stk_sampcrit_eqi.m: Increase unit test tolerance (ticket #76) + + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Increase the + numerical tolerance in two unit tests. + + stk_sampcrit_eqi.m: Fix one unit test (ticket #76) + + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Fix one unit + test; in Octave, str2func fails on phony function names. + +2017-06-15 Julien Bect + + stk_sampcrit_akg_eval.m: Improve numerical robustness + + * sampling/stk_sampcrit_akg_eval.m: Mitigate the effect of small + inaccurate covariance values on the computation of the slopes. + + halfpintl.m: Fix a bug affecting slope equality cases + + * sampling/private/halfpintl.m: Fix a bug affecting slope equality + cases. + + stk_plot_shadedci.m: Use area when fill fails (ticket #75) + + * misc/plot/stk_plot_shadedci.m: fill does not accept a axis + handle argument in Matlab prior to R2016a. Use area as we were + doing before when fill fails. + +2017-06-12 Julien Bect + + stk_plot_shadedci.m: Use fill instead of area + + * misc/plot/stk_plot_shadedci.m: Recent changes in Matlab R2017a + have altered the behaviour of area. Using fill is cleaner. + + stk_plot_shadedci.m: Use three shaded areas + + * misc/plot/stk_plot_shadedci.m: Use three shaded areas to + visualize three levels of pointwise confidence intervals at once. + +2017-06-07 Julien Bect + + Optimize for speed + + * core/@stk_kreq_qr/get.m: Use a simple switch. + * core/@stk_model_gpposterior/stk_predict.m: Call get directly. + * sampling/@stk_sampcrit_akg/feval.m: Call get directly. + +2017-06-06 Julien Bect + + @stk_model_gpposterior/stk_predict.m: Improve error messages + + * core/@stk_model_gpposterior/stk_predict.m: Improve the error + messages corresponding to the case where xt has an incorrect size. + +2017-06-05 Julien Bect + + @stk_dataframe/plotmatrix.m: Overload base function + + * arrays/@stk_dataframe/plotmatrix.m: New function, overload base + function to enrich plotmatrix graphics with variable names when + possible. + * admin/octpkg/INDEX: Add the new function to the index. + + Optimize for speed + + * arrays/@stk_dataframe/set_data.m: New function, fast setter. + * admin/octpkg/INDEX: Add the new function to the index. + * arrays/@stk_dataframe/set.m: Use set_data. + * arrays/@stk_factorialdesign/set.m: Use set_data. + * arrays/@stk_hrect/stk_rescale.m: Optimize for speed. + * arrays/@stk_hrect/subsasgn.m: Optimize for speed. + * sampling/stk_sampling_randunif.m: Optimize for speed. + * sampling/stk_sampling_regulargrid.m: Optimize for speed. + +2017-06-03 Julien Bect + + Optimize a few functions for speed + + * arrays/@stk_dataframe/stk_dataframe.m: Optimize + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Optimize + * arrays/@stk_hrect/stk_rescale.m: Optimize + * sampling/stk_sampling_randunif.m: Optimize + * sampling/stk_sampling_regulargrid.m: Optimize + * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: Update + + Upcast objects from derived classes to stk_dataframe + + * arrays/@stk_factorialdesign/stk_dataframe.m: New function. + * arrays/@stk_hrect/stk_dataframe.m: New function. + * admin/octpkg/INDEX: Add new functions to the index. + +2017-05-29 Julien Bect + + @stk_dataframe/find.m: Overload base function + + * arrays/@stk_dataframe/find.m: Overload base function to support + calling find with an stk_dataframe as first input argument. + * admin/octpkg/INDEX: Add new function to the index. + + stk_dataframe.m: Improve error messages + + * arrays/@stk_dataframe/stk_dataframe.m: Improve error message + when either colnames or rownames has an incorrect number of + elements. + + stk_sampcrit_akg_eval.m: Set zr_min to +Inf when zr_mean is empty + + * sampling/stk_sampcrit_akg_eval.m: Set zr_min to +Inf when + zr_mean is empty. + + stk_hrect.m: Preserve colmumns names for stk_dataframe inputs + + * arrays/@stk_hrect/stk_hrect.m: Preserve colmumns names when the + input is an stk_dataframe object. + +2017-05-28 Julien Bect + + stk_factorialdesign.m: Accept stk_dataframe levels + + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Accept + one-variable stk_dataframe factors and preserve column names in + this case. + * arrays/@stk_factorialdesign/stk_boundingbox.m: Do not assume + that the cell array of levels is row-shaped. + * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: Update + patch. + + stk_predict: Remove old inaccessible display_waitbar stuff + + * core/@stk_model_gpposterior/stk_predict.m: Remove old and + inaccessible display_waitbar stuff. + +2017-05-27 Julien Bect + + Implement the AKG criterion + + * sampling/stk_sampcrit_akg_eval.m: New function, this is were the + actual computation of the AKG criterion happens. + * sampling/private/halfpintl.m: New private function that computes + the intersection of lower half-planes (equivalently, the lower + envelope of a set of lines) needed in the AKG. + * sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m: New function. + * sampling/@stk_sampcrit_akg/feval.m: New function, does some + non-trivial preliminary work before calling stk_sampcrit_akg_eval. + * sampling/@stk_sampcrit_akg/disp.m: New function, copied from + other sampcrit classes with minor adaptations. + * sampling/@stk_sampcrit_akg/get.m: New function, this is the same + trivial getter as in other sampcrit classes. + * sampling/@stk_sampcrit_akg/set.m: New function, contains some + pre-computations that depend on the reference grid only. + * examples/02_design_of_experiments/stk_example_doe05.m: Use AKG + as a default, and propose EQI as an option. + * admin/octpkg/INDEX: Update index with new functions. + + @stk_model_gpposterior/stk_make_kreq: new (internal) method + + * core/@stk_model_gpposterior/stk_make_kreq.m: New method. + * core/@stk_model_gpposterior/stk_predict.m: Use the new method. + * admin/octpkg/INDEX: Update index with new function. + + @stk_sampcrit_eqi: point_batch_size can also be a function + + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Add unit tests. + * sampling/@stk_sampcrit_eqi/set.m: Accept functions and char for + the value of point_batch_size. + * sampling/@stk_sampcrit_eqi/feval.m: Compute point_batch_size. + + Fix a spelling error (instanciated -> instantiated) + + * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: Fix spelling error. + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Idem. + +2017-05-25 Julien Bect + + Massive overhaul of sampling criterion classes + + * sampling/@stk_sampcrit_modelbased: Class removed + * sampling/@stk_sampcrit_modelbased/feval.m: Removed + * sampling/@stk_sampcrit_modelbased/get_input_data.m: Removed + * sampling/@stk_sampcrit_modelbased/get_model.m: Removed + * sampling/@stk_sampcrit_modelbased/get_output_data.m: Removed + * sampling/@stk_sampcrit_modelbased/set_model.m: Removed + * sampling/@stk_sampcrit_modelbased/stk_model_update.m: Removed + * sampling/@stk_sampcrit_modelbased/stk_sampcrit_modelbased.m: Removed + * sampling/@stk_sampcrit_singleobjoptim: Class removed + * sampling/@stk_sampcrit_singleobjoptim/get_bminimize.m: Removed + * sampling/@stk_sampcrit_singleobjoptim/get_goal.m: Removed + * sampling/@stk_sampcrit_singleobjoptim/set_goal.m: Removed + * sampling/@stk_sampcrit_singleobjoptim/stk_sampcrit_singleobjoptim.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim: Class removed + * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/get.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_mode.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_quantile_order.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_value.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/set.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/set_goal.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/set_model.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_mode.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_quantile_order.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_value.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_model_update.m: Removed + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Removed + * sampling/@stk_sampcrit_base: Class renamed to @stk_function + * sampling/@stk_sampcrit_base/stk_sampcrit_base.m: Moved to @stk_function, renamed, modified + * sampling/@stk_sampcrit_base/disp.m: : Moved to @stk_function and modified + * sampling/@stk_sampcrit_base/display.m: Idem. + * sampling/@stk_sampcrit_base/horzcat.m: Idem. + * sampling/@stk_sampcrit_base/subsasgn.m: Idem. + * sampling/@stk_sampcrit_base/subsref.m: Idem. + * sampling/@stk_sampcrit_base/vertcat.m: Idem. + * sampling/@stk_function: Replaces @stk_sampcrit_base + * sampling/@stk_function/stk_function.m: Moved from @stk_sampcrit_base, renamed, modified + * sampling/@stk_function/disp.m: Moved from @stk_sampcrit_base and modified + * sampling/@stk_function/display.m: Idem. + * sampling/@stk_function/horzcat.m: Idem. + * sampling/@stk_function/subsasgn.m: Idem. + * sampling/@stk_function/subsref.m: Idem. + * sampling/@stk_function/vertcat.m: Idem. + * sampling/@stk_function/feval.m: New method (error only) + * sampling/@stk_function/get.m: New method (error only) + * core/@struct/get_input_data.m: New method to support prior models defined as structures + * core/@struct/get_output_data.m: Idem. + * core/@struct/get_prior_model.m: Idem. + * core/@struct/private/assert_struct_is_model.m: Private function used by the last three + * sampling/@stk_sampcrit_ei: Complete class rewrite + * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: Entirely rewritten + * sampling/@stk_sampcrit_ei/msfeval.m: Moved to feval.m + * sampling/@stk_sampcrit_ei/feval.m: Moved from msfeval.m and modified + * sampling/@stk_sampcrit_ei/disp.m: Moved from thresholdbasedoptim and modified + * sampling/@stk_sampcrit_ei/get.m: New method (trivial getter) + * sampling/@stk_sampcrit_ei/set.m: New method (non-trivial setter) + * sampling/@stk_sampcrit_eqi: Complete class rewrite + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Entirely rewritten + * sampling/@stk_sampcrit_eqi/msfeval.m: Moved to feval.m + * sampling/@stk_sampcrit_eqi/feval.m: Moved from msfeval.m and modified + * sampling/@stk_sampcrit_eqi/disp.m: Moved from thresholdbasedoptim and modified + * sampling/@stk_sampcrit_eqi/get.m: New method (trivial getter) + * sampling/@stk_sampcrit_eqi/set.m: New method (non-trivial setter) + * examples/02_design_of_experiments/stk_example_doe05.m: Rewrite almost entirely + * admin/octpkg/INDEX: Update index + +2017-05-16 Julien Bect + + Fix object display problem (ticket #73) + + * misc/text/stk_disp_isloose.m: New function, to query the + compact/loose display status in a Matlab/Octave compatible-way. + * core/@stk_model_gpposterior/disp.m: Use the new function. + * core/@stk_model_gpposterior/display.m: Idem. + * sampling/@stk_sampcrit_base/disp.m: Idem. + * sampling/@stk_sampcrit_base/display.m: Idem. + * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: Idem. + * admin/octpkg/INDEX: Add the new function to the index. + +2017-05-13 Julien Bect + + stk_sampcrit_ehvi_eval.m: Add help text + + * sampling/stk_sampcrit_ehvi_eval.m: Add help text. + * sampling/stk_sampcrit_ei_eval.m: Minor change in help text. + * sampling/stk_sampcrit_emmi_eval.m: Minor change in help text. + +2017-05-12 Julien Bect + + stk_distrib_normal_ei.m: Recommend to use stk_sampcrit_ei_eval + + * misc/distrib/stk_distrib_normal_ei.m: Recommend to use + stk_sampcrit_ei_eval instead. + +2017-05-12 Rémi Stroh + + Format help texts. + + * sampling/stk_sampling_nesteddesign.m: Formatting help text to + follow the STK style. + * sampling/stk_sampling_nestedlhs.m: Idem. + +2017-05-11 Julien Bect + + Remove dominated solutions in MOO sampling criteria + + * sampling/stk_sampcrit_ehvi_eval.m: Simply add a comment. + Dominated solutions were already removed by stk_dominatedhv. + * sampling/stk_sampcrit_emmi_eval.m: Remove dominated solutions + and duplicates, as in stk_dominatedhv. + + stk_sampcrit_emmi_eval.m: Improve help text + + * sampling/stk_sampcrit_emmi_eval.m: Improve help text. + + stk_sampcrit_emmi_eval.m: Use capital variable names in help text + + * sampling/stk_sampcrit_emmi_eval.m: Use capital variable names in + help text, as everywhere else in the toolbox. + + stk_sampcrit_ei_eval.m: Warn about deprecated use + + * sampling/stk_sampcrit_ei_eval.m: Add warnings about deprecated + syntaxes, that were introduced inadvertently in STK 2.4.0 and will + be removed in future releases. These warnings should remain as + long as we are in the 2.4.x series. + +2017-05-09 Julien Bect + + stk_sampcrit_ei_eval.m: Add help text + + * sampling/stk_sampcrit_ei_eval.m: Add help text. + + stk_param_estim.m: Improve error message (ticket #72) + + * paramestim/stk_param_estim.m: Issue a better error message when + LNV0 is either NaN of infinite. + +2017-05-08 Julien Bect + + stk_sampcrit_ei_eval.m: Remove the 'goal' argument + + * sampling/stk_sampcrit_ei_eval.m: Remove the 'goal' argument and + provide an implementation for *minimization* problems, which is + the usual convention for optimization problems and which is + consistent with the convention chosen for the EMMI and EHVI + criteria. + * examples/02_design_of_experiments/stk_example_doe03.m: Use the + new syntax without the 'goal' argument, using minus signs instead. + +2017-05-06 Julien Bect + + stk_sampcrit_ei_eval.m: New syntax + + * sampling/stk_sampcrit_ei_eval.m: Adopt a syntax that is + consistent with the syntax of the EHVI and EMMI *_eval functions. + This function was accidentally released in STK 2.4.0 with two + other syntaxes, now marked as deprecated, that were never publicly + documented. + * examples/02_design_of_experiments/stk_example_doe03.m: Use the + new syntax. Also, fix the example which was showing a + minimization strategy while a comment in the source code indicated + maximization. + +2017-05-05 Julien Bect + + stk_distrib_normal_crps.m: Remove example from help text + + * misc/distrib/stk_distrib_normal_crps.m: Remove example from help + text. The functions in misc/distrib are meant to be independent of + the rest of the toolbox, we should avoid using functions from + other parts of STK inside them. + +2017-05-03 Rémi Stroh + + stk_distrib_normal_crps.m: New function to compute the Gaussian CRPS + + * misc/distrib/stk_distrib_normal_crps.m: New function to compute + the Continuous Ranked Probability Score in the case of a Gaussian + predictive density. + +2017-04-27 Rémi Stroh + + New functions to create nested designs. + + * sampling/stk_sampling_nesteddesign.m: New function to create nested + designs. + * sampling/stk_sampling_nestedlhs.m: New function to create nested LHS. + +2017-04-27 Julien Bect + + vertcat.m: Preserve column names when some are missing (ticket #66) + + * arrays/@stk_dataframe/vertcat.m: Preserve column names even if + some of them are missing. + + vertcat.m: Do the concatenation earlier + + * arrays/@stk_dataframe/vertcat.m: Do the concatenation earlier to + let the base vertcat function generate an error message if needed. + +2017-04-26 Julien Bect + + stk_model_fixlm.m: Better error message (ticket #69) + + * core/stk_model_fixlm.m: Display a better error message when both + model.lm and model.order are present, but their values are not + compatible. + +2017-04-19 Julien Bect + + stk_generate_samplepaths.m: Do not set lognoisevariance to -inf + + * utils/stk_generate_samplepaths.m: No need to set lognoisevariance + to -inf in the noiseless case. + + Bring examples up to date with changes in stk_model_gpposterior + + * examples/02_design_of_experiments/stk_example_doe03.m: Do not + modify directly the 'lognoisevariance' field of the prior. + * examples/02_design_of_experiments/stk_example_doe05.m: Do not + modify directly the 'param' field of the prior. + + stk_sampcrit_thresholdbasedoptim.m: Fix input argument processing + + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: + Fix input argument processing. + + Reorganize parameter-related functions + + * param/classes: New directory, that will contain parameter + classes in the future. There are no parameter classes currently, + but this is the place where they will be. + * paramestim/private/stk_get_optimizable_parameters.m: Moved to param/classes. + * paramestim/private/stk_set_optimizable_parameters.m: Idem. + * param/classes/stk_get_optimizable_parameters.m: Moved from paramestim/private. + * param/classes/stk_set_optimizable_parameters.m: Idem. + * paramestim/stk_param_estim.m: Moved to param/estim. + * paramestim/stk_param_getdefaultbounds.m: Idem. + * paramestim/stk_param_gls.m: Idem. + * paramestim/stk_param_init.m: Idem. + * paramestim/stk_param_init_lnv.m: Idem. + * paramestim/stk_param_relik.m: Idem. + * param/estim/stk_param_estim.m: Moved from paramestim/. + * param/estim/stk_param_getdefaultbounds.m: Idem. + * param/estim/stk_param_gls.m: Idem. + * param/estim/stk_param_init.m: Idem. + * param/estim/stk_param_init_lnv.m: Idem. + * param/estim/stk_param_relik.m: Idem. + * stk_init.m: Update the path + +2017-04-18 Julien Bect + + Rewrite two private functions with try-catch blocks instead of tests + + * paramestim/private/stk_get_optimizable_parameters.m: Use a + try-catch block instead of testing what the input is. + * paramestim/private/stk_set_optimizable_parameters.m: Idem. + + Fix syntax errors + + * paramestim/private/stk_get_optimizable_parameters.m: Fix syntax error. + * paramestim/private/stk_set_optimizable_parameters.m: Fix syntax error. + +2017-04-16 Julien Bect + + stk_pmisclass.m: Add help text + + * utils/stk_pmisclass.m: Add help text. + + stk_pmisclass.m: Handle K22 scalar negative or null + + * utils/stk_pmisclass.m: Handle specifically, when K22 is scalar, + the case where K22 is negative or null. + +2017-03-09 Julien Bect + + wfg.c: Remove unused variables + + * misc/pareto/private/wfg.c: Remove unused variables. + + stk_example_doe04.m: Add help text + + * examples/02_design_of_experiments/stk_example_doe04.m: Add help + text. + + stk_param_getdefaultbounds.m: Add help text + + * paramestim/stk_param_getdefaultbounds.m: Add help text. + +2017-03-08 Julien Bect + + @stk_dataframe/ismember.m: Fix a bug + + * arrays/@stk_dataframe/ismember.m: Handle the case where A is an + stk_dataframe object and B is an stk_hrect object (or any + specialized stk_dataframe object that implements ismember). + + stk_plot_histnormres.m: Ignore infinite normalized residuals + + * misc/plot/stk_plot_histnormres.m: Ignore infinite normalized + residuals, with a warning. + +2017-02-21 Julien Bect + + stk_phipcrit.m: Fix a typo in the help text + + * misc/design/stk_phipcrit.m: Fix a typo in the help text. + +2017-02-10 Julien Bect + + Use fminsearch for box-constrained problems as last recourse + + * misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m: + New function, which allows to use fminsearch for box-constrained + problems, a as last recourse for Matlab users that have neither + the Optimization toolbox nor MOSEK. + * admin/octpkg/INDEX: Add new function to the INDEX. + + sqp_quadprog.m: Restore warning state if quadprog fails + + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: Restore + warning state if quadprog fails. + + Provide better tools to check for optimizer availability (ticket #64) + + * misc/optim/@stk_optim_baseclass: New abstract base class for all + optimizer object classes. + * misc/optim/@stk_optim_baseclass/stk_optim_baseclass.m: New + function, constructor of the new base class. + * misc/optim/@stk_optim_baseclass/isequal.m: Overload isequal + Octave 3.2.x compatibility, see CODING_GUIDELINES. + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Derive from + the new class. + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Idem. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Itou. + * misc/optim/stk_optim_isavailable.m: New function, which tests if + a given optimization algorithm is available. + * misc/optim/@stk_optim_baseclass/stk_optim_isavailable.m: + Overload the generic function stk_optim_isavailable for the + abstract base class. + * misc/optim/stk_minimize_boxconstrained.m: Fix unit tests. + * misc/optim/stk_minimize_unconstrained.m: Fix unit tests. + * admin/octpkg/INDEX: Add new functions to the INDEX. + +2017-02-07 Julien Bect + + Oldest supported version of Octave is now 3.2.4 + + * admin/build_tools/build_octpkg.m: Modify supported version from + 3.2.2 to 3.2.4 in DESCRIPTION, in accordance with README.md. + * NEWS: No need to advertise such a tiny change of version number. + + stk_init.m: Use __octave_config_info__ instead of octave_config_info + + * stk_init.m: Use __octave_config_info__ instead of + octave_config_info, which is now deprecated. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: New patch. + * admin/octpkg/patches/series: Insert new patch in the series. + + Prevent errors in Matlab <=R2014a using try-end blocks (bis) + + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Add try-end block. + * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: New patch + to remove Matlab related blocks from Octave package release. + * admin/octpkg/patches/series: Insert new patch in the series. + +2017-02-06 Julien Bect + + stk_dataframe.m: Prevent error in Matlab <=R2014a using a try-end block + + * arrays/@stk_dataframe/stk_dataframe.m: Prevent superiorto() from + generating an error in Matlab <=R2014a using a try-end block. + +2017-01-28 Julien Bect + + stk_dominatedhv_mex.c: Remove unused variable + + * misc/pareto/private/stk_dominatedhv_mex.c: Remove unused variable. + +2017-01-27 Julien Bect + + stk_init: Fix install_mole_function (again) + + * stk_init: Fix install_mole_function (again). + + stk_init.m: Set use_silent to zero in Octave + + * stk_init.m: Set use_silent to zero in Octave. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + +2017-01-25 Julien Bect + + stk_init: Fix install_mole_function + + * stk_init: Fix install_mole_function. + + stk_init: Use mex without -silent when it is not supported + + * stk_init: Use mex without -silent when it is not supported. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + + Fix minor issues in C source code + + * misc/distrib/private/stk_distrib_bivnorm0_cdf.c: Insert braces + to avoid "Missing braces around initializer" warning. + * misc/pareto/private/wfg.c: Remove unused variables. + +2017-01-24 Julien Bect + + @stk_dataframe/subsasgn.m: Octave 3.2.x repmat hack + + * arrays/@stk_dataframe/subsasgn.m: Hack for a problem related to + repmat in Octave 3.2.x. + + Do not use ismatrix. + + * arrays/generic/stk_boundingbox.m: Do not use ismatrix. + * misc/pareto/stk_dominatedhv.m: Do not use ismatrix. + * admin/CODING_GUIDELINES: Explain why. + * misc/error/stk_assert_box.m: Refer to CODING_GUIDELINES. + + stk_example_doe04.m: Do not use ~ to ignore unwanted outputs + + * examples/02_design_of_experiments/stk_example_doe04.m: Do not + use ~ to ignore unwanted output arguments. + * admin/CODING_GUIDELINES: Explain why. + + stk_plot1d.m: Ignore legend errors + + * misc/plot/stk_plot1d.m: Ignore legend errors. + +2017-01-23 Julien Bect + + @stk_dataframe: Deprecate info field + + * arrays/@stk_dataframe/stk_sprintf.m: Hide info field. + * arrays/@stk_factorialdesign/stk_sprintf.m: Hide info field. + * arrays/@stk_dataframe/stk_sprintf_info.m: Removed (was "internal"). + * arrays/generic/stk_sprintf_info.m: Removed (was "internal"). + * admin/octpkg/INDEX: Remove both functions from the index. + * core/@stk_model_gpposterior/stk_predict.m: Do not set info. + * sampling/stk_sampling_halton_rr2.m: Do not set info. + * sampling/stk_sampling_maximinlhs.m: Do not set info. + * sampling/stk_sampling_olhs.m: Do not set info. + * sampling/stk_sampling_randomlhs.m: Do not set info. + * sampling/stk_sampling_randunif.m: Do not set info. + * sampling/stk_sampling_regulargrid.m: Do not set info. + * sampling/stk_sampling_sobol.m: Do not set info. + * arrays/@stk_dataframe/isequal.m: Ignore info. + + @stk_dataframe/subsref.m: Minor modif to make it work in Octave 3.2.4 + + * arrays/@stk_dataframe/subsref.m: Minor modification to make it + work in Octave 3.2.4 despite a but that allows subsref to modify + its input argument. + + stk_feval.m: Use commas in cell arrays of function handles + + * arrays/generic/stk_feval.m: Separate elements with commas when + creating cell arrays of function handles. + * admin/CODING_GUIDELINES: Explain why. + +2017-01-22 Julien Bect + + README.md: Raise minimal Octave version to 3.2.4 + + * README.md: Raise minimal Octave version to 3.2.4. + + README.md: Rewrite C compiler requirement + + * README.md: Rewrite C compiler requirement + + stk_parallel_engine_parfor.m: Adapt to the 'new' PCT syntax + + * misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m: + Adapt to the 'new' PCT syntax, since matlabpool has been removed. + + Implement isequal to maintain compatiblity with Octave 3.2.x. + + * arrays/@stk_dataframe/isequal.m: Handle any number of input + arguments. + * core/@stk_kreq_qr/isequal.m: Idem. + * arrays/@stk_factorialdesign/isequal.m: Implement isequal to + maintain compatibility with Octave 3.2.x. + * core/@stk_model_gpposterior/isequal.m: Idem. + * lm/@stk_lm_affine/isequal.m: Idem. + * lm/@stk_lm_constant/isequal.m: Idem. + * lm/@stk_lm_cubic/isequal.m: Idem. + * lm/@stk_lm_matrix/isequal.m: Idem. + * lm/@stk_lm_null/isequal.m: Idem. + * lm/@stk_lm_quadratic/isequal.m: Idem. + * misc/optim/@stk_optim_fmincon/isequal.m: Idem. + * misc/optim/@stk_optim_fminsearch/isequal.m: Idem. + * misc/optim/@stk_optim_octavesqp/isequal.m: Idem. + * misc/parallel/@stk_parallel_engine_none/isequal.m: Idem. + * misc/parallel/@stk_parallel_engine_parfor/isequal.m: Idem. + * arrays/@stk_dataframe/stk_dataframe.m: Fix unit test. + * admin/octpkg/INDEX: Add new functions to the INDEX. + +2017-01-21 Julien Bect + + stk_test_class.m: Standard unit tests for all STK classes + + * misc/test/stk_test_class.m: New function, which performs a + series of standard unit tests that all STK classes should pass. + * admin/octpkg/INDEX: Add the new function to the INDEX. + * arrays/@stk_dataframe/stk_dataframe.m: Add unit test. + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Add unit test. + * arrays/@stk_hrect/stk_hrect.m: Add unit test. + * core/@stk_kreq_qr/stk_kreq_qr.m: Add unit test. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Add unit test. + * lm/@stk_lm_affine/stk_lm_affine.m: Add unit test. + * lm/@stk_lm_constant/stk_lm_constant.m: Add unit test. + * lm/@stk_lm_cubic/stk_lm_cubic.m: Add unit test. + * lm/@stk_lm_matrix/stk_lm_matrix.m: Add unit test. + * lm/@stk_lm_null/stk_lm_null.m: Add unit test. + * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Add unit test. + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Add unit test. + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Add unit test. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Add unit test. + * misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m: Add unit test. + * misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m: Add unit test. + +2017-01-19 Julien Bect + + stk_error.m: Catch unsupported use of -completenames + + * misc/error/stk_error.m: Catch unsupported use of option + -completenames for dbstack in Octave 3.2.4. + +2017-01-18 Julien Bect + + @stk_dataframe/subsasgn.m:: Do not use isequalwithnans + + * arrays/@stk_dataframe/subsasgn.m: Do not use isequalwithnans, + which is has been removed from Octave 4.2.0. + + Add nargin checks for stk_lm_* functions + + * lm/@stk_lm_affine/stk_lm_affine.m: Add nargin check and unit test. + * lm/@stk_lm_constant/stk_lm_constant.m: Idem. + * lm/@stk_lm_cubic/stk_lm_cubic.m: Idem. + * lm/@stk_lm_matrix/stk_lm_matrix.m: Idem. + * lm/@stk_lm_null/stk_lm_null.m: Idem. + * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Idem. + * lm/stk_lm_polynomial.m: Idem. + + Call @stk_dataframe/get instead of using dot indexing when possible + + * arrays/@stk_hrect/stk_hrect.m: Call @stk_dataframe/get instead + of using dot indexing. + * arrays/@stk_hrect/subsasgn.m: Idem. + +2017-01-15 Julien Bect + + Makefile: Achieve reproducible builds without --sort=name + + * Makefile: Achieve reproducible builds without using the option + --sort=name, which is only available is very recent versions of tar, + thanks to the recommendations of https://reproducible-builds.org/. + +2017-01-14 Julien Bect + + Makefile: Trigger build if hg id as changed + + * Makefile: Trigger build if hg id as changed. + + Makefile: Check if hg clone is clean before processing + + * Makefile: Check if hg clone is clean before processing. + + Makefile: Declare .PHONY targets + + * Makefile: Declare .PHONY targets. + + Makefile: Use timestamp files instead of directories as targets + + * Makefile: Use timestamp files instead of directories as targets. + + Makefile: Add "dist" rule expected by OF admins + + * Makefile: Add "dist" rule to build packages only, as expected by + Octave Forge admins. + +2017-01-14 Julien Bect + + stk_init.m: Display GCC version warning only once (Matlab only) + + * stk_init.m (stk_init__compile): Capture GCC version warnings. + (stk_init__build_mex): Display GCC version warning only once. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + +2017-01-13 Julien Bect + + README.md: Explain that there are two releases (closes ticket #62) + + * README.md: Explain that there are two releases, and the specific + "quick start" procedure for each release. + +2017-01-09 Julien Bect + + README.md: Remove warning about STK not starting if GLPK is missing + + * README.md: Remove useless warning about STK not starting is + Octave is configured without GLPK. I only met this case once, a + long time ago, with Octave 3.0 on some BD distro... + +2017-01-07 Julien Bect + + stk_example_kb09.m: Catch a legend-related bug (closes ticket #55) + + * examples/01_kriging_basics/stk_example_kb09.m: Add a try/catch + block to catch a legend-related bug that shows up in Octave 4.0.x. + +2017-01-04 Julien Bect + + Provide help texts for stk_lm_* functions + + * lm/@stk_lm_affine/stk_lm_affine.m: Add help text. + * lm/@stk_lm_constant/stk_lm_constant.m: Idem. + * lm/@stk_lm_cubic/stk_lm_cubic.m: Idem. + * lm/@stk_lm_matrix/stk_lm_matrix.m: Idem. + * lm/@stk_lm_null/stk_lm_null.m: Idem. + * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Idem. + * lm/stk_lm_polynomial.m: Idem. + + stk_dominatedhv.m: Remove dominated points before using WFG + + * misc/pareto/stk_dominatedhv.m: Remove dominated points before + using WFG, since WFG assumes that there are no duplicated points. + +2017-01-01 Julien Bect + + stk_generate_samplepaths.m: Improve the documentation + + * utils/stk_generate_samplepaths.m: Improve the documentation. In + particular, warn about the case of noisy observations. + + stk_predict: Explain the Bayesian point of view + + * core/stk_predict.m: Explain the Bayesian point of view. + + Fix one-line help for overloaded STK functions + + * arrays/@stk_dataframe/stk_conditioning.m: Fix one-line help. + * arrays/@stk_dataframe/stk_generate_samplepaths.m: Idem. + * arrays/@stk_hrect/stk_normalize.m: Idem. + * arrays/@stk_hrect/stk_rescale.m: Idem. + * core/@stk_model_gpposterior/stk_isnoisy.m: Idem. + * core/@stk_model_gpposterior/stk_predict.m: Idem. + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Idem. + +2016-12-29 Julien Bect + + Polish new LOO cross-validation function + + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Return + residuals in a dataframe (instead of a structure). + * core/stk_predict_leaveoneout.m: Add doc and unit tests. + * examples/01_kriging_basics/stk_example_kb10.m: Update name of + normalized residual field (second column of the new dataframe). + * misc/plot/stk_plot_histnormres.m: Fix a tiny bug. + + Fix one-line help for overloaded feval functions in lm + + * lm/@stk_lm_affine/feval.m: Fix one-line help. + * lm/@stk_lm_constant/feval.m: Idem. + * lm/@stk_lm_cubic/feval.m: Idem. + * lm/@stk_lm_matrix/feval.m: Idem. + * lm/@stk_lm_null/feval.m: Idem. + * lm/@stk_lm_quadratic/feval.m: Idem. + +2016-12-15 Julien Bect + + stk_model_gpposterior.m: Estimate if param has NaNs (closes ticket #40) + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Estimate + parameters automatically if prior_model.param contains NaNs. + + @stk_model_gpposterior/disp.m: Clarify display. + + * core/@stk_model_gpposterior/disp.m: Clarify display. + + @stk_model_gpposterior: Make all properties read-only. + + * core/@stk_model_gpposterior/set.m: Make all properties + read-only. Provide meaningful hints in error messages. + * core/@stk_model_gpposterior/set_prior_model.m: Removed. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Set + prior_model directly since set_prior_model no longer exists. + * admin/octpkg/INDEX: Update index. + + @stk_model_gpposterior: Remove somes properties + + * core/@stk_model_gpposterior/get_input_dim.m: Removed. + * core/@stk_model_gpposterior/get_output_dim.m: Removed. + * core/@stk_model_gpposterior/get_lognoisevariance.m: Removed. + * core/@stk_model_gpposterior/get_lognoisevariance.m: Removed. + * core/@stk_model_gpposterior/get_param.m: Removed. + * core/@stk_model_gpposterior/set_param.m: Removed. + * core/@stk_model_gpposterior/fieldnames.m: Remove properties. + * core/@stk_model_gpposterior/disp.m: Idem. + * core/@stk_model_gpposterior/get.m: Idem. + * core/@stk_model_gpposterior/set.m: Idem. + * core/@stk_model_gpposterior/subsref.m: Remove one unit test. + * admin/octpkg/INDEX: Update index. + + README.md: Use numeric references + + * README.md: Use numeric references instead of author-year. + + README.md: Move sentence about M/O compatiblity to "Quick start" + + * README.md: Move the sentence about Matlab/Octave compatiblity to + the "Quick start" section. Remove redundant sentence about the + meaning of STK. + + README.md: Remove sentence about parallel computing + + * README.md: Remove the sentence about parallel computing not + being supported in Octave, since there is actually very little + support, currently, for parallel computing in *both* Matlab and + Octave. + + README.md: Remove redundant licence statement + + * README.md: Remove redundant licence statement. + + Makefile: download new icons for visual inspection of HTML doc + + * Makefile: download new icons (news.png, homepage.png) for visual + inspection of OctaveForge HTML doc. + +2016-12-14 Julien Bect + + Convert README to Markdown format + + * README: Renamed to README.md. + * README.md: Renamed from README.md and converted to Markdown. + Removed copyright notice. + * admin/build_tools/build_allpurpose.m: Rename README -> README.md. + * admin/build_tools/build_octpkg.m: Idem. + * admin/build_tools/copy_readme.m: Idem. + * admin/find_nonstandard_characters.sh: Process all *README* files. + * admin/fix_eol.sh: Idem. + +2016-12-09 Julien Bect + + Save M/O version info when compiling MEX-files (closes ticket #54) + + * stk_init.m: Save Matlab/Octave version info in a text file with + the .info extension when compiling MEX-files. + * .hgignore: Ignore .info files. + * admin/octpkg/patches/remove-testprivatemex.patch: update patch. + * admin/octpkg/patches/remove-buildmex.patch: update patch. + * admin/build_tools/build_octpkg.m: Ignore *.info files. + +2016-12-05 Julien Bect + + @stk_dataframe: Overload openvar + + * arrays/@stk_dataframe/openvar.m: Overload base function. + * misc/options/stk_options_set.m: Add option openvar_warndlg with + default value true. + * INDEX: Add @stk_dataframe/openvar to the index. + + stk_lm_polynomial.m: Add nargin check (closes ticket #52) + + * lm/stk_lm_polynomial.m: Add nargin check. + +2016-12-04 Julien Bect + + stk_optim_fmincon, stk_optim_fminsearch: improve option processing + + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Improve + option processing. + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Idem. + * misc/optim/stk_minimize_boxconstrained.m: Add tests. + * misc/optim/stk_minimize_unconstrained.m: Add tests. + +2016-12-02 Julien Bect + + Do not call display on model structures (closes ticket #47) + + * examples/01_kriging_basics/stk_example_kb01.m: Do not call + display on model structures. + * examples/01_kriging_basics/stk_example_kb01n.m: Idem. + * examples/01_kriging_basics/stk_example_kb02.m: Idem. + * examples/01_kriging_basics/stk_example_kb02n.m: Idem. + * examples/03_miscellaneous/stk_example_misc03.m: Idem: + * admin/CODING_GUIDELINES: Explain why. + +2016-11-12 Julien Bect + + New covariance functions: exponential + spherical + + * covfcs/rbf/stk_rbf_exponential.m: New function ("exponential" RBF) + * covfcs/rbf/stk_rbf_spherical.m: New function ("spherical" RBF) + * covfcs/stk_expcov_aniso.m: New covariance function. + * covfcs/stk_expcov_iso.m: New covariance function. + * covfcs/stk_sphcov_aniso.m: New covariance function. + * covfcs/stk_sphcov_iso.m: New covariance function. + * core/stk_model.m: Support new covariance functions. + * paramestim/stk_param_init.m: Idem. + * paramestim/stk_param_getdefaultbounds.m: Idem. + * admin/octpkg/INDEX: Update index. + +2016-11-11 Julien Bect + + Rename stk_sf_* functions to stk_rbf_* and make them public + + * misc/specfun/stk_sf_gausscorr.m: Moved to covfcs/rbf and renamed. + * misc/specfun/stk_sf_matern.m: Moved to covfcs/rbf and renamed. + * misc/specfun/stk_sf_matern32.m: Moved to covfcs/rbf and renamed. + * misc/spfun/stk_sf_matern52.m: Moved to covfcs/rbf and renamed. + * covfcs/rbf/stk_rbf_gauss.m: Renamed from stk_sf_gausscorr. + * covfcs/rbf/stk_rbf_matern.m: Renamed from stk_sf_matern. + * covfcs/rbf/stk_rbf_matern32.m: Renamed from stk_sf_matern32. + * covfcs/rbf/stk_rbf_matern52.m: Renamed from stk_sf_matern52. + * covfcs/rbf/stk_sf_gausscorr.m: Deprecated. + * covfcs/rbf/stk_sf_matern.m: Deprecated. + * covfcs/rbf/stk_sf_matern32.m: Deprecated. + * covfcs/rbf/stk_sf_matern52.m: Deprecated. + * covfcs/stk_gausscov_aniso.m: Use new function names. + * covfcs/stk_gausscov_iso.m: Use new function names. + * covfcs/stk_materncov32_aniso.m: Use new function names. + * covfcs/stk_materncov32_iso.m: Use new function names. + * covfcs/stk_materncov52_aniso.m: Use new function names. + * covfcs/stk_materncov52_iso.m: Use new function names. + * covfcs/stk_materncov_aniso.m: Use new function names. + * covfcs/stk_materncov_iso.m: Use new function names. + * misc/benchmarks/stk_benchmark_cov2.m: Use new function names. + * misc/options/stk_options_set.m: Rename options and ensure that + the old option names are still accepted (with a warning). + * misc/options/stk_options_get.m: Ensure that the old option names + are still accepted (with a warning). + * stk_init.m: Change path. + * admin/octpkg/INDEX: Update index. + +2016-09-21 Julien Bect + + Reduce the number of allocations in WFG + + * misc/pareto/private/wfg.c: Reduce the number of allocations in WFG by + allocating large blocks of size n * allocated_size for xmin and xmax. + * misc/pareto/private/wfg.h: Add fields xmin_data and xmax_data to Rlist + structures. + * misc/pareto/private/stk_dominatedhv_mex.c: Change rule of thumb. + +2016-09-20 Julien Bect + + Fix two bugs in stk_dominatedhv. + + * misc/pareto/private/wfg.c: Fix two bugs affecting the case where + the decomposition is returned. + * misc/pareto/stk_dominatedhv.m: Unit tests. + +2016-07-21 Julien Bect + + core/stk_model_fixlm.m: Fix error message + + * core/stk_model_fixlm.m: Fix error message. + +2016-07-21 Rémi Stroh + + arrays/@stk_dataframe: Overload 25 additional unitary base functions (sin, exp...) + + * arrays/@stk_dataframe/acos.m: New overloaded base function + * arrays/@stk_dataframe/acosd.m: Idem. + * arrays/@stk_dataframe/acosh.m: Idem. + * arrays/@stk_dataframe/asin.m: Idem. + * arrays/@stk_dataframe/asind.m: Idem. + * arrays/@stk_dataframe/asinh.m: Idem. + * arrays/@stk_dataframe/atan.m: Idem. + * arrays/@stk_dataframe/atand.m: Idem. + * arrays/@stk_dataframe/atanh.m: Idem. + * arrays/@stk_dataframe/cos.m: Idem. + * arrays/@stk_dataframe/cosd.m: Idem. + * arrays/@stk_dataframe/cosh.m: Idem. + * arrays/@stk_dataframe/exp.m: Idem. + * arrays/@stk_dataframe/expm1.m: Idem. + * arrays/@stk_dataframe/log.m: Idem. + * arrays/@stk_dataframe/log10.m: Idem. + * arrays/@stk_dataframe/log1p.m: Idem. + * arrays/@stk_dataframe/log2.m: Idem. + * arrays/@stk_dataframe/sin.m: Idem. + * arrays/@stk_dataframe/sind.m: Idem. + * arrays/@stk_dataframe/sinh.m: Idem. + * arrays/@stk_dataframe/sqrt.m: Idem. + * arrays/@stk_dataframe/tan.m: Idem. + * arrays/@stk_dataframe/tand.m: Idem. + * arrays/@stk_dataframe/tanh.m: Idem. + * admin/octpkg/INDEX: Add new functions to the INDEX + + arrays/@stk_dataframe/logical.m: New overloaded base function + + * arrays/@stk_dataframe/logical.m: New overloaded base function. + * admin/octpkg/INDEX: Add new function to the INDEX. + + arrays/@stk_dataframe/bsxfun.m: Preserve row names if possible + + * arrays/@stk_dataframe/bsxfun.m: Preserve row names if possible. + +2016-06-23 Julien Bect + + Linear model objects are no more considered as an experimental feature + + * core/stk_model.m: Create objects with a .lm field as a default. + * core/stk_model_fixlm.m: New internal function that ensures + backward compatiblity for model structures with a .order field. + * core/stk_ortho_func.m: Indicate deprecation of .order. Call + stk_model_fixlm to ensure backward compatibility. + * admin/octpkg/INDEX: Show stk_lm_* functions in the INDEX. + * examples/01_kriging_basics/stk_example_kb03.m: Use model.lm + field instead of model.order. + * paramestim/stk_param_init.m: Use model.lm field instead of + model.order. Call stk_model_fixlm to ensure backward + compatibility. + * examples/01_kriging_basics/stk_example_kb06.m: Idem. + * examples/03_miscellaneous/stk_example_misc03.m: Idem. + * core/@stk_model_gpposterior/get.m: Fix unit tests. + * core/@stk_model_gpposterior/set.m: Fix unit tests. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Fix unit tests. + * core/@stk_model_gpposterior/stk_predict.m: Fix unit tests. + * core/@stk_model_gpposterior/subsref.m: Fix unit tests. + * core/stk_make_matcov.m: Fix help and unit tests. + * core/stk_model_update.m: Fix unit tests. + * core/stk_predict.m: Fix unit tests. + * covfcs/stk_discretecov.m: Fix unit tests. + * paramestim/stk_param_gls.m: Fix unit tests. + * paramestim/stk_param_relik.m: Fix unit tests. + +2016-06-22 Julien Bect + + Indicate internal and deprecated functions more systematically + + * admin/octpkg/INDEX: Indicate internal and deprecated functions + more systematically. + * arrays/@struct/double.m: Indicate deprecation (was already + mentioned in the INDEX file). + * arrays/@struct/stk_boundingbox.m: Idem. + * arrays/@struct/stk_length.m: Idem. + +2016-05-29 Julien Bect + + New function to get/set optimizable parameters. + + * paramestim/private/stk_get_optimizable_parameters.m: New + function get the value of optimizable parameters. + * paramestim/private/stk_set_optimizable_parameters.m: New + function set the value of optimizable parameters. + * paramestim/stk_param_estim.m: Use the new functions wherever it + is appropriate. + * paramestim/stk_param_relik.m: Idem. + + INDEX: Bring up to date + + * admin/octpkg/INDEX: Bring up to date. + +2016-05-27 Julien Bect + + stk_benchmark_examples.m: new benchmark script + + * misc/benchmarks/stk_benchmark_examples.m: new benchmark script, + which benchmarks all examples in the toolbox. + +2016-05-26 Julien Bect + + stk_example_doe05.m: Plot only once in a while + + * examples/02_design_of_experiments/stk_example_doe05.m: Plot only + once in a while (default: PLOT_PERIOD = 10). + + stk_example_doe05.m: Remove stopping condition based on EQI_max + + * examples/02_design_of_experiments/stk_example_doe05.m: Remove + stopping condition based on EQI_max, which is never met anyway. + +2016-05-07 Julien Bect + + stk_isnoisy: new function to test for a noisy model + + * core/stk_isnoisy.m: New function, which returns false for a + noiseless model and true otherwise. This is the base + implementation for (prior) model structures. + * core/@stk_model_gpposterior/set_prior_model.m: New function. + Overload stk_isnoisy for posterior model objects. + * admin/BACKWARD_COMPATIBILITY.md: Indicate that stk_noisy is the + preferred way of handling the "missing lognoisevariance" backward + compatibility issue. + * core/@stk_model_gpposterior/set_prior_model.m: Use stk_isnoisy. + * core/stk_make_matcov.m: Idem. + * core/stk_model.m: Idem. + * iago/crit/stk_optim_crit_EI.m: Idem. + * iago/crit/stk_optim_crit_SUR.m: Idem. + * iago/crit/stk_optim_crit_iago.m: Idem. + * paramestim/stk_param_estim.m: Idem. + * paramestim/stk_param_init.m: Idem. + * paramestim/stk_param_init_lnv.m: Idem. + * paramestim/stk_param_relik.m: Idem. + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Idem. + * utils/stk_generate_samplepaths.m: Idem. + +2016-05-02 Julien Bect + + stk_example_doe05.m: Reduce NB_ITER. + + * examples/02_design_of_experiments/stk_example_doe05.m: Reduce + NB_ITER to make stk_runtests run faster. + + stk_optim_octavesqp.m: Use a string for the 'optimizer' property + + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Use a + string, instead of a handle, for the 'optimizer' property. + * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: + Use feval to call the optimizer, since it is no longer a handle. + +2016-04-27 Julien Bect + + stk_sf_matern32.m, stk_sf_matern52.m: Bugfix for large h + + * misc/specfun/stk_sf_matern32.m: Return 0 when h is large. + * misc/specfun/stk_sf_matern52.m: Idem. + +2016-04-20 Julien Bect + + Fix a bug in stk_example_doe05 + + * examples/02_design_of_experiments/stk_example_doe05.m: Pass a + value for tau2_new when evaluating the EQI criterion. + +2016-03-15 Tom Assouline + + Implement EQI criterion for noisy optimization + + * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: New function. + * sampling/@stk_sampcrit_eqi/msfeval.m: New function. + * examples/02_design_of_experiments/stk_example_doe05.m: Example. + script + +2016-03-15 Julien Bect + + @stk_sampcrit_modelbased/feval.m: Pass additional args to msfeval + + * sampling/@stk_sampcrit_modelbased/feval.m: Make it possible to + pass additional arguments to msfeval. + +2016-03-15 Julien Bect + + stk_testfun_twobumps.m: Change the sign of the test function + + * examples/test_functions/stk_testfun_twobumps.m: Change the sign + of the test function (it looked more like "two hollows" than "two + bumps"...). + +2016-03-08 Julien Bect + + Make it possible to update heteroscedastic models + + * core/@stk_model_gpposterior/set_lognoisevariance.m: Provide a + more informative error message when the size is wrong. Add unit + tests. + * core/@stk_model_gpposterior/stk_model_update.m: Handle the + heteroscedastic case thanks to a new input argument. Provide + informative error messages. Add unit tests. + * sampling/@stk_sampcrit_modelbased/stk_model_update.m: Pass the + additional input argument, unchaged. + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_model_update.m: + Idem. + +2016-03-06 Julien Bect + + Define and use three datasets based on TwoBumps + + * examples/datasets/stk_dataset_twobumps.m: New function, which + defines three datasets based on TwoBumps. + * examples/01_kriging_basics/stk_example_kb01.m: Use dataset + 'noiseless'. Move the noisy case to stk_example_kb01n. + * examples/01_kriging_basics/stk_example_kb01n.m: New example + script, which corresponds to the noisy case of the previous + version of stk_example_kb01. + * examples/01_kriging_basics/stk_example_kb02.m: Use dataset + 'noiseless'. Move the noisy case to stk_example_kb02n. + * examples/01_kriging_basics/stk_example_kb02n.m: New example + script, which corresponds to the noisy case of the previous + version of stk_example_kb02. + * examples/01_kriging_basics/stk_example_kb04.m: This example no + longer exists (replaced by /stk_example_kb02n). + * examples/01_kriging_basics/stk_example_kb05.m: Use dataset + 'noiseless'. + * examples/01_kriging_basics/stk_example_kb08.m: Idem. + * examples/01_kriging_basics/stk_example_kb05.m: Use dataset + 'noisy2'. + * stk_init.m: Add examples/datasets to the path. + * admin/octpkg/INDEX: Update index. + + Give a name (TwoBumps) to our oldest test function + + * examples/test_functions/stk_testfun_twobumps.m: Our oldest test + function now as its own M-file and a name. + * examples/01_kriging_basics/stk_example_kb01.m: Use the newly + created stk_testfun_twobumps function. + * examples/01_kriging_basics/stk_example_kb05.m: Idem. + * examples/01_kriging_basics/stk_example_kb08.m: Idem. + * examples/01_kriging_basics/stk_example_kb09.m: Idem. + * admin/octpkg/INDEX: Add stk_testfun_twobumps. Make test + functions visible in the documentation. + +2016-02-29 Julien Bect + + Getters and setters for the @stk_model_gpposterior class + + * core/@stk_model_gpposterior/get_prior_model.m: New getter. + * core/@stk_model_gpposterior/set_param.m: New setter. + * core/@stk_model_gpposterior/set_prior_model.m: New setter, + ensuring backward compatibility with partially defined prior model + structures (missing dim or lognoisevariance fields). + * core/@stk_model_gpposterior/set.m: Use setters when it is useful + for argument checking. Prevent modification of the kreq field. + * core/@stk_model_gpposterior/set_lognoisevariance.m: Add optional + `recompute` input argument. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Re-organize + to avoid code duplication with set_prior_model. + * admin/octpkg/INDEX: Update index. + +2016-02-26 Julien Bect + + stk_kreq_qr.m: Add default constructor + + * core/@stk_kreq_qr/stk_kreq_qr.m: Add a default constructor, + corresponding to the case where nargin == 0. + +2016-02-24 Julien Bect + + stk_sampling_sobol.m: Cite the NLopt toolbox in the documentation + + * sampling/stk_sampling_sobol.m: Cite the NLopt toolbox in the + documentation. + +2016-02-23 Julien Bect + + stk_sampling_sobol.m: new function + + * sampling/stk_sampling_sobol.m: New function to generate points + from a Sobol sequence. + * sampling/private/stk_sampling_sobol_mex.c: New MEX-file. + * admin/octpkg/INDEX: Add new function to the INDEX + * admin/octpkg/Makefile: Add new MEX-file to the Makefile. + * stk_init.m: Add new MEX-file to the build system. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + + stk_param_relik.m: Introduce a 'simple_kriging' flag + + * paramestim/stk_param_relik.m: Introduce a 'simple_kriging' flag + to clarify the meaning of the tests for q == 0. + + Get rid of the half-baked @stk_ndf class + + * iago/@stk_ndf/fieldnames.m: Deleted + * iago/@stk_ndf/get.m: Deleted + * iago/@stk_ndf/set.m: Deleted + * iago/@stk_ndf/stk_ndf.m: Deleted + * iago/@stk_ndf/stk_setnoisevariance.m: Deleted + * iago/@stk_ndf/stk_sprintf.m: Deleted + * iago/@stk_ndf/subsasgn.m: Deleted + * iago/@stk_ndf/vertcat.m: Deleted + * iago/DESIGN-NOTES.md: Remove all references to stk_ndf + * iago/stk_optim.m: Idem. + * iago/utils/stk_optim_addevals.m: Idem. + * iago/crit/stk_optim_crit_SUR.m: Idem. + * iago/crit/stk_optim_crit_iago.m: Idem. + + stk_sampcrit_thresholdbasedoptim.m: Add unit tests + + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: + Add unit tests for various number of input arguments. + +2016-02-23 Tom Assouline + + stk_sampcrit_thresholdbasedoptim.m: Fix nargin check + + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: + Fix nargin check. + +2016-02-18 Julien Bect + + stk_predict_leaveoneout.m: Compute residuals outside the CV loop + + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Compute + residuals outside the cross-validation loop. + +2016-02-17 Julien Bect + + @stk_model_gpposterior: Make sure that lognoisevariance is a column + + * core/@stk_model_gpposterior/set_lognoisevariance.m: Make sure + that prior_model.lognoisevariance is a column vector. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Idem. + +2016-02-17 Stefano Duhamel + + stk_predict_leaveoneout.m: Bugfix for the heteroscedastic case (bug #43) + + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Delete + the lognoisevariance of the left-out point in the heteroscedastic + case (fixes bug #43). + +2016-02-16 Stefano Duhamel + + stk_predict_leaveoneout.m: Add a (currently failing) unit test + + * core/stk_predict_leaveoneout.m: Add a (currently failing) unit test. + +2016-02-16 Julien Bect + + Get rid of iago/utils/get_lognoisevariance.m + + * iago/utils/get_lognoisevariance.m: Deleted. + * iago/crit/stk_optim_crit_SUR.m: Do without it. + * iago/crit/stk_optim_crit_iago.m: Idem. + + Get rid of noise_params_consistency + + * iago/utils/noise_params_consistency.m: Deleted. + * iago/crit/stk_optim_crit_EI.m: Remove call to noise_params_consistency. + * iago/crit/stk_optim_crit_SUR.m: Idem. + * iago/crit/stk_optim_crit_iago.m: Idem. + * iago/utils/stk_optim_addevals.m: Idem. + + Improve @stk_sampcrit_thresholdbasedoptim class + + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: + Add properties threshold_quantile_order (public) and + theshold_quantile_value (private). Streamline input arguments processing. + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_quantile_order.m: + Fast getter for new public property. + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_quantile_order.m: + Fast setter for new public property. + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_mode.m: + Rename output argument. + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_value.m: + Rename output argument. + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_mode.m: + Fix bug. Accept mixed-case variants of mode string. + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_value.m: + Fix bug. Implement quantile case. + * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: + Display new public property. Change display layout. + * sampling/@stk_sampcrit_thresholdbasedoptim/get.m: + Use direct access to properties whenever possible. + * sampling/@stk_sampcrit_thresholdbasedoptim/set.m: + Add new public property. + +2016-02-15 Julien Bect + + stk_param_relik.m: Add comments + + * paramestim/stk_param_relik.m: Add comments. + + First draft of a class hierarchy for sampling criteria + + * sampling/@stk_sampcrit_base: New class + * sampling/@stk_sampcrit_base/disp.m: New function + * sampling/@stk_sampcrit_base/display.m: New function + * sampling/@stk_sampcrit_base/horzcat.m: New function + * sampling/@stk_sampcrit_base/stk_sampcrit_base.m: New function + * sampling/@stk_sampcrit_base/subsasgn.m: New function + * sampling/@stk_sampcrit_base/subsref.m: New function + * sampling/@stk_sampcrit_base/vertcat.m: New function + * sampling/@stk_sampcrit_modelbased: New class + * sampling/@stk_sampcrit_modelbased/feval.m: New function + * sampling/@stk_sampcrit_modelbased/get_input_data.m: New function + * sampling/@stk_sampcrit_modelbased/get_model.m: New function + * sampling/@stk_sampcrit_modelbased/get_output_data.m: New function + * sampling/@stk_sampcrit_modelbased/set_model.m: New function + * sampling/@stk_sampcrit_modelbased/stk_model_update.m: New function + * sampling/@stk_sampcrit_modelbased/stk_sampcrit_modelbased.m: New function + * sampling/@stk_sampcrit_singleobjoptim: New class + * sampling/@stk_sampcrit_singleobjoptim/get_bminimize.m: New function + * sampling/@stk_sampcrit_singleobjoptim/get_goal.m: New function + * sampling/@stk_sampcrit_singleobjoptim/set_goal.m: New function + * sampling/@stk_sampcrit_singleobjoptim/stk_sampcrit_singleobjoptim.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim: New class + * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/get.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_mode.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_value.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/set.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/set_goal.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/set_model.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_mode.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_value.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_model_update.m: New function + * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: New function + * sampling/@stk_sampcrit_ei: New class + * sampling/@stk_sampcrit_ei/msfeval.m: New function + * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: New function + * sampling/stk_sampcrit_ehvi_eval.m: New function + * sampling/stk_sampcrit_ei_eval.m: New function + * sampling/stk_sampcrit_emmi_eval.m: New function + * examples/02_design_of_experiments/stk_example_doe03.m: Use a sampling criterion object + +2016-02-11 Julien Bect + + stk_lm_polynomial.m: Create polynomial LM object + + * lm/stk_lm_polynomial.m: New function. + * core/stk_ortho_func.m: Use stk_lm_polynomial. + * paramestim/stk_param_init.m: Use stk_lm_polynomial. + * admin/octpkg/INDEX: Add new function to the index. + +2016-02-10 Julien Bect + + stk_make_matcov.m: Error message for NaN in covariance parameters + + * core/stk_make_matcov.m: Issue an error message if covariance + parameters have not been estimated. + + stk_error.m: Use complete names in the stack + + * misc/error/stk_error.m: Use complete names in the stack, to + obtain better-looking error messages in Matlab. + +2016-02-04 Julien Bect + + Provide generic stk_minimize_* functions + + * misc/optim/stk_minimize_boxconstrained.m: Generic + stk_minimize_boxconstrained function, which accepts a char array + as first input argument, and provides a generic documentation for + all stk_minimize_boxconstrained methods. + * misc/optim/stk_minimize_unconstrained.m: Same thing for + stk_minimize_unconstrained methods. + * admin/octpkg/INDEX: Add new functions to the index. + + Workaround for Octave bug #46350 (closes ticket #32) + + * admin/octpkg/patches/workaround-octave-bug-46350.patch: New + patch that comments some unit tests out. + * admin/octpkg/patches/series: Add new patch to the series. + + stk_optimscript.m: Fix %!shared blocks + + * iago/stk_optimscript.m: Fix %!shared blocks. + +2016-02-02 Julien Bect + + Add some basic support for LOO cross-validation + + * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: New + function that computes LOO predictions and residuals. Currently + implemented in a very basic manner (virtual-LOO formulas will be + implemented later). + * core/stk_predict_leaveoneout.m: Just a wrapper around the first + one (very inefficient as it is, since we create a "posterior" that + we don't really use... but we should). + * misc/plot/stk_plot_predvsobs.m: New graphical function, to + visualize predictions versus observations. + * misc/plot/stk_plot_histnormres.m: New graphical function, to the + distribution of normalized residuals. + * examples/01_kriging_basics/stk_example_kb10.m: Example script. + * stk_example_kb10.m: Add new functions to the index. + + stk_testfun_borehole.m: New test function + + * examples/test_functions/stk_testfun_borehole.m: New test + function (the "borehole model" response function, from Harper & + Gupta 1983). + * admin/octpkg/INDEX: Add new function to the index (hidden for + now, as the other stk_testfun_* functions, bug perhaps should we + change that ?). + + @stk_model_gpposterior/disp.m: Fix a bug and improve layout + + * core/@stk_model_gpposterior/disp.m: Fix a bug and (try to) + improve visual layout. + +2016-01-28 Julien Bect + + Rename the output argument in optimizer objects + + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Rename the + output argument (optimizer object) to 'algo'. + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Idem. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Idem. + +2016-01-27 Julien Bect + + Overhaul plotting functions + + * misc/plot/stk_get_axis_arg.m: Rename to stk_plot_getaxisarg + * misc/plot/stk_plot_getaxisarg.m: Renamed from + stk_plot_getaxisarg, with some minor modifications along the way. + * admin/octpkg/INDEX: Update index following function rename. + * arrays/@stk_dataframe/plot.m: Rewrite to make use of + stk_plot_getaxisarg. Rename variable h to h_plot. + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: + Rewrite to make use of stk_plot_getaxisarg. Rename variable + h_axis to h_axes. + * arrays/@stk_hrect/axis.m: Rename variable h to h_axes. + * misc/plot/stk_figure.m: Rename variable h to h_fig. + * misc/plot/stk_labels.m: Add option axes handle input argument, + based on stk_plot_getaxisarg. Return vector of handles to label + objects. + * misc/plot/stk_plot1d.m: Rewrite to make use of + stk_plot_getaxisarg. Rename variable h to h_plot. + * misc/plot/stk_plot_shadedci.m: Rewrite to make use of + stk_plot_getaxisarg. Rename variable h to h_plot. + * misc/plot/stk_subplot.m: Rename variable h to h_axes. + * misc/plot/stk_xlabel.m: Simplify source code by removing the + possibility of having a vector of axes handles (why did I ever do + that ?). Fix the confusion between axes handle and label handle. + Rename output handle h to h_label. + * misc/plot/stk_ylabel.m: Idem. + * misc/plot/stk_zlabel.m: Idem. + + @stk_factorialdesign: Return handles from all plot functions + + * arrays/@stk_factorialdesign/surf.m: Return a handle. + * arrays/@stk_factorialdesign/contour.m: Return a handle. + * arrays/@stk_factorialdesign/mesh.m: Return a handle. + * arrays/@stk_factorialdesign/meshc.m: Return a handle. + * arrays/@stk_factorialdesign/meshz.m: Return a handle. + * arrays/@stk_factorialdesign/pcolor.m: Return a handle. + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: + Return a handle to the plot object just constructed. Also, fix + some bugs related to the optional axis handle argument. + +2016-01-25 Julien Bect + + stk_plot1d: Accept a handle as optional first argument + + * misc/plot/stk_plot1d.m: Accept a handle as optional first + argument. + + Remove stk_plot2d (had been deprecated for a while) + + * misc/plot/stk_plot2d.m: Removed (deprecated since 2.2.0) + * admin/octpkg/INDEX: Remove stk_plot2d from the index + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: + Rearrange copyright information. + +2016-01-22 Julien Bect + + @stk_model_gpposterior: Preserve row and column names + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Preserver + row and column names in input/output data. + * core/@stk_model_gpposterior/stk_model_update.m: Idem. + * core/@stk_model_gpposterior/stk_predict.m: Use double() to + extract the numerical content of the 'output_data' field. + + stk_optim_init.m: Fix the value of algo.model.dim + + * iago/utils/stk_optim_init.m: Fix the value of algo.model.dim. + + More work on stk_model_gpposterior properties + + * core/@stk_model_gpposterior/get_input_data.m: Rename variable. + * core/@stk_model_gpposterior/get_output_data.m: Rename variable. + * core/@stk_model_gpposterior/fieldnames.m: New function. + * core/@stk_model_gpposterior/set.m: New function. + * core/@stk_model_gpposterior/subsasgn.m: New function. + * core/@stk_model_gpposterior/set_lognoisevariance.m: New function. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Accept + prior model structure with missing 'dim' field. + + Properties input_dim/output_dim for stk_model_gpposterior objects + + * core/@stk_model_gpposterior/get.m: Add new properties + 'input_dim', 'output_dim'. Make 'dim' an alias for 'input_dim'. + * core/@stk_model_gpposterior/get_dim.m: Rename to + get_input_dim.m. + * core/@stk_model_gpposterior/get_input_dim.m: Renamed from + get_dim.m. + * core/@stk_model_gpposterior/get_output_dim.m: New function that + returns the output dimension, currently always one. + * core/@stk_model_gpposterior/disp.m: Display the new + properties. Improve the overall display. + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Remove + field 'dim'. + * core/@stk_model_gpposterior/stk_predict.m: Read .dim directly + from the prior model structure. + +2016-01-18 Julien Bect + + New functions to update models with new observations + + * core/@stk_model_gpposterior/stk_model_update.m: New function. + * core/stk_model_update.m: New function. + * admin/octpkg/INDEX: Add new functions to the index. + +2016-01-16 Julien Bect + + Speed stk_init. + + * stk_init.m: Speed up by reducing the number of calls to addpath. + * misc/benchmarks/stk_benchmark_init.m: New benchmark script + +2015-12-15 Julien Bect + + stk_maxabscorr.m: Rewrite without using corr + + * misc/design/stk_maxabscorr.m: Rewrite without using corr. + * stk_init.m (stk_init__config_mole): Remove corr + * misc/mole/corr/corr.m: Deleted + +2015-12-09 Julien Bect + + wfg.c: Fix a bug in Rlist_extend + + * misc/pareto/private/wfg.c (Rlist_extend): Fix a bug + * misc/pareto/stk_dominatedhv.m: Add unit tests + +2015-12-08 Julien Bect + + wfg.c: Fix a bug in Rlist_inclhv4 + + * misc/pareto/private/wfg.c (Rlist_inclhv4): Fix a bug + * misc/pareto/stk_dominatedhv.m: Add unit tests + +2015-12-03 Julien Bect + + Display a legend in several "kriging basics" examples + + * examples/01_kriging_basics/stk_example_kb01.m: Show legend + * examples/01_kriging_basics/stk_example_kb02.m: Show legend + * examples/01_kriging_basics/stk_example_kb04.m: Show legend + * examples/01_kriging_basics/stk_example_kb09.m: Show legend + + @stk_model_gpposterior: A new class to represent posterior distributions + + * core/@stk_model_gpposterior/stk_model_gpposterior.m: Class + constructor. + * core/stk_predict.m: Transfer a large part of the predicition + code to the method @stk_model_gpposterior/predict.m. + * core/@stk_model_gpposterior/stk_predict.m: Overload stk_predict. + * core/@stk_model_gpposterior/disp.m: Overload base function + * core/@stk_model_gpposterior/display.m: Overload base function + * core/@stk_model_gpposterior/get.m: Overload base function + * core/@stk_model_gpposterior/subsref.m: Overload base function + * core/@stk_model_gpposterior/vertcat.m: Overload base function + * core/@stk_model_gpposterior/horzcat.m: Overload base function + * core/@stk_model_gpposterior/get_dim.m: Fast getter + * core/@stk_model_gpposterior/get_input_data.m: Fast getter + * core/@stk_model_gpposterior/get_lognoisevariance.m: Fast getter + * core/@stk_model_gpposterior/get_output_data.m: Fast getter + * core/@stk_model_gpposterior/get_param.m: Fast getter + +2015-11-29 Julien Bect + + stk_isequal_tolrel.m: Bugfix and unit test. + + * misc/test/stk_isequal_tolrel.m: Bugfix and unit test. + +2015-11-27 Julien Bect + + @stk_dataframe/stk_sprintf.m: Fix header + + * arrays/@stk_dataframe/stk_sprintf.m: Fix header. + +2015-11-25 Julien Bect + + Improve display of size+type information + + * arrays/generic/stk_sprintf_sizetype.m: Accept objects. + * arrays/@cell/stk_sprintf_sizetype.m: Removed. + + Add minimalist display for stk_kreq objects + + * core/@stk_kreq_qr/disp.m: Overload base function. + * core/@stk_kreq_qr/display.m: Overload base function. + +2015-11-22 Julien Bect + + stk_predict.m: Stop accepting row input vectors in the discrete case + + * core/stk_predict.m: Stop accepting row input vectors in the case + of discrete models (stk_discretecov covariance function). + +2015-11-20 Julien Bect + + arrays/@stk_dataframe: Accept char and cell indices + + * arrays/@stk_dataframe/subsasgn.m: Accept char and cell indices. + * arrays/@stk_dataframe/subsref.m: Accept char and cell indices. + * arrays/@stk_dataframe/private/process_cell_indices.m: Process + cell indices (cell arrays of row/column names). + * arrays/@stk_dataframe/private/process_char_indices.m: Process + char indices (row/column name). + * arrays/@stk_dataframe/private/names_errmsg.m: Error messages for + incorrect cell indices. + +2015-11-19 Julien Bect + + Compatibility with Matlab >= R2014b: graphics handles are objects + + * arrays/@stk_dataframe/stk_dataframe.m: Enforce precedence over + the matlab.graphics.axis.Axes class. + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Enforce + precedence over the matlab.graphics.axis.Axes class. + * arrays/@stk_dataframe/plot.m: Do not assume that graphics + handles are doubles. + * misc/plot/stk_plot_shadedci.m: Do not assume that graphics + handles are doubles. + + stk_optim_fminsearch.m: Do not try to detect fminsearch + + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Do not + try to detect at this point whether fminsearch is available. + +2015-11-15 Julien Bect + + stk_init.m: Remove STK's root from the path if needed + + * stk_init.m (stk_init__pkg_unload): Remove STK's root from the + path if needed. + (stk_init__rmpath): Remove verbose comment. + * admin/octpkg/patches/prevent-PKG_DEL-loop.patch: New patch. + * admin/octpkg/patches/series: Add new patch to the series. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + + stk_init.m: No need to remove other copies of STK from the path + + * stk_init.m (stk_init__rmpath): No need to remove other copies of + STK from the search path. Even if several copies are on the path, + only the most recently installed is visible. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + + Merge config/* functions into stk_init + + * config/stk_config_addpath.m: Replaced by stk_init__addpath. + * config/stk_config_buildmex.m: Replaced by stk_init__build_mex. + * config/stk_config_clearpersistents.m: Replaced by + stk_init__clear_persistents. + * config/stk_config_getroot.m: Removed. + * config/stk_config_makeinfo.m: Replaced by stk_init__get_make_info. + * config/stk_config_mole.m: Replaced by stk_init__config_mole. + * config/stk_config_path.m: Replaced by stk_init__genpath. + * config/stk_config_rmpath.m: Replaced by stk_init__rmpath. + * config/stk_config_setup.m: Merged into stk_init__pk_load. + * config/stk_config_testprivatemex.m: Replaced by + stk_init__test_private_mex. + * stk_runtests.m: Use stk_init genpath. + * stk_init.m: Integrate config/* functions as subfunctions and + introduce a public interface that makes it easy to call them + separately if needed. + * admin/octpkg/post_install.m: Use stk_init prune_mole. + * admin/build.m: Edit comment. + * admin/build_tools/build_octpkg.m: Use stk_init get_make_info. + * admin/build_tools/get_public_mfile_list.m: Use stk_init genpath. + * admin/octpkg/patches/prevent-PKG_ADD-loop.patch: Refresh patch. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + * admin/octpkg/patches/use-native-test-function.patch: Refresh patch. + +2015-11-14 Julien Bect + + build_octpkg.m: Forced pop of quilt patches if an error occurs + + * admin/build_tools/build_octpkg.m: Forced pop of quilt patches if + an error occurs. + +2015-11-13 Julien Bect + + stk_config_path.m: Do not include STK's root in the list + + * config/stk_config_path.m: Do not include STK's root in the list. + * config/stk_config_addpath.m: Rephrase one-line help text. + * stk_init.m: Add STK's root to the path. + * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. + * admin/octpkg/patches/prevent-PKG_ADD-loop.patch: Modify patch. + * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. + +2015-11-12 Julien Bect + + stk_example_kb09.m: Show legend + + * examples/01_kriging_basics/stk_example_kb09.m: Show legend. + + stk_plot1d.m: Do not create a legend for conditional simulations + + * misc/plot/stk_plot1d.m: Prevent the automatic creation of a + legend when the array of conditional simulations has column names, + since stk_plot1d already creates a global legend for all of its + graphical elements (the two are not compatible). + + Include stk_runtests in the Octave package release + + * admin/build_tools/build_octpkg.m: Do not ignore stk_runtests and + stk_tests when processing directories. + * admin/octpkg/INDEX: Add stk_runtests to the INDEX. + * admin/octpkg/patches/use-native-test-function.patch: Remove + stk_tests, and skrink stk_runtests to a simple wrapper around + __run_test_suite__. + * admin/octpkg/patches/series: Add new patch. + +2015-11-11 Julien Bect + + sqp_quadprog.m: Bypass unit test if quadprog is not available + + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: Bypass + unit test if quadprog is not available. + + Use quilt patches instead of the STK_OCTAVE_PACKAGE variable + + * .hgignore: Ignore quilt's .pc directory + * admin/build_tools/build_octpkg.m: Add .pc to the list of ignored + directories. Add a quilt push/pop pair around + process_directory. Remove STK_OCTAVE_PACKAGE stuff. + * admin/build_tools/get_public_mfile_list.m: Add root the list + returned by stk_config_path. + * config/stk_config_path.m: Remove STK_OCTAVE_PACKAGE stuff. + * stk_init.m: Remove STK_OCTAVE_PACKAGE stuff. + * admin/octpkg/patches/prevent-PKG_ADD-loop.patch: Patch for + stk_config_path to avoid PKG_ADD loop. + * admin/octpkg/patches/remove-buildmex.patch: Patch that removes + MEX-file building from stk_init (a Makefile is used instead in the + Octave package release). Removes stk_config_buildmex and + stk_config_makeinfo as well. + * admin/octpkg/patches/remove-testprivatemex.patch: Patch that + removes all the code related to testing if MEX-file in private + directories are detected (since MEX-files are no longer in private + directories in the Octave package release). + * admin/octpkg/patches/series: Ordered list of patches. + + check_index_file.m: Fix a bug (column cell-arrays) + + * admin/build_tools/check_index_file.m (parse_index_file): Make + sure that 'ignored' and 'indexed' are formatted as *column* + cell-arrays; otherwise, check_index_file fails on vertcat + operations. + +2015-11-10 Julien Bect + + Hide experimental IAGO implementation in the INDEX + + * admin/octpkg/INDEX: hide experimental IAGO implementation + + Ignore IAGO design notes when building Octave package + + * iago/NOTES.temp: Renamed to DESIGN-NOTES.md + * iago/DESIGN-NOTES.md: Renamed from NOTES.temp and converted to md + * admin/build_tools/build_octpkg.m: Ignore DESIGN-NOTES.md + +2015-11-06 Julien Bect + + Makefile: Fix 'clean' target (tab instead of spaces) + + * admin/octpkg/Makefile: Fix 'clean' target (tabs instead of + spaces) + +2015-10-30 Julien Bect + + Decrease unit test verbosity + + * arrays/@stk_dataframe/double.m: decrease unit test verbosity. + * arrays/@stk_dataframe/sort.m: idem + * arrays/@stk_dataframe/subsasgn.m: idem + * arrays/@stk_factorialdesign/fieldnames.m: idem + * arrays/@stk_factorialdesign/stk_factorialdesign.m: idem + * arrays/@stk_hrect/horzcat.m: idem + * misc/text/stk_sprintf_colvect_scientific.m: idem + * paramestim/stk_param_gls.m: idem + + Add a 'clean' target to the Octave package Makefile + + * admin/octpkg/Makefile: Add a 'clean target'. + +2015-10-22 Julien Bect + + @stk_hrect/subsref.m: Return an stk_hrect object if possible + + * arrays/@stk_hrect/subsref.m: Make sure that the returned value + is still an stk_hrect object when the number of rows (which is + two) is unchanged. + + @stk_hrect/ismember.m: Optimize for speed + + * arrays/@stk_hrect/ismember.m: Optimize for speed + + @stk_hrect/ismember.m: Fix two bugs + + * arrays/@stk_hrect/ismember.m: Fix a bug that prevented ismember + from working on more than one point at a time, and another bug + in the case where B is not an stk_hrect object (it was incorrectly + assumed to be an stk_dataframe in this case). + +2015-10-11 Julien Bect + + mole/matlab/file_in_path.m: Fix two bugs + + * misc/mole/matlab/file_in_path.m: Fix two bugs. + +2015-10-10 Julien Bect + + stk_example_doe03.m: Use the appropriate flag for maximization + + * examples/02_design_of_experiments/stk_example_doe03.m: Use the + appropriate flag for maximization. Also, use stk_plot1d for the + upper panel plot to display pointwise credible intervals. + +2015-09-30 Julien Bect + + Bring Octave's sqp inside STK. + + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: New + function based on Octave's sqp function, with minor modifications + to be usable under Matlab with quadprog instead of qp. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Complete + rewrite. A 'qp_solver' option is added for the choice between 'qp', + which is Octave's core qp solver, and 'quadprog', which is + available from Mathworks' Optimization toolbox or from MOSEK. + * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: + Make it possible to use either Octave's sqp or our sqp_quadprog (a + handle to the function to be used is stored in algo.sqp). + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Do not try to + check if fmincon is present or not (this can be done using + stk_optim_testmin_box). + * misc/optim/stk_optim_testmin_box.m: Simple test to check that a + given box-constrained optimizer actually works. + * misc/optim/stk_optim_testmin_unc.m: Simple test to check that a + given unconstrained optimizer actually works. + * misc/optim/stk_optim_hasfmincon.m: Deprecated function.. + * misc/optim/stk_select_optimizer.m: Deprecated function. + * misc/options/stk_options_set.m: Rewrite optimizer selection + logic. Shorten some option names. + * paramestim/stk_param_estim.m: Use shortened option names. + * INDEX: Add new functions and classes. + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m: + Used in sqp_quadprog unit tests. + * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m: + Used in sqp_quadprog unit tests. + +2015-09-25 Julien Bect + + stk_param_getdefaultbounds: Documentation needed + + * paramestim/stk_param_getdefaultbounds.m: This function is not + marked as "STK internal" any more, since this is obviously the + right place to document how default bounds can be specified for + user-defined functions. Documentation needed. + + stk_plot1d.m: Create a hidden legend and return a struct of handles + + * misc/plot/stk_plot1d.m: Create a hidden legend, wich can be + displayed using lgend ('show'), and return a struct of handles to + make it possible to modify the plot more easily. + + Don't use UTF-8 in m-files + + * misc/design/stk_phipcrit.m: Müller -> Muller + * misc/dist/stk_filldist.m: Idem + * misc/dist/stk_filldist_exact.m: Idem + +2015-09-25 Rémi Stroh + + stk_param_getdefaultbounds: new feature to define default bounds + + * paramestim/stk_param_getdefaultbounds.m: make it possible to + define default bounds on parameters for user-defined covariance + functions. + +2015-09-21 Julien Bect + + stk_plot_shadedci.m: Do not call set (h, opt{:}) when opt is empty + + * misc/plot/stk_plot_shadedci.m: Do not call set (h, opt{:}) when + opt is empty (it makes Octave display all the settings of the + object with handle h, which was not intended). + +2015-09-20 Julien Bect + + stk_plot_shadedci.m: Accept a handle as first input argument. + + * misc/plot/stk_plot_shadedci.m: Accept a handle to an axes object + as (optional) first input argument and accepts additional + key-value pairs as well. + + stk_plot1d.m: Fill in DisplayName properties + + * misc/plot/stk_plot1d.m: Fill in the DisplayName properties for + all the components of the plot, thus making it possible to create + a legend automatically using: legend ('show'). + +2015-09-19 Julien Bect + + @stk_dataframe/plot.m: Return vector of handles + + * arrays/@stk_dataframe/plot.m: Return vector of handles + + stk_plot_shadedci.m: Delete invisible area object, return a handle + + * misc/plot/stk_plot_shadedci.m: Delete invisible area object and + return a handle to the visible one. + +2015-09-15 Julien Bect + + README: Fix a typo + + * README: Fix a typo + +2015-09-13 Julien Bect + + stk_param_init.m: Improve error message + + * paramestim/stk_param_init.m: Improve error message for + unsupported covariance functions by reporting the original error + message. + +2015-08-14 Julien Bect + + stk_dominatedhv.m: Tolerate points that do not dominate the ref + + * misc/pareto/stk_dominatedhv.m: Tolerate points that do not + dominate the reference point. + +2015-08-13 Julien Bect + + stk_dominatedhv can now return a decomposition in hyper-rectangles + + * misc/pareto/private/wfg.c (Rlist_hv, Rlist_hv2, Rlist_inclhv) + (Rlist_inclhv2, Rlist_inclhv3, Rlist_inclhv4, Rlist_exclhv) + (wfg_compute_decomposition): For each original WFG function that + returns an hypervolume valume, provide a function that return the + corresponding decomposition as a collection of signed overlapping + hyper-rectangles (RLIST structure). + (Rlist_alloc, Rlist_extend, Rlist_free): Memory management for + RLIST structures. + * misc/pareto/private/wfg.h: Define RLIST structure and declare + some associated functions. + * misc/pareto/private/stk_dominatedhv_mex.c (compute_hv): Use + size_t instead of int for unsigned indices. + (compute_decomposition): New function, similar to compute_hv, but + return the decomposition instead of the hypervolume value. + (mexFunction): Use size_t instead of int for unsigned indices. Add + second input argument to select between computing the hypervolume + value and computing the decomposition. + * misc/pareto/stk_dominatedhv.m: Add optional input argument to + select whether the decomposition into overlapping hyper-rectangles + must be returned (instead of the hypervolume only). Add unit + tests. + + stk_mex.h: Define bool type + + * misc/include/stk_mex.h: Define bool type. + +2015-08-05 Julien Bect + + wfg.c (hv): Code simplification + + * misc/pareto/private/wfg.c (hv): Factorize some code for the + cases n == 3 and n >= 4. + + wfg.c (inclhv4): Put all declarations at the beginning + + * misc/pareto/private/wfg.c (inclhv4): Put all variable + declarations at the beginning of the function (strict ANSI C). + +2015-07-20 Julien Bect + + Use size_t for computations on positive indices + + * misc/dist/private/stk_dist_matrixx.c: Use size_t for + computations on positive indices, otherwise we can get very + unpleasant surprises (aka segfaults) as a consequence of negative + indices... + * misc/dist/private/stk_dist_matrixy.c: idem + * misc/dist/private/stk_dist_pairwise.c: idem + * misc/dist/private/stk_filldist_discr_mex.c: idem + * misc/dist/private/stk_gpquadform_matrixx.c: idem + * misc/dist/private/stk_gpquadform_matrixy.c: idem + * misc/dist/private/stk_gpquadform_pairwise.c: idem + * misc/dist/private/stk_mindist_mex.c: idem + +2015-07-10 Julien Bect + + Introduce optimizer objects. + + * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Constructor + for fmincon algorithm objects. + * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: + Constructor for fminsearch algorithm objects. + * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: + Constructor for Octave SQP algorithm objects. + * misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m: + Box-constrained optimization with fmincon. + * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: + Box-constrained optimization with sqp. + * misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m: + Unconstrained optimization with sqp. + * misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m: + Unconstrained optimization with fminsearch. + * paramestim/stk_param_estim.m: Big cleanup thanks to the new + system of algorithm classes. + * misc/options/stk_options_set.m: Select default optimization + algorithms. This was previously done in stk_select_optimizer. + Also, remove the option 'optim_display_level' for stk_param_estim. + * config/stk_config_setup.m: Remove call to stk_select_optimizer. + * misc/optim/stk_select_optimizer.m: Deprecated. + * misc/optim/stk_optim_hasfmincon.m: Deprecated. + * config/stk_config_clearpersistents.m: Remove + stk_optim_hasfmincon and stk_select_optimizer from the list of + functions to be cleared. Add stk_optim_fmincon. + * admin/octpkg/INDEX: Remove stk_select_optimizer from the index. + +2015-06-30 Julien Bect + + build_octpkg.m: Fix the generated DESCRIPTION file + + * admin/build_tools/build_octpkg.m: Add "Depends: octave (>= + 3.2.2)" and "Autoload: no" to the generated DESCRIPTION file. + +2015-06-25 Emmanuel Vazquez + + @stk_kreq_qr/get.m: Fix a call to dot () + + * core/@stk_kreq_qr/get.m: Fix a call to dot () to make it work + when there is only one observation. + +2015-06-25 Rémi Stroh + + stk_param_estim.m: Fix a bug related to parameter objects. + + * paramestim/stk_param_estim.m (provide_param0_value): Fix a bug + related to parameter objects. More precisely, use (:) indexing + systematically to access the vector of numerical parameters + corresponding to a given parameter object. + + @stk_factorialdesign/stk_normalize.m: Add missing line continuation mark + + * arrays/@stk_factorialdesign/stk_normalize.m: Add missing line + continuation mark. + +2015-06-25 Julien Bect + + stk_param_init.m: XXXX_param_init (undocumented feature) + + * paramestim/stk_param_init.m: make it possible to define a + XXXX_param_init function that provides initial estimates for a + user-defined covariance function called XXXX (undocumented + feature). + +2015-06-24 Julien Bect + + stk_param_init.m: Removed unused variable. + + * paramestim/stk_param_init.m: Removed unused variable. + + stk_param_getdefaultbounds.m: Return [] for parameter classes + + * paramestim/stk_param_getdefaultbounds.m: Return empty lower and + upper bounds for parameter classes that do not implement the + stk_param_getdefaultbounds. + +2015-06-17 Julien Bect + + wfg: Remove n from the global scope + + * misc/pareto/private/wfg.c:: Remove n from the global scope. Add + new helper functions to encapsulate basic operations on fronts: + wfg_front_init, wfg_front_destroy, wfg_front_resize. + * misc/pareto/private/wfg.h: Declare the new functions. + * misc/pareto/private/stk_dominatedhv_mex.c: Use the new functions. + + wfg.c: Pass pointers to FRONT structures + + * misc/pareto/private/wfg.c: Pass pointers to FRONT structures. + +2015-06-16 Julien Bect + + check_index_file.m: Fix error handling. + + * admin/build_tools/check_index_file.m: Fix error handling. + + Use PKG_ADD/PKG_DEL directives in the Octave package. + + * stk_init.m: Add PKG_ADD/PKG_DEL directives. Also, add an + optional input argument 'do_quit'; when it is true, stk_init + removes STK from the path. + * admin/build_tools/build_octpkg.m: No more PKG_ADD/PKG_DEL + files. They are replaced by corresponding directives in + stk_init.m, which is no longer renamed to PKG_ADD. Also, there are + now two STK_OCTAVE_PACKAGE variables to set (one in stk_init.m, + the other one in stk_config_rmpath.m). + * admin/build_tools/check_index_file.m: No need to warry about + PKG_ADD.m ad PKG_DEL.m anymore. + * admin/octpkg/post_install.m: Idem. + * admin/octpkg/INDEX: Add stk_init to the INDEX. + * config/stk_config_path.m: Do not look for PKG_ADD to detect + Octave package mode, since there no longer is a PKG_ADD + file. Instead, rely on a hard-coded STK_OCTAVE_PACKAGE variable, + which is modified at build time by build_octpkg (similarly to the + one in stk_init). + * config/stk_config_rmpath.m: Modify comment. + * config/stk_config_addpath.m: Modify comment. + * admin/octpkg/PKG_DEL.m: Removed. Instead, a PKD_DEL directive + has been inserted in stk_init. + +2015-06-15 Julien Bect + + Avoid unnecessary calls to stk_commonsize. + + * misc/distrib/stk_distrib_bivnorm_cdf.m: Avoid unnecessary calls + to stk_commonsize. + * misc/distrib/stk_distrib_normal_cdf.m: Idem. + +2015-06-12 Julien Bect + + stk_commonsize.m: Avoid unnecessary calls to repmat. + + * arrays/generic/stk_commonsize.m: Avoid unnecessary calls to + repmat. + +2015-06-11 Julien Bect + + stk_commonsize.m: Accept empty dimensions + + * arrays/generic/stk_commonsize.m: Accept empty dimensions, under + the condition that all input arguments have the same empty + dimensions (in which case the result is empty). + +2015-06-10 Julien Bect + + @stk_dataframe/subsasgn.m: Preserve column names when deleting rows + + * arrays/@stk_dataframe/subsasgn.m: Preserve column names when + deleting rows, even if the resulting array is empty. + +2015-06-02 Julien Bect + + wfg.c: Improve portability again + + * misc/pareto/private/wfg.c: Improve portability again. Now all + variables are declared at the beginning of functions (as required + by the C89 standard). And some unused headers have been removed, + too. + +2015-05-29 Julien Bect + + stk_distrib_bivnorm_cdf.m: Bugfix + + * misc/distrib/stk_distrib_bivnorm_cdf.m: Fix a bug in the case of + mixtures of singular and non-singular cases. Add unit test. + +2015-05-28 Julien Bect + + wfg.c: Remove C99-specific code (stdbool.h). + + * misc/pareto/private/wfg.c: Remove C99-specific code (stdbool.h). + +2015-05-27 Julien Bect + + stk_pmisclass.m: Compute the probability of misclassification + + * utils/stk_pmisclass.m: New function to compute the probability + of misclassification with respect to a given threshold (either the + current probability of misclassification or the expectation of the + future probability of misclassification). + * examples/02_design_of_experiments/stk_example_doe04.m: Example + script that demonstrates the use of stk_pmisclass (). + + stk_dominatedhv.m: New function to compute dominated hypervolumes. + + * misc/pareto/stk_dominatedhv.m: New function to compute + dominated hypervolumes, which uses WFG 1.10 internally + * misc/pareto/private/stk_dominatedhv_mex.c: MEX-file wrapper for WFG + * admin/octpkg/INDEX: Add new function to the index + * admin/octpkg/Makefile: Add new MEX-file to the Makefile + * config/stk_config_makeinfo.m:Add new MEX-file to the build list + + Import WFG 1.10. + + * misc/pareto/private/wfg.c: Main WFG source file, with minor changes + * misc/pareto/private/wfg.h: Main WFG header, with minor changes + * misc/pareto/private/wfg.README: WFG README + ChangeLog + Copyright + * admin/build_tools/build_octpkg.m: Ignore wfg.README. + + Make it possible to have several source files for one MEX. + + * config/stk_config_buildmex.m: Make it possible to have several + source files for one MEX. + * config/stk_config_makeinfo.m: Existing MEX-files do not have any + additional source file. + + Move Pareto-related functions to misc/pareto. + + * arrays/generic/private/stk_isdominated_mex.c: moved from + * misc/pareto/private/stk_isdominated_mex.c: moved to + * arrays/generic/private/stk_paretofind_mex.c: moved from + * misc/pareto/private/stk_paretofind_mex.c: moved to + * arrays/generic/stk_isdominated.m: moved from + * misc/pareto/stk_isdominated.m: moved to + * arrays/generic/stk_paretofind.m: moved from + * misc/pareto/stk_paretofind.m: moved to + * admin/octpkg/INDEX: Create a dedicated section in the index + * config/stk_config_makeinfo.m: Update make info + * config/stk_config_path.m: Add new directory to the path + +2015-05-24 Julien Bect + + Clear persistent variables in stk_init + + * config/stk_config_clearpersistents.m: New function that unlocks + all possibly mlock-ed STK files and clears all STK functions that + contain persistent variables. + * stk_init.m: Call stk_config_clearpersistents. + * admin/RELEASE.md: Update release instructions. + +2015-05-20 Julien Bect + + @stk_dataframe/set.m: Fix stk_error calls (missing mnemonic) + + * arrays/@stk_dataframe/set.m: Fix stk_error calls (missing mnemonic) + + stk_param_estim.m: Make sure that lnv0 falls within the bounds + + * paramestim/stk_param_estim.m (get_default_bounds_lnv): Make sure + that lnv0 falls within the bounds returned by get_default_bounds_lnv. + +2015-05-19 Julien Bect + + stk_optim_hasfmincon.m: Improve fmincon detection + + * misc/optim/stk_optim_hasfmincon.m: Try to use fmincon to check + that it is there, instead of relying on the result of the exist + function (closes ticket #30). + +2015-05-17 Julien Bect + + admin/octpkg/Makefile: Use $(MKOCTFILE) if defined + + * admin/octpkg/Makefile: Use $(MKOCTFILE) if defined + + stk_runtests.m: Make sure that all Octave warnings are disabled + + * misc/test/stk_runtests.m: Make sure that all Octave warnings are + disabled + + Fix %!shared blocks in unit tests. + + * arrays/@stk_hrect/stk_normalize.m: Fix unit test. + * arrays/generic/stk_feval.m: Fix unit test. + +2015-04-22 Julien Bect + + Improve indexing (subasgn/subsref) for stk_dataframe objects. + + * arrays/@stk_dataframe/subsasgn.m: Preserve row names and column + names when it is possible (closes ticket #21). + * arrays/@stk_dataframe/subsref.m: Allow for several levels of + indexing in the case of ()-indexing. + + stk_dataframe.m: Add help text + + * arrays/@stk_dataframe/stk_dataframe.m: Add help text (closes + ticket #26). + +2015-04-21 Julien Bect + + stk_hrect.m: Add help text + + * arrays/@stk_hrect/stk_hrect.m: Add help text (closes ticket #27). + +2015-04-20 Julien Bect + + stk_boundingbox.m: Add doc and overload for several classes (ticket #28) + + * arrays/generic/stk_boundingbox.m: Add doc. Handle plain arrays only. + * arrays/@stk_dataframe/stk_boundingbox.m: Overload. + * arrays/@stk_factorialdesign/stk_boundingbox.m: Overload. + * arrays/@stk_hrect/stk_boundingbox.m: Overload. + * arrays/@struct/stk_boundingbox.m: Overload. + +2015-04-05 Julien Bect + + stk_feval.m: Update documentation. + + * stk_feval.m: Update documentation. + +2015-03-11 Julien Bect + + stk_feval.m: Implement vectorized calls and use them by default. + + * arrays/generic/stk_feval.m: Implement vectorized calls and use them by + default. + * paramestim/stk_param_relik.m: Fix unit test. + + Fix progress indicator in stk_feval. + + * arrays/generic/stk_feval.m: Restore the progress indicator. + * misc/text/stk_disp_progress.m: Fix progress message. + +2015-03-04 Julien Bect + + stk_distrib_normal_cdf.m: Fix the zero-variance case + + * misc/distrib/stk_distrib_normal_cdf.m: Fix the zero-variance + case. Add unit tests. + + Fix bugs in stk_distrib_*_ei functions. + + * misc/distrib/stk_distrib_normal_ei.m: Fix bug (input argument + "minimize" was not properly taken into account). + * misc/distrib/stk_distrib_student_ei.m: Fix bug (input argument + "minimize" was not properly taken into account). + +2015-02-21 Julien Bect + + Optimize for speed + + * misc/distrib/stk_distrib_normal_cdf.m: Optimize for speed + * covfcs/stk_gausscov_aniso.m: Optimize for speed + * covfcs/stk_materncov32_aniso.m: Optimize for speed + * covfcs/stk_materncov52_aniso.m: Optimize for speed + * covfcs/stk_materncov_aniso.m: Optimize for speed + +2015-02-18 Julien Bect + + stk_feval.m: Do not return an stk_dataframe object systematically + + * arrays/generic/stk_feval.m: Return an stk_dataframe object only + if the input x itself is an stk_dataframe object. + + Optimize for speed (and fix a tiny bug) + + * arrays/@stk_dataframe/stk_dataframe.m: Optimize for speed + * arrays/@stk_dataframe/set.m: Optimize for speed (and fix a tiny bug) + * arrays/@stk_dataframe/horzcat.m: Optimize for speed + * arrays/@stk_dataframe/vertcat.m: Optimize for speed + * arrays/@stk_dataframe/subsref.m: Optimize for speed + * arrays/generic/stk_feval.m: Optimize for speed + +2015-02-17 Julien Bect + + Initialize model.param with NaNs. + + * core/stk_model.m: Initialize model.param with NaNs. + * core/stk_predict.m: Fix unit tests. + * covfcs/stk_discretecov.m: Fix unit tests. + * covfcs/stk_gausscov_aniso.m: Fix unit tests. + * covfcs/stk_gausscov_iso.m: Fix unit tests. + * covfcs/stk_materncov32_aniso.m: Fix unit tests. + * covfcs/stk_materncov32_iso.m: Fix unit tests. + * covfcs/stk_materncov52_aniso.m: Fix unit tests. + * covfcs/stk_materncov52_iso.m: Fix unit tests. + * covfcs/stk_materncov_aniso.m: Fix unit tests. + * covfcs/stk_materncov_iso.m: Fix unit tests. + * utils/stk_conditioning.m: Fix unit tests. + * utils/stk_generate_samplepaths.m: Fix unit tests. + +2015-02-11 Julien Bect + + stk_feval.m: Accept any object that implement feval + + * arrays/generic/stk_feval.m: Accept any object that implement + feval (not just strings and function handles). + +2015-02-10 Julien Bect + + stk_feval.m: Fix backward compatibility issues + + * arrays/generic/stk_feval.m: Fix backward compatibility + issue. Old-style STK structures, where the data is contained in a + field named 'a', were not dealt with properly. Add unit test. + * core/stk_predict.m: Convert xi to double (same reason). + * paramestim/stk_param_estim.m: Convert zi to double (same reason). + * arrays/@struct/stk_length.m: New function. + +2015-02-09 Julien Bect + + stk_hrect.m: Provide default constructor + + * arrays/@stk_hrect/stk_hrect.m: Provide default constructor + +2015-02-04 Julien Bect + + Overload uplus, uminus for stk_dataframe objects. + + * arrays/@stk_dataframe/uminus.m: Overload uminus. + * arrays/@stk_dataframe/uplus.m: Overload uplus. + * arrays/@stk_factorialdesign/uminus.m: Overload uminus. + + stk_feval.m: Accept multivariate outputs (closes #20) + + * arrays/generic/stk_feval.m: Accept functions with multivariate + outputs (i.e., outputs with several columns). Improve the + construction of the output dataframe (column names). Add unit + tests. + + stk_feval.m: Fix a bug related to column names + + * arrays/generic/stk_feval.m: Fix a bug related to column names. + +2015-02-03 Julien Bect + + @stk_dataframe/apply, min, max: Return more than one output argument + + * arrays/@stk_dataframe/apply.m: Return more than one output argument + * arrays/@stk_dataframe/max.m: Return more than one output argument + * arrays/@stk_dataframe/min.m: Return more than one output argument + + stk_param_relik.m: Improve the computation of G = W' * K * W + + * paramestim/stk_param_relik.m: Compute G = W' * K * W in such a + way that the result is always (?) symmetric. + +2015-01-28 Julien Bect + + stk_predict.m: Compute lambda_mu and RS only when necessary + + * core/stk_predict.m: Compute lambda_mu and RS only when + necessary, depending on the number of output arguments. Add unit + tests. + + stk_param_init.m: Handle the heteroscedastic case + + * paramestim/stk_param_init.m: Handle the heteroscedastic case + with known variance properly. Error in the heteroscedastic case + with unknown variance. Add unit tests. + +2015-01-27 Julien Bect + + stk_param_init.m: Fix a bug. + + * paramestim/stk_param_init.m (paraminit_): Fix a bug. + +2015-01-25 Julien Bect + + stk_dataframe.m: Make sure that the output is an stk_dataframe + + * arrays/@stk_dataframe/stk_dataframe.m: Make sure that the output + is an stk_dataframe object. Add unit tests. + +2015-01-24 Julien Bect + + Overload a few base functions for stk_dataframe objects + + * arrays/@stk_dataframe/sort.m: Overload base function + * arrays/@stk_dataframe/mtimes.m: Overload base function + +2015-01-23 Julien Bect + + stk_conditioning.m: Overload for stk_dataframe objects + + * arrays/@stk_dataframe/stk_conditioning.m: Overload + stk_conditioning for stk_dataframe inputs. The output is an + stk_dataframe object if either LAMBDA or ZSIM is an stk_dataframe + object. + * utils/stk_conditioning.m: Do not convert the output into an + stk_dataframe object. + + stk_generate_samplepaths.m: Overload for stk_dataframe objects + + * arrays/@stk_dataframe/stk_generate_samplepaths.m: Overload + stk_generate_samplepaths for stk_dataframe inputs. The output is + always an stk_dataframe object. + * utils/stk_generate_samplepaths.m: Simplify the code using the + assumption that none of the inputs is an stk_dataframe object. The + output is an stk_dataframe object if and only if + model.response_name exists and is a non-empty string. + +2015-01-21 Julien Bect + + stk_feval.m: Various improvements. + + * arrays/generic/stk_feval.m: Update documentation. Try to make + the code clearer. Use stk_disp_progress. + + stk_disp_progress.m: Display a progress indicator. + + * misc/text/stk_disp_progress.m: New function that displays a + textual progress indicator. + +2015-01-21 Emmanuel Vazquez + + stk_feval.m: Generalize to the case of a cell array of functions + + * arrays/generic/stk_feval.m: Generalize to the case of a cell + array of functions (ticket #19 closed). + +2015-01-08 Julien Bect + + Improve conditional simulation examples. + + * examples/01_kriging_basics/stk_example_kb05.m: Add documentation. + * examples/01_kriging_basics/stk_example_kb09.m: New example. + + stk_generate_samplepaths.m: Fix conditioning on noisy observations + + * utils/stk_generate_samplepaths.m: Fix conditioning on noisy + observations, which was not implemented properly until now. + + stk_conditioning.m: Implement conditioning on noisy observations + + * utils/stk_conditioning.m: Simulate sample paths conditioned on + noisy observations when the additional NOISE_SIM argument is + provided. + +2015-01-07 Julien Bect + + stk_generate_samplepaths.m: Do not simulate observation noise. + + * utils/stk_generate_samplepaths.m: Do not add observation noise + to the generated sample paths. This is consistent with + stk_predict, which returns posterior variances for the unknown + function, not for future noisy observations. + +2014-12-31 Julien Bect + + Accept empty dim in sampling functions. + + * sampling/stk_sampling_halton_rr2.m: Accept empty dim argument + when box is provided, in which case dim is guessed from the + dimension of box if provided, and defaults to one otherwise. + * sampling/stk_sampling_maximinlhs.m: Idem. + * sampling/stk_sampling_olhs.m: Idem. + * sampling/stk_sampling_randomlhs.m: Idem. + * sampling/stk_sampling_randunif.m: Idem. + * sampling/stk_sampling_regulargrid.m: Idem. + + Use @stk_hrect objects wherever it is useful (work in progress). + + * examples/01_kriging_basics/stk_example_kb03.m: Use @stk_hrect. + * examples/02_design_of_experiments/stk_example_doe03.m: Use @stk_hrect. + * misc/test/stk_is_lhs.m: Use @stk_hrect. + * paramestim/stk_param_init.m: Use @stk_hrect. + * sampling/stk_sampling_halton_rr2.m: Use @stk_hrect. + * sampling/stk_sampling_maximinlhs.m: Use @stk_hrect. + * sampling/stk_sampling_olhs.m: Use @stk_hrect. + * sampling/stk_sampling_randomlhs.m: Use @stk_hrect. + * sampling/stk_sampling_randunif.m: Use @stk_hrect. + * sampling/stk_sampling_regulargrid.m: Use @stk_hrect. + + A few additional methods for the @stk_dataframe class. + + * arrays/@stk_dataframe/diff.m: Overload base function. + * arrays/@stk_dataframe/ismember.m: Overload base function. + * arrays/@stk_dataframe/xlim.m: Overload base function. + * arrays/@stk_dataframe/ylim.m: Overload base function. + + Overhaul stk_normalize and stk_rescale functions. + + * arrays/@stk_dataframe/stk_normalize.m: Overhaul. + * arrays/@stk_dataframe/stk_rescale.m: Overhaul. + * arrays/@stk_factorialdesign/stk_normalize.m: Overhaul. + * arrays/@stk_factorialdesign/stk_rescale.m: Overhaul. + * arrays/generic/stk_normalize.m: Overhaul. + * arrays/generic/stk_rescale.m: Overhaul. + + stk_boundingbox.m: New function to create bounding boxes. + + * arrays/generic/stk_boundingbox.m: New function to create + bounding boxes as @stk_hrect object. + * admin/octpkg/INDEX: Add new functions to the index. + + New @stk_hrect class to represent hyper-rectangles. + + * arrays/@stk_hrect/stk_hrect.m: Constructor for the new + @stk_hrect class. + * arrays/@stk_hrect/axis.m: Overload base function. + * arrays/@stk_hrect/disp.m: Overload base function. + * arrays/@stk_hrect/display.m: Overload base function. + * arrays/@stk_hrect/get.m: Overload base function. + * arrays/@stk_hrect/horzcat.m: Overload base function. + * arrays/@stk_hrect/ismember.m: Overload base function. + * arrays/@stk_hrect/stk_normalize.m: Overload STK function. + * arrays/@stk_hrect/stk_rescale.m: Overload STK function + * arrays/@stk_hrect/subsasgn.m: Overload base function. + * arrays/@stk_hrect/subsref.m: Overload base function. + * arrays/@stk_hrect/vertcat.m: Overload base function. + * admin/octpkg/INDEX: Add new functions to the index. + + Improve plot helper functions. + + * misc/plot/stk_get_axis_arg.m: New function to help handling the + options axes argument that most plotting functions have. + * misc/plot/stk_xlabel.m: Use stk_get_axis_arg. + * misc/plot/stk_ylabel.m: Use stk_get_axis_arg. + * misc/plot/stk_zlabel.m: New function, similar to stk_xlabel and stk_ylabel. + * misc/options/stk_options_set.m: Add options for stk_zlabel. + +2014-12-09 Julien Bect + + stk_distrib_bivnorm_cdf: Compute bivariate normal probabilities. + + * misc/distrib/stk_distrib_bivnorm_cdf.m: Compute bivariate normal + probabilities (with any means, standard deviations and + corrrelation coefficients). Supports broadcasting. Accurate + computation of [p, q] even when p or q is close to one. + * misc/distrib/private/stk_distrib_bivnorm0_cdf.c: C MEX-file for + the computation of standard bivariate probabilities (zero means, + unit variances). + * admin/octpkg/INDEX: Hide stk_distrib_bivnorm_cdf.m, currently + considered as an internal function. + * admin/octpkg/Makefile: Add __stk_distrib_bivnorm0_cdf__ to the + list of targets. + * config/stk_config_makeinfo.m: Add stk_distrib_bivnorm0_cdf. + +2014-12-03 Julien Bect + + stk_sampling_randunif.m: Fix input argument checking. + + * sampling/stk_sampling_randunif.m: Fix input argument checking. + + stk_sampling_randunif.m: Accept empty dim when box is provided. + + * sampling/stk_sampling_randunif.m: Accept empty dim argument when + box is provided, in which case dim is guessed from the dimension + of box. + +2014-11-20 Julien Bect + + stk_param_estim.m: Provide a value for param0 if needed. + + * paramestim/stk_param_estim.m: Provide a value for param0 if needed. + + stk_param_estim.m: Empty is the same as not provided. + + * paramestim/stk_param_estim.m: Empty is the same as not provided. + + stk_param_estim.m: Simplify variable names. + + * paramestim/stk_param_estim.m: Simplify variable names, param0lnv + -> lnv0, paramlnvopt -> lnvopt. + + stk_param_estim.m: Always return something meaningful for lnv. + + * paramestim/stk_param_estim.m: Always return something meaningful + for lnv: when the variance of the noise is not estimated, return + model.lognoisevariance. Update the function documentation + following this and earlier changes. + +2014-11-08 Julien Bect + + stk_param_estim.m: Estimate lnv if lognoisevariance is nan. + + * paramestim/stk_param_init_lnv.m: New function that provides a + rough estimate of the variance of the noise for a given model. + * admin/octpkg/INDEX: Include stk_param_init_lnv.m. + * paramestim/stk_param_estim.m: Estimate the variance of the noise + if the lognoisevariance field is nan, using as a starting point + the value returned by stk_param_init_lnv. + * examples/01_kriging_basics/stk_example_kb04.m: Demonstrate how + it is possible to estimate the variance of the noise without + providing a initial guess for it. + +2014-11-06 Julien Bect + + Handle empty lognoisevariance field as if missing. + + * core/stk_make_matcov.m: Handle empty lognoisevariance field as + if missing. + * core/stk_model.m: Idem. + * doc/dev/model.texi: Idem. + * paramestim/stk_param_estim.m: Idem. + * paramestim/stk_param_init.m: Idem. + * paramestim/stk_param_relik.m: Idem. + +2014-11-03 Julien Bect + + Add a 'pairwise' argument to stk_noisecov. + + * covfcs/stk_noisecov.m: Add a 'pairwise' argument. + * core/stk_make_matcov.m: Use the new 'pairwise' argument. + +2014-11-02 Julien Bect + + stk_param_init.m: Change the behaviour regarding lnv. + + * paramestim/stk_param_init.m: defaults to using the input value + of model.lognoisevariance if it is not nan, and estimating the + variance if it is nan. The meaning of the fifth argument, now + called DO_ESTIM_LNV, has also slightly changed: it is used to + force or prevent the estimation of the variance of the noise, + regardless of the value of model.lognoisevariance. + * examples/03_miscellaneous/stk_example_misc03.m: Display the two + models that have been used in this example. + * doc/dev/model.texi: update accordingly. + +2014-10-26 Julien Bect + + Make lognoisevariance a mandatory field in model structures. + + * core/stk_model.m: Make lognoisevariance a mandatory field in + model structures, with default value -inf. For backward + compatibility, stk_discrete_cov models can still be created with + model structures that lack a lognoisevariance field. + * core/stk_make_matcov.m: For backward compatibility, a + lognoisevariance field with value -inf is added if absent. + * paramestim/stk_param_estim.m: idem. + * paramestim/stk_param_init.m: idem. + * paramestim/stk_param_relik.m: idem + remove NOISYOBS variable. + * covfcs/stk_discretecov.m: Modify unit test accordingly. + * doc/dev/model.texi: Record design notes and ideas about model + structures (not meant to be released as a user-level doc). + +2014-10-09 Julien Bect + + Add the Goldstein-Price test function. + + * examples/test_functions/stk_testfun_goldsteinprice.m: + Goldstein-Price test function. + +2014-09-29 Julien Bect + + Polish stk_sprintf_colvect_* functions. + + * misc/text/stk_sprintf_colvect_fixedpoint.m: Use round instead of + floor. Polish formatting. + * misc/text/stk_sprintf_colvect_scientific.m: Polish formatting. + +2014-09-28 Julien Bect + + @stk_dataframe/plot.m: Fix two problems. + + * arrays/@stk_dataframe/plot.m: Fix two problems. + + stk_config_rmpath.m: Use strrep instead of regexprep. + + * config/stk_config_rmpath.m: Use strrep instead of regexprep for + compatiblity with Octave 3.2.x (see comments inside the file). + +2014-09-27 Julien Bect + + PKG_DEL.m: Use addpath instead of cd. + + * admin/octpkg/PKG_DEL.m: Use addpath instead of cd. + + stk_param_getdefaultbounds.m: Avoid -Inf in default bounds. + + * paramestim/stk_param_getdefaultbounds.m: Avoid -Inf in default + bounds. + +2014-09-25 Julien Bect + + Fix a problem related to Octave 3.2.x when STK is used as a package. + + * config/stk_config_path.m: Add private folder to the path in + Octave 3.2.x even when STK is used as a package. + + Fix a problem with @stk_factorialdesign/fieldnames.m. + + * arrays/@stk_factorialdesign/fieldnames.m: Concatenate cell + arrays of strings, but not a string with a cell array of strings + since the latter syntax is not supported in Octave 3.2.x. + + Add @stk_factorialdesign/private to the path when using Octave 3.2.x. + + * config/stk_config_path.m: Add @stk_factorialdesign/private to + the path when using Octave 3.2.x. + +2014-09-22 Julien Bect + + Robustify a private function. + + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Make + the function work with old versions of octave where, for some + plotting functions (e.g., pcolor in Octave 3.6.4) the full syntax + with axes handle and parameter/value pairs is not supported. + + Make stk_config_rmpath work on Windows systems. + + * config/stk_config_rmpath.m: Make stk_config_rmpath work on + Windows systems (pathsep must be used instead of ':' since ':' is + not the path separator for Windows...). + +2014-09-20 Julien Bect + + Provide a replacement for missing isrow. + + * misc/mole/isrow/isrow.m: Replacement for isrow. + * config/stk_config_mole.m: Add our isrow function to the path if + necessary (e.g., Matlab R2007a). + + Fix a tiny bug in stk_param_estim. + + * paramestim/stk_param_estim.m: Use strcmpi instead of strcmp to + compare err.identifier to 'matlab:optimset:invalidparamname' on + line 167. I wonder if this line has ever worked properly... (only + affects old releases of Matlab, e.g.,R2007a). + + Don't use ~ to ignore arguments. + + * admin/build_tools/build_octpkg.m: Don't use ~ to ignore arguments. + * utils/stk_generate_samplepaths.m: Don't use ~ to ignore arguments. + +2014-09-15 Julien Bect + + stk_param_relik.m: Optimize the case of simple kriging. + + * paramestim/stk_param_relik.m: Optimize the case of simple kriging. + +2014-09-09 Paul Feliot + + doc: Update help text for several functions. + + * covfcs/stk_materncov32_aniso.m: Update help text. + * covfcs/stk_materncov32_iso.m: Update help text. + * covfcs/stk_materncov52_aniso.m: Update help text. + * covfcs/stk_materncov52_iso.m: Update help text. + * covfcs/stk_materncov_aniso.m: Update help text. + * covfcs/stk_materncov_iso.m: Update help text. + * paramestim/stk_param_init.m: Update help text. + +2014-09-02 Julien Bect + + Rename LICENSE to COPYING. + + * LICENSE: Renamed to COPYING. + * COPYING: Formerly known as LICENSE. + * README: Update reference to LICENSE. + * admin/build_tools/build_forgedoc.m: No more need to rename. + * admin/build_tools/build_octpkg.m: No more need to rename. + * admin/find_nonstandard_characters.sh: Update reference to LICENSE. + * admin/fix_eol.sh: Update reference to LICENSE. + + Rename WHATSNEW to NEWS. + + * NEWS: Formerly known as WHATSNEW. This version is for release + 2.1.1 (we still have to update it to 2.2.0). From now on, we will + always keep a version of this file in the default branch. + * admin/build_tools/build_forgedoc.m: No need to rename WHATSNEW + to NEWS anymore. + * admin/build_tools/build_octpkg.m: Same thing. + +2014-08-20 Julien Bect + + Add CITATION file. + + * CITATION: Explain how to cite STK in publications. + +2014-08-18 Julien Bect + + Document stk_length. + + * arrays/generic/stk_length.m: Add doc. + * arrays/@stk_dataframe/stk_length.m: Fix doc. + * admin/octave-pkg/INDEX: Un-hide stk_length. + +2014-08-17 Julien Bect + + Deprecate stk_plot2d. + + * misc/plot/stk_plot2d.m: Deprecated. + * arrays/@stk_factorialdesign/contour.m: Overload base function. + * arrays/@stk_factorialdesign/mesh.m: Overload base function. + * arrays/@stk_factorialdesign/meshc.m: Overload base function. + * arrays/@stk_factorialdesign/meshz.m: Overload base function. + * arrays/@stk_factorialdesign/pcolor.m: Overload base function. + * arrays/@stk_factorialdesign/surf.m: Overload base function. + * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: + Provide a common implementation for overloading surf/contour/... + * examples/01_kriging_basics/stk_example_kb03.m: Use contour and + pcolor. + * examples/03_miscellaneous/stk_example_misc04.m: Use pcolor. + * admin/octave-pkg/INDEX: Update with the new functions. Hide + stk_plot2d. + + @stk_dataframe/plot.m: Hold on after the first plot. + + * arrays/@stk_dataframe/plot.m: Hold on after the first plot, if + there are several (fixes a bug introduced yesterday). + +2014-08-16 Julien Bect + + @stk_dataframe/plot.m: Full rewrite again. + + * arrays/@stk_dataframe/plot.m: Full rewrite again, to improve + even more compatibility with the base plot function. The case + where x is an stk_dataframe objects with two or more columns is + now handled in a way that is consistent with the base plot + function (i.e., if x has two columns, then we get two 1D plots). + +2014-08-15 Julien Bect + + stk_plot1d.m: Add missing documentation. + + * misc/plot/stk_plot1d.m: Add doc. + + @stk_dataframe/plot.m: Full rewrite. + + * arrays/@stk_dataframe/plot.m: Full rewrite to improve + compatibility with the base plot function. Deprecate the case + where x is an stk_dataframe objects with two or more columns. + +2014-08-14 Julien Bect + + Add missing documentations. + + * arrays/@stk_factorialdesign/ndgrid.m: Add doc. + * covfcs/stk_discretecov.m: Add doc. + +2014-08-13 Julien Bect + + Use "z" instead of "x" in all stk_distrib_* functions. + + * misc/distrib/stk_distrib_normal_cdf.m: Use "z" instead of "x". + * misc/distrib/stk_distrib_normal_ei.m: Idem. + * misc/distrib/stk_distrib_normal_pdf.m: Idem. + * misc/distrib/stk_distrib_student_cdf.m: Idem. + * misc/distrib/stk_distrib_student_ei.m: Idem. + * misc/distrib/stk_distrib_student_pdf.m: Idem. + + Provide a documentation for EI functions. + + * misc/distrib/stk_distrib_normal_ei.m: Add doc. + * misc/distrib/stk_distrib_student_ei.m: Add doc. + +2014-08-12 Julien Bect + + Improve Octave packaging. + + * admin/make_octave_package.m: Delete rename_mex.sed after + use. Rename test script. + * admin/MAKE_OCTAVE_PACKAGE.md: New doc file (in markdown). + * admin/octave-pkg/test_package.m: Renamed to + * admin/octave-pkg/pkg_install_stk_and_generate_doc.m: Renamed + from. + +2014-08-10 Julien Bect + + stk_example_misc04.m: Fix property name. + + * examples/03_miscellaneous/stk_example_misc04.m: Fix property + name (YTickLabels --> YTickLabel). + + stk_example_misc04.m: Fix for Octave compatiblity. + + * examples/03_miscellaneous/stk_example_misc04.m: Fix for Octave + compatiblity (stairs does not accept stk_datafrm objects in + Octave). + +2014-08-08 Julien Bect + + Fix and improve stk_factorialdesign's accessors. + + * arrays/@stk_factorialdesign/subsasgn.m: New function. Override + stk_dataframe's subsasgn to prevent illegal modifications of + stk_factorialdesign objects through ()-type indexing. Any such + modification results in an implicit cast to stk_dataframe. + * arrays/@stk_factorialdesign/get.m: Provide read-only access to + the underlying stk_dataframe object. + * arrays/@stk_factorialdesign/set.m: The result is implicitely + cast into an stk_dataframe object upon any modification that would + otherwise corrupt the internal structure of the + stk_factorialdesign object. + * arrays/@stk_factorialdesign/fieldnames.m: Add .stk_dataframe. + +2014-08-07 Julien Bect + + Simplify the display of stk_factorialdesign objects. + + * arrays/@stk_factorialdesign/stk_sprintf.m: Simplify the display + of stk_factorialdesign objects by hiding the ".stk_dataframe" + level (i.e., .info is used as an aliad for .stk_dataframe.info). + * arrays/@stk_dataframe/stk_sprintf.m: Modified (tiny change). + + Define list of field names for stk_factorialdesign objects. + + * arrays/@stk_factorialdesign/fieldnames.m: Define list of field + names for stk_factorialdesign objects. + + Fix list of field names for stk_dataframe objects. + + * arrays/@stk_dataframe/private/reserved_field_names.m: Fix list + of field names for stk_dataframe objects. + * arrays/@stk_dataframe/fieldnames.m: Update unit test. + +2014-07-31 Julien Bect + + Modify the behaviour of vertcat/horzcat for stk_dataframe objects. + + * arrays/@stk_dataframe/horzcat.m: Modified. The result is always + an stk_dataframe object, and has row names iff either one of the + two arguments doesn't have row names, or the row names of both + arguments agree. + * arrays/@stk_dataframe/vertcat.m: Similar changes. + + Modify the behaviour of bsxfun for stk_dataframe objects. + + * arrays/@stk_dataframe/bsxfun.m: Modified. The result is always + an stk_dataframe object, and has column names iff either one of + the two arguments doesn't have columns names or the columns names + of both arguments agree. + * arrays/@stk_factorialdesign/stk_factorialdesign.m: Modified unit + test. + * arrays/@stk_dataframe/abs.m: Overload abs for stk_dataframe + object. This allows to write abs (x) instead of abs (double (x)) + or abs (x.data). + +2014-07-24 Julien Bect + + Accept invRho = 0 in anisotropic covariance functions. + + * covfcs/stk_gausscov_aniso.m: Accept invRho = 0. + * covfcs/stk_materncov32_aniso.m: Idem. + * covfcs/stk_materncov52_aniso.m: Idem. + * covfcs/stk_materncov_aniso.m: Idem. + + stk_sprintf_colvect_scientific.m: Fix a bug. + + * misc/text/stk_sprintf_colvect_scientific.m: Fix a bu related to + rounding numbers such as 9.99e02 (which were displayed as 10e+02 + instead of 1e+03). + * arrays/@stk_dataframe/stk_sprintf.m: Set default width to 8. + * misc/text/stk_sprintf_colvect.m: Idem. + * misc/text/stk_sprintf_colvect_fixedpoint.m: Idem. + +2014-07-23 Julien Bect + + stk_param_estim.m: Warn about constant-response data. + + * paramestim/stk_param_estim.m: Warn about constant-response data. + +2014-07-22 Julien Bect + + stk_param_init.m: Warn about constant-response data. + + * paramestim/stk_param_init.m: Warn about constant-response data. + + stk_param_relik.m: Check symmetry of G = W' * K * W. + + * paramestim/stk_param_relik.m: Check if G = W' * K * W and apply + a naive fix if it is not (+ emit a warning). + * config/stk_config_setup.m: Do not display the new warning. + * core/stk_cholcov.m: Only issue one warning if using epsi. + + Improve the implementation of stk_dataframe objects display. + + * arrays/@stk_dataframe/disp.m: Modified. + * arrays/@stk_dataframe/display.m: Modified. + * arrays/@stk_factorialdesign/stk_sprintf_levels.m: Modified. + * arrays/@stk_dataframe/stk_sprintf.m: New function. + * arrays/@stk_factorialdesign/stk_sprintf.m: New function. + * arrays/generic/stk_sprintf.m: New function. + * arrays/@stk_dataframe/stk_sprintf_data.m: Removed. + * arrays/@stk_factorialdesign/disp.m: Removed. + * arrays/generic/stk_sprintf_data.m: Removed. + + Implement stk_sprintf_sizetype for cell arrays. + + * arrays/@cell/stk_sprintf_sizetype.m: Implement + stk_sprintf_sizetype for cell arrays. + * arrays/@stk_dataframe/stk_sprintf_sizetype.m: Minor formatting + change in the output string (remove spaces). + * arrays/generic/stk_sprintf_sizetype.m: Idem. + +2014-07-21 Julien Bect + + stk_config_buildmex.m: Run silently when doing nothing. + + * config/stk_config_buildmex.m: Run silently when doing nothing. + + Remove page_screen_output (not needed anymore). + + * misc/mole/matlab/page_screen_output.m: Deleted (not needed + anymore). + + Stop bothering users at startup. + + * stk_init.m: Stop bothering users at startup with information + that they can find in the README file anyway. + + Don't display selected optimizers at startup. + + * misc/optim/stk_select_optimizer.m: Don't display selected + optimizers when called without input arguments (typically, during + startup). + +2014-07-20 Julien Bect + + stk_config_setup.m: Call stk_parallel_engine_set. + + * config/stk_config_setup.m: Call stk_parallel_engine_set. + + Get rid of stk_parallel_haspct. + + * misc/parallel/stk_parallel_haspct.m: Deleted. + * admin/octave-pkg/INDEX: Modified. + * misc/parallel/stk_parallel_start.m: Modified. + + stk_config_setup.m: Don't bother checking if the PCT is installed. + + * config/stk_config_setup.m: in Matlab, don't bother checking if + the PCT is installed. + +2014-07-19 Julien Bect + + New example script illustrating random Pareto fronts. + + * examples/03_miscellaneous/stk_example_misc04.m: New script. + +2014-07-18 Julien Bect + + Add an option to control the verbosity fmincon/fminsearch. + + * misc/options/stk_options_set.m: Add new option + 'optim_display_level' with default value 'off'. + * paramestim/stk_param_estim.m: Use the new option. + * paramestim/stk_param_init.m: Don't display debugging info. + +2014-07-14 Julien Bect + + stk_plot1d.m: Improved flexibility in argument handling. + + * misc/plot/stk_plot1d.m: Improved flexibility in the way input + arguments are handled. + +2014-07-03 Julien Bect + + Global options to control upper/lower bounds for param estim. + + * misc/options/stk_options_set.m: Add new options. + * paramestim/stk_param_getdefaultbounds.m: Read global options. + + stk_param_estim.m: Return an additional 'info' structure. + + * paramestim/stk_param_estim.m: Return an additional 'info' + structure, which currently contains the criterion that has been + used, the criterion value at the optimum, and the bounds. + +2014-07-02 Julien Bect + + stk_generate_samplepaths.m: Use model.response_name if available. + + * utils/stk_generate_samplepaths.m: Use model.response_name if + available. + +2014-07-01 Julien Bect + + stk_isdominated.m: New function, returns true for dominated rows. + + * arrays/generic/stk_isdominated.m: New function + * arrays/generic/private/stk_isdominated_mex.c: New MEX-function + * misc/include/pareto.h: Add new function is_dominated + * config/stk_config_makeinfo.m: Compile the new MEX-function + * admin/octave-pkg/Makefile: Compile the new MEX-function + * arrays/generic/private/stk_paretofind_mex.c: Modified + * arrays/generic/stk_paretofind.m: Modified + + stk_figure.m: Do not set the axis title. + + * misc/plot/stk_figure.m: Do not set the axis title. + + stk_plot2d.m: Create labels only if column names are available. + + * misc/plot/stk_plot2d.m: Create labels only if column names are + available. + * examples/01_kriging_basics/stk_example_kb03.m: Provide explicit + column names for the 2d array used in this script. + +2014-06-27 Julien Bect + + stk_cholcov.m: Prevent infinite while loops. + + * core/stk_cholcov.m: Prevent infinite while loops, that could + occur in the case of matrices that either contained nans or Infs, + or were really far from from positive definite. + +2014-06-25 Ashwin Ravisankar + + stk_param_estim.m: Add an optional 'criterion' argument. + + * paramestim/stk_param_estim.m: added new input argument + criterion that will make it possible, in the future, to select + which estimation criterion to use. + + stk_param_relik.m: Add a unit test to check the gradient. + + * paramestim/stk_param_relik.m: Add a unit test. + +2014-06-19 Ashwin Ravisankar + + stk_param_gls.m: A new function to compute the GLS estimator. + + * paramestim/stk_param_gls.m: new function + * paramestim/stk_param_init.m: modified + +2014-06-16 Julien Bect + + make_octave_package.m: Parse 'Description' field from README. + + * admin/make_octave_package.m: Modified to parse 'Description' + field directly from README (avoids text duplication). + * admin/octave-pkg/description.txt: Deleted. + +2014-06-15 Julien Bect + + stk_paretofind.m: New function to find non-dominated points. + + * arrays/generic/stk_paretofind.m: new function + * arrays/generic/private/stk_paretofind_mex.c: new mex-function + * misc/include/pareto.h: new C header + * config/stk_config_makeinfo.m: modified + * config/stk_config_path.m: modified + * admin/octave-pkg/Makefile: modified + +2014-06-14 Julien Bect + + README: Include a short description. + + * README: Include a short description (from description.txt) + * admin/octave-pkg/description.txt: Line-wrapping. + + stk_options_set.m: Add a reset feature. + + * misc/options/stk_options_set.m: Add a reset feature using a + special case when nargin == 1. + * misc/options/stk_options_get.m: Just fix spacing. + + stk_options_set.m: Prevent persistent from being cleared. + + * misc/options/stk_options_set.m: Add a call to mlock to prevent + the persistent variable from being cleared. + +2014-05-15 Julien Bect + + stk_model.m: Fix a fresh bug (my mistake). + + * core/stk_model.m: Restore proper default behaviour when + nargin == 0. + + Merge /etc into /admin + + * etc/CODING_GUIDELINES: moved from + * admin/CODING_GUIDELINES: moved to + * etc/RELEASE_CHECKLIST: moved from + * admin/RELEASE_CHECKLIST: moved to + modified + * etc/octave-pkg/INDEX: moved from + * admin/octave-pkg/INDEX: moved to + * etc/octave-pkg/Makefile: moved from + * admin/octave-pkg/Makefile: moved to + * etc/octave-pkg/PKG_DEL.m: moved from + * admin/octave-pkg/PKG_DEL.m: moved to + * etc/octave-pkg/pkg_install_stk_and_generate_doc.m: moved from + * admin/octave-pkg/pkg_install_stk_and_generate_doc.m: moved to + * etc/octave-pkg/post_install.m: moved from + * admin/octave-pkg/post_install.m: moved to + * admin/description.txt: moved from + * admin/octave-pkg/description.txt: moved to + * admin/make_octave_package.m: modified + * admin/make_release_targz.sh: modified + * admin/stk_make_htmldoc.m: modified + +2014-05-13 Julien Bect + + stk_model.m: Accept function handles for covariance_type. + + * core/stk_model.m: Accept function handles for covariance_type. + +2014-05-13 Emmanuel Vazquez + + Add a stk_length function + + * arrays/generic/stk_length.m: returns the length of an array + * arrays/@stk_dataframe/stk_length.m: idem + +2014-05-12 Julien Bect + + stk_generate_samplepaths.m: Deal with duplicates in xt. + + * utils/stk_generate_samplepaths.m: Deal with duplicates in xt. + +2014-05-08 Julien Bect + + Move stk_model to core. + + * core/stk_model.m: formerly known as utils/stk_model.m + * utils/stk_model.m: deleted + + Move utils/arrays one level up. + + * arrays: formerly known as utils/arrays + * utils/arrays: deleted + * config/stk_config_makeinfo.m: modified + * config/stk_config_path.m: modified + +2014-05-07 Julien Bect + + @stk_dataframe/subsasgn: Solve a problem with Octave 3.2.x + + * utils/arrays/@stk_dataframe/subsasgn.m: solve a problem with + Octave 3.2.x (0x0 stk_dataframe objects). + + Avoid changing the current dir to make a function available. + + * misc/test/stk_runtests.m: Avoid changing the current dir to make + stk_config_path available. Use addpath/rmpath instead. + +2014-05-06 Julien Bect + + stk_config_path: Fix a private folder problem in Octave 3.2.x + + * config/stk_config_path.m: Fix a private folder problem in Octave + 3.2.x (a new private folder has been recently created). + + Use horzcat instead of [,]. + + * lm/@stk_lm_affine/feval.m: modified + * lm/@stk_lm_cubic/feval.m: modified + * lm/@stk_lm_quadratic/feval.m: modified + + Change the way the MOLE is installed. + + * config/stk_config_mole.m: New function, that takes the place of + misc/mole/init.m and misc/mole/install_mole_function.m. + * misc/mole/init.m: removed + * misc/mole/install_mole_function.m: removed + * config/stk_config_addpath.m: Modified, to call stk_config_mole, + thus avoiding the use of "run" which seems to be causing problems + in Octave 3.2.x. + * etc/octave-pkg/post_install.m: idem + * stk_init.m: idem + +2014-04-15 Julien Bect + + Add an INDEX file to the Octave package. + + * etc/octave-pkg/INDEX: INDEX file for the Octave package + * etc/octave-pkg/pkg_install_stk_and_generate_doc.m: new script to + test quickly that the tarball can be installed and to inspect how + the corresponding Octave-forge documentation will look. + * admin/make_octave_package: copy INDEX to the package. + + Don't include stk_optim_hasfmincon in the Octave package. + + * admin/make_octave_package.m: modified + + Some functions are not part of the public API. + + * core/ortho_func.m: modified (doc) + * core/stk_cholcov.m: modified (doc) + * core/@stk_kreq_qr/get.m: modified (doc) + * core/@stk_kreq_qr/isequal.m: modified (doc) + * core/@stk_kreq_qr/linsolve.m: modified (doc) + * core/@stk_kreq_qr/stk_kreq_qr.m: modified (doc) + * core/@stk_kreq_qr/stk_set_righthandside.m: modified (doc) + * core/@stk_kreq_qr/stk_squared_seminorm.m: modified (doc) + * core/@stk_kreq_qr/stk_update.m: modified (doc) + * core/@stk_kreq_qr/subsref.m: modified (doc) + * misc/dist/stk_gpquadform.m: modified (doc) + +2014-04-14 Julien Bect + + stk_cholcov: new function, chol + regularization noise + + * core/stk_cholcov.m: New function. + * config/stk_config_setup.m: Change the name of a warning. + * paramestim/stk_param_init.m: Use stk_colcov instead of chol. + * core/@stk_kreq_qr/get.m: Use stk_colcov instead of chol. + * paramestim/stk_param_relik.m: Use stk_cholcov. + * examples/01_kriging_basics/stk_example_kb07.m: Increase + regularity for the forth subplot. Now we can, so why not? + * examples/01_kriging_basics/stk_example_kb08.m: Remove FIXME + comment. Change subplot titles. + * utils/stk_generate_samplepaths.m: Use stk_colcov instead of + chol. Remove FIXME comment. Remove observations points from the + result when generating conditional sample paths (bugfix). + +2014-04-13 Julien Bect + + Generation of conditioned sample paths made easy (ticket #3). + + * utils/stk_generate_samplepaths.m: Generate conditioned sample + paths if additional (xi, zi) arguments are provided. + * examples/01_kriging_basics/stk_example_kb08.m: New example. + +2014-04-12 Julien Bect + + Move stk_feval.m to utils/arrays/generic. + + * utils/stk_feval.m: moved (from) + * utils/arrays/generic/stk_feval.m: moved (to) + +2014-04-10 Julien Bect + + Fix a bug in stk_predict (). + + * core/stk_predict.m: Fix a bug + +2014-04-03 Julien Bect + + Simplify the code in stk_ortho_func (). + + * core/stk_ortho_func.m: Call feval (stk_lm_quadratic, x) instead + of duplicating the code. And add the cubic case. + + Add (multivariate) cubic linear models. + + * lm/@stk_lm_cubic: New class + * lm/@stk_lm_cubic/stk_lm_cubic.m: New function (constructor) + * lm/@stk_lm_cubic/feval.m: New function + +2014-03-31 Julien Bect + + Introduce a new (experimental) feature: linear models. + + * core/stk_ortho_func.m: Modified to handle model.order == nan. + * paramestim/stk_param_init.m: Modified to handle model.order == nan. + * config/stk_config_path.m: Add lm to the path. + * lm/@stk_lm_affine/stk_lm_affine.m: New function + * lm/@stk_lm_affine/feval.m: New function + * lm/@stk_lm_constant/stk_lm_constant.m: New function + * lm/@stk_lm_constant/feval.m: New function + * lm/@stk_lm_matrix/stk_lm_matrix.m: New function + * lm/@stk_lm_matrix/feval.m: New function + * lm/@stk_lm_null/stk_lm_null.m: New function + * lm/@stk_lm_null/feval.m: New function + * lm/@stk_lm_quadratic/stk_lm_quadratic.m: New function + * lm/@stk_lm_quadratic/feval.m: New function + * examples/03_miscellaneous/stk_example_misc03.m: New example script. + +2014-03-29 Julien Bect + + Do not add config to in the path. + + * config/stk_config_path.m: Remove config from the list of STK + subdirectories to be added to the path. + * stk_init.m: Remove config from the path at the end of + initialization. + * misc/test/stk_runtests.m: Do not assume that config is in the + path. + +2014-03-26 Julien Bect + + Rename stk_config_graphicstoolkit tp graphics_toolkit. + + * config/stk_config_graphicstoolkit.m: Renamed. + * misc/mole/graphics_toolkit/graphics_toolkit.m: Formerly known as + stk_config_graphicstoolkit. Modified to be a (partial) replacement + of the Octave function with the same name. + * misc/mole/init.m: Add graphics_toolkit to the path only when + needed, i.e., when using Matlab or an old version of Octave. + * examples/03_miscellaneous/stk_example_misc02.m: Modified. + + stk_param_relik: Adding a little bit of noise to help chol succeed. + + * paramestim/stk_param_relik.m: Add a little bit of noise to help + chol succeed, when the first factorization returned by chol is not + complete. Emit a warning when doing so. + * config/stk_config_setup.m: By default, hide the warning emitted + by stk_param_relik. + +2014-03-25 Julien Bect + + stk_config_addpath: Add MOLE subdirectories to the path. + + * config/stk_config_addpath.m: modified + + stk_version: Simpler is better. + + * config/stk_version.m: Moved... + * stk_version.m: ...here. STK's version number is now hard-coded + in this file, and read from README anymore. + * README: Refer to stk_version.m for the version number. + * config/stk_config_path.m: Add STK's root to the path unless STK + is used as an Octave package. + * etc/RELEASE_CHECKLIST: Related changes. + + stk_config_getroot: Simpler is better. + + * config/stk_config_getroot.m: Simplify the way we locate STK's + root. Use stk_param_relik instead of stk_test as a reference, as + stk_test will probably not be included in the Octave package. + * admin/make_octave_package.m: Modified. + + stk_make_htmldoc: Remove dependency on stk_config_getroot. + + * admin/stk_make_htmldoc.m: modified. + + stk_param_relik: Improved implementation, or so I hope. + + * paramestim/stk_param_relik.m: Several modifications, that seem + to reduce the number of warnings related to bad conditioning, and + also improve the performance for large n (about 1000, say). + + Fix minor problems in stk_config_rmpath and stk_config_path. + + * config/stk_config_path.m: modified + * config/stk_config_rmpath.m: modified + + Test examples using stk_runtests instead of stk_runexamples. + + * examples/01_kriging_basics/stk_example_kb01.m: add %!test + * examples/01_kriging_basics/stk_example_kb02.m: add %!test + * examples/01_kriging_basics/stk_example_kb03.m: add %!test + * examples/01_kriging_basics/stk_example_kb04.m: add %!test + * examples/01_kriging_basics/stk_example_kb05.m: add %!test + * examples/01_kriging_basics/stk_example_kb06.m: add %!test + * examples/01_kriging_basics/stk_example_kb07.m: add %!test + * examples/02_design_of_experiments/stk_example_doe01.m: add %!test + * examples/02_design_of_experiments/stk_example_doe02.m: add %!test + * examples/02_design_of_experiments/stk_example_doe03.m: add %!test + * examples/03_miscellaneous/stk_example_misc01.m: add %!test + * examples/03_miscellaneous/stk_example_misc02.m: add %!test + * misc/test/stk_runexamples.m: removed + * misc/test/stk_runscript.m: removed + +2014-03-23 Julien Bect + + Remove stk_init.m from the Octave package. + + * admin/make_octave_package.m: Create PKG_ADD.m (later renamed to + PKG_ADD) by renaming stk_init. Therefore, we don't need the + existing PKG_ADD.m anymore. + * stk_init.m: Set STK_OCTAVE_PACKAGE to false. + * etc/octave-pkg/PKG_ADD.m: Removed. + + Minor changes in stk_select_optimizer. + + * misc/optim/stk_select_optimizer.m: Minor changes. + +2014-03-21 Julien Bect + + stk_param_relik: Fix help text. + + * paramestim/stk_param_relik.m: Fix help text. + +2014-03-18 Julien Bect + + Restore the stk_ prefix for distrib_* functions. + + * misc/distrib/distrib_normal_cdf.m: renamed (from) + * misc/distrib/distrib_normal_ei.m: renamed (from) + * misc/distrib/distrib_normal_pdf.m: renamed (from) + * misc/distrib/distrib_student_cdf.m: renamed (from) + * misc/distrib/distrib_student_ei.m: renamed (from) + * misc/distrib/distrib_student_pdf.m: renamed (from) + * misc/distrib/stk_distrib_normal_cdf.m: rename (to) + * misc/distrib/stk_distrib_normal_ei.m: rename (to) + * misc/distrib/stk_distrib_normal_pdf.m: rename (to) + * misc/distrib/stk_distrib_student_cdf.m: rename (to) + * misc/distrib/stk_distrib_student_ei.m: rename (to) + * misc/distrib/stk_distrib_student_pdf.m: rename (to) + * examples/02_design_of_experiments/stk_example_doe03.m: modified + * misc/distrib/README: modified + +2014-03-17 Julien Bect + + Handle large values of nu better in stk_sf_matern. + + * misc/specfun/stk_sf_matern.m: Handle large values of nu better. + +2014-03-14 Julien Bect + + Handle Gaussian covariance functions in stk_param_init. + + * paramestim/stk_param_init.m: Handle Gaussian covariance functions. + * paramestim/stk_param_estim.m: Source formatting. + +2014-03-14 Julien Bect + + Handle special cases in stk_sf_matern. + + * misc/specfun/stk_sf_gausscorr.m: modified + * misc/specfun/stk_sf_matern.m: modified + * misc/specfun/stk_sf_matern32.m: modified + * misc/specfun/stk_sf_matern52.m: modified + +2014-02-26 Julien Bect + + Improve building and Octave packaging. + + * admin/make_octave_package.m: modified + * stk_build.m: renamed... + * config/stk_config_buildmex.m: ...to this; modified. + * config/stk_config_makeinfo.m: new function + * config/stk_config_rmpath.m: modified + * config/stk_config_testprivatemex.m: modified + * etc/octave-pkg/Makefile: new file + * etc/octave-pkg/PKG_ADD.m: modified + * etc/octave-pkg/PKG_DEL.m: modified + * etc/octave-pkg/pre_install.m: deleted + * etc/octave-pkg/post_install.m: new script + * stk_init.m: modified + + Reorganize the MOLE. + + * misc/mole/PKG_ADD.m: Renamed to init.m + * misc/mole/init.m: Renamed from PKG_ADD.m. Add variables + MOLE_DO_ADDPATH and MOLE_PRUNE_ADDPATH to control the behaviour of + the script. + * misc/mole/PKG_DEL.m: Remove (was not needed after all). + * etc/octave-pkg/pre_install.m: Call init.m (renamed from + PKG_ADD.m) with MOLE_DO_ADDPATH = false and MOLE_PRUNE_ADDPATH = + true. Remove call to PKG_DEL.m (was not needed, after all). + * misc/mole/README: Bring up to date with the new organization of + the MOLE. + * misc/mole/common/isoctave.m: Moved to ../isoctave. + * misc/mole/isoctave/isoctave.m: Moved from ../common. + * misc/mole/install_mole_function.m: Helper function for init.m. + * stk_init.m: Modified (call init.m instead of PKG_ADD.m). + +2014-02-25 Julien Bect + + Get rid of ismatlab (). Just use ~ isoctave () instead. + + * config/stk_config_setup.m: Replace ismatlab -> ~isoctave. + * misc/mole/common/ismatlab.m: Removed. + + Rename graphicstoolkit to stk_config_graphicstoolkit. + + * misc/mole/common/graphicstoolkit.m: removed + * config/stk_config_graphicstoolkit.m: new function (formerly + known as graphicstoolkit) + * examples/03_miscellaneous/stk_example_misc02.m: modified + + Rename commonsize () to stk_commonsize (). + + * misc/mole/common/commonsize.m: renamed to... + * utils/arrays/generic/stk_commonsize.m: ...this + * misc/distrib/distrib_normal_cdf.m: modified + * misc/distrib/distrib_normal_ei.m: modified + * misc/distrib/distrib_normal_pdf.m: modified + * misc/distrib/distrib_student_cdf.m: modified + * misc/distrib/distrib_student_ei.m: modified + * misc/distrib/distrib_student_pdf.m: modified + * misc/mole/README: modified + + doc: update some help texts (script names have changed) + + * paramestim/stk_param_estim.m: fix doc + * utils/stk_conditioning.m: fix doc + * utils/stk_generate_samplepaths.m: fix doc + +2014-02-24 Julien Bect + + Rewrite Octave packaging script in Octave (instead of Python). + + * admin/make_octave_package.m: Translation to the Octave langage + of make_octave_package.py . Version number now properly set in + DESCRIPTION based on the one returned by stk_version (). + * admin/make_octave_package.py: deleted + + Try to solve the problem with MEX-files in private directories. + + * stk_init.m: Build the MEX-files *before* adding STK's + subdirectories to the path. Finger crossed. + * stk_build.m: Don't test if MEX-files located in private + directories are found (not at this point). + * config/stk_config_testprivatemex.m: New function to test if + MEX-files located in private directories are found. + + Add load/unload scripts for the MOLE. + + * misc/mole/PKG_ADD.m: New initialization script, that adds + selected subdirectories of the MOLE to the path. + * misc/mole/PKG_DEL.m: Remove MOLE subdirectories from the path. + * config/stk_config_path.m: Remove the part that is now handled by + the new script (misc/mole/PKG_ADD.m). + * etc/octave-pkg/pre_install.m: Run misc/mole/PKG_ADD.m first and + PKG_DEL.m at the end (otherwise the load path would contain + deleted temp directories after the installation). + * stk_init.m: Run misc/mole/PKG_ADD.m first. + +2014-02-22 Julien Bect + + Rewrite stk_config_rmpath without a call to stk_config_path. + + * config/stk_config_rmpath.m: Rewrite without a call to + stk_config_path, in prevision of forthcoming changes. + + Rewrite stk_config_addpath in a cleaner way. + + * config/stk_config_addpath.m: Rewrite the function in a cleaner + way, without the useless output argument. + * config/stk_config_getroot.m: Add an additional output argument, + to indicate if STK is present in the path. + +2014-02-18 Julien Bect + + stk_param_getdefaultbounds.m: Handle Gaussian covariance functions. + + * paramestim/stk_param_getdefaultbounds.m: Handle the case of + Gaussian isotropic and anisotropic covariance functions. + +2014-02-17 Julien Bect + + Improve stk_config_getroot. + + * config/stk_config_getroot.m: Make it work even if STK has not + been added to the search path. + +2014-02-16 Julien Bect + + stk_sampling_maximinlhs.m: minor change + + * stk_sampling_maximinlhs.m (lhsdesign_): No need to check if x is + empty since we start the loop at j == 2, now. + +2014-02-12 Julien Bect + + stk_sampling_maximinlhs.m: Do not compute the criterion if niter == 1. + + * stk_sampling_maximinlhs.m: modified + + @stk_kreq_qr: heuristic improvement of numerical conditioning. + + * core/@stk_kreq_qr/private: new folder + * core/@stk_kreq_qr/private/compute_P_scaling.m: new function + * core/@stk_kreq_qr/stk_update.m: modified + * core/@stk_kreq_qr/stk_kreq_qr.m: modified + * core/@stk_kreq_qr/stk_set_righthandside.m: modified + +2014-02-05 Julien Bect + + stk_testfun_braninhoo.m: Fix domain bound in the documentation. + + * examples/test_functions/stk_testfun_braninhoo.m: Fix domain + bound in the documentation. + +2014-01-17 Julien Bect + + Fix a bug in stk_param_init. + + * paramestim/stk_param_init.m: modified + +2014-01-16 Julien Bect + + Add size checks to several functions. + + * core/stk_predict.m: modified + * paramestim/stk_param_init.m: modified + * paramestim/stk_param_estim.m: modified + +2014-01-15 Julien Bect + + Warn Octave users about the problem with MEX-files in privates folders. + + * stk_build.m: modified + +2014-01-10 Julien Bect + + First draft for the automatic generation of an Octave package. + + * admin/make_octave_package.py: new script + * etc/octave-pkg: new folder + * etc/octave-pkg/pre_install.m: new function + * etc/octave-pkg/PKG_DEL.m: new function + * etc/octave-pkg/PKG_ADD.m: new function + + Create a misc folder for optimization related functions. + + * misc/optim: new folder + * config/stk_select_optimizer.m: moved to misc/optim + * config/stk_config_addpath.m: modified + + Rename stk_configure -> stk_config_setup + + * misc/stk_configure.m: renamed + * misc/stk_config_setup.m: formerly known as stk_configure.m + + Move 'config' up one level and rewrite part of the configuration system. + + * config: formerly known as misc/config + * config/stk_configure.m: new function + * config/stk_config_addpath.m: replacement for stk_set_root.m + * config/stk_config_getroot.m: replacement for stk_get_root.m + * config/stk_config_path.m: replacement for stk_path.m + * config/stk_config_rmpath.m: new function + * misc/config: moved to config + * misc/config/stk_set_root.m: moved/renamed/modified + * misc/config/stk_get_root.m: moved/renamed/modified + * misc/config/stk_path.m: moved/renamed/modified + * misc/config/stk_configure_octave.m: moved/modified + * misc/config/stk_version.m: moved/modified + * misc/config/stk_configure_matlab.m: removed/merged in stk_configure + * misc/config/stk_configure_octave.m: removed/merged in stk_configure + * misc/config/stk_select_optimizer.m: moved + * stk_init.m: modified + * stk_build.m: modified + * misc/test/stk_runexamples.m: modified + * misc/test/stk_runtests.m: modified + * misc/mole/matlab/page_screen_output.m: new function + * admin/stk_make_htmldoc.m: modified + + Rename stk_compile_all -> stk_build. + + * config/stk_compile_all.m: moved/renamed + * stk_build: formerly known as stk_compile_all.m + + Rename stk_is_fmincon_available -> stk_optim_hasfmincon. + + * misc/config/stk_is_fmincon_available.m: moved/renamed + * misc/optim/stk_optim_hasfmincon.m: formerly known as stk_is_fmincon_available.m + + Rename stk_is_pct_installed -> stk_parallel_haspct. + + * misc/config/stk_is_pct_installed.m: moved/renamed + * misc/parallel/stk_parallel_haspct.m: formerly known as stk_is_pct_installed.m + + Remove obsolete function stk_is_octave_in_use. + + * misc/config/stk_is_octave_in_use.m: deleted + +2014-01-01 Julien Bect + + stk_init: move some Matlab-specific configuration to a dedicated function. + + * misc/config/stk_octave_config.m: renamed to stk_configure_octave + * misc/config/stk_configure_octave.m: formerly known as stk_octave_config + * misc/config/stk_configure_matlab.m: new function + * stk_init.m: modified + +2013-12-19 Julien Bect + + Minimalist support for linear indexing on dataframes. + + * utils/arrays/@stk_dataframe/subsref.m: modified + * utils/arrays/@stk_dataframe/subsasgn.m: modified + * examples/02_design_of_experiments/stk_example_doe03.m: modified + + Overload reshape for stk_dataframe objects. + + * utils/arrays/@stk_dataframe/reshape.m: new function + + Set row names on the output of stk_generate_samplepaths. + + * utils/stk_generate_samplepaths.m: modified + +2013-12-06 Julien Bect + + Thicker lines in examples kb01 and kb02. + + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + + Improve the robustness of @stk_dataframe/set.m. + + * utils/arrays/@stk_dataframe/subsasgn.m: modified + * utils/arrays/@stk_dataframe/set.m: modified + + Change the behaviour of dataframes without row or column names. + + * misc/config/stk_compile_all.m: modified + * utils/arrays/@stk_dataframe/private/make_numeric_rownames.c: removed + * utils/arrays/@stk_dataframe/subsasgn.m: modified + * utils/arrays/@stk_dataframe/subsref.m: modified + * utils/arrays/generic/stk_sprintf_data.m: modified + +2013-12-05 Julien Bect + + Make stk_dataframe row manipulations faster. + + * utils/arrays/@stk_dataframe/private/make_numeric_rownames.c: new + * utils/arrays/@stk_dataframe/subsref.m: modified + * utils/arrays/@stk_dataframe/subsasgn.m: modified + * misc/config/stk_compile_all.m: modified + * misc/include/stk_mex.h: modified + + Handle infinities in stk_sprintf_colvect_* functions. + + * misc/text/stk_sprintf_colvect_fixedpoint.m: modified + * misc/text/stk_sprintf_colvect_scientific.m: modified + + Add an optional max_width argument to @stk_dataframe/disp. + + * utils/arrays/@stk_dataframe/disp.m: modified + +2013-12-03 Julien Bect + + Fix @stk_kreq_qr/stk_update. Add tests. + + * core/@stk_kreq_qr/stk_kreq_qr.m: modified + * core/@stk_kreq_qr/stk_update.m: modified + * misc/test/stk_isequal_tolabs.m: modified + +2013-12-02 Julien Bect + + Remove residual occurences of stk_kriging_equations. + + * core/@stk_kreq_qr/stk_update.m: modified + * misc/benchmarks/stk_benchmark_logdet.m: modified + + Advertise the mailing-list and the ticket manager on Sourceforge. + + * stk_init.m: modified + * README: modified + +2013-12-01 Julien Bect + + Reorganize the MOLE. Add linsolve only if necessary. + + * misc/mole/octave: removed + * misc/mole/octave/linsolve.m: moved to misc/mole/linsolve + * misc/mole/linsolve: new folder + * misc/mole/linsolve/linsvoled.m: moved from misc/mole/octave + * misc/config/stk_path.m: modified + * misc/config/stk_set_root.m: modified + + Overload isequal for Octave 3.2.4 support. + + * utils/arrays/@stk_dataframe/isequal.m: new function + * core/@stk_kreq_qr/isequal.m: new function + * etc/CODING_GUIDELINES: modified + +2013-11-30 Julien Bect + + Fix a bug in stk_octave_config. + + * misc/config/stk_octave_config.m: modified + + Reorganize the MOLE for the sake of flexibility. + + * misc/mole/corr: new folder + * misc/mole/corr/corr.m: moved from misc/mole/matlab/stats + * misc/mole/quantile: new folder + * misc/mole/quantile/quantile.m: moved from misc/mole/matlab/stat + * misc/mole/matlab/stats: removed + * misc/mole/matlab/stats/quantile.m: moved to misc/mole/quantile + * misc/mole/matlab/stats/corr.m: moved to misc/mole/corr + * misc/config/stk_path.m: modified + +2013-11-29 Julien Bect + + Add a new function to the MOLE: corr. + + * misc/mole/matlab/stats/corr.m: new function + + Move octave_quantile to the MOLE. + + * misc/stats: removed + * misc/stats/octave_quantile.m: removed + * misc/mole/matlab/stats: new directory + * misc/mole/matlab/stats/quantile.m: formerly known as + misc/stats/octave_quantile + * utils/arrays/@stk_dataframe/quantile.m: modified + * misc/config/stk_path.m: modified + + Make stk_runexamples fail if at least one example failed. + + * trunk/misc/test/stk_runexamples.m: modified + +2013-11-28 Julien Bect + + Add a new MOLE function: graphicstoolkit. + + * misc/mole/matlab/graphics_toolkit.m: removed + * misc/mole/common/graphicstoolkit.m: new function + * examples/03_miscellaneous/stk_example_misc02: modified + +2013-11-25 Julien Bect + + Use a more conservative form of subplot (without options). + + * misc/plot/stk_subplot.m: modified + + Fix a bug in stk_path. + + * misc/config/stk_path.m: modified + +2013-11-24 Julien Bect + + Fix a typo (missing parenthesis) in stk_rescale. + + * utils/arrays/generic/stk_rescale.m: modified + + Fix a copy-paste typo in stk_path. + + * misc/config/stk_path.m: modified + + Increase test tolerance. + + * misc/distrib/distrib_student_cdf.m: modified + + Provide a replacement for graphics_toolkit in Matlab. + + * misc/mole/matlab/graphics_toolkit.m: modified + + Remove the legend in example 'misc02' if using gnuplot. + + * examples/03_miscellaneous/stk_example_misc02.m: modified + + Choose a slightly less singular example for 'doe03'. + + * examples/02_design_of_experiments/stk_example_doe03.m: modified + + Fix stk_select_optimizer: sqp is in Octave core. + + * misc/config/stk_select_optimizer.m: modified + + Add documentation for stk_select_optimizer. + + * misc/config/stk_select_optimizer.m: modified + +2013-11-22 Julien Bect + + Add a new example. + + * examples/01_kriging_basics/stk_example_kb07.m: new script + +2013-11-19 Julien Bect + + Change plot options in example 'doe01'. + + * examples/02_design_of_experiments/stk_example_doe01.m: modified + + Add a smoke test of all examples. + + * misc/test/stk_runexamples.m: modified + +2013-11-18 Julien Bect + + Remove TRUE_NOISE_STD in example 'kb03'. + + * examples/01_kriging_basics/stk_example_kb03.m: modified + + Use the variance returned by stk_param_init for noiseless data. + + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb03.m: modified + +2013-11-15 Julien Bect + + Remove stk_plot1dsim. + + * misc/plot/stk_plot1dsim.m: removed + * misc/plot/stk_plot1d.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + +2013-11-14 Julien Bect + + Rewrite one-line descriptions of all examples. + + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb03.m: modified + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + * examples/01_kriging_basics/stk_example_kb06.m: modified + * examples/02_design_of_experiments/stk_example_doe01.m: modified + * examples/02_design_of_experiments/stk_example_doe02.m: modified + * examples/02_design_of_experiments/stk_example_doe03.m: modified + * examples/03_miscellaneous/stk_example_misc01.m: modified + * examples/03_miscellaneous/stk_example_misc02.m: modified + + Rewrite the description of example 'kb02'. + + * examples/01_kriging_basics/stk_example_kb02.m: modified + +2013-11-12 Julien Bect + + Rewrite the description of example 'misc02'. + + * examples/03_miscellaneous/stk_example_misc02.m: modified + +2013-11-11 Julien Bect + + New functions: stk_axes, stk_subplot, stk_title. + + * misc/plot/stk_subplot.m: new function + * misc/plot/stk_axes.m: new function + * misc/plot/stk_title.m: new function + * misc/options/stk_options_set.m: modified + * misc/plot/stk_figure.m: modified + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb03.m: modified + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + * examples/01_kriging_basics/stk_example_kb06.m: modified + * examples/02_design_of_experiments/stk_example_doe01.m: modified + * examples/02_design_of_experiments/stk_example_doe02.m: modified + * examples/02_design_of_experiments/stk_example_doe03.m: modified + * examples/03_miscellaneous/stk_example_misc01.m: modified + * examples/03_miscellaneous/stk_example_misc02.m: modified + +2013-11-10 Julien Bect + + Change plot labels in several examples. + + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + + New functions to create labels with options. + + * misc/plot/stk_xlabel.m: new function + * misc/plot/stk_ylabel.m: new function + * misc/plot/stk_labels.m: new function + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + * examples/02_design_of_experiments/stk_example_doe03.m: modified + * examples/03_miscellaneous/stk_example_misc01.m: modified + * examples/03_miscellaneous/stk_example_misc02.m: modified + * misc/benchmarks/stk_benchmark_cov2.m: modified + * misc/plot/stk_figure.m: modified + * misc/plot/stk_plot2d.m: modified + * misc/options/stk_options_set.m: modified + * utils/arrays/@stk_dataframe/plot.m: modified + +2013-11-07 Julien Bect + + New function to create figures for the examples. + + * misc/plot/stk_figure.m: new function + * misc/options/stk_options_set.m: modified + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb03.m: modified + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + * examples/01_kriging_basics/stk_example_kb06.m: modified + * examples/02_design_of_experiments/stk_example_doe01.m: modified + * examples/02_design_of_experiments/stk_example_doe02.m: modified + * examples/02_design_of_experiments/stk_example_doe03.m: modified + * examples/03_miscellaneous/stk_example_misc02.m: modified + * examples/03_miscellaneous/stk_example_misc01.m: modified + * misc/benchmarks/stk_benchmark_cov2.m: modified + + Plot directly on the current axes. + + * misc/plot/stk_plot1d.m: modified + * misc/plot/stk_plot1dsim.m: modified + + Minor changes in stk_plot1dsim. + + * misc/plot/stk_plot1dsim.m: modified + + Add figures in example kb05. + + * examples/01_kriging_basics/stk_example_kb05.m: modified + +2013-11-02 Julien Bect + + Remove example misc01, rename misc02 and misc03. + + * stk_example_misc01.m: deleted + * stk_example_misc02.m: renamed to misc01 + * stk_example_misc03.m: renamed to misc02 + + Add a new example. + + * examples/01_kriging_basics/stk_example_kb06.m: new script + + Raise current axis to the top layer in stk_plot_shadedci. + + * misc/plot/stk_plot_shadedci.m: modified + + Add the Gaussian correlation to example 'misc02'. + + * examples/03_miscellaneous/stk_example_misc02.m: modified + +2013-11-01 Julien Bect + + Add Gaussian isotropic and anisotropic covariance functions. + + * covfcs/stk_gausscov_iso.m: new function + * covfcs/stk_gausscov_aniso.m: new function + * utils/stk_model.m: modified + + Add the Gaussian correlation function. + + * misc/specfun/stk_sf_gausscorr.m: new function + + Improve the precision of stk_sf_matern around 0 for high nu. + + * misc/specfun/stk_sf_matern.m: modified + +2013-10-29 Julien Bect + + Remove obsolete references to example01.m + + * core/stk_predict.m: modified + * misc/plot/stk_plot1d.m: modified + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/03_miscellaneous/stk_example_misc01.m: modified + +2013-10-28 Julien Bect + + Rewrite the description of examples 'doe02' and 'doe03'. + + * examples/02_design_of_experiments/stk_example_doe02.m: modified + * examples/02_design_of_experiments/stk_example_doe03.m: modified + +2013-10-26 Julien Bect + + Rewrite example 'doe01'. + + * examples/02_design_of_experiments/stk_example_doe01.m: modified + + Add an optional 'box' argument to stk_sampling_halton_rr2. + + * sampling/stk_sampling_halton_rr2.m: modified + + Rewrite the description of examples 'kb04' and 'kb05'. + + * examples/01_kriging_basics/stk_example_kb04.m: modified + * examples/01_kriging_basics/stk_example_kb05.m: modified + +2013-10-23 Julien Bect + + Rewrite the description of example 'kb03'. + + * examples/01_kriging_basics/stk_example_kb03.m: modified + +2013-10-20 Julien Bect + + Fix a bug in stk_predict and add a test. + + * core/stk_predict.m: modified + +2013-10-16 Julien Bect + + Rewrite the description of example 'kb02'. + + * examples/01_kriging_basics/stk_example_kb02.m: modified + +2013-10-15 Julien Bect + + Rewrite the description of example 'kb01'. + + * examples/01_kriging_basics/stk_example_kb01.m: modified + + Insert an empty line before the example header. + + * misc/text/stk_disp_examplewelcome.m: modified + +2013-10-13 Julien Bect + + New example script: 1D Bayesian optimization. + + * examples/02_design_of_experiments/stk_example_doe03.m: new + script + + Display help text when running an example script. + + * misc/text/stk_disp_examplewelcome.m: modified + + Restore output verbosity at the end of example scripts. + + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + + Use input row names for the output of stk_feval. + + * utils/stk_feval.m: modified + + Fix a bug in @stk_dataframe/subsref. + + * utils/arrays/@stk_dataframe/subsref.m: modified + +2013-10-12 Julien Bect + + Fix a bug in stk_dataframe.m and add a copy constructor. + + * utils/arrays/@stk_dataframe/stk_dataframe.m: modified + + Provide Gaussian and Student EI functions. + + * misc/distrib/distrib_student_ei.m: new function + * misc/distrib/distrib_normal_ei.m: new function + +2013-10-10 Julien Bect + + distrib_normal_*: return nan for negative standard deviations. + + * misc/distrib/distrib_normal_pdf.m: modified + * misc/distrib/distrib_normal_cdf.m: modified + +2013-10-09 Julien Bect + + Provide a first set of pdf/cdf replacement functions. + + * misc/distrib: new folder + * misc/distrib/README: new text file + * misc/distrib/distrib_student_pdf.m: new function + * misc/distrib/distrib_normal_pdf.m: new function + * misc/distrib/distrib_student_cdf.m: new function + * misc/distrib/distrib_normal_cdf.m: new function + * misc/config/stk_path.m: modified + +2013-10-07 Julien Bect + + Make commonsize work directly on cell arrays when nargin == 1. + + * misc/mole/common/commonsize.m: modified + +2013-09-27 Julien Bect + + Make Matlab/Octave compatibility easier to achieve. + + * misc/mole: new folder + * misc/mole/README: new text file + * misc/mole/common: new folder + * misc/mole/common/commonsize.m: new function + * misc/mole/common/ismatlab.m: new function + * misc/mole/common/isoctave.m: new function + * misc/mole/matlab: new folder + * misc/mole/matlab/file_in_path.m: moved form misc/matlab + * misc/mole/matlab/file_in_loadpath.m: moved form misc/matlab + * misc/mole/matlab/stdout.m: moved form misc/matlab + * misc/mole/matlab/index.m: moved form misc/matlab + * misc/mole/matlab/fflush.m: moved form misc/matlab + * misc/matlab: deleted + * misc/mole/octave: new folder + * misc/mole/octave/linsolve.m: new function + * stk_init.m: modified + * admin/stk_make_htmldoc.m: modified + * core/@stk_kreq_qr/linsolve.m: modified + * misc/test/stk_test.m: modified + * misc/test/stk_runscript.m: modified + * misc/config/stk_select_optimizer.m: modified + * misc/config/stk_path.m: modified + * misc/config/stk_octave_config.m: modified + * misc/config/stk_is_octave_in_use.m: modified + +2013-09-19 Julien Bect + + Fix a bug in stk_predict. + + * core/stk_predict.m: modified + +2013-09-18 Julien Bect + + Fix a bug in stk_sampling_olhs. + + * sampling/stk_sampling_olhs.m: modified + + Add new criterions for the design of computer experiments. + + * misc/design: new folder + * misc/design/stk_phipcrit.m: new function + * misc/design/stk_maxabscorr.m: new function + * misc/config/stk_path.m: modified + +2013-09-13 Julien Bect + + New approach for the encapsulation of QR-based kriging computations. + + * core/@stk_kriging_equation: removed + * core/@stk_kreq_qr: new class + * core/stk_predict.m: modified + +2013-09-13 Emmanuel Vazquez + + Switch to verbose display mode for examples kb01 and kb02. + + * examples/01_kriging_basics/stk_example_kb01.m: modified + * examples/01_kriging_basics/stk_example_kb02.m: modified + +2013-09-12 Julien Bect + + Control the verbosity of display for dataframe objects. + + * misc/options/stk_options_set.m: modified + * utils/arrays/@stk_factorialdesign/disp.m: modified + * utils/arrays/@stk_dataframe/disp.m: modified + * utils/arrays/@stk_dataframe/display.m: modified + * stk_init.m: modified + + Display row and column names between simple quotes. + + * utils/arrays/@stk_dataframe/stk_sprintf_colnames.m: modified + * utils/arrays/@stk_dataframe/stk_sprintf_rownames.m: modified + + stk_param_estim.m: Fix a stupid bug. + + * paramestim/stk_param_estim.m: modified + + Reorganize folders. + + * utils/arrays: new folder + * utils/arrays/generic: new folder + * utils/@stk_dataframe: moved to utils/arrays + * utils/@stk_factorialdesign: moved to utils/arrays + * utils/@struct: moved to utils/arrays + * misc/text/stk_sprintf_data.m: moved to utils/arrays/generic + * misc/text/stk_sprintf_rownames.m: moved to utils/arrays/generic + * misc/text/stk_sprintf_info.m: moved to utils/arrays/generic + * misc/text/stk_sprintf_sizetype.m: moved to utils/arrays/generic + * misc/text/stk_sprintf_colnames.m: moved to utils/arrays/generic + * utils/stk_rescale.m: moved to utils/arrays/generic + * utils/stk_normalize.m: moved to utils/arrays/generic + * misc/config/stk_path.m: modified + * misc/config/stk_compile_all.m: modified + + Fill .info field after the construction of a dataframe. + + * core/stk_predict.m: modified + * core/@stk_kriging_equation/stk_predict.m: modified + * utils/stk_feval.m: modified + * sampling/stk_sampling_olhs.m: modified + * sampling/stk_sampling_randunif.m: modified + * sampling/stk_sampling_maximinlhs.m: modified + * sampling/stk_sampling_halton_rr2.m: modified + * sampling/stk_sampling_randomlhs.m: modified + +2013-09-11 Julien Bect + + @stk_dataframe, @stk_factorialdesign: Improve display. + + * utils/@stk_dataframe/stk_sprintf_info.m: new function + * utils/@stk_dataframe/stk_sprintf_data.m: new function + * utils/@stk_dataframe/disp.m: modified + * utils/@stk_dataframe/stk_sprintf_colnames.m: new function + * utils/@stk_dataframe/stk_dataframe.m: modified + * utils/@stk_dataframe/stk_sprintf_rownames.m: new function + * utils/@stk_dataframe/stk_sprintf_sizetype.m: new function + * utils/@stk_factorialdesign/disp.m: new function + * utils/@stk_factorialdesign/stk_factorialdesign.m: modified + * utils/@stk_factorialdesign/stk_sprintf_levels.m: new function + * sampling/stk_sampling_regulargrid.m: modified + * misc/text/stk_sprintf_sizetype.m: new function + * misc/text/stk_sprintf_rownames.m: new function + * misc/text/stk_sprintf_info.m: new function + * misc/text/stk_sprintf_colnames.m: new function + * misc/text/stk_sprintf_data.m: new function + + Allow string arguments in stk_isequal_tolabs and stk_isequal_tolrel. + + * misc/test/stk_isequal_tolrel.m: modified + * misc/test/stk_isequal_tolabs.m: modified + +2013-09-11 Emmanuel Vazquez + + @stk_dataframe: Increase display verbosity. + + * utils/@stk_dataframe/display.m: modified + * utils/@stk_dataframe/disp.m: modified + + @stk_dataframe: Make 'data' available through get/set and dot-indexation. + + * utils/@stk_dataframe/private/get_column_number.c: modified + + stk_disp_examplewelcome.m: Define a default welcome message. + + * misc/text/stk_disp_examplewelcome.m: modified + +2013-09-10 Julien Bect + + Use strtrim instead of deblank + fliplr. + + * misc/config/stk_version.m: modified (bugfix) + * admin/m2html/m2html.m: modified + * admin/m2html/private/mfileparse.m: modified + + Do not display Octave-style unit tests in the HTML documentation. + + * admin/m2html/m2html.m: modified + + Clarify author & copyright information in README. + + * README: modified + +2013-09-08 Julien Bect + + Fix a bug with y-labels (empty legend) in @stk_dataframe/plot. + + * utils/@stk_dataframe/plot.m: modified + + Preserve row names when removing rows from a dataframe. + + * utils/@stk_dataframe/subsref.m: modified + * utils/@stk_dataframe/subsasgn.m: modified + +2013-09-07 Julien Bect + + Rename internal field 'vnames' to 'colnames' in @stk_dataframe. + + * utils/@stk_dataframe/subsasgn.m: modified + * utils/@stk_dataframe/stk_dataframe.m: modified + * utils/@stk_dataframe/get.m: modified + * utils/@stk_dataframe/set.m: modified + * utils/@stk_dataframe/disp.m: modified + * utils/@stk_dataframe/bsxfun.m: modified + * utils/@stk_dataframe/fieldnames.m: modified + + Return an stk_dataframe when using ()-indexing on an stk_dataframe. + + * utils/@stk_dataframe/subsref.m: modified + * utils/stk_feval.m: modified + * utils/@stk_dataframe/subsasgn.m: modified (nothing serious) + * utils/@stk_dataframe/end.m: modified (tests) + * sampling/stk_sampling_vdc_rr2.m: modified (tests) + * sampling/stk_sampling_halton_rr2.m: modified (tests) + +2013-09-05 Julien Bect + + Plot dataframes with two columns or more. + + * utils/@stk_dataframe/plot.m: modified + +2013-09-04 Julien Bect + + Make @stk_dataframe behave more like matrices wrt row/column deletion. + + * utils/@stk_dataframe/subsasgn.m: modified + + Make line lengths equal in README. + + * README: modified + +2013-09-01 Julien Bect + + Improve Octave 3.2.x compatibility. + + * utils/@stk_dataframe/max.m: modified + * utils/@stk_dataframe/apply.m: modified + * utils/@stk_dataframe/display.m: modified + * utils/@stk_dataframe/xor.m: modified + * utils/@stk_dataframe/disp.m: modified + * utils/@stk_dataframe/stk_normalize.m: modified + * utils/@stk_dataframe/min.m: modified + * utils/@stk_factorialdesign/stk_factorialdesign.m: modified + * utils/@stk_factorialdesign/stk_rescale.m: modified + * utils/@stk_factorialdesign/stk_normalize.m: modified + * misc/config/stk_octave_config.m: modified + * misc/stats/octave_quantile.m: modified + * misc/test/stk_isequal_tolabs.m: modified + * misc/test/stk_test_dfbinaryop.m: modified + + Provide a quantile function since Matlab (base) does not have it. + + * misc/stats/octave_quantile.m: new function + * utils/@stk_dataframe/quantile.m: modified + * misc/config/stk_path.m: modified + +2013-08-31 Julien Bect + + Add return code to several C functions. + + * sampling/stk_sampling_vdc_rr2.c: modified + + Remove unused variables in several C functions. + + * misc/dist/private/stk_dist_pairwise.c: modified + * misc/dist/private/stk_gpquadform_pairwise.c: modified + * utils/@stk_dataframe/private/get_column_number.c: modified + + Fix a problem with bsxfun/realpow in Matlab R2007a. + + * utils/@stk_dataframe/bsxfun.m: modified + +2013-08-30 Julien Bect + + Fix several issues in stk_compile_all. + + * misc/config/stk_compile_all.m: modified + + Fix stk_octave_config to make it work in Octave 3.4.3. + + * misc/config/stk_octave_config.m: modified + + Rename stk_remlqrg to stk_param_relik. + + * paramestim/stk_param_relik.m: formerly known as stk_remlgrg.m + * paramestim/stk_remlqrg.m: removed + * paramestim/stk_param_init.m: modified + * paramestim/stk_param_estim.m: modified + + Add new function that returns STK's version number. + + * misc/config/stk_version.m: new function. + +2013-08-29 Julien Bect + + Use new covariance type 'stk_discretecov' instead of Kx_cache/Px_cache. + + * covfcs/stk_discretecov.m: new function. + * core/@stk_kriging_equation/stk_predict.m: modified. + * core/stk_ortho_func.m: modified. + * core/stk_make_matcov.m: modified. + * core/stk_predict.m: modified. + * utils/stk_model.m: modified. + + Rewrite stk_noisecov for clarity. + + * covfcs/stk_noisecov.m: modified. + +2013-08-28 Julien Bect + + Disable a warning in stk_predict. + + * stk_init.m: modified. + + Add checklist for creating releases. + + * etc/RELEASE_CHECKLIST: new text file. + + Add file AUTHORS (list of all contributors). + + * AUTHORS: new text file. + + Add admin script to find non-standard characters. + + * admin/findNonStandardCharacters: new bash script. + + Fix end of lines (use LF). + + * admin/fixEOL: new bash script to fix end of lines. + * sampling/stk_sampling_vdc_rr2.c: fix EOL. + * misc/dist/stk_filldist_exact.m: fix EOL. + * misc/config/stk_octave_config.m: fix EOL. + * misc/test/stk_runscript.m: fix EOL. + +2013-08-27 Julien Bect + + Fix a test. + + * core/stk_predict.m: fix a test. + +2013-08-22 Julien Bect + + Provide facilities for computing logdets. + + * core/@stk_kriging_equation/get.m: new function. + * core/@stk_kriging_equation/set.m: new function. + * misc/benchmarks/stk_benchmark_logdet.m: new script + + Prepare for future work on updating kreq objects. + + * core/@stk_kriging_equation/stk_update.m: new function + + Implement a greedy evaluation model in @stk_kriging_equation. + + * core/@stk_kriging_equation/stk_kriging_equation.m: modified. + * core/@stk_kriging_equation/private/do_compute.m: new function. + * core/@stk_kriging_equation/stk_squared_seminorm.m: new function. + * core/@stk_kriging_equation/stk_predict.m: modified. + * core/@stk_kriging_equation/get.m: new function. + * core/@stk_kriging_equation/set.m: new function. + * core/@stk_kriging_equation/linsolve.m: modified. + * core/stk_predict.m: modified + +2013-08-21 Julien Bect + + Fix horzcat/vertcat in the stk_dataframe class (Octave only). + + * utils/@stk_dataframe/vertcat.m: modified. + * utils/@stk_dataframe/horzcat.m: modified. + + Rewrite get/set in the stk_dataframe class. + + * utils/@stk_dataframe/private/get_column_number.c: new MEX-file. + * utils/@stk_dataframe/private/get_column_number.m: its brother. + * utils/@stk_dataframe/get.m: new M-file. + * utils/@stk_dataframe/set.m: its sister. + * misc/config/stk_compile_all.m: modified. + * utils/@stk_dataframe/src/get_column_number.h: removed + * utils/@stk_dataframe/src/set.c: removed + * utils/@stk_dataframe/src/get.c: removed + * etc/CODING_GUIDELINES: Explain the rationale for this change. + + Fix a bug in sampling/stk_sampling_halton_rr2.m (Octave only). + + * sampling/stk_sampling_halton_rr2.m: modified. + + Get rid of a nested function in stk_compile_all.m. + + * misc/config/stk_compile_all.m: remove nested function. + * etc/CODING_GUIDELINES: Explain the rationale for this change. + + Fix a bug in get_column_number.h. + + * utils/@stk_dataframe/src/get_column_number.h: modified. + + Get rid of stk_narginchk. + + * misc/error/stk_narginchk.m: Removed. + Update argument checking in all STK functions accordingly. + * etc/CODING_GUIDELINES: Explain the rationale for this change. + + Fix a bug in @stk_kriging_equation/stk_predict.m (nargin values). + + * core/@stk_kriging_equation/stk_predict.m: modified. + +2013-07-22 Julien Bect + + Add functions to generate RR2-scrambled van der Corput and Halton + sequences. Joint work with Alexandra Krauth and Elham Rahali. + + * sampling/stk_sampling_vdc_rr2.c: New MEX-file. + * sampling/stk_sampling_vdc_rr2.m: MEX-file doc + tests. + * sampling/stk_sampling_halton_rr2.m: New function. + * misc/include/primes.h: New header. + * misc/include/stk_mex.h: Modified. + * misc/config/stk_compile_all.m: Modified. + + Fix a test. + + * core/stk_predict.m: Modified. + + Fix bugs in approximate comparison functions. + + * misc/test/stk_isequal_tolabs.m: Modified. + * misc/test/stk_isequal_tolrel.m: Modified. + +2013-07-18 Julien Bect + + Fix a minor bug in @stk_dataframe.horzcat. + + * utils/@stk_dataframe/horzcat.m: Modified. + + Benchmarks for parallelization. + + * misc/benchmarks: New folder. + * misc/benchmarks/stk_benchmark_cov2.m: New script. + * misc/benchmarks/stk_benchmark_cov1.m: New script. + + Rewrite parallelization of covariance evaluation. + + * core/private: Removed. + * core/stk_make_matcov.m: Modified (much simpler now !) + * misc/specfun/stk_sf_matern.m: Modified (parallelized) + + Add wrapper classes for parallel computation engines. + + * misc/parallel: New folder. + * misc/parallel/@stk_parallel_engine_none: New class. + * misc/parallel/@stk_parallel_engine_parfor: New class. + * misc/parallel/stk_parallel_cutblocks.m: New function. + * misc/parallel/stk_parallel_feval.m: New function. + * misc/parallel/stk_parallel_start.m: New function. + * misc/parallel/stk_parallel_engine_set.m: New function. + * misc/parallel/stk_parallel_engine_get.m: New function. + * misc/parallel/stk_parallel_stop.m: New function. + * misc/config/stk_path.m: Modified. + + A new system for managing options. + + * misc/options: New folder. + * misc/options/stk_options_set.m: New function. + * misc/options/stk_options_get.m: New function. + * misc/config/stk_path.m: Modified. + +2013-07-15 Julien Bect + + Recompile a MEX-file if the source is more recent. + + * misc/config/stk_compile_all.m: Modified. + + Add MEX-file for an efficient access to the named properties of an + stk_dataframe object. + + * utils/@stk_dataframe/src: New folder for MEX sources. + * utils/@stk_dataframe/src/get.c: New method (source). + * utils/@stk_dataframe/src/set.c: New method (source). + * utils/@stk_dataframe/src/get_column_number.h: New C header. + * misc/config/stk_compile_all.m: Compile get and set. + * utils/@stk_factorialdesign/get.m: New method. + * utils/@stk_factorialdesign/set.m: New method. + * utils/@stk_dataframe/subsasgn.m: Use get/set. + * utils/@stk_dataframe/subsref.m: Idem. + * utils/@stk_dataframe/ctranspose.m: Idem. + * utils/@stk_dataframe/transpose.m: Idem. + * utils/@stk_factorialdesign/stk_factorialdesign.m: Idem. + * utils/@stk_dataframe/stk_dataframe.m: Idem. + * utils/@stk_dataframe/stk_get_rownames.m: Removed. + * utils/@stk_dataframe/stk_get_colnames.m: Removed. + * utils/@stk_dataframe/stk_set_rownames.m: Removed. + * utils/@stk_dataframe/stk_get_colnames.m: Removed + * utils/@stk_dataframe/private/get_column_indicator.m: Removed. + + Create a folder for common include files (*.h). + + * misc/include: New folder. + * misc/include/stk_mex.h: Moved from misc/dist/private/. + * misc/config/stk_compile_all.m: Add a -I flag for mex + +2013-07-02 Julien Bect + + Encapsulate kriging equations in a dedicated class (bis). + + * core/stk_predict.m: Move the rhs loop (and a few other things) + to @stk_kriging_equation.stk_predict(). Add tests. + * core/@stk_kriging_equation/stk_predict.m: New function. + * core/@stk_kriging_equation/linsolve.m: Cast xt to double. + * core/@stk_kriging_equation/stk_kriging_equation.m: Cast xi to + double. Add a third optional argument: 'xt'. + +2013-06-28 Julien Bect + + Encapsulate kriging equations in a dedicated class. + + * core/@stk_kriging_equation: A new class that encapsulates the + basic linear-algebraic operations related to the kriging + equations. Methods: stk_kriging_equation.m, linsolve.m, + stk_posterior_matcov.m and subsref.m. + * core/stk_predict.m: Use the new class. + +2013-06-19 Julien Bect + + Send a warning when negative variances are set to zero. + + * core/stk_predict.m: modified. + +2013-06-18 Julien Bect + + Overloaded quantile() function for dataframe objects. + + * utils/@stk_dataframe/quantile.m: New function. + +2013-06-16 Julien Bect + + Improve backward compatibility. + + * utils/@stk_dataframe/private/get_column_indicator.m: Return the + 'var' field if it exists when 'v' is asked for, and display a + warning. + + Fix a bug in stk_param_getdefaultbounds (not handling .a + structures properly). + + * paramestim/stk_param_getdefaultbounds.m: Cast to double before + calling var() to handle legacy .a structure properly. + +2013-06-04 Julien Bect + + Return a dataframe from stk_conditioning(). + + * utils/stk_conditioning.m: Return a dataframe. + + Fix a bug in stk_predict (not handling .a structures properly). + + * core/stk_predict.m: Filter input arguments through double() to + handle legacy .a structures properly. Add tests. + + Fix two bugs related to dataframe indexing. + + * utils/@stk_dataframe/private/get_column_indicator.m: Fixed. + * utils/@stk_dataframe/subsref.m: Add tests. + +2013-05-18 Julien Bect + + Use function name as variable name in stk_feval. + + * utils/stk_feval.m: Use function name as variable name. + + Get rid of local variable use_indices in stk_predict. + + * core/stk_predict.m: Get rid of local variable use_indices. + +2013-05-09 Julien Bect + + Ensure that .a structures are still accepted. + + * utils/@struct/double.m: new overloaded function that returns the + .a field of a structure, assuming it exists. + * covfcs/stk_materncov32_aniso.m: add tests. + +2013-04-14 Julien Bect + + Add two new classes: stk_dataframe, stk_factorialdesign + + * utils/@stk_dataframe: new class + * utils/@stk_factorialdesign: new class + * utils/stk_datastruct.m: removed (use overloaded double() + instead) + * misc/test/stk_test_dfbinaryop.m: new function to test binary + operations on stk_dataframes objects + * stk_sampling_regulargrid.m: modified to return an + stk_factorialdesign + * *.m: remove all occurences of .a, stk_datastruct, and use the + new possibilities provided by the two added classes + + Return additional arguments from stk_rescale and stk_normalize. + + * utils/stk_rescale.m, utils/stk_normalize.m: modified to return + additional output arguments a and b, such that y = a + b*x + + Reorganize exisiting text functions and add some new ones. + + * misc/disp/stk_disp_framedtext.m: removed, superseded by + the new function stk_sprintf_framed() + * misc/disp/stk_disp_examplewelcome.m: moved to misc/text + * misc/text/stk_sprintf_colvect.m, + stk_sprintf_colvect_fixedpoint.m, + stk_sprintf_colvect_scientific.m: new functions + * misc/test/stk_runexamples.m: modified + * misc/config/stk_path.m: modified + +2013-03-25 Julien Bect + + Make stk_test() silent as a grave. + + * misc/test/stk_test.m: Use evalc() instead of eval() to make + stk_test() silent as a grave. Only works in Matlab for the time + being, since evalc() is still unimplemented in Octave. + +2013-03-20 Julien Bect + + Improve stk_runtests(). + + * misc/test/stk_runtests.m: Include class directories and private + directories in the total number of directories. Silence warnings + and display something if there were warnings during the tests. + +2013-03-17 Julien Bect + + New function stk_param_getdefaultbounds(). + + * paramestim/stk_param_estim.m: Remove internal function + get_default_bounds() and call stk_param_getdefaultbounds() + instead. + * paramestim/stk_param_getdefaultbounds.m: New function to be used + instead of the internal function get_default_bounds() in + stk_param_estim.m. This function can be overloaded for parameters + objects. + + In stk_param_estim(), cast param0 to the appropriate type. + + * paramestim/stk_param_estim.m: Cast param0 into an object of the + appropriate type and size and set model.param to the same value. + + Add local variables delta_p and delta_lnv in stk_remlqrg(). + + * paramestim/stk_remlqrg.m: Add local variables for (slightly) + improved readability and efficiency. + + Modify stk_remlqrg() to support objects in model.param. + + * paramestim/stk_remlqrg.m: Ensure that param is a column vector; + in the case where model.param is an object, this is actually a + call to subsasgn() in disguise. + +2013-03-16 Julien Bect + + Fix a (recently introduced...) bug in stk_param_init(). + + * paramestim/stk_param_init.m: Use log10() when calling + logspace(). Add a non-regression test. + + Avoid unnecessary gradient computation in stk_param_estim(). + + * paramestim/stk_param_estim.m: Compute the gradient only when it + is explicitely requested, both in f_() and in f_with_noise_(). + +2013-03-14 Julien Bect + + Add a warning in stk_param_init() when lognoisevariance is defined. + + * paramestim/stk_param_init.m: Issue a warning if there is a + non-empty lognoisevariance field, since its value won't be used. + + Fix other bugs in stk_param_init(). + + * paramestim/stk_param_init.m: Remove the second normalization + that was performed in the internal function paraminit_(). Use the + correct box diameter to choose the list of range values for + isotropic covariance functions. + +2013-03-13 Julien Bect + + Fix a bug in stk_param_init(). + + * paramestim/stk_param_init.m: Remove the value of the regularity + parameter from param for stk_matercov32_iso and + stk_materncov52_iso covariance functions. + + Avoid the use of 'stable' with unique(). + + * misc/dist/stk_filldist_exact.m: Avoid the use of 'stable' with + unique() since Octave doesn't currently support it (and we don't + really need it, anyway, or so it seems). + +2013-03-12 Julien Bect + + Check the size of 'box' in stk_normalize. + + * utils/stk_normalize.m: Check the size of 'box' before using + it. Raise an error if it's not [2 d]. + + Return empty from stk_param_estim when lnv is not estimated. + + * paramestim/stk_param_estim.m: Return empty for the second output + argument when lognoisevariance is not estimated (to avoid warnings + about output arguments not being assigned). + +2013-02-27 Julien Bect + + Add function stk_gpquadform() to compute Gibbs-Paciorek quadratic + forms. + + * misc/dist/stk_gpquadform.m: New function to compute + Gibbs-Paciorek quadratic forms. + + * misc/dist/private/stk_gpquadform_pairwise.c, + misc/dist/private/stk_gpquadform_matrixx.c, + misc/dist/private/stk_gpquadform_matrixy.c: C sources for the fast + computation of stk_quadform() in several special cases. + + * misc/config/stk_compile_all.m: Compile the new MEX-files. + +2013-02-26 Julien Bect + + Prepare stk_param_estim for parameter objects (instead of vectors). + + * paramestim/stk_param_estim.m: Prepare for parameter objects. Rename + the optimized vector for 'param' to 'u' for clarity (since it is + sometimes an extended parameter vector). + +2013-02-10 Julien Bect + + Fix and improve stk_datastruct(). + + * utils/stk_datastruct.m: Call inputname correctly, with an input + argument. Return an empty data structure when nargin == 0. Add + some tests. + +2013-02-04 Julien Bect + + Implement the NOLHS construction of Cioppa & Luca (2007). + + * sampling/stk_sampling_olhs.m: The function now has an additional + hidden option to trigger the construction of an extended (N)OLHS + following the paper by Cioppa & Lucs (Technometrics, 2007). + + Fixed a bug in stk_rescale() and added regression tests. + + * utils/stk_rescale.m: Fixed a bug in the first part of the + function (i.e., the part where the data is scaled from its + original box to [0; 1]^d). Added some regression tests. + +2013-01-21 Julien Bect + + Modified stk_set_root() to avoid the use of a persistent variable. + + * misc/config/stk_set_root.m: modified. The use of a persistent variable + was failing to play its intended role when switching from one version of + STK to another. The root folder is now detected using which('stk_test'). + +2013-01-20 Julien Bect + + Fixed a test in stk_filldist(). + + * misc/dist/stk_filldist.m: modified test. Added a tolerance in a + comparison; otherwise the test was failing from time to time + because of numerical errors. + +2013-01-19 Julien Bect + + Added a DoE example (sequential space-filling). + + * examples/02_design_of_experiments/stk_example_doe02.m: new + script. + + Fixed a numerical issue in stk_filldist_exact(). + + * misc/dist/stk_filldist_exact.m: modified. Because of possible + numerical inaccuracies, centers that are slightly outside the box + must also be considered as candidates for being ymax. + + Fixed a bug in stk_filldist(). + + * misc/dist/stk_filldist.m: modified. Fixed a bug in the + discretized case (the second output argument was the index of ymax + instead of ymax itself, as advertised by the documentation). + + Added tests to all fill distance-related functions. + + * misc/dist/stk_filldist_exact.m: added tests. + * misc/dist/stk_filldist_discretized.m: added tests. + * misc/dist/stk_filldist.m: added tests. + + Added a second output argument to stk_filldist_discretized(). + + * misc/dist/stk_filldist_discretized.m: modified. The function now + returns, as a second output argument, the point where the maximum + distance is attained, as expected by stk_filldist(). + +2013-01-17 Julien Bect + + Completed the documentation of stk_fill_dist and + stk_filldist_discretized. + + * misc/dist/stk_filldist.m: modified (doc) + * misc/dist/stk_filldist_discretized.m: modified (doc) + +2013-01-14 Julien Bect + + Completed the documentation of stk_filldist_exact. + + * stk_filldist_exact.m: modified (documentation) + + Added a test in stk_filldist. + + * stk_filldist.m: modified (tests) + +2013-01-13 Julien Bect + + Ensured that all misc/dist functions accept ".a" structures. + + * misc/dist/stk_dist.m: modified + * misc/dist/stk_mindist.m: modified + * misc/dist/stk_filldist.m: modified + * misc/dist/stk_filldist_discretized.m: modified + * misc/dist/private/stk_mindist.c: renamed + * misc/dist/private/stk_filldist_discretized.c: renamed + + Moved misc/dist MEX-files into a private folder. + + * misc/dist/private: new folder + * misc/dist/stk_dist_pairwise.c: moved to misc/dist/private + * misc/dist/stk_dist_matrixx.c: idem + * misc/dist/stk_dist_matrixy.c: idem + * misc/dist/stk_filldist_discretized.c: idem + * misc/dist/stk_mindist.c: idem + * misc/dist/stk_mex.h: idem + * misc/config/stk_path.m: modified + * misc/config/stk_compile_all.m: modified + + Minor change in stk_dist (pairwise case). + + * misc/dist/stk_dist.m: modified + +2013-01-12 Julien Bect + + Added a function to compute the exact fill distance, based on a + paper by Luc Pronzato and Werner G. Müller (Statistics and + Computing, 2011). + + * misc/dist/stk_filldist.m: replaced + * misc/dist/stk_filldist_discretized.c: formerly stk_filldist.c + * misc/dist/stk_filldist_discretized.m: formerly stk_filldist.m + * misc/dist/stk_filldist_exact.m: new + * misc/dist/stk_filldist.c: renamed + * misc/config/stk_compile_all.m: modified + +=============================================== +=== Maintenance branch 1.2.x created here === +=============================================== + +2013-01-12 Julien Bect + + Fixed documentation. + + * misc/dist/stk_dist.m: modified + * misc/dist/stk_mindist.m: modified + * misc/dist/stk_filldist.m: modified + +2013-01-03 Julien Bect + + Modified stk_makedoc to exclude misc/matlab from the generated + HTML documentation. + + * stk_makedoc.m: modified + + Made stk_narginchk() slightly more efficient. + + * misc/error/stk_narginchk.m: modified + + Added the text of the GPLv3 license. + + * LICENSE: new + + Removed the NEWS file (to be written after creating the + maintenance branch for a new release). + + * NEWS: removed + + Restored '.a' outputs for all stk_sampling_* functions and + streamlined unit tests for that. + + * sampling/stk_sampling_olhs.m: modified + * sampling/stk_sampling_randunif.m: modified + * sampling/stk_sampling_regulargrid.m: modified + * sampling/stk_sampling_randomlhs.m: modified + * sampling/stk_sampling_maximinlhs.m: modified + +2013-01-02 Julien Bect + + Added a script to generate the HTML documentation. + + * stk_makedoc.m: new script + + Fixed a bug in M2HTML (affecting option 'ignoredDir'). + + * misc/m2html/m2html.m: modified + + Added M2HTML version 1.5 (by Guillaume Flandin). + + * misc/m2html: new + + Removing folder ./htmldoc (to be generated after creating the + maintenance branch for a new release). + + * htmldoc: removed + +2012-12-31 Julien Bect + + Fixing bugs in stk_test() and stk_runtests(). + + * misc/test/stk_runtests.m: modified + * misc/test/stk_test.m: modified + +2012-12-16 Julien Bect + + Modified stk_runtests() to browse through private folders and + class(@) folders. + + * misc/test/stk_runtests.m: modified + + Fixed a typo. + + * misc/test/stk_runtests.m: modified + +2012-12-14 Benoit Jan + + Fixed a bug in stk_make_matcov's "parfor" private functions. + + * core/private/stk_make_matcov_inter_parfor.m: modified + * core/private/stk_make_matcov_auto_parfor.m: modified + +2012-12-14 Julien Bect + + Fixing a bug affecting stk_predict() in the 'blocked' case. + + * core/stk_predict.m: modified + +2012-12-07 Julien Bect + + Minor improvement in stk_runexamples. + + * misc/test/stk_runexamples.m: modified + +2012-12-06 Julien Bect + + Removed some internal ".a" fields. + + * core/stk_ortho_func.m: modified + * core/stk_make_matcov.m: modified + +2012-12-05 Julien Bect + + Modified stk_predict() to make it work with non-stationary + covariance functions. + + * core/stk_predict.m: modified + + Added a "pairwise" option to stk_make_matcov(). + + * core/stk_make_matcov.m: modified + +2012-12-04 Julien Bect + + Added a "pairwise" option to all covariance functions. + + * covfcs/stk_materncov*.m: modified + +2012-12-02 Julien Bect + + Added a new MEX-file to compute distances "pairwise" (i.e., + compute only the diagonal of the full distance matrix). + + * misc/dist/stk_distance_matrix.c: deleted + * misc/dist/stk_mex.h: new C header + * misc/dist/stk_dist_matrixx.c: new MEX-file + * misc/dist/stk_dist_matrixy.c: new MEX-file + * misc/dist/stk_dist_pairwise.c: new MEX-file + * misc/config/stk_compile_all.m: modified + * misc/dist/stk_mindist.c: modified + * misc/dist/stk_filldist.c: modified + + Renamed stk_distancematrix() to stk_dist(). + + * misc/dist/stk_distance_matrix.m: renamed + * misc/dist/stk_filldist.m: modified + * covfcs/stk_materncov*.m: modified + + All stk_materncov* functions now also accepts simple matrix-type + arguments. + + * covfcs/stk_materncov*.m: modified + +2012-12-01 Julien Bect + + Fixed a typo in the documentation of stk_is_lhs(). + + * misc/test/stk_is_lhs.m: modified + + Fixed a bug in stk_runexamples(). + + * misc/test/stk_runexamples.m: modified + +2012-11-29 Julien Bect + + Modified stk_predict() to return the posterior covariance matrix + as a fourth output argument. + + * core/stk_predict.m: modified + +2012-11-26 Julien Bect + + Modified all stk_sampling* functions to use stk_rescale() + and stk_assert_box(). + + * sampling/stk_sampling_olhs.m: modified + * sampling/stk_sampling_randunif.m: modified + * sampling/stk_sampling_regulargrid.m: modified + * sampling/stk_sampling_randomlhs.m: modified + * sampling/stk_sampling_maximinlhs.m: modified + + Minor improvements in stk_is_lhs(). + + * misc/test/stk_is_lhs.m: modified + + Added a new function to rescale data from one box to another. + + * utils/stk_rescale.m: new function + * utils/stk_normalize.m: (slightly) modified + + Added a new function to check "box" arguments. + + * misc/error/stk_assert_box.m: new function + +2012-11-25 Julien Bect + + Added a new function to generate OLHSs, following Ye (1998). + + * sampling/stk_sampling_olhs.m: new function + +2012-11-21 Julien Bect + + Added default values for some input arguments of stk_is_lhs(), + and stricter dimension checking. + + * misc/test/stk_is_lhs.m: modified + +2012-11-14 Julien Bect + + Changed the upper bound on nu in stk_param_estim(). + + * paramestim/stk_param_estim.m: modified + + Fixed a bug in stk_param_init(). + + * paramestim/stk_param_init.m: modified + + Added a new MEX-file to compute a discretized fill distance. + + * misc/dist/stk_filldist.c: new MEX-file (source) + * misc/dist/stk_filldist.m: new MEX-file (doc + tests) + * misc/dist/stk_mindist.m: modified + * misc/config/stk_compile_all.m: modified + + Added a new function to help initialize stk_param_estim(). + + * paramestim/stk_param_init.m: new function + * examples/01_kriging_basics/stk_example_kb02.m: modified + * examples/01_kriging_basics/stk_example_kb03.m: modified + + Added a new function: stk_normalize(). + + * utils/stk_normalize.m: new function + + Renamed some internal variables in stk_param_estim(). + + * paramestim/stk_param_estim.m: modified + +2012-11-06 Julien Bect + + Improved the flexibility of stk_predict() and stk_param_estim(), + which are now accepting both matrices and "data structures" (with + an 'a' field) as input arguments. + + * utils/stk_datastruct.m: new function + * core/stk_predict.m: modified + * paramestim/stk_param_estim.m: modified + +2012-11-04 Julien Bect + + Improved graphical outputs in stk_example_kb03. + + * examples/01_kriging_basics/stk_example_kb03.m: modified + + Added a new function stk_plot2d() that serves has a wrapper around + {surf|contour|mesh|pcolor}-type functions, to plot data defined + over a two-dimensional regular grid. + + * misc/plot/stk_plot2d.m: new function + + Modified stk_predict() to avoid returning negative variances. When + negative variances are encountered, they are set to zero and a + warning is issued. + + * core/stk_predict.m: modified + + Modified stk_sampling_regulargrid() to return 'ndgrid-style' + coordinate matrices stored in new .coord field. + + * sampling/stk_sampling_regulargrid.m: modified + + Improved Octave-specific configuration (GNUTERM=wxt). + + * misc/config/stk_octave_config.m: modified + +2012-11-01 Julien Bect + + Added a new folder for test functions. + + * examples/test_functions: new folder + * examples/test_functions/stk_testfun_braninhoo.m: new function + * misc/config/stk_path.m: modified + +2012-10-28 Julien Bect + + Improved Octave-specific configuration. + + * stk_init.m: modified + * misc/config/stk_octave_config.m: new function + * misc/config/stk_check_octave_packages.m: removed + * README: modified + +2012-10-24 Julien Bect + + Added a new example to demonstrate the effect of adding a prior on + the covariance parameters. + + * examples/03_miscellaneous/stk_example_misc03.m: new script + + Added a new function to draw shaded area representing pointwise + confidence intervals. + + * misc/plot/stk_plot_shadedci.m: new function + * misc/plot/stk_plot1d.m: modified + + Added size checking and changed the upper bound for nu in + stk_param_estim. + + * paramestim/stk_param_estim.m: modified + + Renamed "box" into "BOX" in all example scripts, to + avoid conflicts with the box function. + + * 01_kriging_basics/stk_example_kb01.m: modified + * 01_kriging_basics/stk_example_kb02.m: modified + * 01_kriging_basics/stk_example_kb04.m: modified + * 01_kriging_basics/stk_example_kb05.m: modified + * 03_miscellaneous/stk_example_misc01.m: modified + +2012-10-22 Julien Bect + + Improving welcome messages. + + * misc/disp: new folder + * misc/disp/stk_disp_framedtext.m: new function + * misc/disp/stk_disp_examplewelcome.m: new function + * misc/config/stk_path.m: modified + * examples/01_kriging_basics/stk_example_kb*.m: modified + * examples/02_design_of_experiments/stk_example_doe01.m: modified + * examples/03_miscellaneous/stk_example_misc*.m: modified + * misc/test/stk_runexamples.m: modified + + Moving example scripts to subfolders. + + * misc/config/stk_path.m: modified + * misc/test/stk_runexamples.m: new function + * examples/example*.m: moved to a subfolder + * examples/run_all_examples: deleted + * examples/01_kriging_basics: new folder + * examples/02_design_of_experiments: new folder + * examples/03_miscellaneous: new folder + +2012-09-26 Julien Bect + + Better initial guess for the log of the noise variance + in example08.m (log(eps) wasn't working well with sqp()) + + * examples/example08.m: modified + +2012-09-16 Julien Bect + + Fixing docs and copyright notices. + + * misc/dist/stk_mindist.m: doc modified + * misc/dist/stk_distance_matrix.m: doc modified + + Fixing bugs in stk_runscript.m and run_all_examples.m + + * examples/run_all_examples.m: bugfix + * misc/test/stk_runscript.m: bugfix + +2012-09-08 Julien Bect + + Adding default bounds for Matérn 3/2 covariances. + + * paramestim/stk_param_estim.m: modified + + +===================== +=== Release 1.1 === +===================== + +2012-08-28 Emmanuel Vazquez + + Fixing comments (5/2 -> 3/2). + + * covfcs/stk_materncov32_aniso.m: doc modified + * covfcs/stk_materncov32_iso.m: idem + + Updating HTML doc. + + * htmldoc/*: modified + +2012-08-17 Julien Bect + + Preparing for release 1.1: updating copyright notices and copying + permission statements, removing trailing white spaces, added a + user-level log of changes. + + * almost-all-files: doc & code formatting modified + * NEWS: new file + + Added a new function (stk_runscript) to solve a problem of + inconsistent behaviour of the run function between Matlab and the + latest version of Octave (one wants a '.m', the other doesn't). + + * misc/test/stk_runscript.m: new function + * examples/run_all_examples.m: modified + + Renamed README.txt to README. Added explicit version requirements + for GNU Octave (3.2.0) and Matlab (R2007a). + + * README.txt: renamed and renamed + + Added tests and a little bit of arg checking. + + * covfcs/stk_materncov32_aniso.m: tests + arg checking + * covfcs/stk_materncov32_iso.m: idem + * covfcs/stk_materncov52_aniso.m: idem + * covfcs/stk_materncov52_iso.m: idem + * covfcs/stk_noisecov.m: idem + * covfcs/stk_materncov_aniso.m: idem + * covfcs/stk_materncov_iso.m: idem + +2012-08-10 Julien Bect + + Added tests, improved documentation (help, copyright notices, + ...). Added a little bit of arg checking in stk_conditioning. + + * utils/stk_generate_samplepaths.m: tests + doc + * utils/stk_feval.m: tests + doc + * utils/stk_model.m: source code formatting only + * utils/stk_conditioning.m: tests + doc + arg checking + * core/stk_ortho_func.m: doc + * core/stk_make_matcov.m: doc + * core/stk_predict.m: doc + * core/private/stk_make_matcov_inter_parfor.m: doc + * core/private/stk_make_matcov_auto_parfor.m: doc + +2012-08-08 Julien Bect + + Added a new function for approximate comparisons with an + absolute tolerance threshold. + + * misc/test/stk_isequal_tolabs.m: new function + + Fixed a bug in stk_isequal_tolrel (the function wasn't working as + expected for non-vector arrays) and improved documentation. + + * misc/test/stk_isequal_tolrel.m: modified + + Renamed stk_conditionning to stk_conditioning. + + * utils/stk_conditionning.m: renamed and modified + * examples/example05.m: modified accordingly + +2012-08-07 Julien Bect + + Added tests and improved documentation. + + * misc/specfun/stk_sf_matern.m: tests & doc + * misc/specfun/stk_sf_matern32.m: idem + * misc/specfun/stk_sf_matern52.m: idem + +2012-07-15 Julien Bect + + Replaced a call to isrow(), which didn't exist in some recent Matlab + versions (e.g., R2010b), by a direct call to size(). + + * misc/matlab/index.m: modified + +2012-07-10 Julien Bect + + Fixed a warning generated by stk_compile_all under Octave. + + * misc/config/stk_compile_all.m: modified + +2012-07-08 Julien Bect + + Added tests and improved documentation. + + * sampling/stk_sampling_randunif.m: tests & doc + * sampling/stk_sampling_randomlhs.m: idem + * sampling/stk_sampling_regulargrid.m: idem + * sampling/stk_sampling_maximinlhs.m: idem + + New function to test the LHS property. + + * misc/test/stk_is_lhs.m: new function + + Renamed stk_sampling_cartesiangrid to stk_sampling_regulargrid, + and changed the meaning of the first argument for consistency with + other stk_sampling_* functions. + + * sampling/stk_sampling_cartesiangrid.m: renamed and modified + * examples/example01.m: modified accordingly + * examples/example02.m: idem + * examples/example04.m: idem + * examples/example05.m: idem + * examples/example06.m: idem + * examples/example07.m: idem + * examples/example08.m: idem + * paramestim/stk_param_estim.m: idem + * core/stk_predict.m: idem + +2012-07-04 Julien Bect + + Fixed a bug in stk_compile_all() under Octave, related to a + strange behaviour of exist(). + + * misc/config/stk_compile_all.m: bugfix. + + Improved doc and added tests in several functions. Also, fixed a + minor bug in stk_model(). + + * examples/example07.m: fixed comment + * utils/stk_model.m: bugfix + doc + tests + * paramestim/stk_remlqrg.m: doc + tests + * paramestim/stk_param_estim.m: doc + tests + +2012-06-30 Julien Bect + + Fixed a bug in stk_runtests() under Octave. It is now possible to + write "stk_runtests core" from the STK's root, for instance. + + * misc/test/stk_runtests.m: bugfix. + + Added a new function for approximate comparisons. + + * misc/test/stk_isequal_tolrel.m: new function. + * core/stk_predict.m: modified test. + + Miscellaneous. + + * misc/error/stk_narginchk.m: fixed doc and comments. + * core/stk_ortho_func.m: tests. + * core/stk_make_matcov.m: idem. + +2012-06-29 Julien Bect + + A first series of Octave-style unit tests. + + * core/stk_predict.m: modified + * sampling/stk_sampling_maximinlhs.m: modified + * misc/dist/stk_distance_matrix.m: new function + * misc/dist/stk_mindist.m: new function + + Modified STK's path handling. A separate function stk_path() has + been created, since stk_set_root() is no longer the only function + that needs it. Also, several new folders have been added to the + path. + + * misc/config/stk_set_root.m: modified + * misc/config/stk_path.m: new function + + Imported and adapted Octave's unit testing functions. + + * misc/test: new folder + * misc/test/stk_test.m: new function + * misc/test/stk_runtests.m: new function + + Removed old test scripts (the tests that they contained are now + included as Octave-style unit tests in the M-file themselves). + + * tests: deleted + * tests/test_distance_matrix.m: idem + * tests/test_sampling_maximinlhs.m: idem + * tests/test_Kx_cache.m: idem + * tests/test_mindist.m: idem + + Added new functions for improved error handling. + + * misc/error: new folder + * misc/error/stk_narginchk.m: new function + * misc/error/stk_error.m: new function + + Added new functions for improved M/O inter-operability. + + * misc/matlab: new folder + * misc/matlab/fflush.m: new function + * misc/matlab/file_in_loadpath.m: idem + * misc/matlab/file_in_path.m: idem + * misc/matlab/index.m: idem + * misc/matlab/stdout.m: idem + +2012-06-05 Emmanuel Vazquez + + Changed stk_param_estim to make it possible to estimate noise + variance. + + * examples/example02.m: Bug fix + * examples/example08.m: Example added about noise estimation + * paramestim/stk_param_estim.m: Modified + +2012-06-05 Julien Bect + + Fixing a bug related to the change of parameter ordering. + + * tests/test_Kx_cache.m: Changed the position of the 'model' + parameter in several function calls. + +2012-05-31 Julien Bect + + Reorganizing folders. + + * misc/dist: New folder. + * misc/dist/stk_mindist.c: Moved from sampling. + * misc/dist/stk_distance_matrix.c: Moved from covfcs. + * misc/config/stk_set_root.m: Added misc/dist to path. + * misc/config/stk_compile_all.m: Changed paths. + +2012-05-30 Julien Bect + + Reorganizing folders. + + * paramestim: New folder. + * paramestim/stk_param_estim.m: Moved from core. + * paramestim/stk_remlqrg.m: idem. + * misc: New name of the "old" utils folder. + * misc/config/stk_set_root.m: Changed path. + * utils: New name of the "old" utils/misc folder. + * utils/stk_model.m: Moved to utils. + * utils/stk_conditionning.m: idem. + * utils/stk_generate_samplepaths.m: idem. + * stk_init.m: Changed the location of stk_set_root. + + Miscellaneous changes. + + * sampling/stk_mindist.c: Fixed a comment. + +2012-05-30 Emmanuel Vazquez + + * almost-all-files: Changed the order of the arguments of the + functions that use the structure 'model'. Now, 'model' is always + the first argument. Because of this change, it seems better to + make the argument 'param' in covariance functions coming in first + position too. + +2012-05-19 Julien Bect + + Preparing headers for release 1.1. + + * almost-all-files: Updated headers (copyright, version). + + Miscellaneous changes. + + * core/stk_feval.m: Added optional argument 'progress_msg'. + * utils/config/stk_select_optimizer.m: Minor change to avoid + systematic checking of which optimizer has to be used (as shown by + the comments, this was a mistake...). + * examples/example07.m: Fixed doc. + +2012-05-02 Julien Bect + + Improved compatibility with older versions of Matlab. + + * core/stk_param_estim: Added a try-catch block to catch "invalid + parameter" errors generated by optimset(). + +2012-04-22 Julien Bect + + Removed the undue dependency on the 'optim' package under Octave. + + * utils/config/stk_check_octave_packages.m: Removed dependency. + + Doc fixing. + + * README.txt: Fixed doc. + * utils/config/stk_check_octave_packages.m: Fixed doc. + +2012-04-21 Julien Bect + + Docs fixing. + + * core/stk_make_matcov.m: Fixed doc. + * core/stk_predict.m: Fixed doc. + +2012-02-21 Julien Bect + + Added a test for presence of GLPK in stk_check_octave_packages(). + + * utils/config/stk_check_octave_packages.m: Added test. + * README.txt: Fixed doc. + +2012-02-20 Julien Bect + + Fixed two bugs in run_all_examples.m. + + * examples/run_all_examples.m: Two bugfixes + several minor + changes. The first bug was related to the try/catch block + ("advanced" syntax not supported by Octave, explicitly calling + lasterror() is safer). The second bug was related to the possible + occurence of errors without an error identifier. + + Fixed a bug in stk_set_root(). + + * utils/config/stk_set_root.m: Fixed a bug in stk_set_root() + related to the use of rmpath(). This ensures compatibility with + Octave 3.0.2. + +2012-02-19 Julien Bect + + Fixed a bug under Octave (use of Matlab-like assert statements). + + * covfcs/stk_noisecov.m: Replaced Matlab-style assert() statements + with explicit calls to error(). + + Bugfix for compatibility with older versions of Octave---more + precisely, of the miscellaneous package. + + * utils/stk_is_octave_in_use.m: Test for the existence of built-in + variable OCTAVE_VERSION to check if running under Octave (instead + of calling ver(), which was not working properly with some old + versions of the miscellaneous package). + * stk_init.m: idem. + + Miscellaneous changes. + + * sampling/stk_mindist.c: removed unused variable lambda in + stk_mindist.c + +2012-02-18 Julien Bect + + Miscellaneous changes. + + * tests/test_Kx_cache.m: New script. + * core/stk_make_matcov.m: Simplified syntax guessing. + +2012-02-17 Emmanuel Vazquez + + Fixed two bugs related to the use of a "covariance cache": when xi + is a vector of indices, xi.a does not exist ! + + * core/stk_make_matcov.m: Bugfix. + * core/stk_predict.m: Bugfix. + + Renamed fields in "model" structures (covariance_cache to Kx_cache + and P0 to Px_cache). + + * core/stk_ortho_func.m: Renamed variables. + * core/stk_make_matcov.m: idem. + * core/stk_predict.m: idem. + * core/stk_model.m: idem. + + Miscellaneous changes, mostly doc fixing. + + * covfcs/stk_materncov_aniso.m: Fixed doc. Renamed a variable. + * covfcs/stk_materncov32_aniso.m: idem. + * covfcs/stk_materncov52_aniso.m: idem. + * examples/example01.m: Fixed doc (SMTK -> STK). + * examples/example03.m: idem. + +2012-02-12 Julien Bect + + Added a new function to select an appropriate optimizer in + stk_param_estim(). + + * utils/config/stk_select_optimizer.m: New function. + * core/stk_param_estim.m: Modified to use the new function. + * stk_init.m: Modified to use the new function. + + The stk_model() function now provides default parameters for + several families of covariance functions. A new field 'dim' has + been added to the 'model' structure. + + * core/stk_model.m: Added default parameters. + * examples/example*.m: Modified to use stk_model(). + + Miscellaneous changes. + + * utils/config/stk_compile_all.m: Minor change in error messages. + +2012-02-11 Julien Bect + + The 'statistics' packages is no longer required in Octave. + + * README.txt: Removed dependency. + * utils/config/stk_check_octave_packages.m: Removed dependency. + +2012-02-08 Julien Bect + + New MEX-file to compute the mindist criterion. + + * sampling/stk_mindist.c: New MEX-file. + * examples/example04.m: Removed "be patient" message. + * sampling/stk_sampling_maximinlhs.m: pdist() -> stk_mindist(). + * tests/test_mindist.m: New script. + * tests/test_sampling_maximinlhs.m: New script. + * utils/config/stk_compile_all.m: Added new MEX to be compiled. + + New function to generate random Latin Hypercube Samples. + + * sampling/stk_sampling_randomlhs.m: New function. + + Miscellaneous changes. + + * tests/test_distance_matrix.m: Added missing header. + +2012-02-07 Julien Bect + + Improved stk_distance_matrix(). + + * covfcs/stk_distance_matrix.c: Added a subfunction to handle the + "symmetric" case more efficiently. + * tests: New directory. + * tests/test_distance_matrix.m: New script. + + Added a 'welcome' message to the examples. + + * examples/example0?.m: Added a 'welcome' message. + * examples/run_all_examples.m: Minor changes. + * stk_init.m: Turned output pagination off and disabled verbose + help messages in Octave. + + New covariance function (Matérn 3/2). + + * utils/specfun/stk_sf_matern32.m: New function. + * covfcs/stk_materncov32_aniso.m: New function. + * covfcs/stk_materncov32_iso.m: New function. + * examples/example06.m: Added two subplots. + * examples/example07.m: New script. + * examples/run_all_examples.m: Increased NB_EXAMPLES. + +2012-02-06 Julien Bect + + Fixing bugs and comments in covariance functions. + + * covfcs/stk_materncov52_aniso.m: Fixed a bug (an old function + name was still used) and some comments. + * utils/specfun/stk_sf_matern52.m: Fixed missing abs() in + stk_sf_matern52(). The result was wrong for negative arguments. + * covfcs/stk_materncov_aniso.m: Fixed comment. + * covfcs/stk_materncov_iso.m: Fixed comment. + +2012-02-05 Julien Bect + + New covariance function (Matérn 5/2). + + * utils/specfun/stk_sf_matern52.m: New function. + * covfcs/stk_materncov52_aniso.m: New function. + * covfcs/stk_materncov52_iso.m: New function. + * core/stk_param_estim.m: Added Matérn 5/2 to get_default_bounds(). + * examples/example06.m: New script. + * examples/run_all_examples.m: Increased NB_EXAMPLES. + + Fixed issues in stk_param_estim.m related to the definition of the + search domain and the selection of (constrained/unconstrained) + optimizer. + + * core/stk_param_estim.m: Enlarged the search domain in such a way + that param0 is always inside it. Changed the selection of + optimizer to use fminsearch when either the upper- or the + lower-bound are empty. Moved the definition of the 'options' + struct to the Matlab-specific part of the code. + + Miscellaneous changes. + + * examples/example02.m: Doc & code formatting. + * utils/plot/stk_plot1d.m: Added an optional argument to allow + plotting on an existing axis. + + New directory for special functions (./utils/specfun). + + * utils/specfun: New directory. + * utils/config/stk_set_root.m: Added ./utils/specfun to the path. + * covfcs/stk_materncov_.m: Removed. + * utils/specfun/stk_sf_matern.m: Replacement for stk_materncov_. + * covfcs/stk_materncov_aniso.m: Modified to use stk_sf_matern. + * covfcs/stk_materncov_iso.m: Modified to use stk_sf_matern. + +2012-02-02 Julien Bect + + Miscellaneous changes. + + * README.txt: Improved requirements and recommendations. + * core/stk_param_estim.m: Clarified selection of optimizer. + + Improved handling of Octave packages. + + * utils/stk_check_octave_packages.m: New function to check + for required packages under Octave. + * stk_init.m: Added a call to stk_check_octave_packages(). Removed + some left-overs from an earlier version of stk_init where + fminsearch() was used instead of sqp() under Octave. Moved call to + stk_is_fmincon_available() to the Matlab-conditional part. + + Fixed a parsing problem occuring in Octave 3.4.3 (at least), + related to the fact that parfor loops are supposed to end with an + "endparfor" instead of a simple "end"... but we don't use "parfor" + at all if we are running in Octave. + + * core/stk_make_matcov.m: Moved some sub-functions to independent + M-files stored in a private sub-folder. + * core/private: New folder. + * core/private/stk_make_matcov_auto_parfor.m: New file (the code + in this file was previously part of stk_make_matcov.m). + * core/private/stk_make_matcov_inter_parfor.m: New file (the code + in this file was previously part of stk_make_matcov.m). + +2012-02-01 Julien Bect + + Minor bugfix + improved error message in stk_remlqrg() + + * core/stk_remlqrg.m: Minor bugfix: returns nan for the derivative + with respect to the noise variance in the case of a model without + observation noise. Improved error message if NOISEPRIOR && + ~NOISYOBS (doesn't use assert anymore). + + * core/stk_remlqrg.m: minor bugfix + improved error message in + stk_remlqrg() + + Added a script to run all the examples and report on errors. + + * examples/run_all_examples.m: new script + * examples/example0*.m: remove "clear all; close all;" + + Improved script stk_init. + + * utils/config/stk_set_root.m: new function + * utils/config/stk_get_root.m: new function + * utils/config/stk_compile_all.m: new function + * stk_init.m: Modified to use the new functions. Also, added a + 'clear' statement for temporary variables STK_ROOT, fmincon_found, + octave_in_use, s and ans at the end of the script. + + Created subdirectories in ./utils. + + * utils/config: new subdirectory + * utils/stk_is_fmincon_available.m: moved to ./utils/config + * utils/stk_is_octave_in_use.m: moved to ./utils/config + * utils/stk_is_pct_installed.m: moved to ./utils/config + * utils/plot: new subdirectory + * utils/stk_plot1d.m: moved to ./utils/plot + * utils/stk_plot1dsim.m: moved to ./utils/plot + + Moved stk_feval to ./core (where it should always have been). + + * utils/stk_feval.m: moved to ./core + + +===================== +=== Release 1.0 === +===================== + +2011-09-28 Emmanuel Vazquez + + Initial commit of STK. diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..27a516a --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,30 @@ +Name: STK +# +Version: 2.7.0 +# +Date: 2022-02-23 +# +Title: STK: A Small Toolbox for Kriging +# +Author: See AUTHORS.md file +# +Maintainer: Julien BECT + and Emmanuel VAZQUEZ +# +Description: The STK is a (not so) Small Toolbox for Kriging. Its primary + focus is on the interpolation/regression technique known as kriging, which + is very closely related to Splines and Radial Basis Functions, and can be + interpreted as a non-parametric Bayesian method using a Gaussian Process + (GP) prior. The STK also provides tools for the sequential and + non-sequential design of experiments. Even though it is, currently, mostly + geared towards the Design and Analysis of Computer Experiments (DACE), the + STK can be useful for other applications areas (such as Geostatistics, + Machine Learning, Non-parametric Regression, etc.). +# +License: GPLv3+ +# +Url: https://github.com/stk-kriging/stk/ +# +Depends: octave (>= 4.0.0) +# +Autoload: no diff --git a/INDEX b/INDEX new file mode 100644 index 0000000..c6cc3c4 --- /dev/null +++ b/INDEX @@ -0,0 +1,568 @@ +stk >> STK, a Small Toolbox for Kriging + +## Copyright Notice +## +## Copyright (C) 2015-2021 CentraleSupelec +## Copyright (C) 2014 SUPELEC +## +## Author: Julien Bect + +## Copying Permission Statement +## +## This file is part of +## +## STK: a Small (Matlab/Octave) Toolbox for Kriging +## (https://github.com/stk-kriging/stk/) +## +## STK is free software: you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation, either version 3 of the License, or (at your +## option) any later version. +## +## STK is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +## License for more details. +## +## You should have received a copy of the GNU General Public License +## along with STK. If not, see . + +## Several reasons why we don't want to let certain functions +## appear in the INDEX (i.e., in the public API of STK) +## +## 1) Deprecation: these functions will be removed in future +## versions of STK, no need to adertise them. +## +## 2) Internal: these functions are mostly intended for internal +## use in STK. Although it might be occasionnaly useful for +## advanced users to call them directly, they are not considered +## as part of the public API and therefore not as stable as +## public API functions. Use at your own risk. +## +## 3) Trivial overload: these functions provide the same functionality +## as a corresponding "generic" function, with such a similar +## behaviour that no documentation needs to be provided. For +## instance, @stk_dataframe/abs is just a shortcut to avoid +## writing abs (double (x)) or abs (x.data) when x is an +## stk_dataframe object. No need to advertise such functions in +## the INDEX. +## +## 4) Experimental features: not ready yet for use by everyone. +## + +Core STK functions +## Why not group all these functions in the same folder ? +## Currently, some of them are in ./core/ and some others in ./utils/ + stk_model + stk_model_update + stk_make_matcov + stk_predict + stk_predict_leaveoneout + stk_pmisclass +#stk_ortho_func [deprecated] +#stk_cholcov [internal] +#stk_model_fixlm [internal] +#stk_covmat_noise [internal] +#stk_predict_ [internal] + +Parameter estimation + stk_param_estim + stk_param_gls + stk_param_init + stk_param_init_lnv + stk_param_relik +#stk_param_estim_optim [internal] +#stk_param_getdefaultbounds [internal] +#stk_param_getdefaultbounds_lnv [internal] +#stk_param_init_remlgls [internal] +#stk_get_optimizable_parameters [internal] +#stk_set_optimizable_parameters [internal] + +Simulations + stk_conditioning + stk_generate_samplepaths + stk_simulate_noise + +## Base class for model objects +#@stk_model_/stk_model_ [internal] +#@stk_model_/stk_predict_ [internal] +#@stk_model_/stk_covmat_noise [overload STK] +#@stk_model_/stk_get_input_data [overload STK] +#@stk_model_/stk_get_output_data [overload STK] +#@stk_model_/stk_get_prior_model [overload STK] +#@stk_model_/stk_get_sample_size [overload STK] +#@stk_model_/stk_get_observation_variances [overload STK] +#@stk_model_/cat [overload base] +#@stk_model_/disp [overload base] +#@stk_model_/display [overload base] +#@stk_model_/get [overload base] +#@stk_model_/horzcat [overload base] +#@stk_model_/set [overload base] +#@stk_model_/subsasgn [overload base] +#@stk_model_/subsref [overload base] +#@stk_model_/vertcat [overload base] + +Get/set model properties + stk_get_input_data + stk_get_output_data + stk_get_prior_model + stk_get_observation_variances + stk_isnoisy +#stk_set_optimizable_model_parameters [internal] +#stk_get_optimizable_model_parameters [internal] +#stk_get_optimizable_noise_parameters [internal] + +Posterior model objects + @stk_model_gpposterior/stk_model_gpposterior + @stk_model_gpposterior/stk_predict_leaveoneout + @stk_model_gpposterior/stk_model_update +#@stk_model_gpposterior/stk_covmat_noise [overload STK] +#@stk_model_gpposterior/stk_isnoisy [overload STK] +#@stk_model_gpposterior/stk_generate_samplepaths [overload STK] +#@stk_model_gpposterior/stk_get_observation_variances [overload STK] +#@stk_model_gpposterior/stk_get_optimizable_parameters [overload STK] +#@stk_model_gpposterior/stk_set_optimizable_parameters [overload STK] +#@stk_model_gpposterior/stk_get_optimizable_noise_parameters [overload STK] +#@stk_model_gpposterior/stk_get_input_data [overload STK] +#@stk_model_gpposterior/stk_get_output_data [overload STK] +#@stk_model_gpposterior/stk_get_prior_model [overload STK] +#@stk_model_gpposterior/stk_get_sample_size [overload STK] +#@stk_model_gpposterior/stk_make_kreq [internal] +#@stk_model_gpposterior/stk_predict_ [internal] +#@stk_model_gpposterior/stk_predict_leaveoneout_direct [internal] +#@stk_model_gpposterior/disp [overload base] +#@stk_model_gpposterior/fieldnames [overload base] +#@stk_model_gpposterior/get [overload base] +#@stk_model_gpposterior/set [overload base] + +## The stk_kre_qr class -> not ready to be exposed +#@stk_kreq_qr/disp [overload base] +#@stk_kreq_qr/display [overload base] +#@stk_kreq_qr/get [overload base] +#@stk_kreq_qr/linsolve [overload base] +#@stk_kreq_qr/subsref [overload base] +#@stk_kreq_qr/stk_kreq_qr [internal] +#@stk_kreq_qr/stk_set_righthandside [internal] +#@stk_kreq_qr/stk_squared_seminorm [internal] + +Model components: covariance functions + stk_expcov_aniso + stk_expcov_iso + stk_gausscov_aniso + stk_gausscov_iso + stk_materncov32_aniso + stk_materncov32_iso + stk_materncov52_aniso + stk_materncov52_iso + stk_materncov_aniso + stk_materncov_iso + stk_sphcov_aniso + stk_sphcov_iso + stk_discretecov +#stk_noisecov [deprecated] + +Model components: radial basis functions + stk_rbf_exponential + stk_rbf_gauss + stk_rbf_matern + stk_rbf_matern32 + stk_rbf_matern52 + stk_rbf_spherical + +## Note: stk_sf_* were previously considered as experimental +## -> in principle, they can be removed at any time +#stk_sf_gausscorr [deprecated] +#stk_sf_matern [deprecated] +#stk_sf_matern32 [deprecated] +#stk_sf_matern52 [deprecated] + +Model components: linear model objects + @stk_lm_affine/stk_lm_affine + @stk_lm_constant/stk_lm_constant + @stk_lm_cubic/stk_lm_cubic + @stk_lm_matrix/stk_lm_matrix + @stk_lm_null/stk_lm_null + @stk_lm_quadratic/stk_lm_quadratic + stk_lm_polynomial +#@stk_lm_affine/feval [overload base] +#@stk_lm_constant/feval [overload base] +#@stk_lm_cubic/feval [overload base] +#@stk_lm_matrix/feval [overload base] +#@stk_lm_null/feval [overload base] +#@stk_lm_quadratic/feval [overload base] + +## Model components: noise model objects +#@stk_gaussiannoise_/stk_gaussiannoise_ [internal] +#@stk_gaussiannoise_/disp [overload base] +#@stk_gaussiannoise_/stk_covmat_noise [overload STK] +#@stk_gaussiannoise_/stk_isnoisy [overload STK] +#@stk_gaussiannoise_/stk_covmat [internal] +#@stk_gaussiannoise_/stk_predict_ [internal] +#@stk_gaussiannoise_het0/stk_gaussiannoise_het0 [experimental] +#@stk_gaussiannoise_het0/stk_variance_eval [experimental] +#@stk_gaussiannoise_het0/disp [overload base] +#@stk_gaussiannoise_het0/fieldnames [overload base] +#@stk_gaussiannoise_het0/get [overload base] +#@stk_gaussiannoise_het0/set [overload base] +#@stk_gaussiannoise_het0/stk_get_optimizable_parameters [overload STK] +#@stk_gaussiannoise_het0/stk_param_getdefaultbounds [overload STK] +#@stk_gaussiannoise_het0/stk_set_optimizable_parameters [overload STK] + +Design of experiments (non-sequential): sampling + stk_sampling_halton_rr2 + stk_sampling_sobol + stk_sampling_maximinlhs + stk_sampling_nesteddesign + stk_sampling_nestedlhs + stk_sampling_olhs + stk_sampling_randomlhs + stk_sampling_randunif + stk_sampling_regulargrid + stk_sampling_vdc_rr2 + +Design of experiments (non-sequential): criteria +## note: some are in misc/design, others in misc/dist... +## Shouldn't they all be in sampling/criteria ? + stk_filldist +#stk_filldist_discretized [internal] +#stk_filldist_exact [internal] + stk_maxabscorr + stk_mindist + stk_phipcrit + +Design of experiments (sequential): criteria + stk_sampcrit_ei_eval + stk_sampcrit_ehvi_eval + stk_sampcrit_emmi_eval + stk_sampcrit_akg_eval + stk_distrib_normal_ei + stk_distrib_student_ei + +## Design of experiments (sequential): criterion objects + +#@stk_function/stk_function [experimental] +#@stk_function/disp [overload base] +#@stk_function/display [overload base] +#@stk_function/get [overload base] +#@stk_function/horzcat [overload base] +#@stk_function/subsasgn [overload base] +#@stk_function/subsref [overload base] +#@stk_function/vertcat [overload base] +#@stk_function/feval [overload base] + +#@stk_sampcrit_ei/stk_sampcrit_ei [experimental] +#@stk_sampcrit_ei/disp [overload base] +#@stk_sampcrit_ei/feval [overload base] +#@stk_sampcrit_ei/get [overload base] +#@stk_sampcrit_ei/set [overload base] + +#@stk_sampcrit_eqi/stk_sampcrit_eqi [experimental] +#@stk_sampcrit_eqi/disp [overload base] +#@stk_sampcrit_eqi/feval [overload base] +#@stk_sampcrit_eqi/get [overload base] +#@stk_sampcrit_eqi/set [overload base] + +#@stk_sampcrit_akg/stk_sampcrit_akg [experimental] +#@stk_sampcrit_akg/disp [overload base] +#@stk_sampcrit_akg/feval [overload base] +#@stk_sampcrit_akg/get [overload base] +#@stk_sampcrit_akg/set [overload base] + +Examples: kriging basics + stk_example_kb01 + stk_example_kb01n + stk_example_kb02 + stk_example_kb02n + stk_example_kb03 +#stk_example_kb04 + stk_example_kb05 + stk_example_kb06 + stk_example_kb07 + stk_example_kb08 + stk_example_kb09 + stk_example_kb10 + +Examples: design of experiments + stk_example_doe01 + stk_example_doe02 + stk_example_doe03 + stk_example_doe04 + stk_example_doe05 + stk_example_doe06 + +Examples: miscellaneous + stk_example_misc01 + stk_example_misc02 + stk_example_misc03 + stk_example_misc04 + stk_example_misc05 + +Examples: test functions, datasets, etc. + stk_dataset_twobumps + stk_testfun_borehole + stk_testfun_braninhoo + stk_testfun_goldsteinprice + stk_testfun_twobumps + stk_testcase_truss3 + stk_testfun_truss3_bb + stk_testfun_truss3_vol + +## Cf. misc/distrib/README +#stk_distrib_normal_cdf [internal] +#stk_distrib_normal_pdf [internal] +#stk_distrib_student_cdf [internal] +#stk_distrib_student_pdf [internal] +#stk_distrib_bivnorm_cdf [internal] + +## A first step towards supporting more than nomal priors... +#stk_distrib_logpdf [internal] +#stk_distrib_logpdf_grad [internal] + +Miscellaneous: arrays + stk_boundingbox + stk_feval + stk_get_sample_size + stk_normalize + stk_rescale + @stk_dataframe/stk_dataframe + @stk_factorialdesign/stk_factorialdesign + @stk_factorialdesign/ndgrid + @stk_hrect/stk_hrect +#stk_length [deprecated] + +Miscellaneous: Pareto optimality + stk_dominatedhv + stk_isdominated + stk_paretofind + +Miscellaneous: validation of models + stk_distrib_normal_crps + stk_plot_histnormres + stk_plot_predvsobs + +#stk_commonsize [internal] +#stk_sprintf [internal] +#stk_sprintf_colnames [internal] +#stk_sprintf_rownames [internal] +#stk_sprintf_sizetype [internal] + +#@stk_dataframe/stk_boundingbox [overload STK] +#@stk_dataframe/stk_conditioning [overload STK] +#@stk_dataframe/stk_get_sample_size [overload STK] +#@stk_dataframe/stk_length [deprecated] +#@stk_dataframe/stk_normalize [overload STK] +#@stk_dataframe/stk_rescale [overload STK] +#@stk_dataframe/apply [internal] +#@stk_dataframe/set_data [internal] +#@stk_dataframe/stk_sprintf [internal] +#@stk_dataframe/stk_sprintf_colnames [internal] +#@stk_dataframe/stk_sprintf_rownames [internal] +#@stk_dataframe/stk_sprintf_sizetype [internal] +#@stk_dataframe/abs [overload base] +#@stk_dataframe/acos [overload base] +#@stk_dataframe/acosd [overload base] +#@stk_dataframe/acosh [overload base] +#@stk_dataframe/asin [overload base] +#@stk_dataframe/asind [overload base] +#@stk_dataframe/asinh [overload base] +#@stk_dataframe/atan [overload base] +#@stk_dataframe/atand [overload base] +#@stk_dataframe/atanh [overload base] +#@stk_dataframe/and [overload base] +#@stk_dataframe/bsxfun [overload base] +#@stk_dataframe/cat [overload base] +#@stk_dataframe/cos [overload base] +#@stk_dataframe/cosd [overload base] +#@stk_dataframe/cosh [overload base] +#@stk_dataframe/ctranspose [overload base] +#@stk_dataframe/diff [overload base] +#@stk_dataframe/disp [overload base] +#@stk_dataframe/display [overload base] +#@stk_dataframe/double [overload base] +#@stk_dataframe/end [overload base] +#@stk_dataframe/eq [overload base] +#@stk_dataframe/exp [overload base] +#@stk_dataframe/expm1 [overload base] +#@stk_dataframe/fieldnames [overload base] +#@stk_dataframe/find [overload base] +#@stk_dataframe/ge [overload base] +#@stk_dataframe/get [overload base] +#@stk_dataframe/gt [overload base] +#@stk_dataframe/horzcat [overload base] +#@stk_dataframe/isempty [overload base] +#@stk_dataframe/isfinite [overload base] +#@stk_dataframe/isinf [overload base] +#@stk_dataframe/ismember [overload base] +#@stk_dataframe/isnan [overload base] +#@stk_dataframe/ldivide [overload base] +#@stk_dataframe/le [overload base] +#@stk_dataframe/length [overload base] +#@stk_dataframe/log [overload base] +#@stk_dataframe/log10 [overload base] +#@stk_dataframe/log1p [overload base] +#@stk_dataframe/log2 [overload base] +#@stk_dataframe/logical [overload base] +#@stk_dataframe/lt [overload base] +#@stk_dataframe/max [overload base] +#@stk_dataframe/mean [overload base] +#@stk_dataframe/median [overload base] +#@stk_dataframe/min [overload base] +#@stk_dataframe/minus [overload base] +#@stk_dataframe/mode [overload base] +#@stk_dataframe/mrdivide [overload base] +#@stk_dataframe/mldivide [overload base] +#@stk_dataframe/mtimes [overload base] +#@stk_dataframe/ne [overload base] +#@stk_dataframe/not [overload base] +#@stk_dataframe/or [overload base] +#@stk_dataframe/openvar [overload base] +#@stk_dataframe/plot [overload base] +#@stk_dataframe/plotmatrix [overload base] +#@stk_dataframe/plus [overload base] +#@stk_dataframe/power [overload base] +#@stk_dataframe/prod [overload base] +#@stk_dataframe/subsasgn [overload base] +#@stk_dataframe/subsref [overload base] +#@stk_dataframe/rdivide [overload base] +#@stk_dataframe/realpow [overload base] +#@stk_dataframe/reshape [overload base] +#@stk_dataframe/set [overload base] +#@stk_dataframe/sin [overload base] +#@stk_dataframe/sind [overload base] +#@stk_dataframe/sinh [overload base] +#@stk_dataframe/size [overload base] +#@stk_dataframe/sort [overload base] +#@stk_dataframe/sqrt [overload base] +#@stk_dataframe/quantile [overload base] +#@stk_dataframe/std [overload base] +#@stk_dataframe/sum [overload base] +#@stk_dataframe/tan [overload base] +#@stk_dataframe/tand [overload base] +#@stk_dataframe/tanh [overload base] +#@stk_dataframe/times [overload base] +#@stk_dataframe/transpose [overload base] +#@stk_dataframe/uminus [overload base] +#@stk_dataframe/unique [overload base] +#@stk_dataframe/uplus [overload base] +#@stk_dataframe/var [overload base] +#@stk_dataframe/vertcat [overload base] +#@stk_dataframe/xlim [overload base] +#@stk_dataframe/xor [overload base] +#@stk_dataframe/ylim [overload base] + +#@stk_factorialdesign/contour [overload base] +#@stk_factorialdesign/fieldnames [overload base] +#@stk_factorialdesign/get [overload base] +#@stk_factorialdesign/ismember [overload base] +#@stk_factorialdesign/mesh [overload base] +#@stk_factorialdesign/meshc [overload base] +#@stk_factorialdesign/meshz [overload base] +#@stk_factorialdesign/pcolor [overload base] +#@stk_factorialdesign/set [overload base] +#@stk_factorialdesign/subsasgn [overload base] +#@stk_factorialdesign/surf [overload base] +#@stk_factorialdesign/uminus [overload base] +#@stk_factorialdesign/stk_boundingbox [overload STK] +#@stk_factorialdesign/stk_normalize [overload STK] +#@stk_factorialdesign/stk_rescale [overload STK] +#@stk_factorialdesign/stk_dataframe [overload STK] +#@stk_factorialdesign/stk_sprintf [internal] +#@stk_factorialdesign/stk_sprintf_levels [internal] + +#@stk_hrect/axis [overload base] +#@stk_hrect/disp [overload base] +#@stk_hrect/display [overload base] +#@stk_hrect/get [overload base] +#@stk_hrect/horzcat [overload base] +#@stk_hrect/ismember [overload base] +#@stk_hrect/subsasgn [overload base] +#@stk_hrect/subsref [overload base] +#@stk_hrect/vertcat [overload base] +#@stk_hrect/stk_boundingbox [overload STK] +#@stk_hrect/stk_normalize [overload STK] +#@stk_hrect/stk_rescale [overload STK] +#@stk_hrect/stk_dataframe [overload STK] + +Miscellaneous: optimizers for parameter estimation + stk_minimize_boxconstrained + stk_minimize_unconstrained + stk_optim_isavailable + @stk_optim_fmincon/stk_optim_fmincon +#@stk_optim_fmincon/stk_minimize_boxconstrained [overload STK] + @stk_optim_fminsearch/stk_optim_fminsearch +#@stk_optim_fminsearch/stk_minimize_unconstrained [overload STK] +#@stk_optim_fminsearch/stk_minimize_boxconstrained [overload STK] + @stk_optim_octavesqp/stk_optim_octavesqp +#@stk_optim_octavesqp/stk_minimize_boxconstrained [overload STK] +#@stk_optim_octavesqp/stk_minimize_unconstrained [overload STK] +#stk_optim_testmin_box [internal] +#stk_optim_testmin_unc [internal] +#@stk_optim_optimizer_/stk_optim_optimizer_ [internal] +#@stk_optim_optimizer_/stk_optim_isavailable [overload STK] + +Miscellaneous: options, plots... + stk_dist + stk_halfpintl + stk_init + stk_legend + stk_options_get + stk_options_set + stk_plot1d +#stk_plot_shadedci [internal] + stk_plot_probdom2d + stk_version + +Miscellaneous: unit tests + stk_test + stk_runtests + +#stk_gpquadform [experimental] + +## Replacement for some base functions related to figures. Mostly for use +## in STK's examples, to keep consistent graphical options accross all +## examples. No need to let these appear in the INDEX. +#stk_axes [internal] +#stk_figure [internal] +#stk_plot_getaxesarg [internal] +#stk_labels [internal] +#stk_subplot [internal] +#stk_title [internal] +#stk_xlabel [internal] +#stk_ylabel [internal] +#stk_zlabel [internal] + +## error/warning +#stk_error [internal] +#stk_assert_box [internal] +#stk_assert_no_duplicates [internal] +#stk_assert_model_struct [internal] +#stk_isequal_tolabs [internal] +#stk_isequal_tolrel [internal] +#stk_is_lhs [internal] +#stk_test_class [internal] +#stk_test_dfbinaryop [internal] +#stk_test_critgrad [internal] + +## misc/text +#stk_disp_examplewelcome [internal] +#stk_disp_progress [internal] +#stk_disp_isloose [internal] +#stk_disp_getformat [internal] +#stk_sprintf_colvect [internal] +#stk_sprintf_colvect_fixedpoint [internal] +#stk_sprintf_colvect_scientific [internal] +#stk_sprintf_framed [internal] + +## (embryonic) parallelization engine +#@stk_parallel_engine_none/stk_parallel_engine_none [experimental] +#@stk_parallel_engine_none/stk_parallel_feval [experimental] +#@stk_parallel_engine_none/stk_parallel_stop [experimental] +#@stk_parallel_engine_parfor/stk_parallel_engine_parfor [experimental] +#@stk_parallel_engine_parfor/stk_parallel_feval [experimental] +#@stk_parallel_engine_parfor/stk_parallel_stop [experimental] +#stk_parallel_cutblocks [experimental] +#stk_parallel_engine_get [experimental] +#stk_parallel_engine_set [experimental] +#stk_parallel_feval [experimental] +#stk_parallel_start [experimental] +#stk_parallel_stop [experimental] diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..f19ce44 --- /dev/null +++ b/NEWS @@ -0,0 +1,1255 @@ +# Changes in version 2.7.0 + +## Required Matlab/Octave version + +* Required Matlab version number has been raised to R2009b. + +* Required Octave version number has been raised to 4.0.0. + +## Prediction + +* `stk_predict.m` now officially supports a shorter calling syntax: + + [zp, ...] = skt_predict (model, x_prd) + + that can be used either to compute predictions from any type of + model (proper prior model structures, posterior model object, + (experimental) noise model objects, etc.). + +* `@stk_model_gpposterior/stk_predict.m`: no longer exists. The base + `stk_predict` function now provides the recommended interface for + all possible types of models, and then dispatches to the (new) + internal function `stk_predict_` to do the actual computations (but + do not rely on it directly, since this is an internal function). + +## Models + +* `get_input_data`, `get_output_data`, `get_prior_model`: Removed + (these getters were already deprecated, cf. STK 2.6.0 release notes). + +## Arrays + +* `stk_dataframe` arrays now possess a `sample_size` property, which + can be read using the usual dot-indexing notation or through the + (slightly faster) getter `stk_get_sample_size`. + +* `stk_model_gpposterior` objects also have a `sample_size` property, + which corresponds to the sample size of the underlying data set and + can be read similarly. + +* `stk_length`: deprecated (use `stk_get_sample_size` instead). + +* `@stk_model_gpposterior/stk_{set,get}_optimizable_parameters.m`: Fix + a bug (erroneous property name). + +## Sequential design of experiments + +* `@stk_sampcrit_akg/set.m`: Remove replicated input points when the AKG + reference grid is construted using Scott's original method (i.e., taking + past observations points plus the candidate point). + +## Examples + +* `stk_example_kb07.m`: Add a second figure where nu is fixed to 5/2 + and rho varies. + +* `stk_example_doe05.m`: Make it possible to use the exact KG criterion + instead of Scott's approximation (previously, only the latter was + proposed). + +* `stk_example_doe06.m`: New example script, which illustrates a + simple sequential design strategy to estimate an excursion set + (failure region) and its volume (probability of failure). + +## Miscellaneous + +* `stk_init.m`: Make STK startup faster. + +* `startup.m`: Run `stk_init` automatically for in-place use. + +* `stk_select_optimizer.m`, `stk_optim_hasfmincon.m`: Removed + (had been deprecated since 2015, and were never part of the public API). + +* `README.md`: Explain how to initialize STK when using the Parallel + Computing Toolbox in Matlab, by means of the `pctRunOnAll` function. + +* Internal: source formatting, comments, etc. + +----- + + +# Changes in version 2.6.1 + +## Documentation + +* `stk_factorialdesign`: Provide missing help text. + ([ticket #91](https://sourceforge.net/p/kriging/tickets/91/)) + +* Fix HTML doc (`INDEX` structure was broken). + + +# Changes in version 2.6.0 + +## Required Octave version + +* Required Octave version number has been raised to 3.8. + +## Parameter estimation + +* `stk_param_init`: The syntax with an additional `do_estim_lnv` + parameter is now deprecated. Set model.lognoisevariance to NaN if + you want an initial estimate for the variance of the noise. + +* `stk_param_init_lnv`: Refuse noiseless models (error). + +* `stk_model_gpposterior`: Trigger parameter estimation when + lognoisevariance is NaN. In the (experimental) case where + lognoisevariance is a noise model object, parameter estimation is + triggered as soon as at least one of the optimizable parameters of + the model is NaN. + ([ticket #93](https://sourceforge.net/p/kriging/tickets/93/)) + +* `stk_param_relik`: Return [] instead of NaN when the derivative with + respect to lnv is requested for a noiseless model. + +* `stk_param_relik`: Detect duplicated observation points automatically + and raise an error for noiseless models. + +* `stk_param_getdefaultbounds`: Estimation bounds for the regularity + parameter of the Matérn covariance function are now customizable through + the options `nu_min_dimfun` and `nu_max_dimfun`. + +## Covariance functions + +* Deprecated: `stk_noisecov`. + +## Models + +* `stk_get_input_data`, `stk_get_output_data`, `stk_get_prior_model`: + New getters for model properties, that replace `get_input_data`, + `get_output_data` and `get_prior_model` respectively (now deprecated). + +* `stk_get_observation_variances`: New getter, which returns the + vector of variances associated to the observations that have been + used to build a model. + +* `stk_gaussiannoise_`, `stk_gaussiannoise_het0`: New classes + representing Gaussian noise models. Currently in experimental + state, these two classes are merely a proof-of-concept. Other noise + model classes can be defined by subclassing `stk_gaussiannoise_`. + ([ticket #38](https://sourceforge.net/p/kriging/tickets/38/)) + +* `stk_example_misc05`: Demonstrate the use of noise model objects + to estimate the dispersion parameter in an heteroscedatic case. + +* `stk_simulate_noise`: New function to simulate noise sample replicates. + +## `stk_dataframe` and related classes + +* `stk_dataframe`: Accept char vectors (or strings) as `colnames` or + `rownames` argument when there is only one column or one row + ([ticket #92](https://sourceforge.net/p/kriging/tickets/92/)) + +* `@stk_dataframe/sort`: Argument `dim` can now be skipped, as in the + base `sort` function. + +* `@stk_dataframe/unique`: Overload base function. + +## Graphics + +* `stk_plot1d`: Do not create a legend systematically. + ([ticket #82](https://sourceforge.net/p/kriging/tickets/82/)) + +* `stk_legend`: New function to create a legend, using the graphical + objects for which a non-empty DisplayName has been provided. + +* `stk_plot_shadedci`: Change gray levels and improve legend. + +## Miscellaneous + +* `stk_options_set`: Make it possible to set all options at once using + an option structure. Add help text. + +* `stk_runtests`: Return test results in a structure. + +* `stk_sampling_nesteddesign`: Fix help text. + +----- + + +# Changes in version 2.5.1 + +## Bug fixes + +* `stk_dominatedhv`: Workaround for Octave 4.4 issue + ([ticket #89](https://sourceforge.net/p/kriging/tickets/89/)) + +## Miscellaneous + +* Documentation fixes. + +* `stk_option_set`: Return option struct only if `nargout > 0`. + + +# Changes in version 2.5.0 + +## Required Octave version + +* Required Octave version number has been raised to 3.6.0. + +## Sequential design of experiments + +* `stk_sampcrit_akg_eval`: New function. Computes the Approximate + Knowledge Gradient (AKG) sampling criterion. + +* `stk_example_doe05`: Example script that demonstrates the use of the AKG + and EQI sampling criteria for noisy optimization. + +* New (experimental) classes to represent sampling criterion objects: + `stk_sampcrit_ei`, `stk_sampcrit_akg`, `stk_sampcrit_eqi`. + +* `stk_sampcrit_ei_eval`: Remove deprecated calling forms. + +## Design of experiments + +* `stk_factorialdesign`: Accept one-variable `stk_dataframe` objects as + factors and preserve column names in this case. + +* `stk_sampling_nesteddesign`: New function to create nested designs. + +* `stk_sampling_nestedlhs`: New function to create nested LHS (NLHS). + +* `stk_sampling_sobol`: Fix help text. + +## Validation of models + +* `stk_distrib_normal_crps`: New function to compare observations and + predictive (Gaussian) density. + +* Calling `stk_predict_leaveoneout` with no output arguments now + automatically creates two cross-validation diagnostics in two subplots: + prediction VS observations (left panel) and normalized residuals (right + panel). + +* `stk_predict_leaveoneout` uses now the virtual LOO formula. + +## `stk_dataframe` and related classes + +* `stk_hrect`: Preserve column names for `stk_dataframe` inputs. + +* `@stk_dataframe/find`: Overload base function to support calling find + with an stk_dataframe as first input argument. + +* `@stk_dataframe/plotmatrix`: Overload base function to enrich + `plotmatrix` graphics with variable names when possible. + +* Logical functions + + + Operations that normally return logical (`lt`, `eq`, `and`...) now + return logical values for `stk_dataframe` arguments. + + + New overloaded functions for `stk_dataframe` objects: `isinf`, + `isnan`, `isfinite`. + +* Testing array membership + + + `@stk_dataframe/ismember`: No longer assumes `rows` flag for + consistency with the base `ismember` function. + + + `stk_factorialdesign/ismember`: New function. Tests membership + for factorial designs much more efficiently than for plain arrays + or data frames. + +* `stk_generate_samplepaths` now returns a plain numerical array instead of + a data frame. + +## Miscellaneous + +* `stk_plot_probdom2d`: New function to represent the uncertainty about a + 2D Pareto front. This function is currently considered experimental and + should not be expected to produce a reliable representation of the + uncertainty for difficult or high-dimensional optimization problems. + +* New test case: "truss3" (Koski, 1985; Das, 1997). + +* Many functions have been optimized for speed. + +* `stk_plot1d`: Handle the case where `xt` is not sorted. + +* Support old-style STK structures (with a `.a` field) has been removed. + +----- + + +# Changes in version 2.4.2 + +## Bug fixes + +* Fix display problem of `stk_model_gpposterior` objects in Octave 4.2 + (ticket #73). + + +# Changes in version 2.4.1 + +## Bug fixes + +* `stk_pmisclass`: Handle properly the case where `K22` is negative or + null. + +* `stk_get_optimizable_parameters`, `stk_get_optimizable_parameters`: Fix + syntax errors. + +* `stk_param_estim`: Issue a better error message when `LNV0` (the starting + point for the estimation of the lognoisevariance parameter) is either + `NaN` of infinite (ticket #72). + +## Sampling criteria + +* `stk_sampcrit_ei_eval`: The function now has a new syntax. The other + syntaxes, introduced (accidentally) in STK 2.4.0, will remain supported + in 2.4.x, but are deprecated and will be removed in a future release. + +* Unlike the older `stk_distrib_normal_ei` function, `stk_sampcrit_ei_eval` + is written for a *minimization* problem, following the usual convention + in optimization software. + +* From now on, it is recommended to use `stk_sampcrit_ei_eval` instead of + `stk_distrib_normal_ei`. + +* `stk_sampcrit_emmi_eval`: Now accepts for the input argument `ZI` a set + of observations that contains dominated solutions (rows). Dominated rows + and duplicates are removed automatically, as in `stk_sampcrit_ehvi_eval`. + +## Documentation + +* `stk_pmisclass`, `stk_sampcrit_ei_eval`, `stk_sampcrit_ehvi_eval`: Help + text has been added for all these functions. + + +# Changes in version 2.4.0 + +## Choosing the optimizer used in `stk_param_estim` + +* The choice of the optimization algorithm used in `stk_param_estim` is now + much more flexible, thanks to a new interface based on "optimizer object" + classes. + +* The following classes are currently available: `@stk_optim_octavesqp`, + `@stk_optim_fmincon`, `@stk_optim_fminsearch`. + +* `stk_optim_octavesqp` works both in Octave and in Matlab, with two + possible choices for the QP solver: `qp` (available in Octave only, this + is Octave's core `qp` function) and `quadprog` (available in Matlab from + the Optimization toolbox or from MOSEK; should be available in Octave's + optim package soon). + +* Automatic detection of available optimizers. + +* `stk_minimize_boxconstrained` (new function): Perform box-constrained + minimization of a function. This function is overloaded for each + optimizer object class that supports box-constrained optimization. + +* `stk_minimize_unconstrained` (new function): Perform unconstrained + minimization of a function. This function is overloaded for each + optimizer object class that supports unconstrained optimization. + +## Covariance functions + +* It is now possible to specify default bounds for the estimation of the + parameters in a user-defined covariance function. See the documentation + of `stk_param_getdefaultbounds` for more information. + +* Experimental/undocumented feature: it is possible to provide a + specialized `stk_param_init` function for user-defined covariance + functions. Read `stk_param_init` if you need to do this. (This feature + might be removed or modified in future releases.) + +* Radial basis functions (old and new): + + + `stk_rbf_matern`, `stk_rbf_matern32`, `stk_rbf_matern52` and + `stk_rbf_gauss` (previously available internally as `stk_sf_*` + functions). + + New: `stk_rbf_exponential`, `st_rbf_spherical`. + + Bugfix: `stk_rbf_matern32`, `stk_rbf_matern52` return 0 for very large + `h`, where `stk_sf_matern32` and `stk_sf_matern52` returned NaN. + +* New covariance functions + + + Exponential (aka Matérn 1/2): `stk_expcov_iso`, `stk_expcov_aniso` + + Spherical: `stk_sphcov_iso`, `stk_sphcov_aniso` + +## Linear models + +* `model.lm` and linear model objects (`stk_lm_*` classes), introduced as + an experimental feature in STK 2.2.0, are now the recommended way of + setting the linear part of Gaussian process models. + +* `model.order` is deprecated (but still supported). + +* As an example, the following define a Gaussian process with a Matérn 5/2 + covariance function and a quadratic trend: + + model = stk_model ('stk_materncov52_aniso'); + model.lm = stk_lm_quadratic; + +* `stk_lm_polynomial` (new function): Create a polynomial model of given + degree, up to cubic models. + +## `stk_model_gpposterior` objects + +* A new `stk_model_gpposterior` class is introduced to represent a Gaussian + process conditioned by observations (which is again Gaussian process). + +* Internally, an `stk_model_gpposterior` object currently stores the QR + factorization of the associated kriging matrix (other representations + will be implemented in the future). + +* `stk_predict` is overloaded for `stk_model_gpposterior` objects. + +* `stk_model_update` (new function): Update a model with new observations. + +## Space-filling designs + +* `stk_sampling_sobol`: New function to generate points from a Sobol + sequence using the algorithm of Bratley and Fox (1988), as modified by + Joe and Kuo (2003). The C implementation under the hood is due to Steven + G. Johnson, and was borrowed from the NLopt toolbox (version 2.4.2). + +## Sampling criterions for sequential designs + +* `stk_sampcrit_ei_eval` (new function): Compute the expected improvement + (EI) criterion for single-objective noiseless optimization. + +* `stk_sampcrit_ehvi_eval` (new function): Compute the expect hyper-volume + improvement (EHVI) criterion (Emmerich, Giannakoglou & Naujoks, 2006) for + multi-objective noiseless optimization. This function implements an + exact computation of the EHVI criterion, using a decomposition of the + dominated region into hyper-rectangles. + +* `stk_sampcrit_emmi_eval` (new function): Compute the expected maximin + improvement (EMMI) criterion for multi-objective noiseless optimization + (Svenson & Santner, 2010). + +## Miscellaneous + +* `stk_pmisclass` (new function): Compute either the current probability of + misclassification or the expectation of the future probability of + misclassification, with respect to a given threshold. + +* `stk_dominatedhv` (new function): Compute Pareto-dominated hypervolumes, + which relies internally on the "Walking Fish Group" (WFG 1.10) + algorithm. The function can also return the underlying + inclusion-exclusion representation of the dominated region, i.e., its + representation as a collection of signed overlapping hyper-rectangles. + +* `stk_predict_leaveoneout`: New function that computes leave-one-out + predictions and residuals. + +* `stk_isnoisy` (new function): Returns false for a noiseless model and + true otherwise. + +## Graphics + +* All STK functions related to graphics now accept a handle to existing + axes as optional first input argument, and return a handle (or a vector + of handles when appropriate) to the graphical object created by the + function. + +* STK is now compatible with Matlab >= R2014b, where handles to graphical + objects are not numbers any more. + +* `stk_plot1d`: A nice default legend can now be created painlessly using + legend ('show'), and a struct of handles to the graphical objects + composing the plot is returned to facilitate further customization. See, + e.g., examples 1 and 2 in the "kriging basics" series. + +* `stk_plot2d`: Removed (had been deprecated for a while). + +* `stk_plot_predvsobs` (new function): Plot predictions against observations. + +* `stk_plot_histnormres` (new function): Plot histogram of normalized + residuals, together with the N(0, 1) pdf as a reference. + +## Examples + +* `stk_example_doe04`: Example script that demonstrates the use of + `stk_pmisclass`. + +* `stk_example_kb10`: Example script that demonstrates the use of + leave-one-out cross-validation to produce goodness-of-fit graphical + diagnostics. + +* `stk_testfun_borehole` (new function): New test function (the "borehole + model" response function, from Harper & Gupta 1983). + +* `stk_testfun_twobumps` (new function): A simple 1D test function. + +* `stk_dataset_twobumps` (new function): Define three datasets based on the + TwoBumps test function. + +## stk_dataframe class + +* New overloaded functions for stk_dataframe objects: `acos`, `acosd`, + `acosh`, `asin`, `asind`, `asinh`, `atan`, `atand`, `atanh`, `cos`, + `cosd`, `cosh`, `exp`, `expm1`, `log`, `log10`, `log1p`, `log2`, + `logical`, `sin`, `sind`, `sinh`, `sqrt`, `tan`, `tand`, `tanh`. + +* `@stk_dataframe/bsxfun`: Now preserve row names if possible. + +* `@stk_dataframe/openvar` (new function): Convert `stk_dataframe` object + to table or double array before opening it the variable editor. + +* `stk_dataframe` arrays now accept characters indices (row/column names) + and cell array indices (list of row/column names). + +* The `info` field is deprecated. + +## Other minor changes + +* `stk_plot_shadedci`: Delete invisible area object. + +* `@stk_hrect/ismember`: Optimize for speed. + +* `stk_predict`: In the case of discrete models, row input vectors are no + longer accepted. + +* `stk_runtests`: Now also available in the Octave package release, to + provide a convenient wrapper around __run_test_suite__ (). + +* `stk_maxabscorr`: No longer relies on corr (). + +* `stk_kreq_qr`: Now has a default constructor, which allows to load saved + `stk_kreq_qr` objects properly. + +----- + + +# Changes in version 2.3.4 + +## Bug fixes + +* `@stk_hrect/ismember`: Fix + + + a bug that prevented `ismember` from working on more than one point at + a time, and + + another bug in the case where `B` is not an `stk_hrect` object (it was + incorrectly assumed to be an `stk_dataframe` in this case). + +* `@stk_hrect/subsref`: Make sure that the returned value is still an + `stk_hrect` object when the number of rows (which is two) is unchanged. + +## Minor changes + +* Add a `clean` target to the Octave package Makefile. + +* Decrease unit test verbosity. + + +# Changes in version 2.3.3 + +## Bug fixes + +* `stk_dist`, `stk_filldist`, `stk_gpquadform`, `stk_mindist`: Fix segmentation + faults occurring with very large matrices (related to signed + integer-based index computation in the underlying MEX-files). + +* `stk_example_doe03`: Use the appropriate flag for maximization. + +* `mole/matlab/file_in_path.m`: Fix two bugs (Matlab only) + +## Minor changes + +* `stk_example_doe03`: Display pointwise credible intervals in the upper + panel. + + +# Changes in version 2.3.2 + +## Bug fixes + +* `stk_param_estim`: Fix a bug related to parameter objects. More + precisely, use `(:)` indexing systematically to access the vector of + numerical parameters corresponding to a given parameter object. + +* `@stk_kreq_qr/get`: Fix a call to `dot` to make it work when there is + only one observation. + +* Add missing field "Depends" to the `DESCRIPTION` file in the Octave + package. + +## Minor changes + +* `stk_param_getdefaultbounds`: Return empty lower and upper bounds for + parameter classes that do not implement the `stk_param_getdefaultbounds` + (instead of calling `error`). + +* Add optional field "Autoload" to the `DESCRIPTION` file in the Octave + package. + + +# Changes in version 2.3.1 + +## Bug fixes + +* `stk_optim_hasfmincon`: Detect `fmincon` by trying to use it, instead of + relying on the result of the `exist` function (ticket #30 closed). + +* `stk_param_estim`: Make sure that the bounds that we use for the `lnv` + parameter contain the starting point `lnv0` when it is provided. + +* `@stk_dataframe/set`: Fix `stk_error` calls (missing mnemonic). + +* `stk_distrib_bivnorm_cdf`: Fix a bug in the case of mixtures of singular + and non-singular cases. + +* `@stk_dataframe/subsasgn`: Preserve column names when deleting rows, even + if the resulting array is empty. + +## Minor changes + +* `stk_init`: Clear persistent variables. As a consequence, `stk_init` can + now be used to restart STK completely. + +* `stk_commonsize`: Accept empty dimensions, under the condition that all + input arguments have the same empty dimensions (in which case the result + is empty). + +* `stk_commonsize`: is now faster when some arguments already have the + proper size (unnecessary calls to `repmat` are avoided). + +* `stk_distrib_normal_cdf`, `stk_distrib_bivnorm_cdf`: are now slightly + faster (unnecessary calls to `stk_commonsize` are avoided). + + +# Changes in version 2.3.0 + +## Model structures + +* `lognoisevariance` is now considered a mandatory field. For backward + compatibility, a missing or empty lognoisevariance field is interpreted + as `-inf`. A NaN value in the lognoisevariance field is now interpreted + as meaning that the variance of the noise must be estimated. + +* `model.param` is set to NaN by `stk_model`. This special value indicates + that the parameters must be estimated from the data before any prediction + can be done. + +* Improved documentation for `stk_model`. + +## Parameter estimation + +* `stk_param_init` defaults to using the input value of + `model.lognoisevariance` if it is not NaN, and estimating the variance if + it is NaN. The meaning of the fifth argument, now called `DO_ESTIM_LNV`, + has thus slightly changed: it is used to force or prevent the estimation + of the variance of the noise, regardless of the value of + `model.lognoisevariance`. + +* `stk_param_init` also supports the heteroscedastic noisy case, but only + when the variance of the noise is assumed to be known. + +* `stk_param_init_lnv` is a new function that provides a rough estimate of + the variance of the noise (in the spirit of `stk_param_init`). + +* `stk_param_estim` estimates the variance of the noise if either + + + `param0lnv` is provided and is not empty (as in STK <= 2.2.0), or + + `model.lognoisevariance` is NaN (new behaviour). + + If `param0lnv` is not provided, a starting point is obtained using the + new `stk_param_init_lnv` function. In all cases (whether `lnv` is + estimated or not) a meaningful value is returned for `lnv` (equal to + `model.lognoisevariance` when `lnv` is not estimated). + +* `stk_param_estim` can provide a value for `param0` when it is missing + from the list of input arguments. + +* `stk_param_relik`: Compute `G = W' * K * W` in such a way that the result + is always (?) symmetric. + +## Prediction + +* `stk_predict` computes `lambda_mu` and `RS` only when necessary, depending on + the number of output arguments. + +## Covariance functions + +* `stk_noisecov` now has a `pairwise` argument, like the others. + +## Sampling + +* `stk_sampling_randunif` accepts empty dim argument when `box` is provided + +## Simulation of Gaussian process sample paths + +* `stk_generate_samplepaths`: Do not add observation noise to the generated + sample paths. This is consistent with `stk_predict`, which returns + posterior variances for the unknown function, not for future noisy + observations. + +* `stk_conditioning`: Simulate sample paths conditioned on noisy + observations when the additional `NOISE_SIM` argument is provided. + +* `stk_generate_samplepaths`: Fix conditioning on noisy observations, which + was not implemented properly until now. + +* `stk_generate_samplepaths`: The output is an `stk_dataframe` object if + either `MODEL.response_name` exists and is a non-empty string, or one of + the input arguments (`XI`, `ZI`, `XT`) is an `stk_dataframe` object. + +* `stk_conditioning`: The output is an `stk_dataframe` object if either + `LAMBDA` or `ZSIM` is an `stk_dataframe` object. + +## Objects representing sets + +* `stk_hrect`: new class to describe hyper-rectangle objects. + +* `stk_boundingbox`: constructs the bounding box for a set of points. + +## Examples + +* `stk_example_kb04` demonstrates how it is possible to estimate the + variance of the noise without providing a initial guess for it. + +* `stk_example_kb09` demonstrates how to simulate conditional sample paths + in the case of noisy observations, both in the homoscedastic and in the + heteroscedastic cases. + +## Miscellaneous + +* `stk_distrib_bivnorm_cdf` computes bivariate normal probabilities. + +* `stk_disp_progress`: New function that displays a textual progress + indicator. + +* `stk_feval` handles cell-arrays of functions (ticket #19 closed), + multivariate outputs (ticket #20 closed), and uses vectorized calls by + default (unless a progress indicator is displayed). + +* `sort`, `mtimes`, `uplus` and `uminus` are now overloaded for + `stk_dataframe` objects + +* `min`, `max` are now able to return a second output argument (index of + mininizer or maximizer) for `stk_dataframe` arguments. + +* Now the output of `stk_dataframe` is always an `stk_dataframe` object. + Previously, this wasn't true if the first input argument was, e.g., an + `stk_factorialdesign` object. + +* `stk_distrib_normal_ei`, `stk_distrib_student_ei`: bugfix (the optional + input argument "minimize" was not taken into account). + +* `stk_distrib_normal_cdf`: Fix the zero-variance case. + +----- + + +# Changes in version 2.2.1 + +## Octave 4.0 compliance + +* Fix unit tests + +## Octave package + +* Do not ship `stk_test` and `stk_runtests` with the Octave package + + +# Changes in version 2.2.0 + +## Octave package + +* The STK is now available both as an "all-purpose" Matlab/Octave toolbox + (as usual) and as a full-fledged Octave package that can be installed + using `pkg install`. + +## Core + +* `stk_model` now also accepts function handles for `covariance_type`. + +* `stk_ortho_func` is deprecated and will be completely replaced, in the + 3.x series, by linear model objects. In the meantime, `stk_ortho_func` + has been kept as a gateway to `stk_lm_*` functions and now supports the + case of cubic polynomial models. + +* `stk_cholcov`: new function that adaptively adds a little bit of noise on + the diagonal of a covariance matrix to help `chol` succeed, when the + first factorization returned by `chol` is not complete (a warning is + emitted when doing so). Used in `stk_param_init`, `@stk_kreq_qr/get`, + `stk_param_relik`... + +* `@stk_kreq_qr`: heuristic improvement of numerical conditioning + (implemented in the new private function `compute_P_scaling`). + +## Covariance functions + +* Accept `invRho = 0` in anisotropic covariance functions. + +* `stk_sf_matern`: Handle special cases (3/2, 5/2, infinity) explicitly, + and handle large values of the smoothness parameter `nu` better. + +* Handle the case of Gaussian isotropic and anisotropic covariance + functions in `stk_param_init` and `stk_param_getdefaultbounds`. + +## Linear models + +* Introduce linear models objects. Currently, the following linear model + object classes are available: `stk_lm_null`, `stk_lm_constant`, + `stk_lm_affine`, `stk_lm_quadratic`, `stk_lm_cubic` and `stk_lm_matrix`. + +* Linear model objects are still considered an experimental feature. They + can be accessed by setting `model.order` to NaN, in which case `model.lm` + is expected to contain a linear model object. + +* `stk_example_misc03`: New example script that demonstrates the use of + linear model objects. + +## Sample path simulation (`stk_generate_samplepaths`) + +* The simulation of conditioned sample paths has been made easier (see + ticket #3 on SF). This is demonstrated by `stk_example_kb08`. + +* Now uses `model.response_name` (if available) to create column names for + the output array, and `xt.rownames` (if available) to create row names. + +* `stk_generate_samplepaths` can deal with replicated rows in `xt`. + +## Parameter estimation + +* `stk_param_estim` + + * Warn about constant-response data. + * Return an additional `info` structure, which currently contains the + criterion that has been used, the criterion value at the optimum, and + the bounds. + * Add a new (optional) input argument that will make it possible, + in the future, to select which estimation criterion to use. + +* `stk_param_relik` + + * Check symmetry of `G = W' * K * W` and apply a naive fix if it is not + (emit a warning when doing so). + * Improved implementation, which seems to reduce the number of warnings + related to bad conditioning, and also improve the performance for + large `n` (about 1000, say). + +* New optimization options (can bet set through `stk_options_set`) + + * Add global options to control upper/lower bounds for `stk_param_estim`. + * (Matlab) Add a `optim_display_level` option to control the verbosity + `fmincon`/`fminsearch`. Its default value is `'off'`. + +* `stk_param_gls`: new function that computes the GLS estimator. + +## Array objects (`stk_dataframe`, `stk_factorialdesign`) + +* `stk_length`: New function that returns the "length" of an array, + currently defined as its number of rows. + +* Improved display for both `stk_dataframe` and `stk_factorial` objects + +* Fix and improve accessors (`subsasgn`, `subsref`, `set`, `get`, + `fieldnames`) + +* Minimalist support for linear indexing on `stk_dataframe` objects + +* New overloaded methods: `@stk_dataframe/abs`, `@stk_dataframe/reshape` + +* `@stk_dataframe/plot`: Full rewrite to improve compatibility with the + base plot function. The case where `x` is an `stk_dataframe` objects with + two or more columns is now handled in a way that is consistent with the + base plot function (i.e., if `x` has two columns, then we get two 1D + plots). + +* `@stk_dataframe/horzcat`, `@stk_dataframe/vertcat`: Now the result is + always an `stk_dataframe` object, and has row names iff either one of the + two arguments doesn't have row names, or the row names of both arguments + agree. + +* `@stk_dataframe/bsxfun`: Modify the behaviour of `bsxfun` for + `stk_dataframe` objects. The result is always an `stk_dataframe` object, + and has column names iff either one of the two arguments doesn't have + columns names or the columns names of both arguments agree. + +## Graphics + +* `stk_plot2d` is deprecated and will be removed in the 3.x series. Use + `contour`, `mesh`, `surf`... directly instead (they are now overloaded + for `stk_factorialdesign` objects). + +* `stk_plot1d`: Improved flexibility in the way input arguments are + handled. + +* `stk_figure` does not set the axis title any more. + +## Pareto domination + +* `stk_isdominated`: New function that returns true for dominated rows. + +* `stk_paretofind`: New function that finds non-dominated points. + +* `stk_example_misc04`: New example script illustrating random Pareto fronts. + +## Faster and less verbose startup + +* Stop bothering users at startup with information that they can find in + the `README` file anyway. + +* Don't display selected optimizers at startup. + +* In Matlab, don't bother checking if the PCT is installed. + +## Documentation + +* New HTML documentation, available in the "all-purpose" Matlab/Octave + release (doc/html directory) and online on Source-Forge at + . + +* Lots of fixes and improvements in help texts. + +* Add a `CITATION` file, which explains how to cite STK in publications. + +* `stk_testfun_braninhoo`: Fix domain bounds in the documentation. + +## Miscellaneous + +* Options set/get + + * `stk_options_set`: Add a reset feature. + * `stk_options_set`: Prevent persistent from being cleared (bugfix) + +* Remove `page_screen_output` (not needed anymore). + +* Restore the `stk_` prefix for `distrib_*` functions (`distrib_normal_cdf` + is renamed to `stk_distrib_normal_cdf`, `distrib_student_ei` to + `stk_distrib_student_ei`, etc.) + +* Lots of internal changes, minor changes, etc. not worth mentioning here. + +----- + + +# Changes in version 2.1.1 + +## Bug fix + +* Fix a bug in `stk_param_init`. + +## Minor changes + +* Add size checks to several functions. + +* Warn Octave users about the problem with MEX-files in privates folders: + Octave must be restarted when `stk_init` is run for the first time. + + +# Changes in version 2.1.0 + +## How to get help + +* Several ways to get help, report bugs or ask for new features on + Sourceforge are now proposed to the user (both in `README` or + `stk_init.m`) + +## Examples + +* Existing examples have been improved: descriptions rewritten; graphical + options controlled globally thanks to dedicated plotting functions + (`stk_figure`; `stk_subplot`, `stk_axes`, `stk_title`...); + lots of + minor changes + +* New examples + + * kb06: ordinary kriging VS linear trend + * kb07: simulations of Matérn sample paths with different various `nu` + * doe03: one-dimensional Bayesian optimization (expected improvement) + +## Covariance functions + +* New function: `stk_gausscov_iso` (isotropic Gaussian covariance model) + +* New function: `stk_gausscov_aniso` (anisotropic Gaussian covariance model) + +## Special functions + +* The precision of `stk_sf_matern` has been improved around 0 for high `nu` + +* New function: `stk_sf_gausscorr` (Gaussian correlation function in 1D) + +## Design of experiments + +* New function: `stk_phipcrit` (phi_p criterion for space-filling designs) + +* New function: `stk_maxabscorr` (maximal pairwise absolute correlation) + +## Probability distributions + +* A new 'probability distributions' module has been initiated (read + `misc/distrib/README` to understand the reasons why) + +* Currently provides: pdf, cdf and expected improvement (EI) for the + Gaussian and Student t distributions + +## Matlab/Octave compatibility + +* Matlab/Octave compatibility throughout all supported releases has been + strengthened, thanks to the creation of a Matlab/Octave Language + Extension (MOLE) module + +* octave_quantile removed; instead, a replacement for `quantile` is + provided by the MOLE when needed. + +* new function `graphicstoolkit`, providing a kind of replacement for + `graphics_toolkit`, that also work in Matlab and old Octave releases + +* ... + +## Miscellaneous + +* `stk_plot1dsim` has been removed (use `stk_plot1d` instead) + +* plotting functions now work directly on the current axes + +* An optional `box` argument has been added to `stk_sampling_halton_rr2` + +* `stk_feval` now uses input row names for its output + +## Bugfixes + +* `@stk_kreq_qr/stk_update` is now (inefficient but) working + +* `isequal` is now working for `stk_dataframe` and `stk_kreq_qr` objects in + Octave 3.2.x (explicit overloading was required for these old releases) + +* and many other tiny little things + +----- + + +# Changes in version 2.0.3 + +## Bug fix + +* Fix a bug `core/stk_predict.m` (related to blockwise computations) + + +# Changes in version 2.0.2 + +## Bug fixes + +* Fix a bug in `@stk_dataframe/subsref` (handle colnames properly when + ()-indexing is used to extract a subset of rows). + +* Fix a bug in `@stk_dataframe/stk_dataframe` (make sure that `.data` + contains numerical data) and add a copy constructor. + + +# Changes in version 2.0.1 + +## Bug fixes + +* Fix a bug in `stk_predict` (don't compute the optional outputs `lambda` + and `mu` when they are not requested by the caller). + +* Fix a bug in `stk_sampling_olhs` (fail neatly when called with n = 2). + + +# Changes in version 2.0.0 + +## Required Octave version number + +* Required Octave version number has been raised to 3.2.2. + +## Important changes to the public API + +* New R-like data structures: `@stk_dataframe`, `@stk_factorial_design`. + +* The structures previously used everywhere in STK (with a `.a` field) are + still supported but should be considered as deprecated (and will probably + be completely removed in the next major release). + +* As a result, `stk_predict` does not return a `.a`/`.v` structure any + more. Instead, it returns an stk_dataframe object with two variables + called `mean` and `var`. + +* The function that computes (the opposite of the log of) the restricted + likelihood is now called `stk_param_relik` instead of `stk_remlqrg`. + +## Internal structure + +* Many improvements in the internal structure of STK, for the sake of + clarity (for those who happen to read the code) and efficiency: + +* `@stk_kreq_qr`: new class for encapsulating basic computations related to + a Gaussian process (kriging) model. + +* The old `Kx_cache`/`Px_cache` mechanism, for working efficiently on + finite spaces, has been replaced by a new covariance function: + `stk_discretecov`. + +* A new framework to encapsulate various approaches to parallel + computations. Currently only supporting `'none'` or `'parfor'` + (Mathworks' PCT toolbox parfor loops) engines, more to come later. + +## Experimental support for parameter objects. + +* `model.param` is now allowed to be an object from a user-defined + class. This feature is experimental, and not really used currently in the + toolbox. + +* A new function `stk_param_getdefaultbounds` has appeared in `./param`, + that was previously hidden in `stk_predict`. It can be overridden in the + case where `model.param` is an object from a user-defined class. + +## New sampling algorithms and related functions + +* Fill-distance computation: exact (using Pronzato & Müller, Statistics & + Computing, 2011) or approximate (using a space-filling reference set). + +* Van Der Corput and Halton RR2-scrambled sequences (quasi-MC) + +* NOLHS designs (Cioppa & Lucs, Technometrics, 2007) + +## Miscellaneous + +* `misc/options`: a new system for managing options + +* `octave_quantile`: replacement for the missing `quantile` function in + base Matlab (Mathworks' Statistics toolbox is not a requirement of STK). + +* Add MEX-files for computing "Gibbs-Paciorek quadratic forms" to support + future work on non-stationary covariance functions. + +* `AUTHORS`: a list of maintainers and contributors can now be found at the + root of the source tree. + +* `stk_compile_all`: now recompiles MEX-files automatically if the source code + has changed. + +* Various new utility functions, tiny or not-so-tiny improvements, + bugfixes here and there... + +----- + + +# Changes in version 1.2 + +## `stk_predict` + +* Now offers the possibility to compute the posterior covariance matrix (it + is returned as a fourth optional argument). + +* Has been modified to work with non-stationary covariance functions. + +## Covariance functions + +* Added a new `"pairwise"` option to all covariance functions and also to + `stk_dist` (formerly `stk_distance_matrix`). This options allows to + compute only the diagonal of the full distance/covariance matrix). + +## Space-filling designs + +* New function (`stk_filldist`) to compute the (discretized) fill distance. + +* New function (`stk_sampling_olhs`) to generate Orthogonal Latin Hypercube + (OLH) samples using the algorithm of Ye (1998). + +## Parameter estimation + +* New (experimental) function to choose automatically the starting point + for a parameter estimation optimization procedure (`stk_param_init`). + +## New functions to work with boxes + +* `stk_rescale`, + +* `stk_normalize`. + +## More flexible representation of data + +* Improved the flexibility most functions (`stk_predict`, + `stk_param_estim`, ...), which are now accepting both matrices and "data + structures" (with an `.a` field) as input arguments. + +* New function: `stk_datastruct` + +## Regular grids + +* New function `stk_plot2d` that serves has a wrapper around + {`surf`|`contour`|`mesh`|`pcolor`}-type functions, to plot data defined + over a two-dimensional regular grid. + +* `stk_sampling_regulargrid` now also returns 'ndgrid-style' coordinate + matrices stored in new `.coord` field. + +## Examples + +* Reorganized the example folder and renamed all example scripts. + +* New example (`stk_example_misc03`) to demonstrate the effect of adding a + prior on the covariance parameters. + +* Improved graphical outputs in `stk_example_kb03`. + +* New test function: `stk_testfun_braninhoo` (Branin-Hoo). + +## Miscellaneous + +* Renamed `stk_distancematrix` to `stk_dist`. + +* Various new utility functions: `stk_runexamples`, `stk_disp_framedtext`, + `stk_disp_examplewelcome`, `stk_plot_shadedci`, `stk_octave_config`. + +* Improved Octave-specific configuration. + +* Lots of bugfixes and improvements. + +----- + + +# Changes in version 1.1 + +* New special functions for the Matérn 3/2 and 5/2 correlation functions + (`stk_sf_matern32`, `stk_sf_matern52`). New covariance functions + (`stk_materncov32_iso`, `stk_materncov32_aniso`, ...). + +* New MEX-file to compute the separation distance (`stk_mindist`). + +* New function to generate random Latin Hypercube Samples + (`stk_sampling_randomlhs`). Renamed `stk_sampling_cartesiangrid` to + `stk_sampling_regulargrid`, and changed the meaning of the first argument + for consistency with other `stk_sampling_*` functions. + +* Improved `stk_model` function. Now provides default parameters for several + families of covariance functions. + +* Renamed fields in model structures (`covariance_cache` to `Kx_cache` and `P0` + to `Px_cache`). A new field `dim` has been added to the model structure. + +* Changed the order of the arguments of the functions that use the + structure `model`. Now, `model` is always the first argument. + +* Changed `stk_param_estim` to make it possible to estimate noise variance. + +* Fixed issues in `stk_param_estim` related to the definition of the search + domain and the selection of (constrained/unconstrained) optimizer. + +* Renamed `stk_conditionning` to `stk_conditioning`. + +* New functions for a more flexible and efficient management of STK's + configuration in `stk_init` (path, compilation of MEX-file, checking for + optional packages, selection of the default optimizer, ...). + +* New functions for unit testing, based on Octave's testing system + (`stk_test`, `stk_runtests`). Tests have been added to most functions in + the toolbox. + +* Improved documentation & new examples. + +* Improved argument checking and error messages. + +* Improved compatibility with older versions of Octave and Matlab. + +* Lots of minor changes and bug fixes. + +* Complete reorganization of the code (better directory structure). diff --git a/doc/AUTHORS.md b/doc/AUTHORS.md new file mode 100644 index 0000000..805fbce --- /dev/null +++ b/doc/AUTHORS.md @@ -0,0 +1,33 @@ +STK is mainly developped and maintained by (alphabetical order): + + * BECT Julien + * VAZQUEZ Emmanuel + +The following people have helped develop the toolbox in various ways +(from providing ideas and bug reports to actually contributing code): + + * ALEKSOVSKA Ivana + * ASSOULINE Tom + * AUTRET Florent + * BARRACOSA Bruno + * BENASSI Romain + * DABOUSSI Elias + * DRAUG Carnë + * DUHAMEL Stephano + * DUTRIEUX Héloïse + * FELIOT Paul + * FRASNEDO Sophie + * GEORG Niklas + * JAN Benoit + * KETTANI Othmane + * KRAUTH Alexandra + * LI Ling + * PIERA-MARTINEZ Miguel + * RAHALI Elham + * RAVISANKAR Ashwin + * RESSEGUIER Valentin + * STROH Rémi + * VILLEMONTEIX Julien + +Individual copyright notices are provided at the beginning of each +file in the toolbox. diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..8fb364f --- /dev/null +++ b/doc/README.md @@ -0,0 +1,204 @@ +# STK: a Small (Matlab/Octave) Toolbox for Kriging + +[![license](https://img.shields.io/github/license/stk-kriging/stk)](COPYING) +[![last commit](https://img.shields.io/github/last-commit/stk-kriging/stk/master)](https://github.com/stk-kriging/stk/commits/main) +[![unit tests](https://github.com/stk-kriging/stk/actions/workflows/run-tests.yml/badge.svg)](https://github.com/stk-kriging/stk/actions/workflows/run-tests.yml) +[![run-linter](https://github.com/stk-kriging/stk/actions/workflows/run-linter.yml/badge.svg)](https://github.com/stk-kriging/stk/actions/workflows/run-linter.yml) + +This README file is part of + +*STK: a Small (Matlab/Octave) Toolbox for Kriging* + + +STK is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your +option) any later version. + +STK is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +License for more details. + +You should have received a copy of the GNU General Public License +along with STK. If not, see . + + +## General information + + Version: 2.7.0 (2022-02-23) + + Authors: See AUTHORS.md file + + Maintainers: Julien Bect + and Emmanuel Vazquez + + Description: The STK is a (not so) Small Toolbox for Kriging. Its + primary focus is on the interpolation/regression + technique known as kriging, which is very closely related + to Splines and Radial Basis Functions, and can be + interpreted as a non-parametric Bayesian method using a + Gaussian Process (GP) prior. The STK also provides tools + for the sequential and non-sequential design of + experiments. Even though it is, currently, mostly geared + towards the Design and Analysis of Computer Experiments + (DACE), the STK can be useful for other applications + areas (such as Geostatistics, Machine Learning, + Non-parametric Regression, etc.). + + Copyright: Large portions are Copyright (C) 2011-2014 SUPELEC + and Copyright (C) 2015-2022 CentraleSupelec. + See individual copyright notices for more details. + + License: GNU General Public License, version 3 (GPLv3). + See COPYING for the full license. + + URL: + + +## One toolbox, two flavours + +The STK toolbox comes in two flavours: + + * an "all purpose" release, which is suitable for use both with + [GNU Octave](http://www.gnu.org/software/octave/) + and with [Matlab](https://www.mathworks.com/products/matlab/). + * an Octave package, for people who want to install and use STK as a + regular [Octave package](http://www.gnu.org/software/octave/doc/interpreter/Packages.html#Packages). + +Hint: if you're not sure about the version that you have... + + * the "all purpose" release has this file (`README.md`) and the `stk_init` + function (`stk_init.m`) in the top-level directory, + * the Octave package has a `DESCRIPTION` file in the top-level directory + and this file in the `doc/` subdirectory. + + +## Quick Start + +### Quick start with the "all purpose" release (Matlab/Octave) + +Download and unpack an archive of the "all purpose" +[release](https://github.com/stk-kriging/stk/releases). + +Run `stk_init` in either Octave or Matlab. One way to do so is to navigate +to the root directory of STK and then simply type: +``` +stk_init +``` +Alternatively, if you don't want to change the current directory, you can use: +``` +run /path/to/stk/stk_init.m +``` +Note that this second approach is suitable for inclusion in your `startup` script. + +After that, you should be able to run the examples located in the `examples` +directory. All of them are scripts, the file name of which starts with +the `stk_example_` prefix. + +For instance, type `stk_example_kb03` to run the third example in the "Kriging +basics" series. + +Remark: when using STK with Mathworks' Parallel Computing Toolbox, it is +important to run `stk_init` within each worker. This can be achieved using: +``` +pctRunOnAll run /path/to/stk/stk_init.m +``` + + +### Quick start with the Octave package release (Octave only) + +Assuming that you have a working Internet connection, typing `pkg install -forge stk` +(from within Octave) will automatically download the latest STK package tarball from the +[Octave Forge](http://octave.sourceforge.net/) +[file release system](https://sourceforge.net/projects/octave/files/) +on SourceForge and install it for you. + +Alternatively, if you want to install an older (or beta) release, you can download +the tarball from either the STK project FRS or the Octave Forge FRS, and install it +with `pkg install FILENAME.tar.gz`. + +After that, you can load STK using `pkg load stk`. + +To check that STK is properly loaded, try for instance `stk_example_kb03` to run +the third example in the "Kriging basics" series. + + +## Requirements and recommendations + +### Common requirement + + Your installation must be able to compile C mex files. + +### Requirements and recommendations for use with GNU Octave + + The STK is tested to work with + [GNU Octave 4.0.0 or newer](https://wiki.octave.org/Release_History). + + +### Requirements and recommendations for use with Matlab + + The STK is tested to work with + [Matlab R2009b or newer](https://en.wikipedia.org/wiki/MATLAB#Release_history). + + The Optimization Toolbox is recommended. + + The Parallel Computing Toolbox is optional. + + +## Content + + By publishing this toolbox, the idea is to provide a convenient and + flexible research tool for working with kriging-based methods. The + code of the toolbox is meant to be easily understandable, modular, + and reusable. By way of illustration, it is very easy to use this + toolbox for implementing the EGO algorithm [1]. + Besides, this toolbox can serve as a basis for the implementation + of advanced algorithms such as Stepwise Uncertainty Reduction (SUR) + algorithms [2]. + + The toolbox consists of three parts: + + 1. The first part is the implementation of a number of covariance + functions, and tools to compute covariance vectors and matrices. + The structure of the STK makes it possible to use any kind of + covariances: stationary or non-stationary covariances, aniso- + tropic covariances, generalized covariances, etc. + + 2. The second part is the implementation of a REMAP procedure to + estimate the parameters of the covariance. This makes it possible + to deal with generalized covariances and to take into account + prior knowledge about the parameters of the covariance. + + 3. The third part consists of prediction procedures. In its current + form, the STK has been optimized to deal with moderately large + data sets. + +### References + +[1] D. R. Jones, M. Schonlau, and William J. Welch. *Efficient global +optimization of expensive black-box functions*. Journal of Global +Optimization, 13(4):455-492, 1998. + +[2] J. Bect, D. Ginsbourger, L. Li, V. Picheny, and E. Vazquez. +*Sequential design of computer experiments for the estimation of a +probability of failure*. Statistics and Computing, pages 1-21, 2011. +DOI: 10.1007/s11222-011-9241-4. + + +## Ways to get help, report bugs, ask for new features... + + Use the "help" mailing-list: + + + (register/browse the archives: [here](https://sourceforge.net/p/kriging/mailman)) + + to ask for help on STK, and the ticket manager: + + + + to report bugs or ask for new features (do not hesitate to do so!). + + If you use STK in Octave, you can also have a look there: + + diff --git a/inst/arrays/@stk_dataframe/abs.m b/inst/arrays/@stk_dataframe/abs.m new file mode 100644 index 0000000..f795e50 --- /dev/null +++ b/inst/arrays/@stk_dataframe/abs.m @@ -0,0 +1,38 @@ +% ABS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = abs (x) + +ydata = abs (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = abs (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, abs (u))) diff --git a/inst/arrays/@stk_dataframe/acos.m b/inst/arrays/@stk_dataframe/acos.m new file mode 100644 index 0000000..96596d7 --- /dev/null +++ b/inst/arrays/@stk_dataframe/acos.m @@ -0,0 +1,38 @@ +% ACOS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = acos (x) + +ydata = acos (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = acos (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, acos (u))) diff --git a/inst/arrays/@stk_dataframe/acosd.m b/inst/arrays/@stk_dataframe/acosd.m new file mode 100644 index 0000000..330b8ef --- /dev/null +++ b/inst/arrays/@stk_dataframe/acosd.m @@ -0,0 +1,38 @@ +% ACOSD [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = acosd (x) + +ydata = acosd (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = acosd (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, acosd (u))) diff --git a/inst/arrays/@stk_dataframe/acosh.m b/inst/arrays/@stk_dataframe/acosh.m new file mode 100644 index 0000000..1b1d76e --- /dev/null +++ b/inst/arrays/@stk_dataframe/acosh.m @@ -0,0 +1,38 @@ +% ACOSH [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = acosh (x) + +ydata = acosh (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = acosh (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, acosh (u))) diff --git a/inst/arrays/@stk_dataframe/and.m b/inst/arrays/@stk_dataframe/and.m new file mode 100644 index 0000000..c2a98c1 --- /dev/null +++ b/inst/arrays/@stk_dataframe/and.m @@ -0,0 +1,33 @@ +% AND [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = and (x1, x2) + +y = (logical (x1) & logical (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/apply.m b/inst/arrays/@stk_dataframe/apply.m new file mode 100644 index 0000000..a3e303e --- /dev/null +++ b/inst/arrays/@stk_dataframe/apply.m @@ -0,0 +1,74 @@ +% APPLY maps a function to the rows or columns of a dataframe. + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = apply (x, dim, F, u) + +if nargin == 4 + uu = {u}; +else + uu = {}; +end + +varargout = cell (1, max (1, nargout)); + +if dim == 1 + % act along columns + [varargout{:}] = feval (F, x.data, uu{:}, 1); +else + if dim ~= 2, + stk_error ('Incorrect dimension specifier', 'IncorrectDimSpec'); + else + % act along rows (less usual) + [varargout{:}] = feval (F, x.data, uu{:}, 2); + end +end + +end % function + +%!shared x, t, u +%! t = rand (3, 2); +%! x = stk_dataframe (t); + +%!test u = apply (x, 1, @sum); +%!assert (isequal (u, sum (t, 1))) +%!test u = apply (x, 2, @sum); +%!assert (isequal (u, sum (t, 2))) +%!error u = apply (x, 3, @sum); + +%!test u = apply (x, 1, @min, []); +%!assert (isequal (u, min (t, [], 1))) +%!test u = apply (x, 2, @min, []); +%!assert (isequal (u, min (t, [], 2))) +%!error u = apply (x, 3, @min, []); + +%!test +%! t = [1; 3; 2]; +%! x = stk_dataframe (t); +%! [M, k] = apply (x, 1, @max, []); +%! assert ((M == 3) && (k == 2)); diff --git a/inst/arrays/@stk_dataframe/asin.m b/inst/arrays/@stk_dataframe/asin.m new file mode 100644 index 0000000..1c0a760 --- /dev/null +++ b/inst/arrays/@stk_dataframe/asin.m @@ -0,0 +1,38 @@ +% ASIN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = asin (x) + +ydata = asin (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = asin (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, asin (u))) diff --git a/inst/arrays/@stk_dataframe/asind.m b/inst/arrays/@stk_dataframe/asind.m new file mode 100644 index 0000000..06ef78c --- /dev/null +++ b/inst/arrays/@stk_dataframe/asind.m @@ -0,0 +1,38 @@ +% ASIND [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = asind (x) + +ydata = asind (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = asind (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, asind (u))) diff --git a/inst/arrays/@stk_dataframe/asinh.m b/inst/arrays/@stk_dataframe/asinh.m new file mode 100644 index 0000000..edefd1c --- /dev/null +++ b/inst/arrays/@stk_dataframe/asinh.m @@ -0,0 +1,38 @@ +% ASINH [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = asinh (x) + +ydata = asinh (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = asinh (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, asinh (u))) diff --git a/inst/arrays/@stk_dataframe/atan.m b/inst/arrays/@stk_dataframe/atan.m new file mode 100644 index 0000000..35f86c2 --- /dev/null +++ b/inst/arrays/@stk_dataframe/atan.m @@ -0,0 +1,38 @@ +% ATAN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = atan (x) + +ydata = atan (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = atan (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, atan (u))) diff --git a/inst/arrays/@stk_dataframe/atand.m b/inst/arrays/@stk_dataframe/atand.m new file mode 100644 index 0000000..90ce089 --- /dev/null +++ b/inst/arrays/@stk_dataframe/atand.m @@ -0,0 +1,38 @@ +% ATAND [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = atand (x) + +ydata = atand (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = atand (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, atand (u))) diff --git a/inst/arrays/@stk_dataframe/atanh.m b/inst/arrays/@stk_dataframe/atanh.m new file mode 100644 index 0000000..da42559 --- /dev/null +++ b/inst/arrays/@stk_dataframe/atanh.m @@ -0,0 +1,38 @@ +% ATANH [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = atanh (x) + +ydata = atanh (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = atanh (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, atanh (u))) diff --git a/inst/arrays/@stk_dataframe/bsxfun.m b/inst/arrays/@stk_dataframe/bsxfun.m new file mode 100644 index 0000000..e48eaf1 --- /dev/null +++ b/inst/arrays/@stk_dataframe/bsxfun.m @@ -0,0 +1,126 @@ +% BSXFUN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec & LNE +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = bsxfun (F, x1, x2) + +%---- Compute ydata ----------------------------------------------------- + +x1data = double (x1); +x2data = double (x2); + +try + ydata = bsxfun (F, x1data, x2data); +catch + err = lasterror (); + if strcmp (err.identifier, 'MATLAB:bsxfun:unsupportedBuiltin') + % This happens in some old versions of Matlab with realpow, for + % instance. Let's try without singleton expansion... + ydata = feval (F, x1data, x2data); + % TODO: manual bsxfun !!! + else + rethrow (err); + end +end + +%---- Choose column and row names --------------------------------------- + +if isa (x1, 'stk_dataframe') + c1 = x1.colnames; + r1 = x1.rownames; +else + c1 = {}; + r1 = {}; +end + +if isa (x2, 'stk_dataframe') + c2 = x2.colnames; + r2 = x2.rownames; +else + c2 = {}; + r2 = {}; +end + +[nr, nc] = size (ydata); + +if length (c1) == nc + % Keep the columns names from the first dataframe (as in R) + colnames = c1; +elseif length (c2) == nc + colnames = c2; +else + colnames = {}; +end + +if length (r1) == nr + % Keep the columns names from the first dataframe (as in R) + rownames = r1; +elseif length (r2) == nr + rownames = r2; +else + rownames = {}; +end + +%--- Create output ------------------------------------------------------ + +y = stk_dataframe (ydata, colnames, rownames); + +end % function + + +%!shared x1, x2, data1, data2 +%! x1 = rand (3, 2); data1 = stk_dataframe (x1); +%! x2 = rand (3, 2); data2 = stk_dataframe (x2); + +%!test +%! z = bsxfun (@plus, data1, x2); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), x1 + x2)) + +%!test +%! z = bsxfun (@plus, x1, data2); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), x1 + x2)) + +%!test +%! z = bsxfun (@plus, data1, data2); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), x1 + x2)) + +%--- check the behaviour wrt column / row names -------------------------------- + +%!shared x, y +%! x = stk_dataframe (randn (2), {'x1', 'x2'}, {'a'; 'b'}); +%! y = stk_dataframe (randn (2), {'y1', 'y2'}, {'c'; 'd'}); + +%!test z = x + y; +%! assert (isequal (z.colnames, x.colnames)); +%! assert (isequal (z.rownames, x.rownames)); + +%!test z = y + x; +%! assert (isequal (z.colnames, y.colnames)); +%! assert (isequal (z.rownames, y.rownames)); + diff --git a/inst/arrays/@stk_dataframe/cat.m b/inst/arrays/@stk_dataframe/cat.m new file mode 100644 index 0000000..f6a9617 --- /dev/null +++ b/inst/arrays/@stk_dataframe/cat.m @@ -0,0 +1,69 @@ +% CAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = cat(dim, varargin) + +if dim == 1 + + % concatenate along dimension 1, i.e., vertically + z = vertcat(varargin{:}); + +else + + if dim ~= 2 + errmsg = 'Dataframes can only be concatenated along dimension 1 or 2.'; + stk_error(errmsg, 'InvalidArgument'); + else + % concatenate along dimension 2, i.e., horizontally + z = horzcat(varargin{:}); + end + +end % if + +end % function + + +%!shared u, v, x, y +%! u = rand(3, 2); +%! v = rand(3, 2); +%! x = stk_dataframe(u); +%! y = stk_dataframe(v); + +%!test % vertical +%! z = cat(1, x, y); +%! assert(isa(z, 'stk_dataframe')); +%! assert(isequal(double(z), [u; v])); + +%!error z = cat(3, x, y); + +%!test % horizontal +%! y = stk_dataframe(v, {'y1' 'y2'}); +%! z = cat(2, x, y); +%! assert(isa(z, 'stk_dataframe')); +%! assert(isequal(double(z), [u v])); +%! assert(all(strcmp(z.colnames, {'' '' 'y1' 'y2'}))); diff --git a/inst/arrays/@stk_dataframe/cos.m b/inst/arrays/@stk_dataframe/cos.m new file mode 100644 index 0000000..caa70f4 --- /dev/null +++ b/inst/arrays/@stk_dataframe/cos.m @@ -0,0 +1,38 @@ +% COS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = cos (x) + +ydata = cos (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = cos (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, cos (u))) diff --git a/inst/arrays/@stk_dataframe/cosd.m b/inst/arrays/@stk_dataframe/cosd.m new file mode 100644 index 0000000..7dd4174 --- /dev/null +++ b/inst/arrays/@stk_dataframe/cosd.m @@ -0,0 +1,38 @@ +% COSD [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = cosd (x) + +ydata = cosd (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = cosd (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, cosd (u))) diff --git a/inst/arrays/@stk_dataframe/cosh.m b/inst/arrays/@stk_dataframe/cosh.m new file mode 100644 index 0000000..a60f0ac --- /dev/null +++ b/inst/arrays/@stk_dataframe/cosh.m @@ -0,0 +1,38 @@ +% ABS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = cosh (x) + +ydata = cosh (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = cosh (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, cosh (u))) diff --git a/inst/arrays/@stk_dataframe/ctranspose.m b/inst/arrays/@stk_dataframe/ctranspose.m new file mode 100644 index 0000000..4a12520 --- /dev/null +++ b/inst/arrays/@stk_dataframe/ctranspose.m @@ -0,0 +1,47 @@ +% CTRANSPOSE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = ctranspose(x) + +rn = get(x, 'rownames'); +cn = get(x, 'colnames'); + +y = stk_dataframe(ctranspose(x.data), rn', cn'); + +end % function + +% note: complex-valued dataframes are supported but, currently, +% not properly displayed + +%!test +%! u = rand(3, 2) + 1i * rand(3, 2); +%! data = stk_dataframe(u, {'x' 'y'}, {'obs1'; 'obs2'; 'obs3'}); +%! data = data'; +%! assert (isa(data, 'stk_dataframe') && isequal(double(data), u')); +%! assert (isequal(data.rownames, {'x'; 'y'})); +%! assert (isequal(data.colnames, {'obs1' 'obs2' 'obs3'})); diff --git a/inst/arrays/@stk_dataframe/diff.m b/inst/arrays/@stk_dataframe/diff.m new file mode 100644 index 0000000..79cf3d5 --- /dev/null +++ b/inst/arrays/@stk_dataframe/diff.m @@ -0,0 +1,33 @@ +% DIFF [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = diff (x, varargin) + +z = diff (x.data, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_dataframe/disp.m b/inst/arrays/@stk_dataframe/disp.m new file mode 100644 index 0000000..1bcda23 --- /dev/null +++ b/inst/arrays/@stk_dataframe/disp.m @@ -0,0 +1,65 @@ +% DISP [overload base function] +% +% Example: +% format short +% x = [1 1e6 rand; 10 -1e10 rand; 100 1e-22 rand]; +% disp (stk_dataframe (x)) + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (x, verbosity, prefix, data_col_width) + +if (nargin < 2) || (isempty (verbosity)) + verbosity = stk_options_get ('stk_dataframe', 'disp_format'); +end + +if (nargin < 3) || (isempty (prefix)) + prefix = ' '; +end + +if (nargin < 4) || (isempty (data_col_width)) + data_col_width = []; +end + +s = stk_sprintf (x, verbosity, data_col_width); +disp ([repmat(prefix, size(s, 1), 1) s]); + +end % function + + +%!shared x, fmt +%! fmt = stk_disp_getformat (); +%! x = stk_dataframe (rand (3, 2)); + +%!test format rat; disp (x); +%!test format long; disp (x); +%!test format short; disp (x); format (fmt); + +%!test disp (stk_dataframe (zeros (0, 1))) +%!test disp (stk_dataframe (zeros (0, 2))) diff --git a/inst/arrays/@stk_dataframe/display.m b/inst/arrays/@stk_dataframe/display.m new file mode 100644 index 0000000..6e4c0be --- /dev/null +++ b/inst/arrays/@stk_dataframe/display.m @@ -0,0 +1,50 @@ +% DISPLAY [overload base function] +% +% Example: +% format short +% x = [1 1e6 rand; 10 -1e10 rand; 100 1e-22 rand]; +% stk_dataframe(x) % implicitely calls display() + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function display (x, varargin) + +fprintf ('\n%s = <%s>\n', inputname (1), stk_sprintf_sizetype (x)); + +if strcmp ('basic', stk_options_get ('stk_dataframe', 'disp_format')) + fprintf ('\n'); +end + +disp (x, varargin{:}); + +fprintf ('\n'); + +end % function + + +%!test display (stk_dataframe (rand (3, 2))); diff --git a/inst/arrays/@stk_dataframe/double.m b/inst/arrays/@stk_dataframe/double.m new file mode 100644 index 0000000..cead70b --- /dev/null +++ b/inst/arrays/@stk_dataframe/double.m @@ -0,0 +1,52 @@ +% DOUBLE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function xdata = double(x) + +xdata = double(x.data); + +end % function + +%!test +%! u = rand(4, 3); +%! x = stk_dataframe(u); +%! v = double(x); +%! assert (strcmp(class(v), 'double') && isequal(v, u)) + +%!test +%! u = (rand(4, 3) < 0.5); +%! x = stk_dataframe(u); +%! v = double(x); +%! assert (strcmp(class(v), 'double') && isequal(v, double(u))) + +%!test +%! u = uint8 (rand (4, 3) * 5); +%! x = stk_dataframe(u); +%! v = double(x); +%! assert (strcmp(class(v), 'double') && isequal(v, double(u))) diff --git a/inst/arrays/@stk_dataframe/end.m b/inst/arrays/@stk_dataframe/end.m new file mode 100644 index 0000000..07cfefc --- /dev/null +++ b/inst/arrays/@stk_dataframe/end.m @@ -0,0 +1,63 @@ +% END implements the the 'end' keyword for indexing + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function idx = end (x, k, nb_indices) + +if nb_indices == 2, + % using two indices (matrix-style indexing) + idx = size (x.data, k); +else + if nb_indices ~= 1, + errmsg = 'stk_dataframe objects only support linear or matrix-style indexing.'; + stk_error (errmsg, 'IllegalIndexing'); + else + % using linear indexing + idx = numel (x.data); + end +end + +end % function + + +%--- tests with a univariate dataframe ---------------------------------------- + +%!shared x +%! x = stk_dataframe ([1; 2; 3]); +%!assert (isequal (double (x(2:end, :)), [2; 3])) +%!assert (isequal (double (x(2:end)), [2; 3])) +%!assert (isequal (double (x(2, 1:end)), 2)) +%!assert (isequal (double (x(end)), 3)) + +%--- tests with a bivariate dataframe ----------------------------------------- + +%!shared x +%! x = stk_dataframe ([1 2; 3 4; 5 6]); +%!assert (isequal (x(2:end, :), x(2:3, :))) +%!assert (isequal (x(2, 1:end), x(2, :))) +%!assert (isequal (x(2:end, 2:end), x(2:3, 2))) +%!error x(1:end, 1:end, 1:end) diff --git a/inst/arrays/@stk_dataframe/eq.m b/inst/arrays/@stk_dataframe/eq.m new file mode 100644 index 0000000..f916077 --- /dev/null +++ b/inst/arrays/@stk_dataframe/eq.m @@ -0,0 +1,33 @@ +% EQ [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = eq (x1, x2) + +y = (double (x1) == double (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/exp.m b/inst/arrays/@stk_dataframe/exp.m new file mode 100644 index 0000000..fdcabe3 --- /dev/null +++ b/inst/arrays/@stk_dataframe/exp.m @@ -0,0 +1,38 @@ +% EXP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = exp (x) + +ydata = exp (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = exp (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, exp (u))) diff --git a/inst/arrays/@stk_dataframe/expm1.m b/inst/arrays/@stk_dataframe/expm1.m new file mode 100644 index 0000000..3a65083 --- /dev/null +++ b/inst/arrays/@stk_dataframe/expm1.m @@ -0,0 +1,38 @@ +% EXPM1 [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = expm1 (x) + +ydata = expm1 (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = expm1 (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, expm1 (u))) diff --git a/inst/arrays/@stk_dataframe/fieldnames.m b/inst/arrays/@stk_dataframe/fieldnames.m new file mode 100644 index 0000000..40de575 --- /dev/null +++ b/inst/arrays/@stk_dataframe/fieldnames.m @@ -0,0 +1,56 @@ +% FIELDNAMES [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017, 2020 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function fn = fieldnames (x) + +% Non-empty column names +cn = x.colnames; +cn = cn(~ cellfun (@isempty, cn))'; + +% Non-empty row names +rn = x.rownames; +rn = rn(~ cellfun (@isempty, rn)); + +fn = [cn; rn; reserved_field_names()]; + +end % function + + +%!test +%! x = stk_dataframe (rand (3, 2), {'u' 'v'}); +%! assert (isequal (sort (fieldnames (x)), ... +%! {'colnames'; 'data'; 'info'; 'rownames'; 'sample_size'; 'u'; 'v'})); + +%!test +%! x = stk_dataframe (rand (3, 2)); +%! x.rownames(2:3) = {'aa', 'bb'}; +%! x.colnames{2} = 'toto'; +%! assert (isequal (fieldnames (x), ... +%! {'toto'; 'aa'; 'bb'; 'data'; 'info'; ... +%! 'rownames'; 'colnames'; 'sample_size'})); diff --git a/inst/arrays/@stk_dataframe/find.m b/inst/arrays/@stk_dataframe/find.m new file mode 100644 index 0000000..c3cc6fe --- /dev/null +++ b/inst/arrays/@stk_dataframe/find.m @@ -0,0 +1,45 @@ +% @STK_DATAFRAME/FIND [overload base function] +% +% See also: find + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = find (x, varargin) + +if isa (x, 'stk_dataframe') + + varargout = cell (1, max (nargout, 1)); + [varargout{:}] = find (logical (x), varargin{:}); + +else + + stk_error (['@stk_dataframe/find only supports stk_dataframe objects ' ... + 'for the first input argument.'], 'InvalidArgument'); + +end + +end % function diff --git a/inst/arrays/@stk_dataframe/ge.m b/inst/arrays/@stk_dataframe/ge.m new file mode 100644 index 0000000..5d91ad8 --- /dev/null +++ b/inst/arrays/@stk_dataframe/ge.m @@ -0,0 +1,33 @@ +% GE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = ge (x1, x2) + +y = (double (x1) >= double (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/get.m b/inst/arrays/@stk_dataframe/get.m new file mode 100644 index 0000000..d45f809 --- /dev/null +++ b/inst/arrays/@stk_dataframe/get.m @@ -0,0 +1,55 @@ +% GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (x, propname) + +icol = __get_column_number__ (x.colnames, propname); + +switch icol + case -5 % 'sample_size' + value = size (x.data, 1); + + case -4 % 'info' + value = x.info; + + case -3 % 'rownames' + value = x.rownames; + + case -2 % 'colnames' + value = x.colnames; + + case -1 % Get entire array + value = x.data; + + otherwise + value = x.data(:, icol); + +end + +end % function diff --git a/inst/arrays/@stk_dataframe/gt.m b/inst/arrays/@stk_dataframe/gt.m new file mode 100644 index 0000000..df5e8b8 --- /dev/null +++ b/inst/arrays/@stk_dataframe/gt.m @@ -0,0 +1,33 @@ +% GT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = gt (x1, x2) + +y = (double (x1) > double (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/horzcat.m b/inst/arrays/@stk_dataframe/horzcat.m new file mode 100644 index 0000000..4cf0928 --- /dev/null +++ b/inst/arrays/@stk_dataframe/horzcat.m @@ -0,0 +1,178 @@ +% HORZCAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = horzcat (x, y, varargin) + +if nargin < 2, + y = []; +end + +%--- Get raw data --------------------------------------------------------- + +x_data = double (x); +y_data = double (y); + +%--- Get column and row names of inputs ----------------------------------- + +if isa (x, 'stk_dataframe') + x_colnames = get (x, 'colnames'); + x_rownames = get (x, 'rownames'); +else + x_colnames = {}; + x_rownames = {}; +end + +if isa (y, 'stk_dataframe') + y_colnames = get (y, 'colnames'); + y_rownames = get (y, 'rownames'); +else + y_colnames = {}; + y_rownames = {}; +end + +%--- Create output row names ---------------------------------------------- + +if isempty (x_rownames) + + rownames = y_rownames; + +elseif isempty (y_rownames) + + rownames = x_rownames; + +else + + if (~ isequal (size (x_rownames), size (y_rownames))) ... + || (any (~ strcmp (x_rownames, y_rownames))) + warning ('STK:horzcat:IncompatibleRowNames', sprintf ( ... + ['Incompatible row names !\nThe output of horzcat will ' ... + 'have no row names.'])); rownames = {}; + else + rownames = x_rownames; + end + +end + +%--- Create output column names ------------------------------------------- + +bx = isempty (x_colnames); +by = isempty (y_colnames); + +if bx && by, % none of the argument has row names + + colnames = {}; + +else % at least of one the arguments has column names + + if bx, x_colnames = repmat ({''}, 1, size (x_data, 2)); end + if by, y_colnames = repmat ({''}, 1, size (y_data, 2)); end + + colnames = [x_colnames y_colnames]; + +end + +%--- Create output -------------------------------------------------------- + +if strcmp (class (x), 'stk_dataframe') %#ok + % Optimize for speed (no need to call constructor) + x.data = [x_data y_data]; + x.colnames = colnames; + x.rownames = rownames; +else + x = stk_dataframe ([x_data y_data], colnames, rownames); +end + +if ~ isempty (varargin), + x = horzcat (x, varargin{:}); +end + +end % function + + +% IMPORTANT NOTE: [x y ...] fails to give the same result as horzcat (x, y, +% ...) in some releases of Octave. As a consequence, all tests must be +% written using horzcat explicitely. + +%!shared u, v +%! u = rand(3, 2); +%! v = rand(3, 2); + +%% +% Horizontal concatenation of two dataframes + +%!test +%! x = stk_dataframe(u, {'x1' 'x2'}); +%! y = stk_dataframe(v, {'y1' 'y2'}); +%! z = horzcat (x, y); +%! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v])); +%! assert(all(strcmp(z.colnames, {'x1' 'x2' 'y1' 'y2'}))); + +%!test +%! x = stk_dataframe(u, {'x1' 'x2'}, {'a'; 'b'; 'c'}); +%! y = stk_dataframe(v, {'y1' 'y2'}); +%! z = horzcat (x, y); +%! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v])); +%! assert(all(strcmp(z.colnames, {'x1' 'x2' 'y1' 'y2'}))); +%! assert(all(strcmp(z.rownames, {'a'; 'b'; 'c'}))); + +%!test +%! x = stk_dataframe(u, {'x1' 'x2'}); +%! y = stk_dataframe(v, {'y1' 'y2'}, {'a'; 'b'; 'c'}); +%! z = horzcat (x, y); +%! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v])); +%! assert(all(strcmp(z.colnames, {'x1' 'x2' 'y1' 'y2'}))); +%! assert(all(strcmp(z.rownames, {'a'; 'b'; 'c'}))); + +%!test % incompatible row names +%! x = stk_dataframe (u, {'x1' 'x2'}, {'a'; 'b'; 'c'}); +%! y = stk_dataframe (v, {'y1' 'y2'}, {'a'; 'b'; 'd'}); +%! z = horzcat (x, y); +%! assert (isequal (z.rownames, {})); + +%% +% Horizontal concatenation [dataframe matrix] or [matrix dataframe] + +%!test +%! x = stk_dataframe (u); +%! z = horzcat (x, v); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u v])); + +%!test +%! y = stk_dataframe (v); +%! z = horzcat (u, y); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u v])); + +%% +% Horizontal concatenation of more than two elements + +%!test +%! x = stk_dataframe(u, {'x1' 'x2'}); +%! y = stk_dataframe(v, {'y1' 'y2'}); +%! z = horzcat (x, y, u, v); +%! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v u v])); diff --git a/inst/arrays/@stk_dataframe/isempty.m b/inst/arrays/@stk_dataframe/isempty.m new file mode 100644 index 0000000..9466de4 --- /dev/null +++ b/inst/arrays/@stk_dataframe/isempty.m @@ -0,0 +1,33 @@ +% ISEMPTY [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = isempty(x) + +b = isempty(x.data); + +end % function diff --git a/inst/arrays/@stk_dataframe/isfinite.m b/inst/arrays/@stk_dataframe/isfinite.m new file mode 100644 index 0000000..4e3d822 --- /dev/null +++ b/inst/arrays/@stk_dataframe/isfinite.m @@ -0,0 +1,38 @@ +% ISFINITE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = isfinite (x) + +ydata = isfinite (x.data); + +end % function + + +%!test +%! u = [pi, NaN, Inf, -Inf]; x = stk_dataframe (u); v = isfinite (x); +%! assert (islogical (v) && isequal (v, isfinite (u))) diff --git a/inst/arrays/@stk_dataframe/isinf.m b/inst/arrays/@stk_dataframe/isinf.m new file mode 100644 index 0000000..325ff7e --- /dev/null +++ b/inst/arrays/@stk_dataframe/isinf.m @@ -0,0 +1,38 @@ +% ISINF [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = isinf (x) + +ydata = isinf (x.data); + +end % function + + +%!test +%! u = [pi, NaN, Inf, -Inf]; x = stk_dataframe (u); v = isinf (x); +%! assert (islogical (v) && isequal (v, isinf (u))) diff --git a/inst/arrays/@stk_dataframe/ismember.m b/inst/arrays/@stk_dataframe/ismember.m new file mode 100644 index 0000000..2c634f4 --- /dev/null +++ b/inst/arrays/@stk_dataframe/ismember.m @@ -0,0 +1,70 @@ +% ISMEMBER [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = ismember (A, B, varargin) + +if ~ all (cellfun (@ischar, varargin)) + stk_error ('Invalid flag (should be a string).', 'InvalidArgument'); +end + +varargout = cell (1, max (nargout, 1)); + +if isa (A, 'stk_dataframe') + + [varargout{:}] = ismember (A.data, B, varargin{:}); + +else % B is an stk_dataframe object + + [varargout{:}] = ismember (A, B.data, varargin{:}); + +end + +end % function + + +%!shared u, x, u1, x1, u2, x2 +%! u = rand (10, 4); +%! x = stk_dataframe (u); +%! x1 = x(1, :); +%! u1 = double (x1); +%! u2 = - ones (1, 4); +%! x2 = stk_dataframe (u2); + +%!assert (ismember (u1, x, 'rows')) +%!assert (ismember (x1, u, 'rows')) +%!assert (ismember (x1, x, 'rows')) + +%!assert (~ ismember (u2, x, 'rows')) +%!assert (~ ismember (x2, u, 'rows')) +%!assert (~ ismember (x2, x, 'rows')) + +%!test +%! [b, idx] = ismember ([x2; x1; x1], x, 'rows'); +%! assert (isequal (b, [false; true; true])); +%! assert (isequal (idx, [0; 1; 1])) diff --git a/inst/arrays/@stk_dataframe/isnan.m b/inst/arrays/@stk_dataframe/isnan.m new file mode 100644 index 0000000..9b64c0e --- /dev/null +++ b/inst/arrays/@stk_dataframe/isnan.m @@ -0,0 +1,38 @@ +% ISNAN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = isnan (x) + +ydata = isnan (x.data); + +end % function + + +%!test +%! u = [pi, NaN, Inf, -Inf]; x = stk_dataframe (u); v = isnan (x); +%! assert (islogical (v) && isequal (v, isnan (u))) diff --git a/inst/arrays/@stk_dataframe/ldivide.m b/inst/arrays/@stk_dataframe/ldivide.m new file mode 100644 index 0000000..ef4138e --- /dev/null +++ b/inst/arrays/@stk_dataframe/ldivide.m @@ -0,0 +1,37 @@ +% LDIVIDE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = ldivide(x1, x2) + +y = bsxfun(@ldivide, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@ldivide, 1 + rand(7, 2), rand(7, 2)); +%!test stk_test_dfbinaryop(@ldivide, 1 + rand(7, 2), pi); +%!error stk_test_dfbinaryop(@ldivide, 1 + rand(7, 2), rand(7, 3)); diff --git a/inst/arrays/@stk_dataframe/le.m b/inst/arrays/@stk_dataframe/le.m new file mode 100644 index 0000000..e722d38 --- /dev/null +++ b/inst/arrays/@stk_dataframe/le.m @@ -0,0 +1,33 @@ +% LE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = le (x1, x2) + +y = (double (x1) <= double (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/length.m b/inst/arrays/@stk_dataframe/length.m new file mode 100644 index 0000000..a75022c --- /dev/null +++ b/inst/arrays/@stk_dataframe/length.m @@ -0,0 +1,37 @@ +% LENGTH [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + + +function N = length (x) %#ok + +errmsg = ['length() is not defined for objects of class ' class(x)]; +stk_error (errmsg, 'MethodNotDefined'); + +end % function + +%!error length (stk_dataframe ([1 2; 3 4; 5 6])) diff --git a/inst/arrays/@stk_dataframe/log.m b/inst/arrays/@stk_dataframe/log.m new file mode 100644 index 0000000..6bbddd4 --- /dev/null +++ b/inst/arrays/@stk_dataframe/log.m @@ -0,0 +1,38 @@ +% LOG [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = log (x) + +ydata = log (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = log (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, log (u))) diff --git a/inst/arrays/@stk_dataframe/log10.m b/inst/arrays/@stk_dataframe/log10.m new file mode 100644 index 0000000..05c6707 --- /dev/null +++ b/inst/arrays/@stk_dataframe/log10.m @@ -0,0 +1,38 @@ +% LOG10 [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = log10 (x) + +ydata = log10 (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = log10 (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, log10 (u))) diff --git a/inst/arrays/@stk_dataframe/log1p.m b/inst/arrays/@stk_dataframe/log1p.m new file mode 100644 index 0000000..1b1c468 --- /dev/null +++ b/inst/arrays/@stk_dataframe/log1p.m @@ -0,0 +1,38 @@ +% LOG1P [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = log1p (x) + +ydata = log1p (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = log1p (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, log1p (u))) diff --git a/inst/arrays/@stk_dataframe/log2.m b/inst/arrays/@stk_dataframe/log2.m new file mode 100644 index 0000000..c6f990f --- /dev/null +++ b/inst/arrays/@stk_dataframe/log2.m @@ -0,0 +1,38 @@ +% LOG2 [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = log2 (x) + +ydata = log2 (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = log2 (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, log2 (u))) diff --git a/inst/arrays/@stk_dataframe/logical.m b/inst/arrays/@stk_dataframe/logical.m new file mode 100644 index 0000000..6a62aca --- /dev/null +++ b/inst/arrays/@stk_dataframe/logical.m @@ -0,0 +1,52 @@ +% LOGICAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec & LNE +% +% Author: Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function xdata = logical (x) + +xdata = logical (x.data); + +end % function + + +%!test +%! u = rand (4, 3); +%! x = stk_dataframe (u); +%! v = logical (x); +%! assert (strcmp (class(v), 'logical') && isequal (v, logical (u))) + +%!test +%! u = (rand (4, 3) < 0.5); +%! x = stk_dataframe (u); +%! v = logical (x); +%! assert (strcmp (class (v), 'logical') && isequal (v, u)) + +%!test +%! u = uint8 (rand (4, 3) * 5); +%! x = stk_dataframe (u); +%! v = logical (x); +%! assert (strcmp (class (v), 'logical') && isequal (v, logical (u))) diff --git a/inst/arrays/@stk_dataframe/lt.m b/inst/arrays/@stk_dataframe/lt.m new file mode 100644 index 0000000..7a4e52d --- /dev/null +++ b/inst/arrays/@stk_dataframe/lt.m @@ -0,0 +1,33 @@ +% LT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = lt (x1, x2) + +y = (double (x1) < double (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/max.m b/inst/arrays/@stk_dataframe/max.m new file mode 100644 index 0000000..df8d9ce --- /dev/null +++ b/inst/arrays/@stk_dataframe/max.m @@ -0,0 +1,69 @@ +% MAX [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = max (x, y, dim) + +varargout = cell (1, max (1, nargout)); + +if (nargin < 2) || (isempty (y)), % Act on rows or columns + + if nargin < 3, dim = 1; end + + [varargout{:}] = apply (x, dim, @max, []); + +else % Apply 'max' elementwise + + if nargin > 2, + errmsg = 'Too many input arguments (elementwise max assumed)'; + stk_error(errmsg, 'TooManyInputArgs'); + else + [varargout{:}] = bsxfun (@max, x, y); + end + +end % if + +end % function + + +%!test stk_test_dfbinaryop ('max', rand(7, 2), rand(7, 2)); +%!test stk_test_dfbinaryop ('max', rand(7, 2), pi); +%!error stk_test_dfbinaryop ('max', rand(7, 2), rand(7, 3)); + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (max(df1), max(x1))) +%!assert (isequal (max(df1, [], 1), max(x1))) +%!assert (isequal (max(df1, [], 2), max(x1, [], 2))) +%!error (max(df1, df1, 2)) + +%!test +%! x = stk_dataframe ([1; 3; 2]); +%! [M, k] = max (x); +%! assert ((M == 3) && (k == 2)); diff --git a/inst/arrays/@stk_dataframe/mean.m b/inst/arrays/@stk_dataframe/mean.m new file mode 100644 index 0000000..e9e5b24 --- /dev/null +++ b/inst/arrays/@stk_dataframe/mean.m @@ -0,0 +1,43 @@ +% MEAN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = mean(x, dim) + +if nargin < 2, dim = 1; end + +z = apply(x, dim, @mean); + +end % function + + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (mean(df1), mean(x1))) +%!assert (isequal (mean(df1, 1), mean(x1))) +%!assert (isequal (mean(df1, 2), mean(x1, 2))) diff --git a/inst/arrays/@stk_dataframe/median.m b/inst/arrays/@stk_dataframe/median.m new file mode 100644 index 0000000..0f0f4bc --- /dev/null +++ b/inst/arrays/@stk_dataframe/median.m @@ -0,0 +1,43 @@ +% MEDIAN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = median(x, dim) + +if nargin < 2, dim = 1; end + +z = apply(x, dim, @median); + +end % function + + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (median(df1), median(x1))) +%!assert (isequal (median(df1, 1), median(x1))) +%!assert (isequal (median(df1, 2), median(x1, 2))) diff --git a/inst/arrays/@stk_dataframe/min.m b/inst/arrays/@stk_dataframe/min.m new file mode 100644 index 0000000..2e32eeb --- /dev/null +++ b/inst/arrays/@stk_dataframe/min.m @@ -0,0 +1,69 @@ +% MIN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = min (x, y, dim) + +varargout = cell (1, max (1, nargout)); + +if (nargin < 2) || (isempty (y)), % Act on rows or columns + + if nargin < 3, dim = 1; end + + [varargout{:}] = apply (x, dim, @min, []); + +else % Apply 'min' elementwise + + if nargin > 2, + errmsg = 'Too many input arguments (elementwise min assumed)'; + stk_error (errmsg, 'TooManyInputArgs'); + else + [varargout{:}] = bsxfun (@min, x, y); + end + +end % if + +end % function + + +%!test stk_test_dfbinaryop ('min', rand(7, 2), rand(7, 2)); +%!test stk_test_dfbinaryop ('min', rand(7, 2), pi); +%!error stk_test_dfbinaryop ('min', rand(7, 2), rand(7, 3)); + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (min(df1), min(x1))) +%!assert (isequal (min(df1, [], 1), min(x1))) +%!assert (isequal (min(df1, [], 2), min(x1, [], 2))) +%!error (min(df1, df1, 2)) + +%!test +%! x = stk_dataframe ([5; 2; 4]); +%! [M, k] = min (x); +%! assert ((M == 2) && (k == 2)); diff --git a/inst/arrays/@stk_dataframe/minus.m b/inst/arrays/@stk_dataframe/minus.m new file mode 100644 index 0000000..3c45c50 --- /dev/null +++ b/inst/arrays/@stk_dataframe/minus.m @@ -0,0 +1,37 @@ +% MINUS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = minus(x1, x2) + +y = bsxfun(@minus, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@minus, rand(7, 2), rand(7, 2)); +%!test stk_test_dfbinaryop(@minus, rand(7, 2), pi); +%!error stk_test_dfbinaryop(@minus, rand(7, 2), rand(7, 3)); diff --git a/inst/arrays/@stk_dataframe/mldivide.m b/inst/arrays/@stk_dataframe/mldivide.m new file mode 100644 index 0000000..9a9392d --- /dev/null +++ b/inst/arrays/@stk_dataframe/mldivide.m @@ -0,0 +1,88 @@ +% MLDIVIDE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = mldivide (x1, x2) + +if isa (x1, 'stk_dataframe') + + x1_data = x1.data; + rownames = x1.colnames; + + if isa (x2, 'stk_dataframe') % both are stk_dataframe objects + + x2_data = x2.data; + colnames = x2.colnames; + + else % x1 is an stk_dataframe object, but not x2 + + x2_data = x2; + colnames = {}; + + end + +else % x2 is an stk_dataframe object, but x1 is not + + x1_data = x1; + + x2_data = x2.data; + colnames = x2.colnames; + + if isscalar (x1) % special case + rownames = x2.rownames; + else + rownames = {}; + end + +end + +y = stk_dataframe (x1_data \ x2_data, colnames, rownames); + +end % function + + +%!test +%! x1_data = [57 7; 2 0]; +%! x1 = stk_dataframe (x1_data, {'x' 'y'}, {'a'; 'b'}); +%! x2_data = [8 7; 2 0]; +%! x2 = stk_dataframe (x2_data, {'w' 'z'}, {'a'; 'b'}); +%! y = x2 \ x1; +%! assert (stk_isequal_tolabs (y, ... +%! stk_dataframe ([1 0; 7 1], {'x'; 'y'}, {'w'; 'z'}))); + + +% Special case: division by a scalar + +%!shared x_data, x, y_data, y +%! x_data = [3 3; 6 3; 9 12]; +%! y_data = [1 1; 2 1; 3 4]; +%! x = stk_dataframe (x_data, {'x' 'y'}, {'a'; 'b'; 'c'}); + +%!test y = 3 \ x; +%!assert (isequal (y, stk_dataframe (y_data, {'x' 'y'}, {'a'; 'b'; 'c'}))); + +%!error y = x \ 3; diff --git a/inst/arrays/@stk_dataframe/mode.m b/inst/arrays/@stk_dataframe/mode.m new file mode 100644 index 0000000..7c8f259 --- /dev/null +++ b/inst/arrays/@stk_dataframe/mode.m @@ -0,0 +1,43 @@ +% MODE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = mode(x, dim) + +if nargin < 2, dim = 1; end + +z = apply(x, dim, @mode); + +end % function + + +%!shared x1, df1 +%! x1 = floor(3 * rand(9, 3)); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (mode(df1), mode(x1))) +%!assert (isequal (mode(df1, 1), mode(x1))) +%!assert (isequal (mode(df1, 2), mode(x1, 2))) diff --git a/inst/arrays/@stk_dataframe/mrdivide.m b/inst/arrays/@stk_dataframe/mrdivide.m new file mode 100644 index 0000000..214e9a9 --- /dev/null +++ b/inst/arrays/@stk_dataframe/mrdivide.m @@ -0,0 +1,88 @@ +% MRDIVIDE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = mrdivide (x1, x2) + +if isa (x1, 'stk_dataframe') + + x1_data = x1.data; + rownames = x1.rownames; + + if isa (x2, 'stk_dataframe') % both are stk_dataframe objects + + x2_data = x2.data; + colnames = x2.rownames; + + else + + x2_data = x2; + + if isscalar (x2) % special case + colnames = x1.colnames; + else + colnames = {}; + end + + end + +else % x2 is an stk_dataframe object, but x1 is not + + x1_data = x1; + rownames = {}; + + x2_data = x2.data; + colnames = x2.rownames; + +end + +y = stk_dataframe (x1_data / x2_data, colnames, rownames); + +end % function + + +%!test +%! x1_data = [8 7; 58 49]; +%! x1 = stk_dataframe (x1_data, {'x' 'y'}, {'a'; 'b'}); +%! x2_data = [8 7; 2 0]; +%! x2 = stk_dataframe (x2_data, {'x' 'y'}, {'u'; 'v'}); +%! y = x1 / x2; +%! assert (stk_isequal_tolabs (y, ... +%! stk_dataframe ([1 0; 7 1], {'u'; 'v'}, {'a'; 'b'}))); + + +% Special case: division by a scalar + +%!shared x_data, x, y_data, y +%! x_data = [3 3; 6 3; 9 12]; +%! y_data = [1 1; 2 1; 3 4]; +%! x = stk_dataframe (x_data, {'x' 'y'}, {'a'; 'b'; 'c'}); + +%!test y = x / 3; +%!assert (isequal (y, stk_dataframe ([1 1; 2 1; 3 4], {'x' 'y'}, {'a'; 'b'; 'c'}))); + +%!error y = 3 / x; diff --git a/inst/arrays/@stk_dataframe/mtimes.m b/inst/arrays/@stk_dataframe/mtimes.m new file mode 100644 index 0000000..79a9124 --- /dev/null +++ b/inst/arrays/@stk_dataframe/mtimes.m @@ -0,0 +1,98 @@ +% MTIMES [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = mtimes (x1, x2) + +if isa (x1, 'stk_dataframe') + + x1_data = x1.data; + rownames = x1.rownames; + + if isa (x2, 'stk_dataframe') % both are stk_dataframe objects + + x2_data = x2.data; + colnames = x2.colnames; + + else % x1 is an stk_dataframe object, but not x2 + + x2_data = x2; + + if isscalar (x2) % special case + colnames = x1.colnames; + else + colnames = {}; + end + + end + +else % x2 is an stk_dataframe object, but x1 is not + + x1_data = x1; + + x2_data = x2.data; + colnames = x2.colnames; + + if isscalar (x1) % special case + rownames = x2.rownames; + else + rownames = {}; + end + +end + +y = stk_dataframe (x1_data * x2_data, colnames, rownames); + +end % function + + +%!shared x, y, z, w +%! +%! u = [1 3 4; 2 7 6]; % 2 x 3 +%! v = [6 2; 1 7; 9 4]; % 3 x 2 +%! w = [45 39; 73 77]; % u * v +%! +%! x = stk_dataframe (u, {}, {'a'; 'b'}); +%! y = stk_dataframe (v, {'c' 'd'}); +%! z = x * y; + +%!assert (isa (z, 'stk_dataframe')); +%!assert (isequal (z.data, w)); +%!assert (isequal (z.rownames, x.rownames)); +%!assert (isequal (z.colnames, y.colnames)); + + +% Special case: multiplication by a scalar + +%!shared x, y +%! x = stk_dataframe (rand (3, 2), {'x' 'y'}, {'a'; 'b'; 'c'}); + +%!test y = 3 * x; +%!assert (isequal (y, stk_dataframe (3 * x.data, {'x' 'y'}, {'a'; 'b'; 'c'}))); + +%!test y = x * 3; +%!assert (isequal (y, stk_dataframe (3 * x.data, {'x' 'y'}, {'a'; 'b'; 'c'}))); diff --git a/inst/arrays/@stk_dataframe/ne.m b/inst/arrays/@stk_dataframe/ne.m new file mode 100644 index 0000000..bbe285f --- /dev/null +++ b/inst/arrays/@stk_dataframe/ne.m @@ -0,0 +1,33 @@ +% NE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = ne (x1, x2) + +y = (double (x1) ~= double (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/not.m b/inst/arrays/@stk_dataframe/not.m new file mode 100644 index 0000000..0e38236 --- /dev/null +++ b/inst/arrays/@stk_dataframe/not.m @@ -0,0 +1,33 @@ +% NOT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = not (x) + +y = ~ logical (x); + +end % function diff --git a/inst/arrays/@stk_dataframe/openvar.m b/inst/arrays/@stk_dataframe/openvar.m new file mode 100644 index 0000000..318e70d --- /dev/null +++ b/inst/arrays/@stk_dataframe/openvar.m @@ -0,0 +1,65 @@ +% OPENVAR [overload base function] + +% Copyright Notice +% +% Copyright (C) 2016 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function openvar (varname, x) + +try + x_val = array2table (double (x)); + x_val.Properties.RowNames = x.rownames; + if ~ isempty (x.colnames) + x_val.Properties.VariableNames = x.colnames; + end + x_name = sprintf ('%s__CONVERTED_TO_TABLE', varname); +catch + x_val = double (x); + x_name = sprintf ('%s__CONVERTED_TO_DOUBLE', varname); +end + +show_warning = stk_options_get ('stk_dataframe', 'openvar_warndlg'); + +if show_warning + + w_msg = sprintf (['Viewing the content of stk_dataframe objects in the ' ... + 'Variable Editor directly is not possible.\n\n'... + 'A temporary variable named %s will be now created in your base ' ... + 'workspace, making it possible for you to explore the data ' ... + 'contained in %s using the Variable Editor.\n\n' ... + 'DO NOT EDIT this temporary variable, as the modifications will ' ... + 'not be copied back to the original variable %s.\n\n' ... + 'This warning will only be shown once per session.'], ... + x_name, varname, varname); + + warndlg (w_msg, 'Converting stk_dataframe object', 'modal'); + + stk_options_set ('stk_dataframe', 'openvar_warndlg', false); +end + +assignin ('base', x_name, x_val); +openvar (x_name) + +end \ No newline at end of file diff --git a/inst/arrays/@stk_dataframe/or.m b/inst/arrays/@stk_dataframe/or.m new file mode 100644 index 0000000..efd610d --- /dev/null +++ b/inst/arrays/@stk_dataframe/or.m @@ -0,0 +1,33 @@ +% OR [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = or (x1, x2) + +y = (logical (x1) | logical (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/plot.m b/inst/arrays/@stk_dataframe/plot.m new file mode 100644 index 0000000..aad45aa --- /dev/null +++ b/inst/arrays/@stk_dataframe/plot.m @@ -0,0 +1,326 @@ +% PLOT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015-2017, 2020, 2022 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = plot (varargin) + +% Parse the list of input arguments +[h_axes, plot_elem, keyval_pairs] = parse_args_ (varargin{:}); + +% Read hold state +b = ishold (); + +% Plot all +n = length (plot_elem); +h_plot = []; +for i = 1:n + p = plot_elem(i); + hh = plot_ (h_axes, p.x, p.z, p.S, keyval_pairs{:}); + h_plot = [h_plot; hh]; %#ok + if (i == 1) && (n > 1), hold on; end +end + +% Restore hold state +if (~ b) && (n > 1), hold off; end + +end % function + + +function h = plot_ (h_axes, x, z, S, varargin) + +%--- Handle stk_dataframe inputs ------------------------------------------ + +if isa (x, 'stk_dataframe') + xlab = x.colnames; + x = double (x); +else + xlab = {}; +end + +if isa (z, 'stk_dataframe') + zlab = z.colnames; + z = double (z); +else + zlab = {}; +end + +%--- Deal with various forms for x and z ---------------------------------- + +if isempty (x) % Special: x not provided + + [n, d] = size (z); + + % Tolerate row vector for z + if (d > 1) && (isequal (size (z), [1 d])) % isrow CG#08 + n = d; + z = z'; + end + + % Create a default x + x = (1:n)'; + +else % General case + + [n, d] = size (x); + + % Tolerate row vector for x + if (d > 1) && (isequal (size (x), [1 d])) % isrow CG#08 + n = d; + x = x'; + end + + % Tolerate row vector for z + if isequal (size (z), [1 n]) % isrow CG#08 + z = z'; + end + +end + +%--- Plot and set labels -------------------------------------------------- + +if isempty (S) + h = plot (h_axes, x, z, varargin{:}); +else + h = plot (h_axes, x, z, S, varargin{:}); +end + +if ~ isempty (xlab) + if size (x, 2) == 1 + stk_xlabel (xlab{1}, 'interpreter', 'none'); % CG#10 + end + % Note: in the case where x has several columns (and z also) we could + % create more elaborate legends, e.g., "Zj versus Xj". Another time. +end + +if ~ isempty (zlab) + if size (z, 2) == 1 + stk_ylabel (zlab{1}, 'interpreter', 'none'); % CG#10 + else + legend (zlab{:}); + end +end + +end % function + +%#ok<*SPWRN,*TRYNC> + + +function [h_axes, plot_elem, keyval_pairs] = parse_args_ (varargin) + +% Plot is highly polymorphic, making the task of parsing input arguments a +% rather lengthy and painful one... + +%--- Formal grammar for the list of arguments ----------------------------- +% +% Terminal symbols +% +% h = a handle to an axes object +% x = abscissa argument +% z = ordinate argument +% S = symbol/color/line string argument +% k = key in a key-val pair +% v = value in a key-val pair +% +% Derivation rules +% +% ::= | h +% ::= +% ::= k v | k v +% ::= | +% ::= | +% ::= | +% ::= x z | x z S +% ::= z | z S + +% Extract axis handle (if it is present) +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +if n_argin == 0 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +% Extract first element from the list of arguments +arg1 = varargin{1}; +varargin(1) = []; + +% Then, arg1 *must* be a "numeric" argument +if ischar (arg1) + stk_error ('Syntax error. Unexpected string argument.', 'TypeMismatch'); +end + +% Then, process remaining arguments recursively +if isempty (varargin) + + % Special case: x has been omitted, and there are no additional args + plot_elem = struct ('x', [], 'z', {arg1}, 'S', []); + keyval_pairs = {}; + +elseif ischar (varargin{1}) + + % Special case: x has been omitted, and there *are* additional args + if mod (length (varargin), 2) + S = []; + keyval_pairs = parse_keyval_ (varargin); + else + S = varargin{1}; + keyval_pairs = parse_keyval_ (varargin{2:end}); + end + plot_elem = struct ('x', [], 'z', {arg1}, 'S', {S}); + +else + + % General case + [plot_elem, keyval_pairs] = parse_args__ (arg1, varargin{:}); + +end + +end % function + + +function [plot_elem, keyval_pairs] = parse_args__ (x, z, varargin) + +if ischar (x) || ischar (z) + display (x); display (z); + stk_error (['Syntax error. At this point, we were expecting ' ... + 'another numeric (x, z) pair.'], 'SyntaxError'); +end + +if isempty (varargin) + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); + keyval_pairs = {}; + +elseif ~ ischar (varargin{1}) % expect another (x, z) pair after this one + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); + [plot_elem_, keyval_pairs] = parse_args__ (varargin{:}); + plot_elem = [plot_elem plot_elem_]; + +elseif length (varargin) == 1 % S + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1)); + keyval_pairs = {}; + +elseif length (varargin) == 2 % key, val OR x2, z2 ? + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); + + if ischar (varargin{1}) + keyval_pairs = parse_keyval_ (varargin{:}); + else + plot_elem_ = struct ('x', varargin(1), 'z', varargin(2), 'S', []); + plot_elem = [plot_elem plot_elem_]; + keyval_pairs = {}; + end + +else % Three or more remaining arguments + % 1) S, key, val, ... ? + % 2) S, x2, z2, ... ? + % 3) key, val, key, val, ... ? + % 4) x2, z2, ... ? + + if ~ ischar (varargin{1}) % x2, z2, ... + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); + [plot_elem_, keyval_pairs] = parse_args__ (varargin); + plot_elem = [plot_elem plot_elem_]; + + elseif ~ ischar (varargin{2}) % S, x2, z2, ... OR key, val, key, val, ... + + if ~ ischar (varargin{3}) % S, x2, z2, ... + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1)); + [plot_elem_, keyval_pairs] = parse_args__ (varargin{2:end}); + plot_elem = [plot_elem plot_elem_]; + + else % key, val, key, val, ... + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); + keyval_pairs = parse_keyval_ (varargin{:}); + + end + + else % S, key, val, ... OR key, val, key, val, ... + + if mod (length (varargin), 2) == 1 % S, key, val, ... + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1)); + keyval_pairs = parse_keyval_ (varargin{2:end}); + + else % key, val, key, val, ... + + plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); + keyval_pairs = parse_keyval_ (varargin{:}); + + end + end +end + +end % function + + +function keyval_pairs = parse_keyval_ (key, val, varargin) + +if nargin == 0 + + keyval_pairs = {}; + +elseif nargin == 1 + + errmsg = 'Syntax error. Incomplete key-value pair'; + stk_error (errmsg, 'NotEnoughInputArgs'); + +elseif ~ ischar (key) + + display (key); + stk_error (['Syntax error. At his point, we were expecting a ' ... + 'key-value pair, but key is not a string.'], 'TypeMismatch'); + +else + + keyval_pairs = [{key, val} parse_keyval_(varargin{:})]; + +end + +end % function + + +%!test % plot with x as a vector and z as a (univariate) dataframe +%! x = linspace(0, 2*pi, 30)'; +%! z = stk_dataframe(sin(x)); +%! figure; plot(x, z); close(gcf); + +%!test % plot with x as a vector and z as a (multivariate) dataframe +%! x = linspace(0, 2*pi, 30)'; +%! z = stk_dataframe([sin(x) cos(x)], {'sin' 'cos'}); +%! figure; plot(x, z); close(gcf); + +%!test % plot with x as a dataframe and z as a vector +%! x = stk_dataframe(linspace(0, 2*pi, 30)'); +%! z = sin(double(x)); +%! figure; plot(x, z); close(gcf); diff --git a/inst/arrays/@stk_dataframe/plotmatrix.m b/inst/arrays/@stk_dataframe/plotmatrix.m new file mode 100644 index 0000000..128056a --- /dev/null +++ b/inst/arrays/@stk_dataframe/plotmatrix.m @@ -0,0 +1,125 @@ +% @STK_DATAFRAME/PLOTMATRIX [overload base function] +% +% See also: plotmatrix + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = plotmatrix (varargin) + +% Parse the list of input arguments +[h_axes, x, y, linespec] = parse_args_ (varargin{:}); + +% Read x argument +if isa (x, 'stk_dataframe') + x_data = double (x); + x_colnames = x.colnames; +else + x_data = x; + x_colnames = {}; +end +nx = size (x_data, 2); + +varargout = cell (1, max (nargout, 2)); +if isempty (y) + + y_colnames = x_colnames; + ny = nx; + + [varargout{:}] = plotmatrix (h_axes, x_data, linespec{:}); + +else + + % Read y argument + if isa (y, 'stk_dataframe') + y_data = double (y); + y_colnames = y.colnames; + else + y_data = double (y); + y_colnames = {}; + end + ny = size (y_data, 2); + + [varargout{:}] = plotmatrix (h_axes, x_data, y_data, linespec{:}); + +end + +hh = varargout{2}; +varargout = varargout(1:nargout); + +if ~ isempty (x_colnames) + for i = 1:nx + stk_xlabel (hh(ny, i), x_colnames{i}, 'interpreter', 'none'); % CG#10 + end +end + +if ~ isempty (y_colnames) + for j = 1:ny + stk_ylabel (hh(j, 1), y_colnames{j}, 'interpreter', 'none'); % CG#10 + end +end + + +end % function + + +function [h_axes, x, y, linespec] = parse_args_ (varargin) + +% Extract axis handle (if it is present) +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +switch n_argin + + case 0 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); + + case 1 + x = varargin{1}; + y = []; + linespec = {}; + + case 2 + if ischar (varargin{2}) + x = varargin{1}; + y = []; + linespec = varargin(2); + else + x = varargin{1}; + y = varargin{2}; + linespec = {}; + end + + case 3 + x = varargin{1}; + y = varargin{2}; + linespec = varargin(3); + + otherwise + stk_error ('Too many input arguments.', 'TooManyInputArgs'); + +end % switch + +end % function diff --git a/inst/arrays/@stk_dataframe/plus.m b/inst/arrays/@stk_dataframe/plus.m new file mode 100644 index 0000000..dae7020 --- /dev/null +++ b/inst/arrays/@stk_dataframe/plus.m @@ -0,0 +1,38 @@ +% PLUS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = plus(x1, x2) + +y = bsxfun(@plus, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@plus, rand(7, 2), rand(7, 2)); +%!test stk_test_dfbinaryop(@plus, rand(7, 2), pi); +%!error stk_test_dfbinaryop(@plus, rand(7, 2), rand(7, 3)); + diff --git a/inst/arrays/@stk_dataframe/power.m b/inst/arrays/@stk_dataframe/power.m new file mode 100644 index 0000000..784090a --- /dev/null +++ b/inst/arrays/@stk_dataframe/power.m @@ -0,0 +1,37 @@ +% POWER [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = power(x1, x2) + +y = bsxfun(@power, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@power, rand(7, 2), .1 + rand(7, 2)); +%!test stk_test_dfbinaryop(@power, rand(7, 2), .1); +%!error stk_test_dfbinaryop(@power, rand(7, 2), .1 + rand(7, 3)); diff --git a/inst/arrays/@stk_dataframe/private/get_column_number.m b/inst/arrays/@stk_dataframe/private/get_column_number.m new file mode 100644 index 0000000..9d071e6 --- /dev/null +++ b/inst/arrays/@stk_dataframe/private/get_column_number.m @@ -0,0 +1,30 @@ +% GET_COLUMN_NUMBER [STK internal] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +% Do NOT remove this seemingly useless M-file, otherwise some not-so-old +% versions of Octave would faild to detect the corresponding mex-file. diff --git a/inst/arrays/@stk_dataframe/private/names_errmsg.m b/inst/arrays/@stk_dataframe/private/names_errmsg.m new file mode 100644 index 0000000..11348b0 --- /dev/null +++ b/inst/arrays/@stk_dataframe/private/names_errmsg.m @@ -0,0 +1,44 @@ +% NAMES_ERRMSG [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [s, mnemo] = names_errmsg (n1, n2, type) + +mnemo = sprintf ('Unknown%sNames', type); + +type = lower (type); + +s = 'Invalid indexing'; + +if any (~ cellfun (@ischar, n1)), + s = sprintf ('%s: %s names must be character arrays (char).', s, type); +else + i = find (~ ismember (n1, n2), 1, 'first'); + s = sprintf ('%s: there is no %s named %s.', s, type, n1{i}); +end + +end % function diff --git a/inst/arrays/@stk_dataframe/private/process_cell_indices.m b/inst/arrays/@stk_dataframe/private/process_cell_indices.m new file mode 100644 index 0000000..c0d4f9f --- /dev/null +++ b/inst/arrays/@stk_dataframe/private/process_cell_indices.m @@ -0,0 +1,42 @@ +% PROCESS_CELL_INDICES [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function I = process_cell_indices (I, name_list, type) + +% assert (iscell (I)) % no argument checking in private functions + +names = I; + +[b, I] = ismember (names, name_list); + +if ~ all (b) + [errmsg, mnemo] = names_errmsg (names, name_list, type); + stk_error (errmsg, mnemo); +end + +end % function diff --git a/inst/arrays/@stk_dataframe/private/process_char_indices.m b/inst/arrays/@stk_dataframe/private/process_char_indices.m new file mode 100644 index 0000000..6d65739 --- /dev/null +++ b/inst/arrays/@stk_dataframe/private/process_char_indices.m @@ -0,0 +1,42 @@ +% PROCESS_CHAR_INDICES [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function I = process_char_indices (I, name_list, type) + +% assert (ischar (I)) % no argument checking in private functions + +name = I; + +[b, I] = ismember (name, name_list); + +if ~ b + [errmsg, mnemo] = names_errmsg ({name}, name_list, type); + stk_error (errmsg, mnemo); +end + +end % function diff --git a/inst/arrays/@stk_dataframe/private/reserved_field_names.m b/inst/arrays/@stk_dataframe/private/reserved_field_names.m new file mode 100644 index 0000000..8d462d0 --- /dev/null +++ b/inst/arrays/@stk_dataframe/private/reserved_field_names.m @@ -0,0 +1,34 @@ +% RESERVED_FIELD_NAMES [STK internal] + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function c = reserved_field_names () + +c = {'data'; 'info'; 'rownames'; 'colnames'; 'sample_size'}; + +end % function diff --git a/inst/arrays/@stk_dataframe/prod.m b/inst/arrays/@stk_dataframe/prod.m new file mode 100644 index 0000000..6da6a01 --- /dev/null +++ b/inst/arrays/@stk_dataframe/prod.m @@ -0,0 +1,43 @@ +% PROD [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = prod(x, dim) + +if nargin < 2, dim = 1; end + +z = apply(x, dim, @prod); + +end % function + + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (prod(df1), prod(x1))) +%!assert (isequal (prod(df1, 1), prod(x1))) +%!assert (isequal (prod(df1, 2), prod(x1, 2))) diff --git a/inst/arrays/@stk_dataframe/quantile.m b/inst/arrays/@stk_dataframe/quantile.m new file mode 100644 index 0000000..a18b417 --- /dev/null +++ b/inst/arrays/@stk_dataframe/quantile.m @@ -0,0 +1,45 @@ +% QUANTILE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = quantile (x, p, dim) + +if nargin < 3, + dim = 1; +end + +z = apply (x, dim, @quantile, p); + +end % function + +%!shared x1, df1, p +%! x1 = rand (9, 3); +%! df1 = stk_dataframe (x1, {'a', 'b', 'c'}); +%! p = 0.95; +%!assert (isequal (quantile (df1, p), quantile (x1, p))) +%!assert (isequal (quantile (df1, p, 1), quantile (x1, p))) +%!assert (isequal (quantile (df1, p, 2), quantile (x1, p, 2))) diff --git a/inst/arrays/@stk_dataframe/rdivide.m b/inst/arrays/@stk_dataframe/rdivide.m new file mode 100644 index 0000000..2abda1f --- /dev/null +++ b/inst/arrays/@stk_dataframe/rdivide.m @@ -0,0 +1,37 @@ +% RDIVIDE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = rdivide(x1, x2) + +y = bsxfun(@rdivide, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@rdivide, rand(7, 2), 1 + rand(7, 2)); +%!test stk_test_dfbinaryop(@rdivide, rand(7, 2), pi); +%!error stk_test_dfbinaryop(@rdivide, rand(7, 2), 1 + rand(7, 3)); diff --git a/inst/arrays/@stk_dataframe/realpow.m b/inst/arrays/@stk_dataframe/realpow.m new file mode 100644 index 0000000..e05138d --- /dev/null +++ b/inst/arrays/@stk_dataframe/realpow.m @@ -0,0 +1,37 @@ +% REALPOW [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = realpow(x1, x2) + +y = bsxfun(@realpow, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@realpow, rand(7, 2), .1 + rand(7, 2)); +%!test stk_test_dfbinaryop(@realpow, rand(7, 2), .1); +%!error stk_test_dfbinaryop(@realpow, rand(7, 2), .1 + rand(7, 3)); diff --git a/inst/arrays/@stk_dataframe/reshape.m b/inst/arrays/@stk_dataframe/reshape.m new file mode 100644 index 0000000..c761f1c --- /dev/null +++ b/inst/arrays/@stk_dataframe/reshape.m @@ -0,0 +1,45 @@ +% RESHAPE [overload base function] +% +% Note : the result of reshaping a dataframe is again a dataframe, but all row +% and columns names are lost in the process. + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = reshape (x, varargin) + +% Silently assume that x is a dataframe +% (this can go wrong if a dataframe is hidden in varargin, but hey...) + +y = stk_dataframe (reshape (x.data, varargin{:})); + +end % function + + +%!test +%! x = stk_dataframe (randn (10, 3)); +%! y = reshape (x, 5, 6); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [5 6])) diff --git a/inst/arrays/@stk_dataframe/set.m b/inst/arrays/@stk_dataframe/set.m new file mode 100644 index 0000000..41e6a2b --- /dev/null +++ b/inst/arrays/@stk_dataframe/set.m @@ -0,0 +1,110 @@ +% SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = set (x, propname, value) + +icol = __get_column_number__ (x.colnames, propname); + +switch icol + + case -4 % 'info' + + x.info = value; + + case -3 % 'rownames' + + if isempty (value) + x.rownames = {}; + else + n1 = size (x.data, 1); + n2 = length (value); + if ~ iscell (value) + stk_error (['Input argument ''value'' should be a cell' ... + ' array.'], 'InvalidArgument'); + elseif isequal (size (value), [n2 1]) + x.rownames = value; + else + x.rownames = reshape (value, n2, 1); + end + + b = cellfun (@isempty, x.rownames); + nb = sum (b); + if nb > 0 + x.rownames(b) = repmat ({''}, nb, 1); + end + if n2 < n1 + x.rownames = [x.rownames; repmat({''}, n1 - n2, 1)]; + elseif n2 > n1 + x.data = [x.data; nan(n2 - n1, size(x.data, 2))]; + end + end + + case -2 % 'colnames' + + if isempty (value) + x.colnames = {}; + else + d1 = size (x.data, 2); + d2 = length (value); + + if ~ iscell (value) + stk_error (['Input argument ''value'' should be a cell' ... + ' array.'], 'InvalidArgument'); + elseif isequal (size (value), [1 d2]) + x.colnames = value; + else + x.colnames = reshape (value, 1, d2); + end + + b = cellfun (@isempty, x.colnames); + nb = sum (b); + if nb > 0 + x.colnames(b) = repmat ({''}, 1, nb); + end + if d2 < d1 + x.colnames = [x.colnames repmat({''}, 1, d1 - d2)]; + elseif d2 > d1 + x.data = [x.data nan(size(x.data, 1), d2 - d1)]; + end + end + + case - 1 % set entire array + + x = set_data (x, value); + + otherwise + if isequal (size(value), [size(x.data, 1) 1]) + x.data(:, icol) = value; + else + error ('Incorrect size'); + end + +end + +end % function diff --git a/inst/arrays/@stk_dataframe/set_data.m b/inst/arrays/@stk_dataframe/set_data.m new file mode 100644 index 0000000..a772b78 --- /dev/null +++ b/inst/arrays/@stk_dataframe/set_data.m @@ -0,0 +1,58 @@ +% @STK_DATAFRAME/SET_DATA [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = set_data (x, data) + +[n1, d1] = size (x.data); +[n2, d2] = size (data); +x.data = data; + +if (n1 ~= n2) && ~ isempty (x.rownames) + if n2 > n1 + % silently add rows without a name + x.rownames = [x.rownames; repmat({''}, n2 - n1, 1)]; + else + % delete superfluous row names and emit a warning + x.rownames = x.rownames(1:n2); + warning ('Some row names have been deleted.'); + end +end + +if (d1 ~= d2) && ~ isempty (x.colnames) + if d2 > d1 + % silently add columns without a name + x.colnames = [x.colnames; repmat({''}, 1, d2 - d1)]; + else + % delete superfluous column names and emit a warning + x.colnames = x.colnames(1:d2); + warning ('Some column names have been deleted.'); + end +end + +end % function diff --git a/inst/arrays/@stk_dataframe/sin.m b/inst/arrays/@stk_dataframe/sin.m new file mode 100644 index 0000000..bacf5fe --- /dev/null +++ b/inst/arrays/@stk_dataframe/sin.m @@ -0,0 +1,38 @@ +% SIN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = sin (x) + +ydata = sin (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = sin (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, sin (u))) diff --git a/inst/arrays/@stk_dataframe/sind.m b/inst/arrays/@stk_dataframe/sind.m new file mode 100644 index 0000000..3773779 --- /dev/null +++ b/inst/arrays/@stk_dataframe/sind.m @@ -0,0 +1,38 @@ +% SIND [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = sind (x) + +ydata = sind (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = sind (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, sind (u))) diff --git a/inst/arrays/@stk_dataframe/sinh.m b/inst/arrays/@stk_dataframe/sinh.m new file mode 100644 index 0000000..d27ab8e --- /dev/null +++ b/inst/arrays/@stk_dataframe/sinh.m @@ -0,0 +1,38 @@ +% SINH [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = sinh (x) + +ydata = sinh (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = sinh (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, sinh (u))) diff --git a/inst/arrays/@stk_dataframe/size.m b/inst/arrays/@stk_dataframe/size.m new file mode 100644 index 0000000..fb8b069 --- /dev/null +++ b/inst/arrays/@stk_dataframe/size.m @@ -0,0 +1,45 @@ +% SIZE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = size(x, varargin) + +varargout = cell(1, max(nargout, 1)); +[varargout{:}] = size(x.data, varargin{:}); + +end % function + +%!shared x +%! x = stk_dataframe([1 2; 3 4; 5 6]); +%!assert (isequal (size(x), [3 2])) +%!assert (numel(x) == 1) +%!assert (ndims(x) == 2) +%!test size(x); % force exploration of branch nargout == 0 + +% Note: numel MUST return 1 and not prod(size(x)) +% http://www.mathworks.fr/support/solutions/en/data/1-19EZ0/?1-19EZ0 + diff --git a/inst/arrays/@stk_dataframe/sort.m b/inst/arrays/@stk_dataframe/sort.m new file mode 100644 index 0000000..d4e1f7a --- /dev/null +++ b/inst/arrays/@stk_dataframe/sort.m @@ -0,0 +1,98 @@ +% SORT [overload base] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, i] = sort (x, varargin) + +if ~ isa (x, 'stk_dataframe'), + % Not what we expect: dim or mode is an stk_dataframe... + stk_error ('x should be an stk_dataframe object here.', 'TypeMismatch'); +end + +% The dimension argument is optional, we have to check if it has been given +if (nargin > 1) && (~ ischar (varargin{1})) + dim = varargin{1}; + if ~ (isequal (dim, 1) || isequal (dim, 2)) + stk_error ('dim sould be 1 or 2.', 'InvalidArgument'); + end + opts = varargin(2:end); +else + % Sort along the first non-singleton dimension + if (size (x.data, 1) > 1) + dim = 1; + else + dim = 2; + end + opts = varargin; +end + +if dim == 1 % Sort columns + + [x.data, i] = sort (x.data, 1, opts{:}); + + if (size (x.data, 2) > 1) + % Row names are lost when sorting a dataframe with more than one column + x.rownames = {}; + elseif ~ isempty (x.rownames) + x.rownames = x.rownames(i); + end + +else % Sort rows + + [x.data, i] = sort (x.data, 2, opts{:}); + + if (size (x.data, 1) > 1) + % Column names are lost when sorting a dataframe with more than one row + x.colnames = {}; + elseif ~ isempty (x.colnames) + x.colnames = x.colnames(i); + end + +end + +end % function + + +%!shared x, y +%! x = stk_dataframe ([3; 2; 1], {}, {'a', 'b', 'c'}); +%! y = sort (x); + +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.data, [1; 2; 3])) +%!assert (isequal (y.rownames, {'c'; 'b'; 'a'})) +%!error y = sort (x, []); +%!assert (isequal (sort (x, 1), y)) +%!assert (isequal (sort (x, 2), x)) +%!error sort (x, 3) +%!error y = sort (x, [], 'ascend'); +%!assert (isequal (sort (x, 1, 'ascend'), y)) +%!assert (isequal (sort (x, 2, 'ascend'), x)) +%!error y = sort (x, 3, 'ascend'); +%!error y = sort (x, [], 'descend'); +%!assert (isequal (sort (x, 1, 'descend'), x)) +%!assert (isequal (sort (x, 2, 'descend'), x)) +%!error sort (x, 3, 'descend') diff --git a/inst/arrays/@stk_dataframe/sqrt.m b/inst/arrays/@stk_dataframe/sqrt.m new file mode 100644 index 0000000..9417c7a --- /dev/null +++ b/inst/arrays/@stk_dataframe/sqrt.m @@ -0,0 +1,38 @@ +% SQRT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = sqrt (x) + +ydata = sqrt (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = sqrt (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, sqrt (u))) diff --git a/inst/arrays/@stk_dataframe/std.m b/inst/arrays/@stk_dataframe/std.m new file mode 100644 index 0000000..bae44b6 --- /dev/null +++ b/inst/arrays/@stk_dataframe/std.m @@ -0,0 +1,47 @@ +% STD [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = std(x, flag, dim) + +if nargin < 2, flag = 0; end % default: normalize by N-1 +if nargin < 3, dim = 1; end % default: act along columns + +z = apply(x, dim, @std, flag); + +end % function + + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (std(df1), std(x1))) +%!assert (isequal (std(df1, 0, 1), std(x1))) +%!assert (isequal (std(df1, 0, 2), std(x1, 0, 2))) +%!assert (isequal (std(df1, 1), std(x1, 1))) +%!assert (isequal (std(df1, 1, 1), std(x1, 1))) +%!assert (isequal (std(df1, 1, 2), std(x1, 1, 2))) diff --git a/inst/arrays/@stk_dataframe/stk_boundingbox.m b/inst/arrays/@stk_dataframe/stk_boundingbox.m new file mode 100644 index 0000000..4447ee2 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_boundingbox.m @@ -0,0 +1,45 @@ +% STK_BOUNDINGBOX [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function box = stk_boundingbox (x) + +box = stk_boundingbox (x.data); + +box.colnames = x.colnames; + +end % function + + +%!shared x, y, cn +%! cn = {'a', 'b', 'c'}; +%! x = stk_dataframe ([0 3 2; 1 4 1; 7 0 2], cn); + +%!error y = stk_boundingbox (); +%!test y = stk_boundingbox (x); + +%!assert (isequal (y, stk_hrect ([0 0 1; 7 4 2], cn))); diff --git a/inst/arrays/@stk_dataframe/stk_conditioning.m b/inst/arrays/@stk_dataframe/stk_conditioning.m new file mode 100644 index 0000000..e3a7d76 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_conditioning.m @@ -0,0 +1,99 @@ +% STK_CONDITIONING [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% +% Authors: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function zsimc = stk_conditioning (lambda, zi, zsim, xi_ind, noise_sim) + +df_out = false; % stk_dataframe output ? + +% Read 'lambda' argument +if isa (lambda, 'stk_dataframe') + lambda_ = lambda.data; + rownames = lambda.colnames; + df_out = true; +else + lambda_ = lambda; + rownames = {}; +end + +% Read 'zi' argument +if isa (zi, 'stk_dataframe') + zi_ = zi.data; +else + zi_ = zi; +end + +% Read 'zsim' argument +if isa (zsim, 'stk_dataframe') + zsim_ = zsim.data; + colnames = zsim.colnames; + if isempty (rownames), + rownames = zsim.rownames; + elseif ~ isequal (zsim.rownames, rownames) + rownames = {}; + end + df_out = true; +else + zsim_ = zsim; + colnames = {}; +end + +if nargin < 4, + + zsimc = stk_conditioning (lambda_, zi_, zsim_); + +else % nargin >= 4 + + % Read 'xi_ind' argument + if isa (xi_ind, 'stk_dataframe') + xi_ind_ = xi_ind.data; + else + xi_ind_ = xi_ind; + end + + if nargin < 5, + + zsimc = stk_conditioning (lambda_, zi_, zsim_, xi_ind_); + + else % nargin >= 5 + + % Read 'noise_sim' argument + if isa (noise_sim, 'stk_dataframe'), + noise_sim_ = noise_sim.data; + else + noise_sim_ = noise_sim; + end + + zsimc = stk_conditioning (lambda_, zi_, zsim_, xi_ind_, noise_sim_); + end +end + +if df_out, + zsimc = stk_dataframe (zsimc, colnames, rownames); +end + +end % function diff --git a/inst/arrays/@stk_dataframe/stk_dataframe.m b/inst/arrays/@stk_dataframe/stk_dataframe.m new file mode 100644 index 0000000..79c20b8 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_dataframe.m @@ -0,0 +1,366 @@ +% STK_DATAFRAME constructs a dataframe object +% +% CALL: D = stk_dataframe (X) +% +% constructs a dataframe object from X. If X is a plain numeric array, then +% D is dataframe without row or column names. If X already is an +% stk_dataframe object, row names and column names are preserved when they +% exist. +% +% CALL: D = stk_dataframe (X, COLNAMES) +% +% allows to specify column names for the dataframe D. Row names from X are +% preserved when they exist. +% +% If COLNAMES is empty ([]), this is equivalent to D = stk_dataframe (X); +% in particular, if X has column names, then D inherits from them. +% +% If COLNAMES is an empty cell({}), the resulting dataframe has no column +% names. +% +% CALL: D = stk_dataframe (X, COLNAMES, ROWNAMES) +% +% allows to specify row names as well. +% +% If ROWNAMES is empty ([]), this is equivalent to D = stk_dataframe (X, +% COLNAMES); in particular, if X has row names, then D inherits from them. +% +% If ROWNAMES is an empty cell({}), the resulting dataframe has no row names. +% +% NOTE: How to extract the underlying array +% +% It is sometimes useful to extract from an stk_dataframe object the +% underlying numerical (double precision) array. This can be achieved either +% using the 'data' field of the object: +% +% x1 = x.data; % x1 is a numerical array +% +% or using a cast to double: +% +% x2 = double (x); % x2 is a numerical array too, identical to x1 +% +% Note that the second syntax remains valid even if x is a numerical array +% (single, double, uint8...) instead of an stk_dataframe object. +% +% See also: stk_factorialdesign, stk_hrect + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_dataframe (x, colnames, rownames) + +if nargin == 0 % Default constructor + + x_data = zeros (0, 1); + colnames = {}; + rownames = {}; + +elseif isa (x, 'stk_dataframe') + + if strcmp (class (x), 'stk_dataframe') %#ok + + if nargin > 1 + x = process_names_df (x, colnames, 'colnames', 2); + if nargin > 2 + x = process_names_df (x, rownames, 'rownames', 1); + end + end + + return % We already have an stk_dataframe object + + else % x belongs to a derived class + + x_data = x.data; + + if nargin == 1 + + colnames = x.colnames; + rownames = x.rownames; + + else % nargin > 1 + + % colnames = [] means "keep x.colnames" + if isempty (colnames) && ~ iscell (colnames) + colnames = x.colnames; + end + + % rownames missing or [] means "keep x.rownames" + if (nargin == 2) || (isempty (rownames) && ~ iscell (rownames)) + rownames = x.rownames; + end + end + end + +else % Assume x is (or can be converted to) numeric data + + x_data = double (x); + + if nargin < 3 + rownames = {}; + + if nargin < 2 + colnames = {}; + end + end +end + +if isempty (x_data) + + [colnames, d] = process_names_empty (colnames, 'colnames', 2); + [rownames, n] = process_names_empty (rownames, 'rownames', 1); + x_data = zeros (n, d); + +else + + [n, d] = size (x_data); + colnames = process_names_0 (colnames, 'colnames', [1 d]); + rownames = process_names_0 (rownames, 'rownames', [n 1]); + +end + +x = struct (); + +x.data = x_data; +x.colnames = colnames; +x.rownames = rownames; +x.info = ''; + +x = class (x, 'stk_dataframe'); + +end % function + + +function arg = process_names_0 (arg, argname, s) + +len = max (s); + +if isempty (arg) + arg = {}; +else + try + if iscell (arg) + arg = reshape (arg, s); + else + % Special case: try to interpret arg as a char vector + assert (len == 1); + arg = {char(arg)}; + end + catch + stk_error (errmsg_names (argname, len), 'InvalidArgument'); + end +end + +end % function + + +function x = process_names_df (x, arg, argname, dim) + +% Note: [] means "keep existing names", while {} means "no names" + +if iscell (arg) + x = set (x, argname, arg); +elseif ~ isempty (arg) + try + len = size (x, dim); + assert (len == 1); + % Special case: try to interpret arg as a char vector + x = set (x, argname, {char(arg)}); + catch + stk_error (errmsg_names (argname, len), 'InvalidArgument'); + end +end + +end % function + + +function [arg, len] = process_names_empty (arg, argname, dim) + +if isempty (arg) + len = 0; + arg = {}; +elseif iscell (arg) + len = numel (arg); + if dim == 1 + arg = reshape (arg, len, 1); + else + arg = reshape (arg, 1, len); + end +else + try + % Try to interpret colnames as a char vector + len = 1; + arg = {char(arg)}; + catch + stk_error (errmsg_names (argname, len), 'InvalidArgument'); + end +end + +end % function + + +function msg = errmsg_names (argname, len) + +if len == 1 + msg = sprintf (['%s was expected to be a string (or char vector), a cell ' ... + 'array containing such a string (or char vector), or [].'], argname); +else + msg = sprintf (['%s was expected to be a cell array containing %d strings ' ... + '(or char vectors), or [].'], argname, len); +end + +end + + +%!test stk_test_class ('stk_dataframe') + +%!test % default constructor +%! x = stk_dataframe (); +%! assert (isa (x, 'stk_dataframe') && isequal (size (x), [0 0])) + +%!test +%! y = stk_dataframe (rand (3, 2)); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [3 2])) + +%!test +%! y = stk_dataframe (rand (3, 2), {'x', 'y'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) + +%!test +%! y = stk_dataframe (rand (3, 2), {'x', 'y'}, {'a', 'b', 'c'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [3 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) + +%!test +%! x = stk_dataframe (rand (3, 2)); +%! y = stk_dataframe (x); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [3 2])) + +%!error +%! x = stk_dataframe (rand (3, 2)); +%! y = stk_dataframe (x, pi); + +%!error +%! x = stk_dataframe (rand (3, 2)); +%! y = stk_dataframe (x, {}, pi); + +%!test +%! x = stk_dataframe (rand (3, 2)); +%! y = stk_dataframe (x, {'x' 'y'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) + +%!test +%! x = stk_dataframe (rand (3, 2)); +%! y = stk_dataframe (x, {'x' 'y'}, {'a', 'b', 'c'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) + +%!test +%! x = stk_dataframe (rand (3, 2), {'x' 'y'}); +%! y = stk_dataframe (x, [], {'a', 'b', 'c'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) + +%!test +%! x = stk_dataframe (rand (3, 2), {'x' 'y'}); +%! y = stk_dataframe (x, {}, {'a', 'b', 'c'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) +%! assert (isequal (y.colnames, {})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) + +%!test +%! x = stk_factorialdesign ({1:3, 1:2}, {'x' 'y'}); +%! y = stk_dataframe (x, [], {'a' 'b' 'c' 'd' 'e' 'f'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) + +%!test +%! x = stk_factorialdesign ({1:3, 1:2}, {}, {'a' 'b' 'c' 'd' 'e' 'f'}); +%! y = stk_dataframe (x, {'x' 'y'}); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) + +%!test +%! x = stk_factorialdesign ({1:3, 1:2}, {}, {'a' 'b' 'c' 'd' 'e' 'f'}); +%! y = stk_dataframe (x, {'x' 'y'}, []); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) + +%!test +%! x = stk_factorialdesign ({1:3, 1:2}, {'x' 'y'}, {'a' 'b' 'c' 'd' 'e' 'f'}); +%! y = stk_dataframe (x); +%! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) +%! assert (isequal (y.colnames, {'x' 'y'})) +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) + +%!error +%! x = stk_factorialdesign ({1:3, 1:2}); +%! y = stk_dataframe (x, pi); + +%!error +%! x = stk_factorialdesign ({1:3, 1:2}); +%! y = stk_dataframe (x, {}, pi); + +%!test +%! x = stk_dataframe ([], {'a', 'b'}); +%! assert (isequal (size (x), [0 2])) +%! assert (isequal (x.colnames, {'a' 'b'})); +%! assert (isequal (x.rownames, {})); + +%!test +%! x = stk_dataframe ([], {'a', 'b'}, {'toto'}); +%! assert (isequal (size (x), [1 2])) +%! assert (isequal (x.colnames, {'a' 'b'})); +%! assert (isequal (x.rownames, {'toto'})); + +% Check that we tolerate char arguments for colnames/rownames + +%!shared x + +%!test +%! x = stk_dataframe (randn (10, 1), 'NOx'); +%! assert (isequal (x.colnames, {'NOx'})); + +%!test +%! y = stk_dataframe (x, 'toto'); +%! assert (isequal (y.colnames, {'toto'})); + +%!test +%! x = stk_dataframe (randn (1, 2), {}, 'aaa'); +%! assert (isequal (x.rownames, {'aaa'})); + +%!test +%! y = stk_dataframe (x, {}, 'tata'); +%! assert (isequal (y.rownames, {'tata'})); diff --git a/inst/arrays/@stk_dataframe/stk_get_sample_size.m b/inst/arrays/@stk_dataframe/stk_get_sample_size.m new file mode 100644 index 0000000..6265fc2 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_get_sample_size.m @@ -0,0 +1,40 @@ +% STK_GET_SAMPLE_SIZE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function n = stk_get_sample_size (x) + +n = size (x.data, 1); + +end % function + + +%!test +%! x = stk_dataframe ([1 2; 3 4; 5 6]); +%! assert (isequal (stk_get_sample_size (x), 3)); diff --git a/inst/arrays/@stk_dataframe/stk_length.m b/inst/arrays/@stk_dataframe/stk_length.m new file mode 100644 index 0000000..bf1cec4 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_length.m @@ -0,0 +1,42 @@ +% STK_LENGTH [deprecated] +% +% See also: stk_get_sample_size + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function n = stk_length (x) + +n = size (x.data, 1); + +end % function + + +%!test +%! x = stk_dataframe ([1 2; 3 4; 5 6]); +%! assert (isequal (stk_length (x), 3)); diff --git a/inst/arrays/@stk_dataframe/stk_normalize.m b/inst/arrays/@stk_dataframe/stk_normalize.m new file mode 100644 index 0000000..16f381a --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_normalize.m @@ -0,0 +1,64 @@ +% STK_NORMALIZE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_normalize (x, box) + +if nargin < 2, + box = []; +end + +if isa (x, 'stk_dataframe') + + % Ensure that box is an stk_hrect object + if ~ isa (box, 'stk_hrect') + if isempty (box), + box = stk_boundingbox (x.data); % Default: bounding box + else + box = stk_hrect (box); + end + end + + % Call @stk_hrect/stk_normalize + [x.data, a, b] = stk_normalize (x.data, box); + +else % box is an stk_dataframe object + + % Call @stk_hrect/stk_normalize + [x, a, b] = stk_normalize (x, stk_hrect (box)); + +end % if + +end % function + +%!test +%! u = rand (6, 2) * 2; +%! x = stk_dataframe (u); +%! y = stk_normalize (x); +%! assert (isa (y, 'stk_dataframe') ... +%! && stk_isequal_tolabs (double (y), stk_normalize (u))) diff --git a/inst/arrays/@stk_dataframe/stk_rescale.m b/inst/arrays/@stk_dataframe/stk_rescale.m new file mode 100644 index 0000000..b54ae5f --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_rescale.m @@ -0,0 +1,53 @@ +% STK_RESCALE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_rescale (x, box1, varargin) + +% Ensure that box1 is an stk_hrect object +if ~ isa (box1, 'stk_hrect') + if isempty (box1) + box1 = stk_hrect (size (x, 2)); % Default: [0; 1] ^ DIM + else + box1 = stk_hrect (box1); + end +end + +% Rescale using @stk_hrect/stk_rescale +if isa (x, 'stk_dataframe') + [x.data, a, b] = stk_rescale (x.data, box1, varargin{:}); +else + [x, a, b] = stk_rescale (x, box1, varargin{:}); +end + +end % function + +%!test +%! u = rand(5, 1) * 2; +%! x = stk_dataframe(u); +%! y = stk_rescale(x, [0; 2], [0; 3]); +%! assert (isa (y, 'stk_dataframe') && isequal(double(y), u * 3/2)) diff --git a/inst/arrays/@stk_dataframe/stk_sprintf.m b/inst/arrays/@stk_dataframe/stk_sprintf.m new file mode 100644 index 0000000..c009e15 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_sprintf.m @@ -0,0 +1,181 @@ +% STK_SPRINTF [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf (x, verbosity, data_col_width) + +if (nargin < 2) || (isempty (verbosity)) + verbosity = stk_options_get ('stk_dataframe', 'disp_format'); +end + +if ~ ismember (verbosity, {'basic', 'verbose'}) + errmsg = 'verbosity should be ''basic'' or ''verbose''.'; + stk_error (errmsg, 'InvalidArgument'); +end + +if (nargin < 3) || (isempty (data_col_width)) + data_col_width = []; +end + +if isempty (x) + + spstr = stk_options_get ('stk_dataframe', 'disp_spstr'); + + if strcmp (verbosity, 'verbose') + + s = char (... + '.colnames =', horzcat (spstr, stk_sprintf_colnames (x)), ... + '.rownames =', horzcat (spstr, stk_sprintf_rownames (x)), ... + '.data =', horzcat (spstr, '<', stk_sprintf_sizetype (x.data), '>')); + + else + + [n, d] = size (x); + + s = sprintf ('Empty data frame with %d rows and %d columns', n, d); + + if d > 0 && ~ isempty (x.colnames) + s = char (s, ... + sprintf (' with .colnames = %s', stk_sprintf_colnames (x))); + elseif n > 0 && ~ isempty (x.rownames) + s = char (s, ... + sprintf (' with .rownames = %s', stk_sprintf_rownames (x))); + end + end + +else % x is not empty + + s = sprintf_table_ (x.data, x.colnames, x.rownames, data_col_width); + + if strcmp (verbosity, 'verbose') + + spstr = stk_options_get ('stk_dataframe', 'disp_spstr'); + + s = char (... + '.colnames =', horzcat (spstr, stk_sprintf_colnames (x)), ... + '.rownames =', horzcat (spstr, stk_sprintf_rownames (x)), ... + '.data =', horzcat (repmat (spstr, size (s, 1), 1), s)); + + elseif isempty (s) + + disp toto + + end + +end + +end % function + +%#ok<*CTCH> + + +function s = sprintf_table_ (x, colnames, rownames, data_col_width) + +x = double (x); +[n, d] = size (x); + +if (n == 0) || (d == 0) + + s = '[] (empty)'; + +else + + if (nargin < 2) || isempty (data_col_width) + switch stk_disp_getformat () + case 'short' + data_col_width = 8; + case 'long' + data_col_width = 16; + otherwise + % FIXME (ticket #87): handle other formatting modes... + data_col_width = 8; + end + end + + % column names + if (nargin < 3) || isempty (colnames) + colnames = repmat ({''}, 1, d); + end + + % row names + if (nargin < 4) || isempty (rownames) + rownames = repmat ({''}, n, 1); + end + b = cellfun (@isempty, rownames); + rownames(b) = repmat({'*'}, sum (b), 1); + rownames = fliplr (char (cellfun ... + (@fliplr, rownames, 'UniformOutput', false))); + + nb_spaces_colsep = 2; + + nb_rows = n + 1; % + 1 for the header + + s = repmat ('', nb_rows, 1); %#ok<*AGROW> + + s = [s [repmat(' ', 1, size(rownames, 2)); rownames]]; + + % column separator between row names and the first data column + s = [s repmat(' :', nb_rows, 1) ... + repmat(' ', nb_rows, nb_spaces_colsep)]; + + for j = 1:d + + xx = stk_sprintf_colvect (x(:, j), data_col_width); + Lxx = size (xx, 2); + + vn = colnames{j}; + if isempty (vn) + vn = repmat('-', 1, Lxx); + end + + L = max (length (vn), Lxx); + s = [s [sprintf('% *s', L, vn); % variable name + repmat(' ', n, L - Lxx) xx]]; % formatted data + + if j < d + % column separator + s = [s repmat(' ', nb_rows, nb_spaces_colsep)]; + end + + end % for + +end % if + +end % function + + +%!shared x, fmt +%! fmt = stk_disp_getformat (); +%! x = stk_dataframe (rand (3, 2)); + +%!test format rat; disp (x); +%!test format long; disp (x); +%!test format short; disp (x); format (fmt); + +%!test disp (stk_dataframe (zeros (0, 1))) +%!test disp (stk_dataframe (zeros (0, 2))) diff --git a/inst/arrays/@stk_dataframe/stk_sprintf_colnames.m b/inst/arrays/@stk_dataframe/stk_sprintf_colnames.m new file mode 100644 index 0000000..5fbbd7b --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_sprintf_colnames.m @@ -0,0 +1,45 @@ +% STK_SPRINTF_COLNAMES returns the column names of an array + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_colnames (x) + +d = size (x, 2); +colnames = get (x, 'colnames'); + +if isempty (colnames) + s = stk_sprintf_colnames (zeros (0, d)); +else + s = '{'; + for j = 1:(d-1), + s = [s sprintf('''%s'', ', x.colnames{j})]; %#ok + end + s = [s sprintf('''%s''}', x.colnames{end})]; +end + +end % function diff --git a/inst/arrays/@stk_dataframe/stk_sprintf_rownames.m b/inst/arrays/@stk_dataframe/stk_sprintf_rownames.m new file mode 100644 index 0000000..671c077 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_sprintf_rownames.m @@ -0,0 +1,45 @@ +% STK_SPRINTF_ROWNAMES returns the row names of an array + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_rownames (x) + +n = size (x, 1); +rownames = get (x, 'rownames'); + +if isempty (rownames) + s = stk_sprintf_rownames (zeros (n, 0)); +else + s = '{'; + for j = 1:(n-1), + s = [s sprintf('''%s''; ', x.rownames{j})]; %#ok + end + s = [s sprintf('''%s''}', x.rownames{end})]; +end + +end % function diff --git a/inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m b/inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m new file mode 100644 index 0000000..0fcc148 --- /dev/null +++ b/inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m @@ -0,0 +1,36 @@ +% STK_SPRINTF_SIZETYPE prints the size and type into a string + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_sizetype (x) + +[n, d] = size (x); + +s = sprintf ('%dx%d %s array', n, d, class (x)); + +end % function diff --git a/inst/arrays/@stk_dataframe/subsasgn.m b/inst/arrays/@stk_dataframe/subsasgn.m new file mode 100644 index 0000000..93a9d01 --- /dev/null +++ b/inst/arrays/@stk_dataframe/subsasgn.m @@ -0,0 +1,424 @@ +% SUBSASGN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = subsasgn(x, idx, val) + +if ~ isa (x, 'stk_dataframe') + if isempty (x) + % this is required to support B(idx) = D if B does not exist and D is + % an stk_dataframe (which, in turn, is required to make repmat work...) + x_data = subsasgn ([], idx, val.data); + x = stk_dataframe (x_data); + else + % we're assigning a dataframe (val) to something else + x = subsasgn(x, idx, val.data); + end + return +end + +switch idx(1).type + + case '()' + + if length(idx) ~= 1 + + stk_error('Illegal indexing.', 'IllegalIndexing'); + + else % ok, only one level of indexing + + [n, d] = size (x.data); + + % one or two indices, but not more than that + L = length (idx(1).subs); + if L > 2 + stk_error('Illegal indexing.', 'IllegalIndexing'); + end + + val_data = double (val); + + if L == 2 % matrix-style indexing + + % Process row indices + I = idx(1).subs{1}; + if ischar (I) && ~ isequal (I, ':') + I = process_char_indices (I, x.rownames, 'Row'); + idx(1).subs{1} = I; + elseif iscell (I) + I = process_cell_indices (I, x.rownames, 'Row'); + idx(1).subs{1} = I; + end + + % Process column indices + J = idx(1).subs{2}; + if ischar (J) && ~ isequal (J, ':') + J = process_char_indices (J, x.colnames, 'Column'); + idx(1).subs{2} = J; + elseif iscell (J) + J = process_cell_indices (J, x.colnames, 'Column'); + idx(1).subs{2} = J; + end + + end + + if ~ isempty (val_data) % assignment + + x.data = subsasgn (x.data, idx, val_data); + + if L == 1 % linear indexing + + % Linear indexing is not allowed to change the shape of a + % dataframe (this happens, with numeric arrays, when + % indexing beyond numel) + if ~ isequal (size (x.data), [n d]) + stk_error ('Illegal indexing.', 'IllegalIndexing'); + end + + else % matrix-style indexing + + [n1, d1] = size (x.data); + val_is_an_stkdf = isa (val, 'stk_dataframe'); + + % Column names + if val_is_an_stkdf && (isequal (I, ':')) + + cn = val.colnames; + xcn = x.colnames; + + if isempty (xcn) + if ~ isempty (cn) + xcn = repmat ({''}, 1, size (n1, 2)); + x.colnames = subsasgn (xcn, idx, cn); + end + else + if isempty (cn) + cn = repmat ({''}, 1, size (val, 2)); + end + x.colnames = subsasgn (xcn, idx, cn); + end + + elseif (d1 > d) && (~ isempty (x.colnames)) + + x.colnames = horzcat (x.colnames, ... + repmat ({''}, 1, d1 - d)); + + end + + % Row names + if val_is_an_stkdf && (isequal (J, ':')) + + rn = val.rownames; + xrn = x.rownames; + + if isempty (xrn) + if ~ isempty (rn) + xrn = repmat ({''}, size (val, 1), 1); + x.rownames = subsasgn (xrn, idx, rn); + end + else + if isempty (rn) + rn = repmat ({''}, size (val, 1), 1); + end + x.rownames = subsasgn (xrn, idx, rn); + end + + elseif (n1 > n) && ~ isempty (x.rownames) + + x.rownames = vertcat (x.rownames, ... + repmat ({''}, n1 - n, 1)); + + end + + end + + else % Assignment rhs is empty: deletion + + if L == 1 % Linear indexing + + if d == 1 % Column array => remove rows + I = idx(1).subs{1}; + J = 1; + remove_rows = true; + elseif n == 1 % Row array => remove columns + I = 1; + J = idx(1).subs{1}; + remove_rows = false; + else + stk_error ('Illegal indexing.', 'IllegalIndexing'); + end + + else % Matrix-style indexing + + remove_rows = strcmp (J, ':'); + if ~ (remove_rows || (strcmp (I, ':'))) + stk_error ('Illegal indexing.', 'IllegalIndexing'); + end + + end + + if remove_rows % Keep column names + + x.data(I, :) = []; + if ~ isempty (x.rownames) + x.rownames(I) = []; + end + + else % Remove columns + + x.data(:, J) = []; + if ~ isempty (x.colnames) + x.colnames(J) = []; + end + + end + end + end + + case '{}' + + errmsg = 'Indexing with curly braces is not allowed.'; + stk_error(errmsg, 'IllegalIndexing'); + + case '.' + + if strcmp (idx(1).subs, 'data') && length (idx) > 1 + + if strcmp (idx(2).type, '()') + x = subsasgn (x, idx(2:end), val); + else + stk_error('Illegal indexing.', 'IllegalIndexing'); + end + + else % other than 'data' + + if length (idx) > 1 + val = subsasgn (get (x, idx(1).subs), idx(2:end), val); + end + + x = set (x, idx(1).subs, val); + + end + +end + +end % function + + +%!shared x, s, t, data +%! x = stk_dataframe (rand (3, 2)); +%! s = {'a'; 'b'; 'c'}; +%! t = {'xx' 'yy'}; + +%!test +%! x.rownames = s; +%! assert (isequal (get (x, 'rownames'), s)) + +%!test +%! x.colnames = t; +%! assert (isequal (get (x, 'rownames'), s)) +%! assert (isequal (get (x, 'colnames'), t)) + +%!test +%! x.rownames{2} = 'dudule'; +%! assert (isequal (get (x, 'rownames'), {'a'; 'dudule'; 'c'})) +%! assert (isequal (get (x, 'colnames'), t)) + +%!test +%! x.colnames{1} = 'martha'; +%! assert (isequal (get (x, 'rownames'), {'a'; 'dudule'; 'c'})) +%! assert (isequal (get (x, 'colnames'), {'martha' 'yy'})) + +% %!error x.colnames{1} = 'yy' +% %!error x.colnames = {'xx' 'xx'} + +%!test +%! data = stk_dataframe (zeros(3, 2), {'x1' 'x2'}); +%! u = rand(3, 1); data.x2 = u; +%! assert (isequal (double (data), [zeros(3, 1) u])) + +%!test +%! data = stk_dataframe (zeros (3, 2), {'x1' 'x2'}); +%! data.x2(3) = 27; +%! assert (isequal (double (data), [0 0; 0 0; 0 27])) + +%!error data.toto = rand (3, 1); + +%!shared x +%! x = stk_dataframe (reshape (1:12, 4, 3), {'u' 'v' 'w'}); + +%!test +%! x(:, 2) = []; +%! assert (isequal (size (x), [4 2])) +%! assert (isequal (double (x), [1 9; 2 10; 3 11; 4 12])) +%! assert (isequal (get (x, 'colnames'), {'u' 'w'})) +%! assert (isempty (get (x, 'rownames'))) + +%!test +%! x(2, :) = []; +%! assert (isequal (size (x), [3 2])) +%! assert (isequal (double (x), [1 9; 3 11; 4 12])) +%! assert (isempty (get (x, 'rownames'))) + +%!test +%! x.rownames = {'a'; 'b'; 'c'}; +%! x(2, :) = []; +%! assert (isequal (size (x), [2 2])) +%! assert (isequal (double (x), [1 9; 4 12])) +%! assert (isequal (x.rownames, {'a'; 'c'})) + +%!test % change one value with matrix-style indexing +%! x(1, 2) = 11; +%! assert (isequal (size (x), [2 2])) +%! assert (isequal (double (x), [1 11; 4 12])) + +%!test % change one value with linear indexing +%! x(3) = 13; +%! assert (isequal (size (x), [2 2])) +%! assert (isequal (double (x), [1 13; 4 12])) + +%!assert (isequal (double (x(:, :)), [1 13; 4 12])); + +%!test % assignment to a variable that doesn't exist +%! A = stk_dataframe (7.1); +%! clear B; B(2) = A; +%! assert (strcmp (class (B), 'stk_dataframe')) +%! assert (isequal (B.data, [0 7.1])); + +%!test % repmat +%! x = stk_dataframe (1); +%! y = repmat (x, 2, 3); +%! assert (isa (y, 'stk_dataframe')); +%! assert (isequal (y.data, ones (2, 3))); + +%!test +%! x(:, :) = []; +%! assert (isempty (x)); + +%!test % Delete the only row of a one-row dataframe +%! y1 = stk_dataframe ([1.2 3.33], {'mean', 'var'}); +%! y1(1, :) = []; % Remove the only row of data +%! assert (isequal (size (y1), [0 2])) +%! assert (isequal (y1.colnames, {'mean', 'var'})) +%! y11 = get (y1, 'mean'); +%! assert (isempty (y11)); + +%!error x{1} = 2; +%!error x(1, 2) = []; +%!error x(1, 2).a = 3; + +%--- tests with a univariate dataframe ---------------------------------------- + +%!shared x +%! x = stk_dataframe((1:5)'); + +% linear indexing +%!test x(2) = 0; assert (isequal (double (x), [1; 0; 3; 4; 5])); +%!test x(3) = []; assert (isequal (double (x), [1; 0; 4; 5])); + +% matrix-style indexing also +%!test x(3, 1) = 0; assert (isequal(double(x), [1; 0; 0; 5])); + +% three indices is not allowed (even if the third is one...) +%!error x(3, 1, 1) = 297; + +%!test % create a new row and a new column through subsasgn() +%! x = stk_dataframe (rand (5, 2)); x(6, 3) = 7; +%! assert(isequal(size(x), [6, 3])); + +%--- tests adding row/columns through row/columns names ------------------------ + +%!test +%! x = stk_dataframe ([]); +%! x.colnames{2} = 'v'; +%! x.rownames{2} = 'b'; +%! assert (isequal (x.rownames, {''; 'b'})); +%! assert (isequal (x.colnames, {'' 'v'})); +%! assert (isequal (size (x.data), [2 2]) && (all (isnan (x.data(:))))) + +%--- test replacing one column using ':' --------------------------------------- + +%!shared x +%! x = stk_dataframe (reshape (1:12, 4, 3), {'u' 'v' 'w'}); + +%!test % change one column using ':', plain numeric argument +%! y = [0; 9; 0; 9]; +%! z = x; z(:, 2) = y; +%! assert (isequal (z(:, 1), x(:, 1))); +%! assert (isequal (z(:, 2).data, y)); + +%!test % change one column using ':', skt_dataframe argument +%! y = stk_dataframe ([0; 9; 0; 9], {'y'}); +%! z = x; z(:, 2) = y; +%! assert (isequal (z(:, 1), x(:, 1))); +%! assert (isequal (z(:, 2), y)); + +%--- test replacing one row using ':' ------------------------------------------ + +%!shared x +%! x = stk_dataframe (reshape (1:12, 4, 3), [], {'a'; 'b'; 'c'; 'd'}); + +%!test % change one row using ':', plain numeric argument +%! y = [7 7 7]; +%! z = x; z(3, :) = y; +%! assert (isequal (z(1, :), x(1, :))); +%! assert (isequal (z(3, :).data, y)); + +%!test % change one row using ':', skt_dataframe argument +%! y = stk_dataframe ([7 7 7], [], {'y'}); +%! z = x; z(3, :) = y; +%! assert (isequal (z(1, :), x(1, :))); +%! assert (isequal (z(3, :), y)); + +%--- change several values at once with linear indexing ------------------------ + +%!shared x +%! x = stk_dataframe (zeros (2), {'u' 'v'}); + +%!test % first column +%! x(1:2) = 1; +%! y = stk_dataframe ([1 0; 1 0], {'u' 'v'}); +%! assert (isequal (x, y)); + +%!test % one more element +%! x(1:3) = 2; +%! y = stk_dataframe ([2 2; 2 0], {'u' 'v'}); +%! assert (isequal (x, y)); + +%!error % too many elements +%! x(1:5) = 3; + +%--- add just one row/column name ---------------------------------------------- + +%!shared x +%! x = stk_dataframe (randn (3, 3)); + +%!test x.colnames{2} = 'y'; +%!assert (isequal (x.colnames, {'' 'y' ''})); + +%!test x.rownames{2} = 'b'; +%!assert (isequal (x.rownames, {''; 'b'; ''})); diff --git a/inst/arrays/@stk_dataframe/subsref.m b/inst/arrays/@stk_dataframe/subsref.m new file mode 100644 index 0000000..955f1bc --- /dev/null +++ b/inst/arrays/@stk_dataframe/subsref.m @@ -0,0 +1,170 @@ +% SUBSREF [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function t = subsref (x, idx) + +switch idx(1).type + + case '()' + + L = length (idx(1).subs); + + if L == 1 % linear indexing + + t = subsref (x.data, idx); + + elseif L == 2 % matrix-style indexing + + % Process row indices + I = idx(1).subs{1}; + if ischar (I) && ~ isequal (I, ':') + I = process_char_indices (I, x.rownames, 'Row'); + elseif iscell (I) + I = process_cell_indices (I, x.rownames, 'Row'); + end + + % Process column indices + J = idx(1).subs{2}; + if ischar (J) && ~ isequal (J, ':') + J = process_cell_indices (J, x.colnames, 'Column'); + elseif iscell (J) + J = process_cell_indices (J, x.colnames, 'Column'); + end + + if isempty (I) + if isempty (J) + t_data = []; + else + t_data = zeros (0, size (x.data, 2)); + t_data = t_data(:, J); + end + else + if isempty (J) + t_data = zeros (size (x.data, 1), 0); + t_data = t_data(I, :); + else + t_data = x.data(I, J); + end + end + + if isempty (x.colnames) + cn = {}; + else + cn = x.colnames(1, J); + end + + if isempty (x.rownames) + rn = {}; + else + rn = x.rownames(I, 1); + end + + t = stk_dataframe (t_data, cn, rn); + + else + stk_error ('Illegal indexing.', 'IllegalIndexing'); + end + + case '{}' + + errmsg = 'Indexing with curly braces is not allowed.'; + stk_error (errmsg, 'IllegalIndexing'); + + case '.' + + t = get (x, idx(1).subs); + +end + +if (length (idx)) > 1 + t = subsref (t, idx(2:end)); +end + +end % function + + +%!shared x, s, t, data +%! x = stk_dataframe(rand(3, 2)); +%! s = {'a'; 'b'; 'c'}; +%! t = {'xx' 'yy'}; + +%!test +%! x = set(x, 'rownames', s); +%! assert (isequal (x.rownames, s)) +%! assert (isequal (x.rownames{2}, 'b')) + +%!test +%! x = set(x, 'colnames', t); +%! assert (isequal (x.rownames, s)) +%! assert (isequal (x.colnames, t)) +%! assert (isequal (x.colnames{2}, 'yy')) + +%--- tests with a bivariate dataframe + column names -------------------------- + +%!shared u, data +%! u = rand(3, 2); +%! data = stk_dataframe(u, {'x1', 'x2'}); + +%!assert (isequal (data.x2, u(:, 2))) +%!assert (data.x2(3) == u(3, 2)) +%!error t = data.toto; +%!error t = data(1, 1).zzz; % illegal multilevel indexing +%!error t = data(1, 1, 1); % too many indices +%!error t = data{1}; % curly braces not allowed + +%!test % select rows and columns +%! x = stk_dataframe (reshape (1:15, 5, 3), {'u' 'v' 'w'}); +%! assert (isequal (x([3 5], 2), stk_dataframe ([8; 10], {'v'}))); + +%--- tests with a univariate dataframe ---------------------------------------- + +%!shared u, data +%! u = rand(3, 1); data = stk_dataframe(u, {'x'}); + +%!assert (isequal (data.x, u)) +%!assert (isequal (double (data), u)) +%!assert (isequal (double (data(2)), u(2))) +%!assert (isequal (double (data(3, 1)), u(3))) +%!error t = data(1, 1, 1); % too many indices + +%--- empty indexing ------------------------------------------------------------ + +%!test +%! x = stk_dataframe (randn (2, 2), {'u' 'v'}); +%! y = x ([], :); +%! assert (isa (y, 'stk_dataframe')); +%! assert (isequal (size (y), [0 2])); +%! assert (isequal (y.colnames, {'u' 'v'})); + +%!test +%! x = stk_dataframe (randn (2, 2), [], {'a' 'b'}); +%! y = x (:, []); +%! assert (isa (y, 'stk_dataframe')); +%! assert (isequal (size (y), [2 0])); +%! assert (isequal (y.rownames, {'a'; 'b'})); diff --git a/inst/arrays/@stk_dataframe/sum.m b/inst/arrays/@stk_dataframe/sum.m new file mode 100644 index 0000000..09b67c3 --- /dev/null +++ b/inst/arrays/@stk_dataframe/sum.m @@ -0,0 +1,43 @@ +% SUM [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = sum(x, dim) + +if nargin < 2, dim = 1; end + +z = apply(x, dim, @sum); + +end % function + + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (sum(df1), sum(x1))) +%!assert (isequal (sum(df1, 1), sum(x1))) +%!assert (isequal (sum(df1, 2), sum(x1, 2))) diff --git a/inst/arrays/@stk_dataframe/tan.m b/inst/arrays/@stk_dataframe/tan.m new file mode 100644 index 0000000..bc90855 --- /dev/null +++ b/inst/arrays/@stk_dataframe/tan.m @@ -0,0 +1,38 @@ +% TAN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = tan (x) + +ydata = tan (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = tan (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, tan (u))) diff --git a/inst/arrays/@stk_dataframe/tand.m b/inst/arrays/@stk_dataframe/tand.m new file mode 100644 index 0000000..aef04b7 --- /dev/null +++ b/inst/arrays/@stk_dataframe/tand.m @@ -0,0 +1,38 @@ +% TAND [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = tand (x) + +ydata = tand (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = tand (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, tand (u))) diff --git a/inst/arrays/@stk_dataframe/tanh.m b/inst/arrays/@stk_dataframe/tanh.m new file mode 100644 index 0000000..49b40ec --- /dev/null +++ b/inst/arrays/@stk_dataframe/tanh.m @@ -0,0 +1,38 @@ +% TANH [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ydata = tanh (x) + +ydata = tanh (x.data); + +end % function + + +%!test +%! u = rand (4, 3); x = stk_dataframe (u); v = tanh (x); +%! assert (strcmp (class (v), class (u)) && isequal (v, tanh (u))) diff --git a/inst/arrays/@stk_dataframe/times.m b/inst/arrays/@stk_dataframe/times.m new file mode 100644 index 0000000..a4c2273 --- /dev/null +++ b/inst/arrays/@stk_dataframe/times.m @@ -0,0 +1,37 @@ +% TIMES [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = times(x1, x2) + +y = bsxfun(@times, x1, x2); + +end % function + +%!test stk_test_dfbinaryop(@times, rand(7, 2), rand(7, 2)); +%!test stk_test_dfbinaryop(@times, rand(7, 2), pi); +%!error stk_test_dfbinaryop(@times, rand(7, 2), rand(7, 3)); diff --git a/inst/arrays/@stk_dataframe/transpose.m b/inst/arrays/@stk_dataframe/transpose.m new file mode 100644 index 0000000..6bd0077 --- /dev/null +++ b/inst/arrays/@stk_dataframe/transpose.m @@ -0,0 +1,44 @@ +% TRANSPOSE [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = transpose(x) + +rn = get(x, 'rownames'); +cn = get(x, 'colnames'); + +y = stk_dataframe(transpose(x.data), rn', cn'); + +end % function + +%!test +%! u = rand(3, 2) + 1i * rand(3, 2); +%! data = stk_dataframe(u, {'x' 'y'}, {'obs1'; 'obs2'; 'obs3'}); +%! data = data.'; +%! assert (isa(data, 'stk_dataframe') && isequal(double(data), u.')); +%! assert (isequal(data.rownames, {'x'; 'y'})); +%! assert (isequal(data.colnames, {'obs1' 'obs2' 'obs3'})); diff --git a/inst/arrays/@stk_dataframe/uminus.m b/inst/arrays/@stk_dataframe/uminus.m new file mode 100644 index 0000000..1cc2c03 --- /dev/null +++ b/inst/arrays/@stk_dataframe/uminus.m @@ -0,0 +1,33 @@ +% UMINUS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = uminus (x) + +x.data = - x.data; + +end % function diff --git a/inst/arrays/@stk_dataframe/unique.m b/inst/arrays/@stk_dataframe/unique.m new file mode 100644 index 0000000..db8d005 --- /dev/null +++ b/inst/arrays/@stk_dataframe/unique.m @@ -0,0 +1,55 @@ +% UNIQUE [overload base] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [y, ia, ib] = unique (x, varargin) + +if ~ isa (x, 'stk_dataframe') + stk_error ('x should be an stk_dataframe object here.', 'TypeMismatch'); +end + +% We want unique to behave always as if the 'rows' option had be given +varargin = unique ([varargin {'rows'}]); + +[y_data, ia, ib] = unique (x.data, varargin{:}); + +if isempty (x.rownames) + rn = {}; +else + rn = x.rownames(ia); +end + +y = stk_dataframe (y_data, x.colnames, rn); + +end % function + + +%!test +%! cn = {'u' 'v' 'w'}; x = stk_dataframe (rand (4, 3), cn); +%! y = [x; x]; z = unique (y, 'rows'); +%! assert (isequal (z.colnames, cn)); +%! assert (isequal (z.data, unique (x.data, 'rows'))); diff --git a/inst/arrays/@stk_dataframe/uplus.m b/inst/arrays/@stk_dataframe/uplus.m new file mode 100644 index 0000000..7c95b52 --- /dev/null +++ b/inst/arrays/@stk_dataframe/uplus.m @@ -0,0 +1,31 @@ +% UPLUS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = uplus (x) + +end % function diff --git a/inst/arrays/@stk_dataframe/var.m b/inst/arrays/@stk_dataframe/var.m new file mode 100644 index 0000000..5f669bb --- /dev/null +++ b/inst/arrays/@stk_dataframe/var.m @@ -0,0 +1,47 @@ +% VAR [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = var(x, flag, dim) + +if nargin < 2, flag = 0; end % default: normalize by N-1 +if nargin < 3, dim = 1; end % default: act along columns + +z = apply(x, dim, @var, flag); + +end % function + + +%!shared x1, df1 +%! x1 = rand(9, 3); +%! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); +%!assert (isequal (var(df1), var(x1))) +%!assert (isequal (var(df1, 0, 1), var(x1))) +%!assert (isequal (var(df1, 0, 2), var(x1, 0, 2))) +%!assert (isequal (var(df1, 1), var(x1, 1))) +%!assert (isequal (var(df1, 1, 1), var(x1, 1))) +%!assert (isequal (var(df1, 1, 2), var(x1, 1, 2))) diff --git a/inst/arrays/@stk_dataframe/vertcat.m b/inst/arrays/@stk_dataframe/vertcat.m new file mode 100644 index 0000000..902da9f --- /dev/null +++ b/inst/arrays/@stk_dataframe/vertcat.m @@ -0,0 +1,207 @@ +% VERTCAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = vertcat (x, y, varargin) + +if nargin < 2 + y = []; +end + +%--- Get raw data and concatenate ----------------------------------------- + +x_data = double (x); +y_data = double (y); + +% We let the base vertcat function generate an error if needed +data = [x_data; y_data]; + +%--- Get column and row names of inputs ---------------------------------- + +if isa (x, 'stk_dataframe') + x_colnames = get (x, 'colnames'); + x_rownames = get (x, 'rownames'); +else + x_colnames = {}; + x_rownames = {}; +end + +if isa (y, 'stk_dataframe') + y_colnames = get (y, 'colnames'); + y_rownames = get (y, 'rownames'); +else + y_colnames = {}; + y_rownames = {}; +end + +%--- Create output column names ------------------------------------------- + +if isempty (x_colnames) + + colnames = y_colnames; + +elseif isempty (y_colnames) + + colnames = x_colnames; + +else + + x_empty = cellfun (@isempty, x_colnames); + y_empty = cellfun (@isempty, y_colnames); + xy_equal = strcmp (x_colnames, y_colnames); + + if all (x_empty | y_empty | xy_equal) + colnames = x_colnames; + colnames(x_empty) = y_colnames(x_empty); + else + warning ('STK:vertcat:IncompatibleColNames', sprintf ( ... + ['Incompatible column names !\nThe output of vertcat ' ... + 'will have no column names.'])); colnames = {}; + end + +end + +%--- Create output row names ---------------------------------------------- + +bx = isempty (x_rownames); +by = isempty (y_rownames); + +if bx && by % none of the argument has row names + + rownames = {}; + +else % at least of one the arguments has row names + + if bx, x_rownames = repmat ({''}, size (x_data, 1), 1); end + if by, y_rownames = repmat ({''}, size (y_data, 1), 1); end + + rownames = [x_rownames; y_rownames]; + +end + +%--- Create output -------------------------------------------------------- + +if strcmp (class (x), 'stk_dataframe') %#ok + % Optimize for speed (no need to call constructor) + x.data = data; + x.colnames = colnames; + x.rownames = rownames; +else + x = stk_dataframe (data, colnames, rownames); +end + +if ~ isempty (varargin) + x = vertcat (x, varargin{:}); +end + +end % function + +%#ok<*SPWRN> + + +% IMPORTANT NOTE: [x; y; ...] fails to give the same result as vertcat (x, y, +% ...) in some releases of Octave. As a consequence, all tests must be written +% using vertcat explicitely. + +%!shared u, v +%! u = rand (3, 2); +%! v = rand (3, 2); + +%% +% Vertical concatenation of two dataframes + +%!test +%! x = stk_dataframe (u); +%! y = stk_dataframe (v); +%! z = vertcat (x, y); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); + +%!test % the same, with row names this time +%! x = stk_dataframe (u, {}, {'a'; 'b'; 'c'}); +%! y = stk_dataframe (v, {}, {'d'; 'e'; 'f'}); +%! z = vertcat (x, y); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); +%! assert (all (strcmp (z.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'}))); + +%!test % the same, with row names only for the first argument +%! x = stk_dataframe (u, {}, {'a'; 'b'; 'c'}); +%! y = stk_dataframe (v); +%! z = vertcat (x, y); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); + +%!test % incompatible variable names +%! u = rand (3, 1); x = stk_dataframe (u, {'x'}); +%! v = rand (3, 1); y = stk_dataframe (v, {'y'}); +%! z = vertcat (x, y); +%! assert (isequal (z.colnames, {})); + +%% +% Vertical concatenation [dataframe; matrix] + +%!test +%! x = stk_dataframe (u); +%! z = vertcat (x, v); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); + +%!test % the same, with row names for the first argument +%! x = stk_dataframe (u, {}, {'a'; 'b'; 'c'}); +%! z = vertcat (x, v); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); + +%% +% Vertical concatenation [matrix; dataframe] + +%!test +%! y = stk_dataframe (v); +%! z = vertcat (u, y); +%! assert (isa (z, 'stk_dataframe') && (isequal (double (z), [u; v]))); + +%% +% Vertical concatenation of more than two elements + +%!test +%! x = stk_dataframe (u); +%! y = stk_dataframe (v); +%! z = vertcat (x, y, u, v); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v; u; v])); + +%% +% Vertical concatenation with missing column names + +%!shared x, y +%! x = stk_dataframe (rand (2, 3), {'a', 'b', 'c'}); +%! y = stk_dataframe (rand (3, 2), {'a', 'b'}); +%! y = horzcat (y, rand(3, 1)); % last column name is missing + +%!test +%! z = vertcat (x, y); +%! assert (isequal (z.colnames, {'a' 'b' 'c'})) + +%!test +%! z = vertcat (y, x); +%! assert (isequal (z.colnames, {'a' 'b' 'c'})) diff --git a/inst/arrays/@stk_dataframe/xlim.m b/inst/arrays/@stk_dataframe/xlim.m new file mode 100644 index 0000000..74794c9 --- /dev/null +++ b/inst/arrays/@stk_dataframe/xlim.m @@ -0,0 +1,43 @@ +% XLIM [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = xlim (arg1, arg2) + +varargout = cell (1, nargout); + +if nargin == 1, + [varargout{:}] = xlim (double (arg1)); + return +end + +if isa (arg1, 'stk_dataframe'), arg1 = double (arg1); end +if isa (arg2, 'stk_dataframe'), arg2 = double (arg2); end + +[varargout{:}] = xlim (arg1, arg2); + +end % function diff --git a/inst/arrays/@stk_dataframe/xor.m b/inst/arrays/@stk_dataframe/xor.m new file mode 100644 index 0000000..402dca3 --- /dev/null +++ b/inst/arrays/@stk_dataframe/xor.m @@ -0,0 +1,33 @@ +% XOR [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = xor (x1, x2) + +y = xor (logical (x1), logical (x2)); + +end % function diff --git a/inst/arrays/@stk_dataframe/ylim.m b/inst/arrays/@stk_dataframe/ylim.m new file mode 100644 index 0000000..ad9e8d4 --- /dev/null +++ b/inst/arrays/@stk_dataframe/ylim.m @@ -0,0 +1,43 @@ +% YLIM [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = ylim (arg1, arg2) + +varargout = cell (1, nargout); + +if nargin == 1, + [varargout{:}] = ylim (double (arg1)); + return +end + +if isa (arg1, 'stk_dataframe'), arg1 = double (arg1); end +if isa (arg2, 'stk_dataframe'), arg2 = double (arg2); end + +[varargout{:}] = ylim (arg1, arg2); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/contour.m b/inst/arrays/@stk_factorialdesign/contour.m new file mode 100644 index 0000000..949e151 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/contour.m @@ -0,0 +1,36 @@ +% CONTOUR [overload base function] +% +% See also: stk_factorialdesign/surf, stk_factorialdesign/mesh, ... + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = contour (varargin) + +h_plot = plot_surfmeshcontour (@contour, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/fieldnames.m b/inst/arrays/@stk_factorialdesign/fieldnames.m new file mode 100644 index 0000000..ef4bef1 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/fieldnames.m @@ -0,0 +1,43 @@ +% FIELDNAMES [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2020 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function fn = fieldnames (x) + +fn = fieldnames (x.stk_dataframe); +fn = [{'levels'; 'stk_dataframe'}; fn]; + +end % function + + +%!test +%! x = stk_factorialdesign ({0:1, 3:5}, {'u' 'v'}); +%! fn1 = sort (fieldnames (x)); +%! fn2 = {'colnames'; 'data'; 'info'; 'levels'; ... +%! 'rownames'; 'sample_size'; 'stk_dataframe'; 'u'; 'v'}; +%! assert (isequal (fn1, fn2)); diff --git a/inst/arrays/@stk_factorialdesign/get.m b/inst/arrays/@stk_factorialdesign/get.m new file mode 100644 index 0000000..fe6b638 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/get.m @@ -0,0 +1,44 @@ +% GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function t = get (x, propname) + +switch propname, + + case 'levels' + t = x.levels; + + case 'stk_dataframe' % Read-only access to the underlying df + t = x.stk_dataframe; + + otherwise + t = get (x.stk_dataframe, propname); + +end + +end % function diff --git a/inst/arrays/@stk_factorialdesign/ismember.m b/inst/arrays/@stk_factorialdesign/ismember.m new file mode 100644 index 0000000..f4947a6 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/ismember.m @@ -0,0 +1,108 @@ +% ISMEMBER [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = ismember (A, B, varargin) + +if ~ all (cellfun (@ischar, varargin)) + stk_error ('Invalid flag (should be a string).', 'InvalidArgument'); +end + +if isa (A, 'stk_factorialdesign') + + varargout = cell (1, max (nargout, 1)); + [varargout{:}] = ismember (double (A), B, varargin{:}); + +else % B is an stk_factorialdesign object + + has_rows = false; + has_legacy = false; + + for k = 1:(numel (varargin)) + switch varargin{k} + case 'rows' + has_rows = true; + case 'legacy' + has_legacy = true; + otherwise + errmsg = sprintf ('Unknown flag: %s', varargin{k}); + stk_error (errmsg, 'InvalidArgument'); + end + end + + if has_rows && ~ has_legacy && (nargout < 2) % This case can be optimized + + lia = ismember_fd (A, B); + varargout = {lia}; + + else % otherwise, use the base ismember function + + varargout = cell (1, max (nargout, 1)); + [varargout{:}] = ismember (A, double (B), varargin{:}); + + end + +end + +end % function + + +function [lia, locb] = ismember_fd (A, B) + +[n, dim] = size (A); +if dim ~= length (B.levels) + stk_error (['A and B should have the same number ' ... + 'of columns'], 'InvalidArgument'); +end + +b = false (n, dim); +for j = 1:dim + b(:, j) = ismember (A(:, j), B.levels{j}); +end + +lia = all (b, 2); + +end % function + + +%!shared A, B, BB, b +%! +%! i_max = 10; n = 100; d = 5; +%! +%! A = randi (i_max, n, d); +%! +%! levels = repmat ({1:i_max}, 1, d); +%! levels{4} = 1:2:i_max; +%! B = stk_factorialdesign (levels); +%! +%! BB = double (B); + +%!test b = ismember (A, B); +%!assert (isequal (b, ismember (A, BB))); + +%!test b = ismember (A, B, 'rows'); +%!assert (isequal (b, ismember (A, BB, 'rows'))); diff --git a/inst/arrays/@stk_factorialdesign/mesh.m b/inst/arrays/@stk_factorialdesign/mesh.m new file mode 100644 index 0000000..5623cfd --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/mesh.m @@ -0,0 +1,36 @@ +% MESH [overload base function] +% +% See also: stk_factorialdesign/contour, stk_factorialdesign/surf, ... + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = mesh (varargin) + +h_plot = plot_surfmeshcontour (@mesh, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/meshc.m b/inst/arrays/@stk_factorialdesign/meshc.m new file mode 100644 index 0000000..bc6e696 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/meshc.m @@ -0,0 +1,36 @@ +% MESHC [overload base function] +% +% See also: stk_factorialdesign/contour, stk_factorialdesign/surf, ... + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = meshc (varargin) + +h_plot = plot_surfmeshcontour (@meshc, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/meshz.m b/inst/arrays/@stk_factorialdesign/meshz.m new file mode 100644 index 0000000..683e9c8 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/meshz.m @@ -0,0 +1,36 @@ +% MESHZ [overload base function] +% +% See also: stk_factorialdesign/contour, stk_factorialdesign/surf, ... + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = meshz (varargin) + +h_plot = plot_surfmeshcontour (@meshz, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/ndgrid.m b/inst/arrays/@stk_factorialdesign/ndgrid.m new file mode 100644 index 0000000..c832fad --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/ndgrid.m @@ -0,0 +1,100 @@ +% NDGRID produces ndgrid-style coordinate arrays +% +% CALL: [X1, X2, ...] = ndgrid (X) +% +% produces ndgrid-style coordinate arrays X1, X2, ... Xd based on the +% @stk_factorialdesign object X (where d is the number of columns of +% X). This is equivalent to +% +% [X1, ..., Xd] = ndgrid (X.levels{1}, ..., X.levels{d}); +% +% See also: ndgrid + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = ndgrid (x) + +d = length (x.levels); + +if nargout > d + + stk_error ('Too many output arguments.', 'TooManyOutputArgs'); + +else + + if (d == 0) || any (cellfun (@isempty, x.levels)) + + varargout = repmat ({[]}, 1, nargout); + + elseif d == 1 + + varargout = {x.levels{1}(:)}; + + else + + varargout = cell (1, max (nargout, 1)); + [varargout{:}] = ndgrid (x.levels{:}); + + end + +end + +end % function + + +%--- general case ------------------------------------------------------------- + +%!shared data +%! data = stk_factorialdesign ({[0 1], [5 6 7]}); + +%!test % nargout = 0 +%! ndgrid (data); +%! assert (isequal (ans, [0 0 0; 1 1 1])); + +%!test % nargout = 1 +%! x = ndgrid (data); +%! assert (isequal (x, [0 0 0; 1 1 1])); + +%!test % nargout = 2 +%! [x, y] = ndgrid (data); +%! assert (isequal ({x, y}, {[0 0 0; 1 1 1], [5 6 7; 5 6 7]})); + +%!error % nargout = 3 +%! [x, y, z] = ndgrid (data); + +%--- special cases ------------------------------------------------------------ + +%!test +%! data = stk_factorialdesign ({[], []}); +%! [x, y] = ndgrid (data); +%! assert (isequal ({x, y}, {[], []})); + +%!test +%! data = stk_factorialdesign ({[1:3]}); +%! x = ndgrid (data); +%! assert (isequal (x, [1; 2; 3])); diff --git a/inst/arrays/@stk_factorialdesign/pcolor.m b/inst/arrays/@stk_factorialdesign/pcolor.m new file mode 100644 index 0000000..960469a --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/pcolor.m @@ -0,0 +1,36 @@ +% PCOLOR [overload base function] +% +% See also: stk_factorialdesign/contour, stk_factorialdesign/mesh, ... + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = pcolor (varargin) + +h_plot = plot_surfmeshcontour (@pcolor, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m b/inst/arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m new file mode 100644 index 0000000..c7d38fc --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m @@ -0,0 +1,170 @@ +% PLOT_SURFMESHCONTOUR [STK internal] + +% Copyright Notice +% +% Copyright (C) 2016, 2017, 2021 CentraleSupelec +% Copyright (C) 2013 Valentin Resseguier +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect +% Valentin Resseguier + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = plot_surfmeshcontour (plotfun, varargin) + +[h_axes, x, z, opts] = parse_args_ (varargin{:}); + +%--- Deal with various possible types for the 'z' argument ---------------- + +if ischar (z) || isa (z, 'function_handle') + z = double (stk_feval (z, x)); +else + z = double (z); +end + +%--- Do the actual plotting job ------------------------------------------- + +[xx1, xx2] = ndgrid (x); + +h_plot = call_plotfun (plotfun, h_axes, ... + xx1, xx2, reshape (z, size (xx1)), opts{:}); + +% Create labels if x provides column names +c = get (x.stk_dataframe, 'colnames'); +if ~ isempty (c) + stk_xlabel (h_axes, c{1}, 'interpreter', 'none'); % CG#10 +end +if length (c) > 1 + stk_ylabel (h_axes, c{2}, 'interpreter', 'none'); % CG#10 +end + +% Use interpolated shading for surf and pcolor plots +if ismember (func2str (plotfun), {'surf', 'pcolor'}) + shading (h_axes, 'interp'); +end + +end % function + +%#ok<*TRYNC> + + +function [h_axes, x, z, opts] = parse_args_ (varargin) + +%--- Formal grammar for the list of arguments ----------------------------- +% +% Terminal symbols +% +% h = a handle to an axes object +% x = stk_factorial_design object +% z = ordinate argument +% +% Derivation rules +% +% ::= | h +% ::= x z + +% Extract axis handle (if it is present) +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +if n_argin < 2 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +x = varargin{1}; +z = varargin{2}; +opts = varargin(3:end); + +% Then, x must be an stk_factorialdesign object +if ~ isa (x, 'stk_factorialdesign') + stk_error (['The first input argument should be a handle to existing' ... + 'axes or and stk_factorialdesign object.'], 'TypeMismatch'); +end + +dim = size (x, 2); + +if dim ~= 2 + errmsg = 'Only works for two-dimensional factor spaces.'; + stk_error (errmsg, 'InvalidArgument'); +end + +end % function + + +function h_plot = call_plotfun (plotfun, h_axes, x, y, z, varargin) + +% In Octave 3.6.4, pcolor supports neither the axis handle argument nor +% the optional parameter/value arguments. This function has been created to +% overcome this and other similar issues. + +try + + % When the full 'modern' syntax is supported, the result is usually better, + % in particular when options are provided. Let's try that first. + + if strcmp (func2str (plotfun), 'contour') + [~, h_plot] = contour ... + (h_axes, x, y, z, varargin{:}); + else + h_plot = plotfun (h_axes, x, y, z, varargin{:}); + end + +catch %#ok + + % Do we have an additional numeric argument ? + if isempty (varargin) + numarg = {}; + opts = {}; + else + if ischar (varargin{1}) + numarg = {}; + opts = varargin; + else + numarg = varargin(1); + opts = varargin(2:end); + end + end + + % Select the axes to draw on + h1 = gca (); axes (h_axes); + + try + + if strcmp (func2str (plotfun), 'contour') + [~, h_plot] = contour (x, y, z, numarg{:}); + else + h_plot = plotfun (x, y, z, numarg{:}); + end + + if ~ isempty (opts) + set (h_plot, opts{:}); + end + + axes (h1); + + catch %#ok + axes (h1); + rethrow (lasterror ()); %#ok + end + +end % try_catch + +end % function diff --git a/inst/arrays/@stk_factorialdesign/set.m b/inst/arrays/@stk_factorialdesign/set.m new file mode 100644 index 0000000..b7dfdfd --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/set.m @@ -0,0 +1,61 @@ +% SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = set (x, propname, value) + +df = x.stk_dataframe; + +switch propname, + + case 'levels', + % We proceed in two steps, instead of the seemingly simpler + % x = stk_factorialdesign (value); + % to preserve the value of the other fields (info, colnames, ...). + tmp = stk_factorialdesign (value); + x = set_data (df, tmp.data); + + case 'stk_dataframe', + errmsg = 'Field .stk_dataframe is read-only.'; + stk_error (errmsg, 'ReadOnlyField'); + + case {'colnames', 'rownames', 'info'}, + x.stk_dataframe = set (df, propname, value); + + otherwise, + if ismember (propname, fieldnames (df)) + % The result is not an stk_factorialdesign object anymore, in + % general. An implicit cast to stk_dataframe is thus performed. + x = set (df, propname, value); + else + errmsg = sprintf ('There is no field named: %s.', propname); + stk_error (errmsg, 'UnknownField'); + end + +end + +end % function diff --git a/inst/arrays/@stk_factorialdesign/stk_boundingbox.m b/inst/arrays/@stk_factorialdesign/stk_boundingbox.m new file mode 100644 index 0000000..0db36f8 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_boundingbox.m @@ -0,0 +1,52 @@ +% STK_BOUNDINGBOX [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function box = stk_boundingbox (x) + +xmin = cellfun (@min, x.levels); +xmax = cellfun (@max, x.levels); + +dim = numel (xmin); +xmin = reshape (xmin, 1, dim); +xmax = reshape (xmax, 1, dim); + +box = stk_hrect ([xmin; xmax]); + +box.colnames = x.stk_dataframe.colnames; + +end % function + + +%!shared x, y, cn +%! cn = {'a', 'b', 'c'}; +%! x = stk_factorialdesign ({[1 2], [3 4 5], [0 2 8]}, cn); + +%!error y = stk_boundingbox (); +%!test y = stk_boundingbox (x); + +%!assert (isequal (y, stk_hrect ([1 3 0; 2 5 8], cn))); diff --git a/inst/arrays/@stk_factorialdesign/stk_dataframe.m b/inst/arrays/@stk_factorialdesign/stk_dataframe.m new file mode 100644 index 0000000..9e855d9 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_dataframe.m @@ -0,0 +1,90 @@ +% @STK_FACTORIALDESIGN/STK_DATAFRAME [overload STK function] +% +% See also: stk_dataframe + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_dataframe (x, colnames, rownames) + +x = x.stk_dataframe; + +if nargin > 1 + + % Note: [] means "keep x.colnames" while {} means "no column names" + if iscell (colnames) + x = set (x, 'colnames', colnames); + elseif ~ isempty (colnames) + stk_error (['colnames should be either a cell array ' ... + 'of strings or [].'], 'InvalidArgument'); + end + + if nargin > 2 + + % Note: [] means "keep x.rownames" while {} means "no row names" + if iscell (rownames) + x = set (x, 'rownames', rownames); + elseif ~ isempty (rownames) + stk_error (['rownames should be either a cell array ' ... + 'of strings or [].'], 'InvalidArgument'); + end + end + +end + +end % function + +%!shared x, cn, rn, y, cn2, rn2 +%! cn = {'x' 'y'}; +%! rn = {'a'; 'b'; 'c'; 'd'}; +%! x = stk_factorialdesign ({1:2, 1:2}, cn, rn); +%! cn2 = {'xx' 'yy'}; +%! rn2 = {'aa'; 'bb'; 'cc'; 'dd'}; + +%!test y = stk_dataframe (x); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn)) +%!assert (isequal (y.rownames, rn)) + +%!test y = stk_dataframe (x, cn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn2)) +%!assert (isequal (y.rownames, rn)) + +%!test y = stk_dataframe (x, cn2, rn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn2)) +%!assert (isequal (y.rownames, rn2)) + +%!test y = stk_dataframe (x, [], rn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn)) +%!assert (isequal (y.rownames, rn2)) + +%!test y = stk_dataframe (x, {}, rn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, {})) +%!assert (isequal (y.rownames, rn2)) diff --git a/inst/arrays/@stk_factorialdesign/stk_factorialdesign.m b/inst/arrays/@stk_factorialdesign/stk_factorialdesign.m new file mode 100644 index 0000000..55cf52f --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_factorialdesign.m @@ -0,0 +1,282 @@ +% STK_FACTORIALDESIGN constructs a "full factorial design" array +% +% CALL: D = stk_factorialdesign (LEVELS) +% +% creates a full factorial design with levels LEVELS{1} for the first +% variable, LEVELS{2} for the second variable, etc. The output is an object +% of the stk_factorialdesign class, which derives from stk_dataframe. +% +% CALL: D = stk_factorialdesign (LEVELS, COLNAMES) +% +% allows to specify column names for the dataframe D. +% +% CALL: D = stk_factorialdesign (LEVELS, COLNAMES, ROWNAMES) +% +% allows to specify row names as well. +% +% See also: stk_dataframe, stk_hrect + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2019 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_factorialdesign (levels, varargin) + +if nargin == 0 % default constructor + levels = {[]}; +end + +if ~ iscell (levels) + + stk_error ('Expecting a cell array as first argument', 'TypeMismatch'); + +else + + % Guess the number of factors from the length of the cell array + dim = length (levels); + + % Extract raw factor data and column names (when they are available) + raw_levels = cell (1, dim); + raw_levels_anyempty = false; + colnames = cell (1, dim); + colnames_allempty = true; + for i = 1:dim + li = levels{i}; + + if isa (li, 'stk_dataframe') + assert (size (li, 2) == 1); + cn = get (li, 'colnames'); + if isempty (cn) + colnames{i} = ''; + else + colnames(i) = cn; + end + raw_levels{i} = double (li); + elseif isnumeric (li) + colnames{i} = ''; + raw_levels{i} = double (li(:)); + levels{i} = raw_levels{i}; + else + errmsg = 'Only numeric factors are currently supported.'; + stk_error (errmsg, 'TypeMismatch'); + end + + if isempty (raw_levels{i}) + raw_levels_anyempty = true; + end + + if ~ isempty (colnames{i}) + colnames_allempty = false; + end + end + + if (dim == 0) || raw_levels_anyempty + + xdata = zeros (0, dim); + + elseif dim == 1 + + xdata = raw_levels{1}; + + else + + % coordinate arrays + coord = cell (1, dim); + [coord{:}] = ndgrid (raw_levels{:}); + + % design matrix + xdata = zeros (numel (coord{1}), dim); + for j = 1:dim + xdata(:, j) = coord{j}(:); + end + + end + + % base dataframe + df = stk_dataframe (xdata, varargin{:}); + df = set (df, 'info', 'Created by stk_factorialdesign'); + + % column names ? + if isempty (get (df, 'colnames')) && ~ colnames_allempty + df = set (df, 'colnames', colnames); + end + + % "factorial design" object + x = struct (); x.levels = levels; + x = class (x, 'stk_factorialdesign', df); + +end % if + +end % function + + +%!test stk_test_class ('stk_factorialdesign') + +%--- constructor -------------------------------------------------------------- + +%!test % constructor with two factors + column names +%! x = stk_factorialdesign ({[0 1], [1 2 3]}, {'a', 'b'}); +%! assert (isequal(x.colnames, {'a', 'b'})); +%! assert (isequal(get (x, 'colnames'), {'a', 'b'})); + +% tests some incorrect values for 'levels' +%!error stk_factorialdesign ('bouh'); + +% categorical variable not supported yet +%!error stk_factorialdesign ({{'a' 'b'}}); + +%--- disp & display ----------------------------------------------------------- + +%!shared x, fmt +%! fmt = stk_disp_getformat (); +%! x = stk_sampling_regulargrid (3^2, 2); + +%!test format rat; disp (x); +%!test format long; disp (x); +%!test format short; disp (x); format (fmt); + +%!test disp (stk_sampling_regulargrid (0^1, 1)); +%!test disp (stk_sampling_regulargrid (0^2, 2)); + +%!test display (x); + +%--- size, length, end -------------------------------------------------------- + +%!error length (stk_sampling_regulargrid (7^2, 2)) % not defined + +%!shared x +%! x = stk_factorialdesign ({[0 1], [0 1]}); +%!assert (isequal (x(2:end, :), x(2:4, :))) +%!assert (isequal (x(2, 1:end), x(2, :))) +%!assert (isequal (x(2:end, 2:end), x(2:4, 2))) +%!error x(1:end, 1:end, 1:end) + +%--- cat, vertcat, horzcat ---------------------------------------------------- + +% Note: the output is a plain stk_dataframe + +%!shared x, y +%! x = stk_sampling_regulargrid (3^2, 2); +%! y = x; + +%!test %%%% vercat +%! z = vertcat (x, y); +%! assert (strcmp (class (z), 'stk_dataframe')); +%! assert (isequal (double (z), [double(x); double(y)])); + +%!test %%%% same thing, using cat(1, ...) +%! z = cat (1, x, y); +%! assert (strcmp (class (z), 'stk_dataframe')); +%! assert (isequal (double (z), [double(x); double(y)])); + +%!test %%%% horzcat +%! y.colnames = {'y1' 'y2'}; z = horzcat (x, y); +%! assert (strcmp (class (z), 'stk_dataframe')); +%! assert (isequal (double (z), [double(x) double(y)])); + +%!test %%%% same thing, using cat (2, ...) +%! z = cat (2, x, y); +%! assert (strcmp (class (z), 'stk_dataframe')); +%! assert (isequal (double (z), [double(x) double(y)])); + +%!error cat (3, x, y) + +%--- apply & related functions ------------------------------------------------ + +%!shared x, t +%! x = stk_sampling_regulargrid (3^2, 2); +%! t = double (x); + +%!assert (isequal (apply (x, 1, @sum), sum (t, 1))) +%!assert (isequal (apply (x, 2, @sum), sum (t, 2))) +%!error u = apply (x, 3, @sum); + +%!assert (isequal (apply (x, 1, @min, []), min (t, [], 1))) +%!assert (isequal (apply (x, 2, @min, []), min (t, [], 2))) +%!error u = apply (x, 3, @min, []); + +%!assert (isequal (min (x), min (t))) +%!assert (isequal (max (x), max (t))) +%!assert (isequal (std (x), std (t))) +%!assert (isequal (var (x), var (t))) +%!assert (isequal (sum (x), sum (t))) +%!assert (isequal (mean (x), mean (t))) +%!assert (isequal (mode (x), mode (t))) +%!assert (isequal (prod (x), prod (t))) +%!assert (isequal (median (x), median (t))) + +%--- bsxfun & related functions ----------------------------------------------- + +%!shared x1, x2, x3, u1, u2, u3 +%! x1 = stk_sampling_regulargrid ([4 3], 2); u1 = double (x1); +%! x2 = stk_sampling_regulargrid ([3 4], 2); u2 = double (x2); +%! x3 = x1 + 1; u3 = u1 + 1; + +%!test +%! z = bsxfun (@plus, x1, u2); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), u1 + u2)) + +%!test +%! z = bsxfun (@plus, u1, x2); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), u1 + u2)) + +%!test +%! z = bsxfun (@plus, x1, x2); +%! assert (isa (z, 'stk_dataframe') && isequal (double (z), u1 + u2)) + +%!test z = min (x1, x2); assert (isequal (double (z), min (u1, u2))); +%!test z = max (x1, x2); assert (isequal (double (z), max (u1, u2))); +%!error z = min (x1, x2, 1); +%!error z = max (x1, x2, 1); + +%!test z = x1 + x2; assert (isequal (double (z), u1 + u2)); +%!test z = x1 - x2; assert (isequal (double (z), u1 - u2)); +%!test z = x1 .* x2; assert (isequal (double (z), u1 .* u2)); +%!test z = x3 .\ x2; assert (isequal (double (z), u3 .\ u2)); +%!test z = x2 ./ x3; assert (isequal (double (z), u2 ./ u3)); +%!test z = x3 .^ x2; assert (isequal (double (z), u3 .^ u2)); +%!test z = realpow (x3, x2); assert (isequal (double (z), realpow (u3, u2))); + +%!test z = (x1 == x2); assert (isequal (double (z), (u1 == u2))); +%!test z = (x1 ~= x2); assert (isequal (double (z), (u1 ~= u2))); +%!test z = (x1 <= x2); assert (isequal (double (z), (u1 <= u2))); +%!test z = (x1 >= x2); assert (isequal (double (z), (u1 >= u2))); +%!test z = (x1 < x2); assert (isequal (double (z), (u1 < u2))); +%!test z = (x1 > x2); assert (isequal (double (z), (u1 > u2))); + +%!test z = x1 & x2; assert (isequal (double (z), u1 & u2)); +%!test z = x1 | x2; assert (isequal (double (z), u1 | u2)); +%!test z = xor (x1, x2); assert (isequal (double (z), xor (u1, u2))); + +%--- transpose, ctranspose ---------------------------------------------------- + +% Transposing a dataframe that represents a factorial design results in a +% dataframe that does NOT represent a factorial design + +%!shared x +%! x = stk_factorialdesign ({[0 1], [0 1 2]}); +%!assert (strcmp (class (x'), 'stk_dataframe')) +%!assert (strcmp (class (x.'), 'stk_dataframe')) diff --git a/inst/arrays/@stk_factorialdesign/stk_normalize.m b/inst/arrays/@stk_factorialdesign/stk_normalize.m new file mode 100644 index 0000000..20c1c54 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_normalize.m @@ -0,0 +1,49 @@ +% STK_NORMALIZE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_normalize (x, varargin) + +if (~ isa (x, 'stk_factorialdesign')) + % One of the box arguments is an stk_factorialdesign object + stk_error (['stk_factorialdesign objects cannot be used as values ' ... + 'for ''box'' arguments.'], 'TypeMismatch'); +end + +% Normalize using @stk_dataframe/stk_normalize +[x.stk_dataframe, a, b] = stk_normalize (x.stk_dataframe, varargin{:}); + +for j = 1:(length (x.levels)) + x.levels{j} = a(j) + b(j) * x.levels{j}; +end + +end % function + +%!test +%! x = stk_factorialdesign ({[1 2], [5 6]}); +%! y = stk_factorialdesign ({[0 1], [0 1]}); +%! assert (stk_isequal_tolabs (stk_normalize (x), y)) diff --git a/inst/arrays/@stk_factorialdesign/stk_rescale.m b/inst/arrays/@stk_factorialdesign/stk_rescale.m new file mode 100644 index 0000000..09e7c10 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_rescale.m @@ -0,0 +1,51 @@ +% STK_RESCALE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_rescale (x, varargin) + +if (~ isa (x, 'stk_factorialdesign')) + % One of the box arguments is an stk_factorialdesign object + stk_error (['stk_factorialdesign objects cannot be used as values ' + 'for ''box'' arguments.'], 'TypeMismatch'); +end + +% Rescale using @stk_dataframe/stk_rescale +[x.stk_dataframe, a, b] = stk_rescale (x.stk_dataframe, varargin{:}); + +% Apply the same normalization to levels +for j = 1:(length (x.levels)) + x.levels{j} = a(j) + b(j) * x.levels{j}; +end + +end % function + +%!test +%! x = stk_factorialdesign ({[1 2], [5 6]}); +%! y = stk_factorialdesign ({[0 3], [0 3]}); +%! z = stk_rescale (x, [1 5; 2 6], [0 0; 3 3]); +%! assert (stk_isequal_tolabs (y, z)) diff --git a/inst/arrays/@stk_factorialdesign/stk_sprintf.m b/inst/arrays/@stk_factorialdesign/stk_sprintf.m new file mode 100644 index 0000000..65631bf --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_sprintf.m @@ -0,0 +1,71 @@ +% STK_SPRINTF ... + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf (x, verbosity, data_col_width) + +if (nargin < 2) || (isempty (verbosity)), + verbosity = stk_options_get ('stk_dataframe', 'disp_format'); +end +if ~ ismember (verbosity, {'basic', 'verbose'}) + errmsg = 'verbosity should be ''basic'' or ''verbose''.'; + stk_error (errmsg, 'InvalidArgument'); +end + +if (nargin < 3) || (isempty (data_col_width)), + data_col_width = []; +end + +% Print the stk_dataframe +df = x.stk_dataframe; +s = stk_sprintf (df, 'basic', data_col_width); + +% Print the levels first, if in verbose mode +if strcmp (verbosity, 'verbose'), + + spstr = stk_options_get ('stk_dataframe', 'disp_spstr'); + L = length (x.levels); + + s = char (... + ... %-------------------------------------------------------------- + '.colnames =', ... % alias for .stk_dataframe.colnames + horzcat (spstr, stk_sprintf_colnames (df)), ... + ... %-------------------------------------------------------------- + '.rownames =', ... % alias for .stk_dataframe.rownames + horzcat (spstr, stk_sprintf_rownames (df)), ... + ... %-------------------------------------------------------------- + sprintf ('.levels = <%s>', stk_sprintf_sizetype (x.levels)), ... + horzcat (repmat (spstr, L, 1), stk_sprintf_levels (x)), ... + ... %-------------------------------------------------------------- + '.data =', ... % alias for .stk_dataframe.data + horzcat (repmat (spstr, size (s, 1), 1), s) ... + ); %--------------------------------------------------------------- + +end + +end % function diff --git a/inst/arrays/@stk_factorialdesign/stk_sprintf_levels.m b/inst/arrays/@stk_factorialdesign/stk_sprintf_levels.m new file mode 100644 index 0000000..bdaabb3 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/stk_sprintf_levels.m @@ -0,0 +1,57 @@ +% STK_SPRINTF_LEVELS prints the levels of a factorial design into a string + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_levels (x) + +colnames = get (x.stk_dataframe, 'colnames'); + +d = length (x.levels); + +for i = 1:d + + if isempty (colnames) + line{i} = sprintf('levels for column #%d: ', i); + else + line{i} = sprintf('levels for variable %s: ', colnames{i}); + end + + L = x.levels{i}; + if isempty (L) + line{i} = [line{i} '[]']; + else + for j = 1:(length(L) - 1) + line{i} = [line{i} num2str(L(j)) ', ']; + end + line{i} = [line{i} sprintf('%s', num2str(L(end)))]; + end + +end + +s = char (line{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/subsasgn.m b/inst/arrays/@stk_factorialdesign/subsasgn.m new file mode 100644 index 0000000..f339d81 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/subsasgn.m @@ -0,0 +1,60 @@ +% SUBSASGN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = subsasgn (x, idx, val) + +if ~ isa (x, 'stk_dataframe') + % Inherit behaviour from @stk_dataframe + % (see @stk_dataframe/subsasgn.m) + x = subsasgn (x, idx, val.stk_dataframe); + return +end + +switch idx(1).type + + case '()' + % The result is not an stk_factorialdesign object anymore, in + % general. An implicit cast to stk_dataframe is thus performed. + x = x.stk_dataframe; + x = subsasgn (x, idx, val); + + case '{}' + errmsg = 'Indexing with curly braces is not allowed.'; + stk_error(errmsg, 'IllegalIndexing'); + + case '.' + if length (idx) > 1 + val = subsasgn (get (x, idx(1).subs), idx(2:end), val); + end + x = set (x, idx(1).subs, val); + +end + +end % function + diff --git a/inst/arrays/@stk_factorialdesign/surf.m b/inst/arrays/@stk_factorialdesign/surf.m new file mode 100644 index 0000000..1ef9b8e --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/surf.m @@ -0,0 +1,36 @@ +% SURF [overload base function] +% +% See also: stk_factorialdesign/contour, stk_factorialdesign/mesh, ... + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = surf (varargin) + +h_plot = plot_surfmeshcontour (@surf, varargin{:}); + +end % function diff --git a/inst/arrays/@stk_factorialdesign/uminus.m b/inst/arrays/@stk_factorialdesign/uminus.m new file mode 100644 index 0000000..6cf1617 --- /dev/null +++ b/inst/arrays/@stk_factorialdesign/uminus.m @@ -0,0 +1,40 @@ +% UMINUS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = uminus (x) + +x.stk_dataframe = - x.stk_dataframe; +x.levels = cellfun (@uminus, x.levels, 'UniformOutput', false); + +end % function + + +%!test +%! x = stk_factorialdesign ({1:3, 1:2}); +%! y = stk_factorialdesign ({-(1:3), -(1:2)}); +%! assert (isequal (-x, y)) diff --git a/inst/arrays/@stk_hrect/axis.m b/inst/arrays/@stk_hrect/axis.m new file mode 100644 index 0000000..96c9cc6 --- /dev/null +++ b/inst/arrays/@stk_hrect/axis.m @@ -0,0 +1,70 @@ +% AXIS [overload base function] + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = axis (varargin) + +[h_axes, varargin, nargin] = stk_plot_getaxesarg (varargin{:}); + +varargout = cell (1, nargout); +labels = {}; + +for i = 1:nargin + a = varargin{i}; + if isa (a, 'stk_hrect') + df = a.stk_dataframe; + + % Check number of columns + d = size (df, 2); + if (d < 2) || (d > 4) + stk_error ('axis support 2, 3 or 4 columns only.', 'IncorrectSize'); + end + + % Convert to vector: [XMIN XMAX YMIN YMAX ...] + varargin{i} = reshape (double (df), 1, 2 * d); + + % Get labels + tmp = get (df, 'colnames'); + if ~ isempty (tmp) + labels = tmp(1:(min (3, d))); + end + end +end + +[varargout{:}] = axis (h_axes, varargin{:}); + +% Add labels if available +if (~ isempty (labels)) + stk_xlabel (h_axes, labels{1}, 'interpreter', 'none'); % CG#10 + stk_ylabel (h_axes, labels{2}, 'interpreter', 'none'); % CG#10 + if (length (labels) > 2) + stk_zlabel (h_axes, labels{3}, 'interpreter', 'none'); % CG#10 + end +end + +end % function diff --git a/inst/arrays/@stk_hrect/disp.m b/inst/arrays/@stk_hrect/disp.m new file mode 100644 index 0000000..cbc480f --- /dev/null +++ b/inst/arrays/@stk_hrect/disp.m @@ -0,0 +1,33 @@ +% DISP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (hr) + +disp (hr.stk_dataframe); + +end % function diff --git a/inst/arrays/@stk_hrect/display.m b/inst/arrays/@stk_hrect/display.m new file mode 100644 index 0000000..442f277 --- /dev/null +++ b/inst/arrays/@stk_hrect/display.m @@ -0,0 +1,39 @@ +% DISPLAY [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function display (x) + +fprintf ( ... + '\n%s = %d-dimensional hyper-rectangle (stk_hrect object):\n\n', ... + inputname (1), size (x.stk_dataframe, 2)); + +disp (x); + +fprintf ('\n'); + +end % function diff --git a/inst/arrays/@stk_hrect/get.m b/inst/arrays/@stk_hrect/get.m new file mode 100644 index 0000000..8959965 --- /dev/null +++ b/inst/arrays/@stk_hrect/get.m @@ -0,0 +1,53 @@ +% GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (x, propname) + +switch propname + + case 'lower_bounds' + value = x.stk_dataframe.data(1, :); + + case 'upper_bounds' + value = x.stk_dataframe.data(2, :); + + case 'stk_dataframe' % Read-only access to the underlying df + value = x.stk_dataframe; + + otherwise + try + value = get (x.stk_dataframe, propname); + catch + stk_error (sprintf ('There is no field named %s', propname), ... + 'InvalidArgument'); + end +end + +end % function + +%#ok<*CTCH> diff --git a/inst/arrays/@stk_hrect/horzcat.m b/inst/arrays/@stk_hrect/horzcat.m new file mode 100644 index 0000000..cd504fb --- /dev/null +++ b/inst/arrays/@stk_hrect/horzcat.m @@ -0,0 +1,90 @@ +% HORZCAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = horzcat (x, y, varargin) + +if nargin < 2, + z = x; + return +end + +if isa (x, 'stk_hrect'), x = x.stk_dataframe; end +if isa (y, 'stk_hrect'), y = y.stk_dataframe; end + +z = horzcat (x, y); + +try + z = stk_hrect (z); +catch + err = lasterror (); + if strcmp (err.identifier, 'STK:stk_hrect:InvalidBounds') + warning ('STK:stk_hrect:horzcat:IllegalBounds', ... + 'Illegal bounds, the result is not an stk_hrect object.'); + else + rethrow (err); + end +end + +if nargin > 2, + z = horzcat (z, varargin{:}); +end + +end % function + +%#ok<*LERR,*CTCH> + + +%!shared d, x1, x2, x3 +%! d = 10; +%! x1 = stk_hrect (d); +%! x2 = double (x1); +%! x3 = [1:d; 0:(d-1)]; % illegal bounds + +%!test +%! y1 = horzcat (x1, x1); +%! assert (isequal (size (y1), [2 2*d])); +%! assert (strcmp (class (y1), 'stk_hrect')); + +%!test +%! y2 = horzcat (x1, x2); +%! assert (isequal (size (y2), [2 2*d])); +%! assert (strcmp (class (y2), 'stk_hrect')); + +%!test +%! y3 = horzcat (x2, x1); +%! assert (isequal (size (y3), [2 2*d])); +%! assert (strcmp (class (y3), 'stk_hrect')); + +%!test +%! lastwarn ('') +%! y4 = horzcat (x1, x3); +%! assert (isequal (size (y4), [2 2*d])); +%! assert (strcmp (class (y4), 'stk_dataframe')); +%! [warn_msg, warn_id] = lastwarn (); +%! assert (strcmp (warn_id, 'STK:stk_hrect:horzcat:IllegalBounds')) diff --git a/inst/arrays/@stk_hrect/ismember.m b/inst/arrays/@stk_hrect/ismember.m new file mode 100644 index 0000000..45a6c85 --- /dev/null +++ b/inst/arrays/@stk_hrect/ismember.m @@ -0,0 +1,96 @@ +% ISMEMBER [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = ismember (A, B, varargin) + +if isa (B, 'stk_hrect'), + + % If B is an stk_hrect, ismember tests whether A (or the points in A) + % belong to the hyper-rectangle B + + % The 'rows' flag is tolerated but unused in this case + if (nargin > 2) && (~ isequal (varargin, {'rows'})) + stk_error ('Invalid additional arguments', 'InvalidArgument'); + end + + if nargout > 1, + stk_error (['Cannot return member indices when testing for ' ... + 'membership to an hyper-rectangle.'], 'TooManyOutputArgs'); + end + + A = double (A); + % bounds = get (B.stk_dataframe, 'data'); + bounds = double (B); % even faster than get (..., 'data') + b1 = bsxfun (@ge, A, bounds(1, :)); + b2 = bsxfun (@le, A, bounds(2, :)); + varargout = {all(b1 & b2, 2)}; + +else % A is an stk_hrect, treat it as any other stk_dataframe would be treated + + varargout = cell (1, max (nargout, 1)); + + if nargin == 2, + + [varargout{:}] = ismember (A.stk_dataframe, B, 'rows'); + + else + + try + % At least of of the arguments (A or B) is an stk_hrect, + % therefore ismember should work on rows + flags = unique ([{'rows'} varargin{:}]); + catch + if ~ all (cellfun (@ischar, varargin)) + stk_error ('Invalid flag (should be a string).', ... + 'InvalidArgument'); + else + rethrow (lasterror ()); + end + end + + [varargout{:}] = ismember (A.stk_dataframe, B, flags{:}); + + end +end + +end % function + +%!shared n, box +%! n = 5; +%! box = stk_hrect (n); + +%!assert (ismember (box(1, :), box)) +%!assert (ismember (box(2, :), box)) +%!assert (ismember (.5 * ones (1, 5), box)) +%!assert (~ ismember (box(1, :) - 1, box)) +%!assert (~ ismember (box(2, :) + 1, box)) + +%!test +%! y = double (box); y = [y; y + 2]; +%! assert (isequal (ismember (y, box), [1; 1; 0; 0])) diff --git a/inst/arrays/@stk_hrect/stk_boundingbox.m b/inst/arrays/@stk_hrect/stk_boundingbox.m new file mode 100644 index 0000000..fd3c520 --- /dev/null +++ b/inst/arrays/@stk_hrect/stk_boundingbox.m @@ -0,0 +1,46 @@ +% STK_BOUNDINGBOX [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function box = stk_boundingbox (x) + +% An stk_hrect object is its own bounding box +box = x; + +end % function + + +%!shared x, y +%! lb = rand (1, 5); +%! ub = lb + 1; +%! cn = {'a', 'b', 'c', 'd', 'e'}; +%! x = stk_hrect ([lb; ub], cn); + +%!error y = stk_boundingbox (); +%!test y = stk_boundingbox (x); + +%!assert (isequal (y, x)); diff --git a/inst/arrays/@stk_hrect/stk_dataframe.m b/inst/arrays/@stk_hrect/stk_dataframe.m new file mode 100644 index 0000000..29c208e --- /dev/null +++ b/inst/arrays/@stk_hrect/stk_dataframe.m @@ -0,0 +1,91 @@ +% @STK_HRECT/STK_DATAFRAME [overload STK function] +% +% See also: stk_dataframe + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_dataframe (x, colnames, rownames) + +x = x.stk_dataframe; + +if nargin > 1 + + % Note: [] means "keep x.colnames" while {} means "no column names" + if iscell (colnames) + x = set (x, 'colnames', colnames); + elseif ~ isempty (colnames) + stk_error (['colnames should be either a cell array ' ... + 'of strings or [].'], 'InvalidArgument'); + end + + if nargin > 2 + + % Note: [] means "keep x.rownames" while {} means "no row names" + if iscell (rownames) + x = set (x, 'rownames', rownames); + elseif ~ isempty (rownames) + stk_error (['rownames should be either a cell array ' ... + 'of strings or [].'], 'InvalidArgument'); + end + end + +end + +end % function + + +%!shared x, cn, rn, y, cn2, rn2 +%! cn = {'x' 'y'}; +%! rn = {'lower_bounds'; 'upper_bounds'}; +%! x = stk_hrect ([0 0; 1 1], cn); +%! cn2 = {'xx' 'yy'}; +%! rn2 = {'aa'; 'bb'}; + +%!test y = stk_dataframe (x); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn)) +%!assert (isequal (y.rownames, rn)) + +%!test y = stk_dataframe (x, cn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn2)) +%!assert (isequal (y.rownames, rn)) + +%!test y = stk_dataframe (x, cn2, rn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn2)) +%!assert (isequal (y.rownames, rn2)) + +%!test y = stk_dataframe (x, [], rn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, cn)) +%!assert (isequal (y.rownames, rn2)) + +%!test y = stk_dataframe (x, {}, rn2); +%!assert (strcmp (class (y), 'stk_dataframe')) +%!assert (isequal (y.colnames, {})) +%!assert (isequal (y.rownames, rn2)) diff --git a/inst/arrays/@stk_hrect/stk_hrect.m b/inst/arrays/@stk_hrect/stk_hrect.m new file mode 100644 index 0000000..488c0a3 --- /dev/null +++ b/inst/arrays/@stk_hrect/stk_hrect.m @@ -0,0 +1,115 @@ +% STK_HRECT creates an hyper-rectangle object +% +% CALL: B = stk_hrect (D) +% CALL: B = stk_hrect (D, COLNAMES) +% +% creates an object representing a D-dimensional unit hypercube, [0; 1] ^ D. +% +% The second (optional) argument can be used to provide variable names. +% +% CALL: B = stk_hrect (X) +% CALL: B = stk_hrect (X, COLNAMES) +% +% creates an object representing a D-dimensional hyperrectangle with lower +% bounds X(1, :) and upper bounds X(2, :). The input X must be a 2xD +% numerical array. +% +% NOTE: class hierarchy +% +% An stk_hrect object is two-row stk_dataframe object, with row names +% 'lower_bounds' and 'upper_bounds'. +% +% See also: stk_dataframe, stk_boundingbox + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_hrect (arg1, colnames) + +if nargin == 0 % Default constructor + + df = stk_dataframe (); + s = class (struct (), 'stk_hrect', df); + return + +elseif isa (arg1, 'stk_hrect') % arg1 is already an stk_hrect object: copy + + s = arg1; + +else % create a new stk_hrect object + + if (prod (size (arg1)) == 1) % isscalar CG#08 + % arg1 is the dimension of the input space + % => create a default hyper-rectangle [0; 1]^d, with d = arg1 + + d = arg1; + box_data = repmat ([0; 1], 1, d); + box_colnames = {}; + + else + + if isa (arg1, 'stk_dataframe') + box_colnames = get (arg1, 'colnames'); + else + box_colnames = {}; + end + + box_data = double (arg1); + d = size (box_data, 2); + + if (~ isequal (size (box_data), [2 d])) + stk_error ('Invalid size: should be 2 x dim.', 'IncorrectSize'); + end + end + + if (~ all (box_data(1, :) <= box_data(2, :))) + stk_error ('Invalid bounds', 'InvalidBounds'); + end + + df = stk_dataframe (box_data, ... + box_colnames, {'lower_bounds', 'upper_bounds'}); + s = class (struct (), 'stk_hrect', df); + +end + +% column names +if nargin > 1 + s.stk_dataframe = set (s.stk_dataframe, 'colnames', colnames); +end + +end % function + +%#ok<*PSIZE> + + +%!test stk_test_class ('stk_hrect') + +%!shared dom +%!test dom = stk_hrect ([-1; 1], {'x'}); +%!assert (isequal (dom.colnames, {'x'})) +%!assert (isequal (dom.rownames, {'lower_bounds'; 'upper_bounds'})) +%!assert (isequal (dom.data, [-1; 1])) diff --git a/inst/arrays/@stk_hrect/stk_normalize.m b/inst/arrays/@stk_hrect/stk_normalize.m new file mode 100644 index 0000000..03b6aa9 --- /dev/null +++ b/inst/arrays/@stk_hrect/stk_normalize.m @@ -0,0 +1,76 @@ +% STK_NORMALIZE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_normalize (x, box) + +if nargin < 2, + box = []; +end + +% Read argument x +x_data = double (x); +d = size (x_data, 2); + +% Ensure that box is an stk_hrect object +if ~ isa (box, 'stk_hrect') + if isempty (box) + box = stk_boundingbox (x_data); % Default: bounding box + else + box = stk_hrect (box); + end +end + +% Read argument box +box_data = double (box.stk_dataframe); +if ~ isequal (size (box_data), [2 d]) + errmsg = sprintf ('box should have size [2 d], with d=%d.', d); + stk_error (errmsg, 'IncorrectSize'); +end + +xmin = box_data(1, :); % lower_bounds +xmax = box_data(2, :); % upper_bounds + +b = 1 ./ (xmax - xmin); +a = - xmin .* b; + +x(:) = bsxfun (@plus, a, x_data * diag (b)); + +end % function + + +%!shared x, box, y1, y2, y3, y4 +%! n = 5; box = stk_hrect ([2; 3]); +%! x = 2 + rand (n, 1); + +%!error y1 = stk_normalize (); +%!test y2 = stk_normalize (x); +%!test y3 = stk_normalize (x, box); + +%!test assert (~ any ((y2 < -10 * eps) | (y2 > 1 + 10 * eps))); +%!test assert (~ any ((y3 < -10 * eps) | (y3 > 1 + 10 * eps))); diff --git a/inst/arrays/@stk_hrect/stk_rescale.m b/inst/arrays/@stk_hrect/stk_rescale.m new file mode 100644 index 0000000..f5598d4 --- /dev/null +++ b/inst/arrays/@stk_hrect/stk_rescale.m @@ -0,0 +1,125 @@ +% STK_RESCALE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_rescale (x, box1, box2) + +% Read argument x +x_data = double (x); +d = size (x_data, 2); + +box1_data = double (box1); + +if isempty (box1_data) + + % Speed up the case where box1 is empty + b1 = 1; + a1 = 0; + +else + + % Ensure that box1 is an stk_hrect object, or can be converted to one + % (note: this checks that lower bounds are smaller than upper bounds) + if ~ isa (box1, 'stk_hrect') + box1 = stk_hrect (box1); %#ok + end + + % Check the number of columns + if size (box1_data, 2) ~= d + errmsg = sprintf ('box1 should have size [2 d], with d=%d.', d); + stk_error (errmsg, 'IncorrectSize'); + end + + % Scale to [0; 1] (xx --> zz) + xmin = box1_data(1, :); + xmax = box1_data(2, :); + b1 = 1 ./ (xmax - xmin); + a1 = - xmin .* b1; + +end + +box2_data = double (box2); + +if isempty (box2_data) + + % Speed up the case where box2 is empty + b2 = 1; + a2 = 0; + +else + + % Ensure that box2 is an stk_hrect object, or can be converted to one + % (note: this checks that lower bounds are smaller than upper bounds) + if ~ isa (box2, 'stk_hrect') + box2 = stk_hrect (box2); %#ok + end + + % Check the number of columns + if size (box2_data, 2) ~= d + errmsg = sprintf ('box2 should have size [2 d], with d=%d.', d); + stk_error (errmsg, 'IncorrectSize'); + end + + % scale to box2 (zz --> yy) + ymin = box2_data(1, :); + ymax = box2_data(2, :); + b2 = ymax - ymin; + a2 = ymin; + +end + +b = b2 .* b1; +a = a2 + a1 .* b2; + +x(:) = bsxfun (@plus, a, bsxfun (@times, x_data, b)); + +end % function + +%#ok<*CTCH> + + +%!shared x +%! x = rand (10, 4); +%! y = stk_rescale (x, [], []); +%! assert (stk_isequal_tolabs (x, y)); + +%!test +%! y = stk_rescale(0.5, [], [0; 2]); +%! assert (stk_isequal_tolabs (y, 1.0)); + +%!test +%! y = stk_rescale (0.5, [0; 1], [0; 2]); +%! assert (stk_isequal_tolabs (y, 1.0)); + +%!test +%! y = stk_rescale (0.5, [0; 2], []); +%! assert (stk_isequal_tolabs (y, 0.25)); + +%!test +%! y = stk_rescale (0.5, [0; 2], [0; 1]); +%! assert (stk_isequal_tolabs (y, 0.25)); diff --git a/inst/arrays/@stk_hrect/subsasgn.m b/inst/arrays/@stk_hrect/subsasgn.m new file mode 100644 index 0000000..180c5d8 --- /dev/null +++ b/inst/arrays/@stk_hrect/subsasgn.m @@ -0,0 +1,48 @@ +% SUBSASGN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = subsasgn (x, idx, value) + +if isa (x, 'stk_hrect') + + x.stk_dataframe = subsasgn (x.stk_dataframe, idx, value); + + data = double (x); + if any (data(1, :) > data(2, :)) + stk_error ('Lower bounds cannot be larger than upperbounds', ... + 'IllegalAssigment'); + end + +else % value must be an stk_hrect object + + x = subsasgn (x, idx, x.stk_dataframe); + +end + +end % function diff --git a/inst/arrays/@stk_hrect/subsref.m b/inst/arrays/@stk_hrect/subsref.m new file mode 100644 index 0000000..c42c684 --- /dev/null +++ b/inst/arrays/@stk_hrect/subsref.m @@ -0,0 +1,71 @@ +% SUBSREF [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function t = subsref (x, idx) + +switch idx(1).type + + case '()' + + t = subsref (x.stk_dataframe, idx); + + if size (t, 1) == 2 + x.stk_dataframe = t; + t = x; + end + + case '{}' + + % Currently {}-indexing is not supported for + % stk_dataframe objects, but who knows... + t = subsref (x.stk_dataframe, idx); + + case '.' + + t = get (x, idx(1).subs); + + if length (idx) > 1, + t = subsref (t, idx(2:end)); + end + +end + +end % function + +%!test +%! B = stk_hrect ([0 0 0 0; 1 2 3 4]); +%! B = B(:, [1 3 4]); +%! assert (strcmp (class (B), 'stk_hrect')); +%! assert (isequal (double (B), [0 0 0; 1 3 4])); + +%!test +%! B = stk_hrect ([0 0 0 0; 1 2 3 4]); +%! B = B(1, :); +%! assert (strcmp (class (B), 'stk_dataframe')); +%! assert (isequal (double (B), [0 0 0 0])); diff --git a/inst/arrays/@stk_hrect/vertcat.m b/inst/arrays/@stk_hrect/vertcat.m new file mode 100644 index 0000000..b570f41 --- /dev/null +++ b/inst/arrays/@stk_hrect/vertcat.m @@ -0,0 +1,60 @@ +% VERTCAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function result = vertcat (varargin) + +for i = 1:nargin, + if isa (varargin{i}, 'stk_hrect') + varargin{i} = varargin{i}.stk_dataframe; + end +end + +result = vertcat (varargin{:}); + +end % function + + +%!shared d, x, y +%! d = 10; +%! x = stk_hrect (d); +%! y = double (x); + +%!test +%! z = vertcat (x, x); +%! assert (isequal (size (z), [4 d])); +%! assert (strcmp (class (z), 'stk_dataframe')); + +%!test +%! z = vertcat (x, y); +%! assert (isequal (size (z), [4 d])); +%! assert (strcmp (class (z), 'stk_dataframe')); + +%!test +%! z = vertcat (y, x); +%! assert (isequal (size (z), [4 d])); +%! assert (strcmp (class (z), 'stk_dataframe')); diff --git a/inst/arrays/generic/stk_boundingbox.m b/inst/arrays/generic/stk_boundingbox.m new file mode 100644 index 0000000..47fd6e3 --- /dev/null +++ b/inst/arrays/generic/stk_boundingbox.m @@ -0,0 +1,64 @@ +% STK_BOUNDINGBOX constructs the bounding box for a set of points +% +% CALL: B = stk_boundingbox (X) +% +% returns the bounding box of X, defined as: +% +% B = [min(X); max(X)]. +% +% The result is an stk_hrect object. +% +% See also: stk_hrect + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function box = stk_boundingbox (x) + +if ~ isnumeric (x) + stk_error (['The input argument should be a ' ... + 'numeric array.'], 'TypeMismatch'); +elseif ndims (x) ~= 2 %#ok see CODING_GUDELINES + stk_error (['Arrays with more than two dimensions are ' ... + 'not supported.'], 'IncorrectSize'); +end + +xmin = min (x, [], 1); +xmax = max (x, [], 1); + +box = stk_hrect ([xmin; xmax]); + +end % function + + +%!shared x, y, cn +%! cn = {'a', 'b', 'c'}; +%! x = [0 3 2; 1 4 1; 7 0 2]; + +%!error y = stk_boundingbox (); +%!test y = stk_boundingbox (x); + +%!assert (isequal (y.data, [0 0 1; 7 4 2])); diff --git a/inst/arrays/generic/stk_commonsize.m b/inst/arrays/generic/stk_commonsize.m new file mode 100644 index 0000000..b94af4e --- /dev/null +++ b/inst/arrays/generic/stk_commonsize.m @@ -0,0 +1,82 @@ +% STK_COMMONSIZE ... +% +% TODO: describe differences with Octave's common_size function. + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_commonsize (varargin) + +n = length (varargin); + +if n == 0, + + varargout = {}; + +else + + if n == 1 + % varargin{1} is expected to be a cell array in this case + C = varargin{1}; + n = length (C); + else + C = varargin; + end + + d = cellfun (@ndims, C); + s = ones (n, max (d)); + for i = 1:n, + s(i, 1:d(i)) = size (C{i}); + end + + smax = max (s); + + % Take care of empty dimensions, if any + b = (smax > 0); + smax = smax (b); + s = s(:, b); + + nrep = ones (size (smax)); + for i = 1:n, + nrep(b) = smax ./ s(i, :); + nrep_one = (nrep == 1); + if ~ all ((s(i, :) == 1) | nrep_one) + error ('Input arguments cannot be brought to a common size.'); + elseif ~ all (nrep_one) + C{i} = repmat (C{i}, nrep); + end + end + + if nargout > 1, + varargout = C(1:nargout); + else + varargout = {C}; + end + +end + +end % function diff --git a/inst/arrays/generic/stk_feval.m b/inst/arrays/generic/stk_feval.m new file mode 100644 index 0000000..dd07d7b --- /dev/null +++ b/inst/arrays/generic/stk_feval.m @@ -0,0 +1,370 @@ +% STK_FEVAL evaluates a function at given evaluation points +% +% CALL: Z = stk_feval (F, X) +% +% evaluates the function F on the evaluation points X, where +% +% * F can be either a function handle or a function name (string), +% or a cell-array of function handles or names, and +% * X can be either a numerical array or an stk_dataframe object. +% +% The output Z contains the evaluation results. The number of rows of Z is +% the same as the number of rows of X. +% +% * If F is a single function (name of handle) that returns row vectors with +% J elements, then Z has J columns and Z(i, :) is equal to F(X(i, :)). +% * If F is a cell-array of functions (names or handles), where F{k} returns +% row vectors J_k elements, then Z has J = J_1 + ... + J_K elements, and +% Z(i, :) is equal to [F{1}(X(i, :)) ... F{K}(X(i, :))]. +% +% This two-argument form assumes that F supports vectorized evaluations. +% +% EXAMPLE: +% +% f = {@sin, @cos}; +% x = stk_sampling_regulargrid (100, 1, [0; 2*pi]); +% x.colnames = {'x'}; +% y = stk_feval (f, x); +% plot (x, y); +% +% CALL: Z = stk_feval (F, X, DISPLAY_PROGRESS) +% +% displays progress messages if DISPLAY_PROGRESS is true, and does the same +% as the previous form otherwise. Displaying a progress message is useful if +% each evaluation of F requires a significant computation time. +% +% This three-argument form assumes that F supports vectorized evaluations if +% DISPLAY_PROGRESS is false, and performs evaluations one by one otherwise. +% +% NOTE: output type +% +% The output of stk_feval is an stk_dataframe object if X is, with the same +% row names and with column names determined automatically. Otherwise, the +% type of the output of stk_feval is determined by the type of the output of +% each function that is evaluated (together with the usual rules for concate- +% nating arrays of different types, if necessary). +% +% CALL: Z = stk_feval (F, X, DISPLAY_PROGRESS, DF_OUT) +% +% returns an stk_dataframe output if DF_OUT is true (even if X is not an +% stk_dataframe object itself), and let the usual concatenation rules +% determine the output type otherwise (even if X is an stk_dataframe). +% +% CALL: Z = stk_feval (F, X, DISPLAY_PROGRESS, DF_OUT, VECTORIZED) +% +% controls whether function evaluations are performed in a "vectorized" manner +% (i.e., all rows at once) or one row after the other. This form can be used +% to override the default rules explained above. Vectorized evaluations are +% usually faster but some functions do not support them. +% +% See also feval + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = stk_feval (f, x, progress_msg, df_out, vectorized) + +% Check 'progress_msg' argument +if (nargin < 3) || (isempty (progress_msg)), + progress_msg = false; +else + progress_msg = logical (progress_msg); +end + +% Check 'df_out' argument +if (nargin < 4) || (isempty (df_out)), + % Default: type stability + df_out = isa (x, 'stk_dataframe'); +else + df_out = logical (df_out); +end + +% Check 'vectorized' argument +if (nargin < 5) || (isempty (vectorized)), + % Default: use vectorized evaluations, unless progress_msg is true + vectorized = ~ progress_msg; +else + vectorized = logical (vectorized); +end + +% Turn f into a cell (if it isn't already one) +if ~ iscell (f), f = {f}; end + +% Number of functions +numfcs = numel (f); + +% Check f and extract function names +if df_out + fname = cell (size (f)); + truncated_fname = false (size (f)); + for k = 1:numfcs, + + if ischar (f{k}), + fname{k} = f{k}; + else + try + fname{k} = func2str (f{k}); + catch + fname{k} = sprintf ('F%d', k); + end + end + + % Truncate long function names + if (length (fname{k})) > 15 + fname{k} = sprintf ('F%d', k); + truncated_fname(k) = true; + end + end +end + +% Extract numeric data +xdata = double (x); + +% Zero-dimensional inputs are not allowed +[n, d] = size (xdata); +if d == 0, + error ('zero-dimensional inputs are not allowed.'); +end + +% Each function can have several outputs => we will try to recover meaningful +% column names by looking at these outputs and store them in: +if df_out + fcolnames = cell (1, numfcs); +end + +if n == 0, % no input => no output + + z = zeros (0, numfcs); + +else % at least one input point + + output_dim = zeros (1, numfcs); + + if vectorized %--- Vectorized calls ---------------------------------------- + + z = cell (1, numfcs); + for k = 1:numfcs + + z{k} = feval (f{k}, xdata); + + % Check output size + if (size (z{k}, 1) ~= size (xdata, 1)) + stk_error (['The size of the output is incorrect. Perhaps ' ... + 'the function does not support vectorized ' ... + 'evaluations.'], 'IncorrectSize'); + end + + % Guess output dimension + output_dim(k) = size (z{k}, 2); + + % Guess column names + if df_out && (isa (z{k}, 'stk_dataframe')) + fcolnames{k} = z{k}.colnames; + end + + end + + else %--- Unvectorized calls: n == 1 -------------------------------------- + + % First evaluation: figure out the dimension of the output + + if progress_msg, + stk_disp_progress ('feval %d/%d... ', 1, n); + end + + z1 = []; + + for k = 1:numfcs + + % Get the evaluation result + % (at this point, we don't know the size or type of zdata{k}) + z1_k = feval (f{k}, xdata(1, :)); + + % Guess output dimension + output_dim(k) = size (z1_k, 2); + + % Concatenate + try + z1 = [z1 double(z1_k)]; %#ok + catch + if ~ isequal (size (z1_k), [1 output_dim(k)]) + stk_error (['The output of F{j} should be a scalar or ' ... + 'a row vector'], 'IncorrectSize'); + else + rethrow (lasterror); + end + end + + % Guess column names + if df_out && (isa (z1_k, 'stk_dataframe')) + fcolnames{k} = z1_k.colnames; + end + end + + end % if vectorized + + % Begin/end indices for each block of columns + j_end = cumsum (output_dim); + j_beg = 1 + [0 j_end(1:end-1)]; + + if vectorized %--- Vectorized calls ---------------------------------------- + + % Concatenate function outputs + z = horzcat (z{:}); + + else %--- Unvectorized calls: n > 1 --------------------------------------- + + % Prepare for subsequent evaluations + z = zeros (n, j_end(end)); + z(1, :) = z1; + + if n > 1, % Subsequent evaluations + + for i = 2:n, + if progress_msg, + stk_disp_progress ('feval %d/%d... ', i, n); + end + for k = 1:numfcs + z(i, (j_beg(k):j_end(k))) = feval (f{k}, xdata(i, :)); + end + end + + end % if n > 1 + + end % if vectorized + +end % if n == 0 + +%--- Create column names ------------------------------------------------------- + +if df_out + colnames = cell (1, size (z, 2)); + + for k = 1:numfcs + + if ~ isempty (fcolnames{k}) % We have column names, let's use them + + % Special case: only one function, + % without a nice short displayable name + if (numfcs == 1) && truncated_fname(1) + prefix = ''; + else + prefix = [fname{1} '_']; + end + + colnames(j_beg(k):j_end(k)) = cellfun (... + @(u)(sprintf ('%s%s', prefix, u)), fcolnames{k}, ... + 'UniformOutput', false); + + elseif output_dim(k) == 1 % Only one column and no column names + + colnames{j_beg(k)} = fname{k}; + + else % General case: several columns but no column names + + colnames(j_beg(k):j_end(k)) = arrayfun (... + @(u)(sprintf ('%s_%d', fname{k}, u)), 1:output_dim(k), ... + 'UniformOutput', false); + end + end +end + +%--- Create output stk_dataframe object ---------------------------------------- + +if df_out + if isa (x, 'stk_dataframe'), + rownames = x.rownames; + else + rownames = {}; + end + + z = stk_dataframe (z, colnames, rownames); +end + +end % function + +%#ok<*CTCH,*LERR> + + +%!shared f, xt +%! f = @(x)(- (0.7 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); +%! xt = stk_sampling_regulargrid (20, 1, [0; 1]); + +%!error yt = stk_feval (); +%!error yt = stk_feval (f); +%!test yt = stk_feval (f, xt); +%!test yt = stk_feval (f, xt, false); +%!test yt = stk_feval (f, xt, false, false); +%!test yt = stk_feval (f, xt, false, false, false); + +%!test +%! N = 15; +%! xt = stk_sampling_regulargrid (N, 1, [0; 1]); +%! yt = stk_feval (f, xt); +%! assert (isequal (size (yt), [N 1])); + +%!test +%! x = stk_dataframe ([1; 2; 3], {'x'}, {'a'; 'b'; 'c'}); +%! y = stk_feval (@(u)(2 * u), x); +%! assert (isequal (y.data, [2; 4; 6])); +%! assert (isequal (y.rownames, {'a'; 'b'; 'c'})); + +%!shared t, z_ref, n +%! n = 20; +%! t = stk_sampling_regulargrid (n, 1, [0; 2*pi]); +%! z_ref = [sin(t.data) cos(t.data)]; + +%!test +%! t.colnames = {'time'}; +%! z = stk_feval ({@sin, @cos}, t); +%! assert (isa (z, 'stk_dataframe')); +%! assert (isequal (z.data, z_ref)); + +%!test +%! F = @(x)([sin(x) cos(x)]); +%! z = stk_feval (F, t); +%! assert (isequal (z.data, z_ref)); + +%!test +%! t = stk_sampling_regulargrid (n, 1, [0; 2*pi]); +%! F = {'sin', 'cos'}; +%! z = stk_feval (F, t); +%! assert (isequal (z.data, [sin(t.data) cos(t.data)])); +%! assert (isequal (z.colnames, {'sin' 'cos'})); + +%!test % vectorized +%! F = @(t)([sin(t) cos(t)]); +%! G = @(t)(0.365 * t.^2 + (cos ((t - 1).*(t - 2) + 0.579033))); +%! z = stk_feval ({@sin, @cos, G, F, 'tan'}, t); +%! assert (isequal (z.colnames, {'sin' 'cos' 'F3' 'F4_1' 'F4_2' 'tan'})); + +%!test % not vectorized +%! F = @(t)([sin(t) cos(t)]); +%! G = @(t)(0.365 * t^2 + (cos ((t - 1)*(t - 2) + 0.579033))); +%! z = stk_feval ({@sin, @cos, G, F, 'tan'}, t, [], [], false); +%! assert (isequal (z.colnames, {'sin' 'cos' 'F3' 'F4_1' 'F4_2' 'tan'})); diff --git a/inst/arrays/generic/stk_get_sample_size.m b/inst/arrays/generic/stk_get_sample_size.m new file mode 100644 index 0000000..86177f1 --- /dev/null +++ b/inst/arrays/generic/stk_get_sample_size.m @@ -0,0 +1,41 @@ +% STK_GET_SAMPLE_SIZE returns the size of a sample +% +% CALL: N = stk_get_sample_size (X) +% +% returns the size N of the sample represented by the array X, in other +% words, the number of rows. + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function n = stk_get_sample_size (x) + +n = size (x, 1); + +end % function + + +%!assert (stk_get_sample_size ([1 2; 3 4; 5 6]) == 3); diff --git a/inst/arrays/generic/stk_length.m b/inst/arrays/generic/stk_length.m new file mode 100644 index 0000000..7f0f14d --- /dev/null +++ b/inst/arrays/generic/stk_length.m @@ -0,0 +1,40 @@ +% STK_LENGTH [deprecated] +% +% See also: stk_get_sample_size + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function n = stk_length (x) + +n = size (x, 1); + +end % function + + +%!assert (isequal (stk_length ([1 2; 3 4; 5 6]), 3)); diff --git a/inst/arrays/generic/stk_normalize.m b/inst/arrays/generic/stk_normalize.m new file mode 100644 index 0000000..9cb4b0b --- /dev/null +++ b/inst/arrays/generic/stk_normalize.m @@ -0,0 +1,59 @@ +% STK_NORMALIZE normalizes a dataset to [0; 1] ^ DIM + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_normalize (x, box, varargin) + +if nargin < 2, + box = []; +end + +% Ensure that box is an stk_hrect object +if ~ isa (box, 'stk_hrect') + if isempty (box), + box = stk_boundingbox (x); + else + box = stk_hrect (box); + end +end + +% Call @stk_hrect/stk_normalize +[x, a, b] = stk_normalize (x, box, varargin{:}); + +end % function + + +%!shared x, box, y1, y2, y3, y4 +%! n = 5; box = [2; 3]; x = box(1) + diff (box) * rand (n, 1); + +%!error y1 = stk_normalize (); +%!test y2 = stk_normalize (x); +%!test y3 = stk_normalize (x, box); + +%!test assert (~ any ((y2 < -10 * eps) | (y2 > 1 + 10 * eps))); +%!test assert (~ any ((y3 < -10 * eps) | (y3 > 1 + 10 * eps))); diff --git a/inst/arrays/generic/stk_rescale.m b/inst/arrays/generic/stk_rescale.m new file mode 100644 index 0000000..a55d187 --- /dev/null +++ b/inst/arrays/generic/stk_rescale.m @@ -0,0 +1,65 @@ +% STK_RESCALE rescales a dataset from one box to another + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, a, b] = stk_rescale (x, box1, varargin) + +% Convert box1 to an stk_hrect object +% (we know that box1 is not an stk_hrect object, otherwise +% we wouldn't have ended up here) +if isempty (box1) + box1 = stk_hrect (size (x, 2)); % Default: [0; 1] ^ DIM +else + box1 = stk_hrect (box1); +end + +% Call @stk_hrect/stk_rescale +[x, a, b] = stk_rescale (x, box1, varargin{:}); + +end % function + + +%!shared x +%! x = rand (10, 4); +%! y = stk_rescale (x, [], []); +%! assert (stk_isequal_tolabs (x, y)); + +%!test +%! y = stk_rescale(0.5, [], [0; 2]); +%! assert (stk_isequal_tolabs (y, 1.0)); + +%!test +%! y = stk_rescale (0.5, [0; 1], [0; 2]); +%! assert (stk_isequal_tolabs (y, 1.0)); + +%!test +%! y = stk_rescale (0.5, [0; 2], []); +%! assert (stk_isequal_tolabs (y, 0.25)); + +%!test +%! y = stk_rescale (0.5, [0; 2], [0; 1]); +%! assert (stk_isequal_tolabs (y, 0.25)); diff --git a/inst/arrays/generic/stk_sprintf.m b/inst/arrays/generic/stk_sprintf.m new file mode 100644 index 0000000..e63ee9f --- /dev/null +++ b/inst/arrays/generic/stk_sprintf.m @@ -0,0 +1,83 @@ +% STK_SPRINTF prints the content of an array into a string + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf (x, verbosity, data_col_width) + +% verbosity will be ignored, but let's check that it's a legal value anyway +if (nargin > 1) && (~ ismember (verbosity, {'basic', 'verbose'})) + errmsg = 'verbosity should be ''basic'' or ''verbose''.'; + stk_error (errmsg, 'InvalidArgument'); +end + +% Only the case of numeric array is handled here +if ~ isnumeric (x) + errmsg = sprintf ('Incorrect argument type: %s', class (x)); + stk_error (errmsg, 'IncorrectType'); +end + +x = double (x); +[n, d] = size (x); + +if (n == 0) || (d == 0) + + s = '[] (empty)'; + +else + + if (nargin < 2) || isempty (data_col_width) + switch stk_disp_getformat () + case 'short' + data_col_width = 6; + case 'long' + data_col_width = 16; + otherwise + % FIXME (ticket #87): handle other formatting modes... + data_col_width = 10; + end + end + + nb_spaces_colsep = 2; + + s = repmat ('', n, 1); %#ok<*AGROW> + + for j = 1:d + xx = stk_sprintf_colvect (x(:, j), data_col_width); + s = [s xx]; % formatted data + if j < d + % column separator + s = [s repmat(' ', n, nb_spaces_colsep)]; + end + + end % for + +end % if + +end % function + +%#ok<*CTCH> diff --git a/inst/arrays/generic/stk_sprintf_colnames.m b/inst/arrays/generic/stk_sprintf_colnames.m new file mode 100644 index 0000000..761b583 --- /dev/null +++ b/inst/arrays/generic/stk_sprintf_colnames.m @@ -0,0 +1,48 @@ +% STK_SPRINTF_COLNAMES returns the column names of an array + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_colnames (x) + +if ~ isnumeric (x) + + errmsg = sprintf ('Incorrect argument type: %s', class (x)); + stk_error (errmsg, 'IncorrectType'); + +else + + n = size (x, 1); + if n == 1 + s = sprintf ('{} (unnamed column)'); + else + s = sprintf ('{} (unnamed columns)'); + end + +end + +end % function diff --git a/inst/arrays/generic/stk_sprintf_rownames.m b/inst/arrays/generic/stk_sprintf_rownames.m new file mode 100644 index 0000000..485448b --- /dev/null +++ b/inst/arrays/generic/stk_sprintf_rownames.m @@ -0,0 +1,48 @@ +% STK_SPRINTF_ROWNAMES returns the row names of an array + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_rownames (x) + +if ~ isnumeric (x) + + errmsg = sprintf ('Incorrect argument type: %s', class (x)); + stk_error (errmsg, 'IncorrectType'); + +else + + n = size (x, 1); + if n == 1 + s = sprintf ('{} (unnamed row)'); + else + s = sprintf ('{} (unnamed rows)'); + end + +end + +end % function diff --git a/inst/arrays/generic/stk_sprintf_sizetype.m b/inst/arrays/generic/stk_sprintf_sizetype.m new file mode 100644 index 0000000..76671e8 --- /dev/null +++ b/inst/arrays/generic/stk_sprintf_sizetype.m @@ -0,0 +1,49 @@ +% STK_SPRINTF_SIZETYPE prints the size and type into a string + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_sizetype (x) + +if (isscalar (x)) && (isobject (x)) + + s = sprintf ('%s object', class (x)); + +else + + t = size (x); + + s = ''; + for i = 1:(length(t) - 1), + s = [s sprintf('%dx', t(i))]; %#ok + end + s = [s sprintf('%d %s array', t(end), class (x))]; + +end + +end % function diff --git a/inst/core/@stk_kreq_qr/disp.m b/inst/core/@stk_kreq_qr/disp.m new file mode 100644 index 0000000..f60a825 --- /dev/null +++ b/inst/core/@stk_kreq_qr/disp.m @@ -0,0 +1,33 @@ +% DISP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (x) + +disp (struct (x)); + +end % function diff --git a/inst/core/@stk_kreq_qr/display.m b/inst/core/@stk_kreq_qr/display.m new file mode 100644 index 0000000..2a004be --- /dev/null +++ b/inst/core/@stk_kreq_qr/display.m @@ -0,0 +1,37 @@ +% DISPLAY [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function display (x) + +fprintf ('\n%s = <%s>\n\n', inputname (1), stk_sprintf_sizetype (x)); + +disp (x); + +fprintf ('\n'); + +end % function diff --git a/inst/core/@stk_kreq_qr/get.m b/inst/core/@stk_kreq_qr/get.m new file mode 100644 index 0000000..ed9fa0d --- /dev/null +++ b/inst/core/@stk_kreq_qr/get.m @@ -0,0 +1,109 @@ +% GET [overload base function] +% +% CALL: value = get (kreq, propname) +% +% implements 'get' for stk_kreq_qr objects. + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (kreq, propname) + +switch propname + + case {'n', 'r', 'P_scaling', 'LS_Q', 'LS_R', 'RS', 'lambda_mu'} + value = kreq.(propname); + + case 'lambda' + value = kreq.lambda_mu(1:kreq.n, :); + + case 'mu' + value = kreq.lambda_mu((kreq.n + 1):end, :); + + case 'delta_var' + value = dot (kreq.lambda_mu, kreq.RS, 1)'; + + case 'log_abs_det_kriging_matrix' + % LS_Q has +/- 1 determinant, so we only need to care about LS_R + value = sum (log (abs (diag (kreq.LS_R)))); + + case 'log_det_covariance_matrix_a' + n = kreq.n; + Q11 = kreq.LS_Q(1:n, 1:n); + R11 = kreq.LS_R(1:n, 1:n); + value = log (det (Q11 * R11)); % K = Q11 * R11 + % note: this method seems much less accurate than the others, + % we strongly recommend to avoid using it + + case 'log_det_covariance_matrix_b' + n = kreq.n; + Q11 = kreq.LS_Q(1:n, 1:n); + R11 = kreq.LS_R(1:n, 1:n); + Kchol = stk_cholcov (Q11 * R11); % K = Q11 * R11 + value = 2 * sum (log (diag (Kchol))); + + case 'log_det_covariance_matrix_c' + % note: very efficient (but not the best) and quite simple to understand + n = kreq.n; + Q11 = kreq.LS_Q(1:n, 1:n); + diag_R = diag (kreq.LS_R); + logdet1 = log (abs (det (Q11))); + logdet2 = sum (log (abs (diag_R(1:n)))); + value = logdet1 + logdet2; + + case {'log_det_covariance_matrix', 'log_det_covariance_matrix_d'} + % note: this is the fastest of all five solutions for large matrices + % (for small matrices, the difference is negligible)... but also + % the trickiest ! + n = kreq.n; + QL = kreq.LS_Q((n + 1):end, :); % lowerpart of LS_Q + diag_R = diag (kreq.LS_R); + logdet1 = sum (log (abs (diag_R))); + T = kreq.LS_R \ (QL'); + logdet2 = log (abs (det (T((n + 1):end, :)))); + value = logdet1 + logdet2; + + case 'log_det_covariance_matrix_e' + % note: the most time consuming of all five solutions (blame qrdelete), + % we strongly recommend to avoid using it + n = kreq.n; + r = kreq.r; + Q = kreq.LS_Q; + R = kreq.LS_R; + for i = 0:(r - 1) + [Q, R] = qrdelete (Q, R, n + r - i, 'row'); + [Q, R] = qrdelete (Q, R, n + r - i, 'col'); + end + value = sum (log (abs (diag (R)))); + + otherwise + error ('There is no property called ''%s''.', propname); + +end % switch + +end % function diff --git a/inst/core/@stk_kreq_qr/linsolve.m b/inst/core/@stk_kreq_qr/linsolve.m new file mode 100644 index 0000000..664a54b --- /dev/null +++ b/inst/core/@stk_kreq_qr/linsolve.m @@ -0,0 +1,44 @@ +% LINSOLVE [STK internal] +% +% CALL: w = linsolve (kreq, rs) +% +% Overload base function 'linsolve' for stk_kreq_qr objects. + +% Copyright Notice +% +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function w = linsolve (kreq, rs) + +if nargin < 2 + rs = kreq.RS; +end + +% Solves the linear equation A * ws = rs, where A is the kriging matrix + +w = linsolve (kreq.LS_R, kreq.LS_Q' * rs, struct ('UT', true)); + +end % function diff --git a/inst/core/@stk_kreq_qr/private/compute_P_scaling.m b/inst/core/@stk_kreq_qr/private/compute_P_scaling.m new file mode 100644 index 0000000..7dcd04c --- /dev/null +++ b/inst/core/@stk_kreq_qr/private/compute_P_scaling.m @@ -0,0 +1,36 @@ +% COMPUTE_P_SCALING [STK internal] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Authors: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = compute_P_scaling (Kii, Pi) + +t = sum (Pi .^ 2); + +s = ones (1, size (Pi, 2)); +s(t > 0) = sqrt ((max (sum (Kii .^ 2))) ./ t(t > 0)); + +end % function diff --git a/inst/core/@stk_kreq_qr/stk_kreq_qr.m b/inst/core/@stk_kreq_qr/stk_kreq_qr.m new file mode 100644 index 0000000..5ceb2fa --- /dev/null +++ b/inst/core/@stk_kreq_qr/stk_kreq_qr.m @@ -0,0 +1,78 @@ +% STK_KREQ_QR [STK internal] +% +% CALL: kreq = stk_kreq_qr (model, xi, xt) +% +% constructs an stk_kreq_qr object. + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function kreq = stk_kreq_qr (model, xi, xt) + +if nargin == 0 + + kreq = struct ('n', 0, 'r', 0, 'P_scaling', [], ... + 'LS_Q', [], 'LS_R', [], 'RS', [], 'lambda_mu', []); + +else + + [Kii, Pi] = stk_make_matcov (model, xi); + [n, r] = size (Pi); + + % heuristics: scale Pi to (try to) avoid conditioning issues later + P_scaling = compute_P_scaling (Kii, Pi); + Pi = bsxfun (@times, Pi, P_scaling); + + % kriging matrix (left-hand side of the kriging equation) + LS = [[Kii, Pi]; [Pi', zeros(r)]]; + + % orthogonal-triangular decomposition + [Q, R] = qr (LS); + + % Check for duplicated rows if R is close to singular + u = abs (diag (R)); + if (~ stk_isnoisy (model)) && (min (u) < eps * max (u)) + stk_assert_no_duplicates (xi); + end + + kreq = struct ('n', n, 'r', r, 'P_scaling', P_scaling, ... + 'LS_Q', Q, 'LS_R', R, 'RS', [], 'lambda_mu', []); + +end + +kreq = class (kreq, 'stk_kreq_qr'); + +% prepare the right-hand side of the kriging equation +if nargin > 2 + [Kti, Pt] = stk_make_matcov (model, xt, xi); + kreq = stk_set_righthandside (kreq, Kti, Pt); +end + +end % function + + +%!test stk_test_class ('stk_kreq_qr') diff --git a/inst/core/@stk_kreq_qr/stk_set_righthandside.m b/inst/core/@stk_kreq_qr/stk_set_righthandside.m new file mode 100644 index 0000000..2507440 --- /dev/null +++ b/inst/core/@stk_kreq_qr/stk_set_righthandside.m @@ -0,0 +1,46 @@ +% STK_SET_RIGHTHANDSIDE [STK internal] +% +% CALL: kreq = stk_set_righthandside (kreq, Kti, Pt) +% +% sets the right-hand side for an stk_kreq_qr object. + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function kreq = stk_set_righthandside (kreq, Kti, Pt) + +% This class implements GREEDY EVALUATION: computations are made as soon as the +% required inputs are made available. + +% prepare the right-hand side of the kriging equation +Pt = bsxfun (@times, Pt, kreq.P_scaling); +kreq.RS = [Kti Pt]'; + +% Solve the kriging equation to get the extended +% kriging weights vector (weights + Lagrange multipliers) +kreq.lambda_mu = linsolve (kreq); + +end % function diff --git a/inst/core/@stk_kreq_qr/stk_squared_seminorm.m b/inst/core/@stk_kreq_qr/stk_squared_seminorm.m new file mode 100644 index 0000000..febc451 --- /dev/null +++ b/inst/core/@stk_kreq_qr/stk_squared_seminorm.m @@ -0,0 +1,52 @@ +% STK_SQUARED_SEMINORM [STK internal] +% +% CALL: s = stk_squared_seminorm (kreq, zi) +% +% computes the squared semi-norm associated to the left-hand side of an +% stk_kreq_qr object. + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_squared_seminorm (kreq, zi) + +% Extend the observation vector with zeros +zz = [double(zi); zeros(kreq.r, 1)]; + +% Compute the squared seminorm +s = zz' * (linsolve (kreq, zz)); + +% % Alternative (slower) implementation: +% ni = size (kreq.LS_Q, 1) - kreq.r; +% zi = double (zi); +% QU = kreq.LS_Q(1:ni, :); +% T = kreq.LS_R \ (QU' * zi); +% s = zi' * T(1:ni, :); + +% Guard against numerical issues +if s < 0, s = 0; end + +end % function diff --git a/inst/core/@stk_kreq_qr/subsref.m b/inst/core/@stk_kreq_qr/subsref.m new file mode 100644 index 0000000..41df0fd --- /dev/null +++ b/inst/core/@stk_kreq_qr/subsref.m @@ -0,0 +1,51 @@ +% SUBSREF [overload base function] +% +% CALL: value = subsref (kreq, idx) +% +% implements 'subsref' for stk_kreq_qr objects. +% +% See also: subsref + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = subsref (kreq, idx) + +if strcmp (idx(1).type, '.') + + value = get (kreq, idx(1).subs); + + if length(idx) > 1 + value = subsref(value, idx(2:end)); + end + +else + + stk_error('Illegal indexing.', 'IllegalIndexing'); + +end + +end % function diff --git a/inst/core/stk_cholcov.m b/inst/core/stk_cholcov.m new file mode 100644 index 0000000..96ac479 --- /dev/null +++ b/inst/core/stk_cholcov.m @@ -0,0 +1,114 @@ +% STK_CHOLCOV [STK internal] +% +% CALL: C = stk_cholcov (A, ...) +% +% returns the result of chol (A, ...) when this succeeds. If chol fails, +% then a small amount of "regularization noise" is added to the diagonal +% of A, in order to make chol succeed (see the code for details). +% +% NOTE: why this function ? +% +% This is a first (rough) attempt at solving numerical problems that +% arise when chol is used with a covariance matrix that is semi-positive +% definite, or positive definite with some very small eigenvalues. See +% tickets #3, #4 and #13 on Sourceforge: +% +% https://sourceforge.net/p/kriging/tickets/3/ +% https://sourceforge.net/p/kriging/tickets/4/ +% https://sourceforge.net/p/kriging/tickets/13/ +% +% See also: chol + +% Copyright Notice +% +% Copyright (C) 2018, 2019 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [C, epsi] = stk_cholcov (A, varargin) + +% try to use a plain "chol" +[C, p] = chol (A, varargin{:}); + +if p == 0 % OK, A is (numerically) positive definite + + epsi = 0; + +else + + epsi = eps; + u = diag (diag (A)); + + while p > 0 + + if epsi > 1 % avoids infinite while loops + if ~ all (isfinite (A(:))) + errmsg = 'A contains NaNs or Infs.'; + else + errmsg = 'A is not even close to positive definite'; + end + stk_error (errmsg, 'InvalidArgument'); + end + + epsi = epsi * 10; + + [C, p] = chol (A + epsi * u, varargin{:}); + + end + + warning ('STK:stk_cholcov:AddingRegularizationNoise', sprintf ... + ('Adding a little bit of noise to help chol succeed (epsi = %.2e)', epsi)); + +end + +end % function + +%!shared Q, K, L, U, epsi +%! Q = 0.25 * hadamard(4); + +%!test +%! K = Q * diag ([1, 0.1, 0.01, 1e-7]) * Q'; +%! [U, epsi] = stk_cholcov (K); +%!assert (istriu (U)) +%!assert (epsi == 0) + +%!test +%! K = Q * diag ([1, 0.1, 0.01, 1e-7]) * Q'; +%! [L, epsi] = stk_cholcov (K, 'lower'); +%!assert (istril (L)) +%!assert (epsi == 0) + +%!test +%! K = Q * diag ([1, 0.1, 0.01, -1e-7]) * Q'; +%! [U, epsi] = stk_cholcov (K); +%!assert (istriu (U)) +%!assert (epsi > 0) + +%!test +%! K = Q * diag ([1, 0.1, 0.01, -1e-7]) * Q'; +%! [L, epsi] = stk_cholcov (K, 'lower'); +%!assert (istril (L)) +%!assert (epsi > 0) + +%#ok<*SPWRN> diff --git a/inst/core/stk_make_matcov.m b/inst/core/stk_make_matcov.m new file mode 100644 index 0000000..eeb597a --- /dev/null +++ b/inst/core/stk_make_matcov.m @@ -0,0 +1,124 @@ +% STK_MAKE_MATCOV computes a covariance matrix (and a design matrix) +% +% CALL: [K, P] = stk_make_matcov (MODEL, X0) +% +% computes the covariance matrix K and the design matrix P for the model +% MODEL at the set of points X0, which is expected to be an N x DIM +% array. As a result, a matrix K of size N x N and a matrix P of size +% N x L are obtained, where L is the number of regression functions in +% the linear part of the model. +% +% CALL: K = stk_make_matcov (MODEL, X0, X1) +% +% computes the covariance matrix K for the model MODEL between the sets +% of points X0 and X1. The resulting K matrix is of size N0 x N1, where +% N0 is the number of rows of XO and N1 the number of rows of X1. +% +% BE CAREFUL: +% +% stk_make_matcov (MODEL, X0) and stk_makematcov (MODEL, X0, X0) are NOT +% equivalent if model.lognoisevariance > - inf (in the first case, the +% noise variance is added on the diagonal of the covariance matrix). + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [K, P] = stk_make_matcov (model, x0, x1, pairwise) + +% Check if the covariance model contains parameters +% that should have been estimated first +if (isnumeric (model.param)) && (any (isnan (model.param))) + stk_error (['The covariance model contains undefined parameters, ' ... + 'which must be estimated first.'], 'ParametersMustBeEstimated'); +end + +%=== process input arguments + +if (nargin > 2) && (~ isempty (x1)) + make_matcov_auto = false; +else + x1 = x0; + make_matcov_auto = true; +end + +pairwise = (nargin > 3) && pairwise; + +%=== compute the covariance matrix + +K = feval (model.covariance_type, model.param, x0, x1, -1, pairwise); + +if make_matcov_auto && stk_isnoisy (model) + K = K + stk_covmat_noise (model, x0, [], -1, pairwise); +end + +%=== compute the regression functions + +if nargout > 1 + + P = stk_ortho_func (model, x0); + +end + +end % function + + +%!shared model, model2, x0, x1, n0, n1, d, Ka, Kb, Kc, Pa, Pb, Pc +%! n0 = 20; n1 = 10; d = 4; +%! model = stk_model (@stk_materncov52_aniso, d); +%! model.lm = stk_lm_affine; +%! model.param = log ([1.0; 2.1; 2.2; 2.3; 2.4]); +%! model2 = model; model2.lognoisevariance = log(0.01); +%! x0 = stk_sampling_randunif (n0, d); +%! x1 = stk_sampling_randunif (n1, d); + +%!error [KK, PP] = stk_make_matcov (); +%!error [KK, PP] = stk_make_matcov (model); +%!test [Ka, Pa] = stk_make_matcov (model, x0); % (1) +%!test [Kb, Pb] = stk_make_matcov (model, x0, x0); % (2) +%!test [Kc, Pc] = stk_make_matcov (model, x0, x1); % (3) +%!error [KK, PP] = stk_make_matcov (model, x0, x1, pi); + +%!assert (isequal (size (Ka), [n0 n0])); +%!assert (isequal (size (Kb), [n0 n0])); +%!assert (isequal (size (Kc), [n0 n1])); + +%!assert (isequal (size (Pa), [n0 d + 1])); +%!assert (isequal (size (Pb), [n0 d + 1])); +%!assert (isequal (size (Pc), [n0 d + 1])); + +% In the noiseless case, (1) and (2) should give the same results +%!assert (isequal (Kb, Ka)); + +% In the noisy case, however... +%!test [Ka, Pa] = stk_make_matcov (model2, x0); % (1') +%!test [Kb, Pb] = stk_make_matcov (model2, x0, x0); % (2') +%!error assert (isequal (Kb, Ka)); + +% The second output depends on x0 only => should be the same for (1)--(3) +%!assert (isequal (Pa, Pb)); +%!assert (isequal (Pa, Pc)); diff --git a/inst/core/stk_model_update.m b/inst/core/stk_model_update.m new file mode 100644 index 0000000..a26f132 --- /dev/null +++ b/inst/core/stk_model_update.m @@ -0,0 +1,58 @@ +% STK_MODEL_UPDATE updates a model with new data +% +% CALL: M_POSTERIOR = stk_model_update (M_PRIOR, X, Y) +% +% updates model M_PRIOR with additional data (X, Y). The result is an +% stk_model_gpposterior object. +% +% See also: stk_model_gpposterior + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function M_posterior = stk_model_update (M_prior, xi, zi) + +M_posterior = stk_model_gpposterior (M_prior, xi, zi); + +end % function + +%!test +%! x1 = (linspace (0, 1, 15))'; z1 = sin (x1); +%! x2 = (linspace (2, 3, 15))'; z2 = sin (x2); +%! xt = (linspace (1, 2, 15))'; zt = sin (xt); +%! +%! % Prior model +%! M0 = stk_model (@stk_materncov32_iso); +%! M0.param = log ([1.0; 2.1]); +%! +%! M1 = stk_model_update (M0, x1, z1); +%! M1 = stk_model_update (M1, x2, z2); % this calls @stk_model_gpposterior/... +%! zp1 = stk_predict (M1, xt); +%! +%! M2 = stk_model_gpposterior (M0, [x1; x2], [z1; z2]); +%! zp2 = stk_predict (M2, xt); +%! +%! assert (stk_isequal_tolabs (double (zp2 - zp1), zeros (15, 2), 1e-10)) diff --git a/inst/core/stk_predict.m b/inst/core/stk_predict.m new file mode 100644 index 0000000..abda5ae --- /dev/null +++ b/inst/core/stk_predict.m @@ -0,0 +1,164 @@ +% STK_PREDICT performs a kriging prediction +% +% CALL: ZP = stk_predict (MODEL, XP) +% CALL: ZP = stk_predict (MODEL, XI, ZI, XP) +% +% performs a kriging prediction at the points XP, given the MODEL and, +% if available, the data (XI, ZI). +% +% The MODEL argument can be either a prior model structure (as provided +% by stk_model) or a model object (for instance, a posterior model +% represented by an stk_model_gpposterior object). If MODEL is already +% a posterior object and some additional data (XI, ZI) is provided, the +% model is first updated with the data before the prediction is actually +% carried out. +% +% The input arguments XI, ZI, and XP can be either numerical matrices or +% dataframes. More precisely, on an input space of dimension DIM, +% +% * XI must have size NI x DIM, +% * ZI must have size NI x 1, +% * XP must have size NP x DIM, +% +% where NI is the number of observations and NP the number of prediction +% points. The output ZP is a dataframe of size NP x 2, with: +% +% * the prediction mean in the first column (ZP.mean), and +% * the prediction variance in the second column (ZP.var). +% +% From a Bayesian point of view, ZP.mean and ZP.var are respectively the +% posterior mean and variance of the Gaussian process prior MODEL given the +% data (XI, ZI). Note that, in the case of noisy data, ZP.var is the +% (posterior) variance of the latent Gaussian process, not the variance of a +% future noisy observation at location XP. +% +% CALL: [ZP, LAMBDA, MU] = stk_predict (MODEL, ...) +% +% also returns the matrix of kriging weights LAMBDA and the matrix of +% Lagrange multipliers MU. +% +% CALL: [ZP, LAMBDA, MU, K] = stk_predict (MODEL, ...) +% +% also returns the posterior covariance matrix K at the locations XP (this is +% an NP x NP covariance matrix). From a frequentist point of view, K can be +% seen as the covariance matrix of the prediction errors. +% +% SPECIAL CASE +% +% If ZI is empty, everything but ZP.mean is computed. Indeed, neither the +% kriging variance ZP.var nor the matrices LAMBDA and MU actually depend on +% the observed values. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_predict (model, varargin) + +% Support for several syntaxes +switch nargin + + case {0, 1} + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); + + case 2 % CALL: [...] = stk_predict (MODEL, X_PRD) + x_prd = varargin{1}; + + case 3 % CALL: [...] = stk_predict (MODEL, DATA, X_PRD) + stk_error ('This syntax is not implemented yet.', 'NotImplemented'); + model = stk_model_gpposterior (model, varargin{1}); + x_prd = varargin{2}; + + case 4 % CALL: [...] = stk_predict (MODEL, X_OBS, Z_OBS, X_PRD) + model = stk_model_gpposterior (model, varargin{1}, varargin{2}); + x_prd = varargin{3}; + + +end % switch + +varargout = cell (1, max (1, nargout)); +[varargout{:}] = stk_predict_ (model, x_prd); + +end % function + + +%!shared n, m, model, x0, x_obs, z_obs, x_prd, y_prd1, idx_obs, idx_prd +%! +%! n = 10; % number of observations +%! m = n + 1; % number of predictions +%! d = 1; % dimension of the input space +%! +%! x0 = stk_sampling_regulargrid(n+m, d, [0; pi]); +%! +%! idx_obs = (2:2:(n+m-1))'; +%! idx_prd = (1:2:(n+m))'; +%! +%! x_obs = x0(idx_obs); +%! z_obs = sin (double (x_obs)); +%! x_prd = x0(idx_prd); +%! +%! model = stk_model (@stk_materncov32_iso); +%! model.param = log ([1.0; 2.1]); + +%!error y_prd1 = stk_predict (); +%!error y_prd1 = stk_predict (model); +%!test y_prd1 = stk_predict (model, x_prd); +%!error y_prd1 = stk_predict (model, data, x_prd); +%!test y_prd1 = stk_predict (model, x_obs, z_obs, x_prd); +%!error y_prd1 = stk_predict (model, [x_obs; x_obs], [z_obs; z_obs], x_prd); + +%!test % nargout = 2 +%! [y_prd1, lambda] = stk_predict (model, x_obs, z_obs, x_prd); +%! assert (isequal (size (lambda), [n m])); + +%!test % nargout = 2, compute only variances +%! [y_prd1, lambda] = stk_predict (model, x_obs, [], x_prd); +%! assert (isequal (size (lambda), [n m])); +%! assert (all (isnan (y_prd1.mean))); + +%!test % nargout = 3 +%! [y_prd1, lambda, mu] = stk_predict (model, x_obs, z_obs, x_prd); +%! assert (isequal (size (lambda), [n m])); +%! assert (isequal (size (mu), [1 m])); % ordinary kriging + +%!test % nargout = 4 +%! [y_prd1, lambda, mu, K] = stk_predict (model, x_obs, z_obs, x_prd); +%! assert (isequal (size (lambda), [n m])); +%! assert (isequal (size (mu), [1 m])); % ordinary kriging +%! assert (isequal (size (K), [m m])); + +%!test % predict on large set of locations +%! x_prd = stk_sampling_regulargrid (1e5, 1, [0; pi]); +%! y_prd = stk_predict (model, x_obs, z_obs, x_prd); + +%!test % predict on an observation point +%! % https://sourceforge.net/p/kriging/tickets/49/ +%! [zp, lambda] = stk_predict (model, x_obs, z_obs, x_obs(4)); +%! assert (isequal (z_obs(4), zp.mean)) +%! assert (isequal (zp.var, 0)) +%! lambda_ref = zeros (n, 1); lambda_ref(4) = 1; +%! assert (isequal (lambda, lambda_ref)) diff --git a/inst/core/stk_predict_leaveoneout.m b/inst/core/stk_predict_leaveoneout.m new file mode 100644 index 0000000..7ee8d6b --- /dev/null +++ b/inst/core/stk_predict_leaveoneout.m @@ -0,0 +1,118 @@ +% STK_PREDICT_LEAVEONEOUT computes LOO predictions and residuals +% +% CALL: LOO_PRED = stk_predict_leaveoneout (M_PRIOR, XI, ZI) +% +% computes LOO predictions for (XI, ZI) using the prior model M_PRIOR. The +% result is a dataframe with n rows and two columns, where n is the common +% number of rows of XI and ZI. The first column is named 'mean' and contains +% LOO prediction means. The second column is named 'var' and contains LOO +% prediction variances. +% +% CALL: [LOO_PRED, LOO_RES] = stk_predict_leaveoneout (M_PRIOR, XI, ZI) +% +% also returns LOO residuals. The result LOO_RES is a dataframe with n rows +% and two columns. The first column is named 'residuals' and contains raw +% (i.e., unnormalized) residuals. The second column is named 'norm_res' and +% contains normalized residuals. +% +% CALL: [LOO_PRED, LOO_RES] = stk_predict_leaveoneout (M_POST) +% +% does the same as above using a posterior model object M_POST directly. +% +% CALL: stk_predict_leaveoneout (...) +% +% automatically produces LOO cross-validations plots in the current figure, +% using stk_plot_predvsobs (left panel) and stk_plot_histnormres (right +% panel). +% +% REMARK +% +% This function actually computes pseudo-LOO prediction and residuals, +% where the same parameter vector is used for all data points. +% +% See also stk_example_kb10, stk_plot_predvsobs, stk_plot_histnormres + +% Copyright Notice +% +% Copyright (C) 2016-2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_predict_leaveoneout (M_prior, xi, zi) + +M_post = stk_model_gpposterior (M_prior, xi, zi); + +if nargout == 0 + + % Call stk_predict_leaveoneout with nargout == 0 to create the plots + stk_predict_leaveoneout (M_post); + +else + + varargout = cell (1, nargout); + [varargout{:}] = stk_predict_leaveoneout (M_post); + +end + +end % function + + +%!shared n, x_obs, z_obs, model +%! n = 20; +%! x_obs = stk_sampling_regulargrid (n, 1, [0; 2*pi]); +%! z_obs = stk_feval (@sin, x_obs); +%! model = stk_model (@stk_materncov32_iso); +%! model.param = log ([1; 5]); + +%!test % one output +%! +%! loo_pred = stk_predict_leaveoneout (model, x_obs, z_obs); +%! +%! assert (isequal (size (loo_pred), [n 2])); +%! assert (isequal (loo_pred.colnames, {'mean', 'var'})); +%! assert (all (isfinite (loo_pred(:)))); + +%!test % two outputs +%! +%! [loo_pred, loo_res] = stk_predict_leaveoneout (model, x_obs, z_obs); +%! +%! assert (isequal (size (loo_pred), [n 2])); +%! assert (isequal (loo_pred.colnames, {'mean', 'var'})); +%! assert (all (isfinite (loo_pred(:)))); +%! +%! assert (isequal (size (loo_res), [n 2])); +%! assert (isequal (loo_res.colnames, {'residuals', 'norm_res'})); +%! assert (all (isfinite (loo_res(:)))); + +%!test % heteroscedastic noise case +%! +%! model.lognoisevariance = (1 + rand (n, 1)) * 1e-6; +%! [loo_pred, loo_res] = stk_predict_leaveoneout (model, x_obs, z_obs); +%! +%! assert (isequal (size (loo_pred), [n 2])); +%! assert (isequal (loo_pred.colnames, {'mean', 'var'})); +%! assert (all (isfinite (loo_pred(:)))); +%! +%! assert (isequal (size (loo_res), [n 2])); +%! assert (isequal (loo_res.colnames, {'residuals', 'norm_res'})); +%! assert (all (isfinite (loo_res(:)))); diff --git a/inst/covfcs/rbf/stk_rbf_exponential.m b/inst/covfcs/rbf/stk_rbf_exponential.m new file mode 100644 index 0000000..fd98c5b --- /dev/null +++ b/inst/covfcs/rbf/stk_rbf_exponential.m @@ -0,0 +1,116 @@ +% STK_RBF_EXPONENTIAL computes the exponential correlation function +% +% CALL: K = stk_rbf_exponential (H) +% +% computes the value of the exponential correlation function at distance H: +% +% K = exp (- sqrt(2) |H|). +% +% Note that this correlation function is a special of the Matern correlation +% function (NU = 1/2). +% +% CALL: K = stk_rbf_exponential (H, DIFF) +% +% computes the derivative of the exponential correlation function with +% respect the H if DIFF is equal to 1, and simply returns the value of the +% exponential correlation function if DIFF <= 0 (in which case it is +% equivalent to K = stk_rbf_exponential (H)). +% +% ADMISSIBILITY +% +% The exponential correlation is a valid correlation function for all +% dimensions. +% +% REMARK +% +% The constant sqrt (2) is consistent with the definition of the Matern +% correlation function in STK. Other references may use different constants. +% +% See also: stk_rbf_matern, stk_rbf_matern32, stk_rbf_matern52 + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_rbf_exponential (h, diff) + +C = 1.4142135623730951; % 2 * sqrt (Nu) with Nu = 1/2 + +% value of the exponential correlation at h +k = exp (- C * abs (h)); + +% for diff <= 0, we return the value of the correlation function; otherwise... +if (nargin > 1) && (diff > 0) + % for diff == 1, we return the derivative + if diff == 1 + b = (k > 0); + % convention: k'(0) = 0, even though k is not derivable at h=0 + k(b) = - C * (sign (h(b))) .* k(b); + else + error ('incorrect value for diff.'); + end + +end + +if any (isnan (k)) + keyboard +end + +end % function + + +%!shared h, diff +%! h = 1.0; diff = -1; + +%!error stk_rbf_exponential (); +%!test stk_rbf_exponential (h); +%!test stk_rbf_exponential (h, diff); + +%!test %% h = 0.0 => correlation = 1.0 +%! x = stk_rbf_exponential (0.0); +%! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); + +%!test %% check derivative numerically +%! h = [-1 -0.5 -0.1 0.1 0.5 1]; delta = 1e-9; +%! d1 = (stk_rbf_exponential (h + delta) - stk_rbf_exponential (h)) / delta; +%! d2 = stk_rbf_exponential (h, 1); +%! assert (stk_isequal_tolabs (d1, d2, 1e-4)); + +%!test %% consistency with stk_rbf_matern: function values +%! for h = 0.1:0.1:2.0, +%! x = stk_rbf_matern (1/2, h); +%! y = stk_rbf_exponential (h); +%! assert (stk_isequal_tolrel (x, y, 1e-8)); +%! end + +%!test %% consistency with stk_rbf_matern: derivatives +%! for h = 0.1:0.1:2.0, +%! x = stk_rbf_matern (1/2, h, 2); +%! y = stk_rbf_exponential (h, 1); +%! assert (stk_isequal_tolrel (x, y, 1e-8)); +%! end + +%!assert (stk_rbf_exponential (inf) == 0) + diff --git a/inst/covfcs/rbf/stk_rbf_gauss.m b/inst/covfcs/rbf/stk_rbf_gauss.m new file mode 100644 index 0000000..e46943f --- /dev/null +++ b/inst/covfcs/rbf/stk_rbf_gauss.m @@ -0,0 +1,86 @@ +% STK_RBF_GAUSS computes the Gaussian correlation function +% +% CALL: K = stk_rbf_gauss (H) +% +% computes the value of the Gaussian correlation function at distance H. +% +% CALL: K = stk_rbf_gauss (H, DIFF) +% +% computes the derivative of the Gaussian correlation function with respect +% to the distance H if DIFF is equal to 1. If DIFF is equal to -1, this is +% the same as K = stk_rbf_gauss (H). +% +% NOTES: +% +% * This correlation function is also known as the "squared exponential" corre- +% lation function, or the "Gaussian RBF" (Radial Basis Function). +% +% * The Gaussian correlation function is a valid correlation function for all +% dimensions. +% +% * The Gaussian correlation function is the limit of the Matern correlation +% function when the regularity parameters tends to infinity. +% +% See also: stk_rbf_matern, stk_rbf_matern52 + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_rbf_gauss (h, diff) + +% default: compute the value (not a derivative) +if nargin < 2, + diff = -1; +end + +if diff <= 0, % value of the covariance function + + k = exp (- h .^ 2); + +elseif diff == 1, % derivative wrt h + + k = - 2 * h .* exp (- h .^ 2); + +else + + error ('incorrect value for diff.'); + +end + +end % function + + +%!shared h, diff +%! h = 1.0; diff = -1; + +%!error stk_rbf_gauss (); +%!test stk_rbf_gauss (h); +%!test stk_rbf_gauss (h, diff); + +%!test % h = 0.0 => correlation = 1.0 +%! x = stk_rbf_gauss (0.0); +%! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); diff --git a/inst/covfcs/rbf/stk_rbf_matern.m b/inst/covfcs/rbf/stk_rbf_matern.m new file mode 100644 index 0000000..5918e61 --- /dev/null +++ b/inst/covfcs/rbf/stk_rbf_matern.m @@ -0,0 +1,160 @@ +% STK_RBF_MATERN computes the Matern correlation function. +% +% CALL: K = stk_rbf_matern (NU, H) +% +% computes the value of the Matern correlation function of order NU at +% distance H. Note that the Matern correlation function is a valid +% correlation function for all dimensions. +% +% CALL: K = stk_rbf_matern (NU, H, DIFF) +% +% computes the derivative of the Matern correlation function of order NU, at +% distance H, with respect to the order NU if DIFF is equal to 1, or with +% respect the distance H if DIFF is equal to 2. (If DIFF is equal to -1, +% this is the same as K = stk_rbf_matern(NU, H).) +% +% See also: stk_rbf_matern32, stk_rbf_matern52 + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_rbf_matern (nu, h, diff) + +% default: compute the value (not a derivative) +if nargin < 3, + diff = -1; +end + +if ~ ((isscalar (nu)) && (nu > 0)) + stk_error ('nu should be a positive scalar.', 'IncorrectSize'); +end + +% Handle the case of VERY large nu +if nu > 1e305, + % nu = 1e306 is so large thatn even gammaln (nu) is not defined ! + if diff <= 0, + k = stk_rbf_gauss (h); return; + else + % Cannot compute or approximate the derivative for such a large nu + k = nan (size (h)); return; + end +end + +% Tolerance for the detection of half-integer values of nu +TOL = 10 * eps; + +% We have no analytical expression for the derivative with respect to nu, +% even if nu is 3/2, 5/2 or +Inf +if diff ~= 1, + + if abs (nu - 1.5) < TOL, + + k = stk_rbf_matern32 (h, diff - 1); return; + + elseif abs (nu - 2.5) < TOL, + + k = stk_rbf_matern52 (h, diff - 1); return; + + end + +end + +[N, M] = size (h); +hp = abs (reshape (h, N * M, 1)); +t = 2 * sqrt (nu) * hp; +z = 0.5 * exp (gammaln (nu) - nu * log (0.5 * t)); +I = ~ isinf (z); + +if diff <= 0 + + k = zeros (N * M, 1); + + % When z < +Inf, compute using the modified Bessel function of the second kind + k(I) = 1 ./ z(I) .* besselk_ (nu, t(I)); + + % When z == +Inf, it means nu is large and/or t is close to zero. + % We approximate the result with the upper bound provided by the Gaussian case. + k(~I) = stk_rbf_gauss (h(~I)); + +elseif diff == 1 % numerical derivative wrt Nu + + itermax = 2; + delta = 1e-4; + dk = zeros (N * M, itermax); + for l= 1:itermax + Nu_p = nu + 2 ^ (l - 1) * delta; + Nu_m = nu - 2 ^ (l - 1) * delta; + t_p = 2 * sqrt (Nu_p) * hp; + t_m = 2 * sqrt (Nu_m) * hp; + k_p = 1 / (2 ^ (Nu_p - 1) * gamma (Nu_p)) .* t_p(I) .^ Nu_p .* ... + besselk_ (Nu_p, t_p(I)); + k_m = 1 / (2 ^ (Nu_m - 1) * gamma (Nu_m)) .* t_m(I) .^ Nu_m .* ... + besselk_ (Nu_m, t_m(I)); + dk(I, l) = k_p - k_m; + end + k = 1 / (12 * delta)* (- dk(:, 2) + 8 * dk(:, 1)); + +elseif diff == 2 % deriv. wrt h + + k = zeros (N * M, 1); + dtdh = 2 * sqrt (nu); + k(I) = - dtdh ./ z(I) .* besselk_ (nu - 1, t(I)); + +end + +k = reshape (k, N, M); + +end % function + + +function y = besselk_ (nu, x) + +opts = stk_options_get('stk_rbf_matern'); + +if size(x, 1) < opts.min_size_for_parallelization, + y = besselk(nu, x); +else + y = stk_parallel_feval(@(t)(besselk(nu, t)), x, true, opts.min_block_size); +end + +end % function + + +%!shared nu, h, diff +%! nu = 1.0; h = 1.0; diff = -1; + +%!error stk_rbf_matern (); +%!error stk_rbf_matern (nu); +%!test stk_rbf_matern (nu, h); +%!test stk_rbf_matern (nu, h, diff); + +%!test %% h = 0.0 => correlation = 1.0 +%! for nu = 0.1:0.2:5.0, +%! x = stk_rbf_matern (nu, 0.0); +%! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); +%! end diff --git a/inst/covfcs/rbf/stk_rbf_matern32.m b/inst/covfcs/rbf/stk_rbf_matern32.m new file mode 100644 index 0000000..75c144d --- /dev/null +++ b/inst/covfcs/rbf/stk_rbf_matern32.m @@ -0,0 +1,102 @@ +% STK_RBF_MATERN32 computes the Matern correlation function of order 3/2. +% +% CALL: K = stk_rbf_matern32 (H) +% +% computes the value of the Matern correlation function of order 3/2 at +% distance H. Note that the Matern correlation function is a valid +% correlation function for all dimensions. +% +% CALL: K = stk_rbf_matern32 (H, DIFF) +% +% computes the derivative of the Matern correlation function of order 3/2, at +% distance H, with respect the distance H if DIFF is equal to 1. (If DIFF is +% equal to -1, this is the same as K = stk_rbf_matern32(H).) +% +% See also: stk_rbf_matern, stk_rbf_matern52 + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2011, 2012 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_rbf_matern32 (h, diff) + +% default: compute the value (not a derivative) +if nargin < 2, + diff = -1; +end + +Nu = 3/2; +C = 2 * sqrt (Nu); % dt/dh +t = C * abs (h); + +k = exp (- t); +b = (k > 0); + +if diff <= 0, % value of the covariance function + + k(b) = (1 + t(b)) .* k(b); + +elseif diff == 1, % derivative wrt h + + k(b) = - C * t(b) .* k(b); + +else + + error ('incorrect value for diff.'); + +end + +end % function + + +%!shared h, diff +%! h = 1.0; diff = -1; + +%!error stk_rbf_matern32 (); +%!test stk_rbf_matern32 (h); +%!test stk_rbf_matern32 (h, diff); + +%!test %% h = 0.0 => correlation = 1.0 +%! x = stk_rbf_matern32 (0.0); +%! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); + +%!test %% consistency with stk_rbf_matern: function values +%! for h = 0.1:0.1:2.0, +%! x = stk_rbf_matern (3/2, h); +%! y = stk_rbf_matern32 (h); +%! assert (stk_isequal_tolrel (x, y, 1e-8)); +%! end + +%!test %% consistency with stk_rbf_matern: derivatives +%! for h = 0.1:0.1:2.0, +%! x = stk_rbf_matern (3/2, h, 2); +%! y = stk_rbf_matern32 (h, 1); +%! assert (stk_isequal_tolrel (x, y, 1e-8)); +%! end + +%!assert (stk_rbf_matern32 (inf) == 0) + diff --git a/inst/covfcs/rbf/stk_rbf_matern52.m b/inst/covfcs/rbf/stk_rbf_matern52.m new file mode 100644 index 0000000..323e303 --- /dev/null +++ b/inst/covfcs/rbf/stk_rbf_matern52.m @@ -0,0 +1,102 @@ +% STK_RBF_MATERN52 computes the Matern correlation function of order 5/2. +% +% CALL: K = stk_rbf_matern52 (H) +% +% computes the value of the Matern correlation function of order 5/2 at +% distance H. Note that the Matern correlation function is a valid +% correlation function for all dimensions. +% +% CALL: K = stk_rbf_matern52 (H, DIFF) +% +% computes the derivative of the Matern correlation function of order 5/2, at +% distance H, with respect the distance H if DIFF is equal to 1. (If DIFF is +% equal to -1, this is the same as K = stk_rbf_matern52(H).) +% +% See also: stk_rbf_matern, stk_rbf_matern32 + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2011, 2012 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_rbf_matern52 (h, diff) + +% default: compute the value (not a derivative) +if nargin < 2, + diff = -1; +end + +Nu = 5/2; +C = 2 * sqrt (Nu); % dt/dh +t = C * abs (h); + +k = exp (- t); +b = (k > 0); +t = t(b); + +if diff <= 0, % value of the covariance function + + k(b) = (1 + t + t.^2/3) .* k(b); + +elseif diff == 1, % derivative wrt h + + k(b) = C * -t/3 .* (1 + t) .* k(b); + +else + + error ('incorrect value for diff.'); + +end + +end % function + + +%!shared h, diff +%! h = 1.0; diff = -1; + +%!error stk_rbf_matern52 (); +%!test stk_rbf_matern52 (h); +%!test stk_rbf_matern52 (h, diff); + +%!test %% h = 0.0 => correlation = 1.0 +%! x = stk_rbf_matern52 (0.0); +%! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); + +%!test %% consistency with stk_rbf_matern: function values +%! for h = 0.1:0.1:2.0, +%! x = stk_rbf_matern (5/2, h); +%! y = stk_rbf_matern52 (h); +%! assert (stk_isequal_tolrel (x, y, 1e-8)); +%! end + +%!test %% consistency with stk_rbf_matern: derivatives +%! for h = 0.1:0.1:2.0, +%! x = stk_rbf_matern (5/2, h, 2); +%! y = stk_rbf_matern52 (h, 1); +%! assert (stk_isequal_tolrel (x, y, 1e-8)); +%! end + +%!assert (stk_rbf_matern52 (inf) == 0) diff --git a/inst/covfcs/rbf/stk_rbf_spherical.m b/inst/covfcs/rbf/stk_rbf_spherical.m new file mode 100644 index 0000000..289b93e --- /dev/null +++ b/inst/covfcs/rbf/stk_rbf_spherical.m @@ -0,0 +1,93 @@ +% STK_RBF_SPHERICAL computes the spherical correlation function +% +% CALL: K = stk_rbf_spherical (H) +% +% computes the value of the spherical correlation function at distance H: +% +% / +% | 1 - 3/2 |h| + 1/2 |h|^3 if |h| < 1, +% K = | +% | 0 otherwise. +% \ +% +% CALL: K = stk_rbf_spherical (H, DIFF) +% +% computes the derivative of the spherical correlation function with +% respect the H if DIFF is equal to 1, and simply returns the value of the +% exponential correlation function if DIFF <= 0 (in which case it is +% equivalent to K = stk_rbf_spherical (H)). +% +% ADMISSIBILITY +% +% The spherical correlation is a valid correlation function in +% dimension d <= 3. + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_rbf_spherical (h, diff) + +t = abs (h); +b = (t < 1); +k = zeros (size (h)); + +if (nargin < 2) || (diff <= 0) + + % value of the spherical correlation at h + k(b) = ((1 - t(b)) .^ 2) .* (1 + 0.5 * t(b)); + +elseif diff == 1 + + % derivative of the spherical correlation function at h + % (convention: k'(0) = 0, even though k is not derivable at h=0) + k(b) = 1.5 * (sign (h(b))) .* (t(b) .^ 2 - 1); + +else + error ('incorrect value for diff.'); +end + +end % function + + +%!shared h, diff +%! h = 1.0; diff = -1; + +%!error stk_rbf_spherical (); +%!test stk_rbf_spherical (h); +%!test stk_rbf_spherical (h, diff); + +%!test %% h = 0.0 => correlation = 1.0 +%! x = stk_rbf_spherical (0.0); +%! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); + +%!test %% check derivative numerically +%! h = [-1 -0.5 -0.1 0.1 0.5 1]; delta = 1e-9; +%! d1 = (stk_rbf_spherical (h + delta) - stk_rbf_spherical (h)) / delta; +%! d2 = stk_rbf_spherical (h, 1); +%! assert (stk_isequal_tolabs (d1, d2, 1e-4)); + +%!assert (stk_rbf_spherical (inf) == 0) + diff --git a/inst/covfcs/rbf/stk_sf_gausscorr.m b/inst/covfcs/rbf/stk_sf_gausscorr.m new file mode 100644 index 0000000..6d6d096 --- /dev/null +++ b/inst/covfcs/rbf/stk_sf_gausscorr.m @@ -0,0 +1,35 @@ +% STK_SF_GAUSSCORR [deprecated] +% +% See also: stk_rbf_gauss + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_sf_gausscorr (h, diff) + +k = stk_rbf_gauss (h, diff); + +end % function diff --git a/inst/covfcs/rbf/stk_sf_matern.m b/inst/covfcs/rbf/stk_sf_matern.m new file mode 100644 index 0000000..b7882c1 --- /dev/null +++ b/inst/covfcs/rbf/stk_sf_matern.m @@ -0,0 +1,35 @@ +% STK_SF_MATERN [deprecated] +% +% See also: stk_rbf_matern + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_sf_matern (nu, h, diff) + +k = stk_rbf_matern (h, diff); + +end % function diff --git a/inst/covfcs/rbf/stk_sf_matern32.m b/inst/covfcs/rbf/stk_sf_matern32.m new file mode 100644 index 0000000..d434adc --- /dev/null +++ b/inst/covfcs/rbf/stk_sf_matern32.m @@ -0,0 +1,35 @@ +% STK_SF_MATERN32 [deprecated] +% +% See also: stk_rbf_matern32 + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_sf_matern32 (h, diff) + +k = stk_rbf_matern32 (h, diff); + +end % function diff --git a/inst/covfcs/rbf/stk_sf_matern52.m b/inst/covfcs/rbf/stk_sf_matern52.m new file mode 100644 index 0000000..516cea8 --- /dev/null +++ b/inst/covfcs/rbf/stk_sf_matern52.m @@ -0,0 +1,35 @@ +% STK_SF_MATERN52 [deprecated] +% +% See also: stk_rbf_matern52 + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_sf_matern52 (h, diff) + +k = stk_rbf_matern52 (h, diff); + +end % function diff --git a/inst/covfcs/stk_discretecov.m b/inst/covfcs/stk_discretecov.m new file mode 100644 index 0000000..32108a5 --- /dev/null +++ b/inst/covfcs/stk_discretecov.m @@ -0,0 +1,106 @@ +% STK_DISCRETECOV computes a covariance matrix for a discrete model +% +% CALL: K = stk_discretecov (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and +% Y, using the discrete model (a kriging model on a discrete space) +% parameters PARAM. The inputs arguments X and Y are expected to be +% vectors of indices. The output matrix K has size NX x NY, where NX is +% the length of X and NY the length of Y. PARAM must contain a field +% PARAM.K which is the full covariance matrix on the discrete input +% space. +% +% CALL: K = stk_discretecov (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance *vector* between the sets of locations X and +% Y if PAIRWISE is TRUE, and the covariance *matrix* otherwise. In the +% first case, the output K is a vector of length N, where N is the +% common number of rows of X and Y. In the second, it is an NX x NY +% matrix as above. The argument DIFF has no effect, but must be equal +% to -1 since this is not a parametric model. + +% Copyright Notice +% +% Copyright (C) 2015, 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function K = stk_discretecov (param, x, y, diff, pairwise) + +%--- process input arguments --------------------------------------------------- + +x = double (x); +y = double (y); + +if (nargin >= 4) && (diff ~= -1) + stk_error ('diff should be equal to -1', 'InvalidArgument'); +end + +if nargin < 5 + pairwise = false; +end + +%--- compute covariance matrix ------------------------------------------------- + +if ~pairwise + K = param.K(x, y); +else + idx = sub2ind (size (param.K), x, y); + K = param.K(idx); +end + +end % function + + +%!shared model, model2, x0 +%! n0 = 20; n1 = 10; dim = 4; +%! x0 = stk_sampling_randunif (n0, dim); +%! x1 = stk_sampling_randunif (n1, dim); +%! model = stk_model (@stk_materncov52_aniso, dim); +%! model.lm = stk_lm_affine (); +%! model.param = log ([1.0; 2.1; 2.2; 2.3; 2.4]); + +%!test % without noise, pairwise = false +%! model.lognoisevariance = - inf; +%! model2 = stk_model (@stk_discretecov, model, x0); +%! idx = [1 4 9]; +%! [K1, P1] = stk_make_matcov (model, x0(idx, :)); +%! [K2, P2] = stk_make_matcov (model2, idx'); +%! assert (stk_isequal_tolrel (K1, K2)); +%! assert (stk_isequal_tolrel (P1, P2)); + +%!test % without noise, pairwise = true +%! K1 = stk_make_matcov (model, x0([2 5 6], :), [], true); +%! K2 = stk_make_matcov (model2, [2 5 6]', [], true); +%! assert (stk_isequal_tolrel (K1, K2)); + +%!test % with noise, pairwise = false +%! model.lognoisevariance = log (0.01); +%! model2 = stk_model (@stk_discretecov, model, x0); +%! idx = [1 4 9]; +%! [K1, P1] = stk_make_matcov (model, x0(idx, :)); +%! [K2, P2] = stk_make_matcov (model2, idx'); +%! assert (stk_isequal_tolrel (K1, K2)); +%! assert (stk_isequal_tolrel (P1, P2)); diff --git a/inst/covfcs/stk_expcov_aniso.m b/inst/covfcs/stk_expcov_aniso.m new file mode 100644 index 0000000..0fdb540 --- /dev/null +++ b/inst/covfcs/stk_expcov_aniso.m @@ -0,0 +1,201 @@ +% STK_EXPCOV_ANISO computes the anisotropic exponential covariance function +% +% CALL: K = stk_expcov_aniso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the exponential covariance function with parameters PARAM. The output +% matrix K has size NX x NY, where NX is the number of rows in X and NY the +% number of rows in Y. The vector of parameters must have DIM + 1 elements, +% where DIM is the common number of columns of X and Y: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter +% for the ith dimension. +% +% CALL: dK = stk_expcov_aniso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_aniso +% (PARAM, X, Y)). +% +% CALL: K = stk_expcov_aniso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_expcov_aniso (param, x, y, diff, pairwise) + +persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check consistency for the number of factors +dim = size (x, 2); +if (size (y, 2) ~= dim) + stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); +end + +% check param +nb_params = dim + 1; +if (numel (param) ~= nb_params) + stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); +else + param = reshape (param, 1, nb_params); % row vector +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2:end)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ all (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + xs = bsxfun (@times, x, invRho); + ys = bsxfun (@times, y, invRho); + D = stk_dist (xs, ys, pairwise); + % save arguments for the next call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; + % recomputation of Kx_cache is required + compute_Kx_cache = true; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_exponential (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_exponential (D, -1); +elseif (diff >= 2) && (diff <= nb_params) + %%% diff wrt param(diff) = - log(invRho(diff-1)) + ind = diff - 1; + if compute_Kx_cache || isempty (Kx_cache) + Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_exponential (D, 1)); + compute_Kx_cache = false; + end + if pairwise + k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; + else + k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; + end +else + stk_error ('Incorrect value for the ''diff'' parameter.', ... + 'InvalidArgument'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y, K1, K2, K3 +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (6, dim); + +%!error K0 = stk_expcov_aniso (); +%!error K0 = stk_expcov_aniso (param); +%!error K0 = stk_expcov_aniso (param, x); +%!test K1 = stk_expcov_aniso (param, x, y); +%!test K2 = stk_expcov_aniso (param, x, y, -1); +%!test K3 = stk_expcov_aniso (param, x, y, -1, false); +%!assert (isequal (K1, K2)); +%!assert (isequal (K1, K3)); + +%!test % df versus ordinary array +%! u = double (x); v = double (y); +%! K1 = stk_expcov_aniso (param, u, v, -1); +%! K2 = stk_expcov_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); + +%!error stk_expcov_aniso (param, x, y, -2); +%!test stk_expcov_aniso (param, x, y, -1); +%!error stk_expcov_aniso (param, x, y, 0); +%!test stk_expcov_aniso (param, x, y, 1); +%!test stk_expcov_aniso (param, x, y, 2); +%!error stk_expcov_aniso (param, x, y, 3); +%!error stk_expcov_aniso (param, x, y, nan); +%!error stk_expcov_aniso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5; 2.4; 2.6]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_expcov_aniso (param, x, y); +%! K2 = stk_expcov_aniso (param, x, y, -1); +%! assert (isequal (size(K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:(dim + 1), +%! dK = stk_expcov_aniso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_expcov_aniso (param, x, y); +%! K2 = stk_expcov_aniso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:(dim + 1), +%! dK1 = stk_expcov_aniso (param, x, y, i); +%! dK2 = stk_expcov_aniso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_expcov_iso.m b/inst/covfcs/stk_expcov_iso.m new file mode 100644 index 0000000..190cf73 --- /dev/null +++ b/inst/covfcs/stk_expcov_iso.m @@ -0,0 +1,172 @@ +% STK_EXPCOV_ISO computes the isotropic exponential covariance function +% +% CALL: K = stk_expcov_iso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and +% Y, using the isotropic exponential covariance function with parameters +% PARAM. The output matrix K has size NX x NY, where NX is the number of rows +% in X and NY the number of rows in Y. The vector of parameters must have two +% elements: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = - log (RHO), where RHO is the range parameter. +% +% CALL: dK = stk_expcov_iso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_iso +% (PARAM, X, Y)). +% +% CALL: K = stk_expcov_iso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_expcov_iso (param, x, y, diff, pairwise) + +persistent x0 y0 param0 pairwise0 D + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check param +if numel (param) ~= 2 + stk_error ('param should have two elements.', 'InvalidArgument'); +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + D = invRho * stk_dist (x, y, pairwise); + % save arguments for the nex call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_exponential (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_exponential (D, -1); +elseif diff == 2 + %%% diff wrt param(3) = - log(invRho) + k = D .* (Sigma2 * stk_rbf_exponential (D, 1)); +else + error ('there must be something wrong here !'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (5, dim); + +%!error K = stk_expcov_iso ([param; 1.234], x, y); + +%!error stk_expcov_iso (); +%!error stk_expcov_iso (param); +%!error stk_expcov_iso (param, x); +%!test stk_expcov_iso (param, x, y); +%!test stk_expcov_iso (param, x, y, -1); +%!test stk_expcov_iso (param, x, y, -1, false); + +%!error stk_expcov_iso (param, x, y, -2); +%!test stk_expcov_iso (param, x, y, -1); +%!error stk_expcov_iso (param, x, y, 0); +%!test stk_expcov_iso (param, x, y, 1); +%!test stk_expcov_iso (param, x, y, 2); +%!error stk_expcov_iso (param, x, y, 3); +%!error stk_expcov_iso (param, x, y, nan); +%!error stk_expcov_iso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_expcov_iso (param, x, y); +%! K2 = stk_expcov_iso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:2, +%! dK = stk_expcov_iso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_expcov_iso (param, x, y); +%! K2 = stk_expcov_iso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:2, +%! dK1 = stk_expcov_iso (param, x, y, i); +%! dK2 = stk_expcov_iso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_gausscov_aniso.m b/inst/covfcs/stk_gausscov_aniso.m new file mode 100644 index 0000000..774b2e3 --- /dev/null +++ b/inst/covfcs/stk_gausscov_aniso.m @@ -0,0 +1,201 @@ +% STK_GAUSSCOV_ANISO computes the anisotropic Gaussian covariance function +% +% CALL: K = stk_gausscov_aniso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the anisotropic Gaussian covariance function with parameters PARAM. +% The output matrix K has size NX x NY, where NX is the number of rows in X +% and NY the number of rows in Y. The vector of parameters must have DIM + 1 +% elements, where DIM is the common number of columns of X and Y: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2:END) = - log (RHO), where RHO is the vector of range parameters. +% +% CALL: dK = stk_gausscov_aniso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to PARAM(DIFF) +% if DIFF is between 1 and DIM + 1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_gausscov_aniso (PARAM, +% X, Y)). +% +% CALL: K = stk_gausscov_aniso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) between +% the sets of locations X and Y. The output K is a vector of length N, where +% N is the common number of rows of X and Y. +% +% See also: stk_rbf_gauss, stk_gausscov_iso + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_gausscov_aniso (param, x, y, diff, pairwise) + +persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check consistency for the number of factors +dim = size (x, 2); +if size (y, 2) ~= dim + stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); +end + +% check param +nb_params = dim + 1; +if length (param) ~= nb_params + stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); +else + param = reshape (param, 1, nb_params); % row vector +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2:end)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ all (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) || ... + ~ isequal ({x, y, param}, {x0, y0, param0}) || ... + ~ isequal (pairwise, pairwise0) + % compute the distance matrix + xs = bsxfun (@times, x, invRho); + ys = bsxfun (@times, y, invRho); + D = stk_dist (xs, ys, pairwise); + % save arguments for the next call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; + % recomputation of Kx_cache is required + compute_Kx_cache = true; +end + +if diff == -1 + % Compute the value (not a derivative) + k = Sigma2 * stk_rbf_gauss (D, -1); +elseif diff == 1 + % Differentiate wrt param(1) = log (Sigma2) + k = Sigma2 * stk_rbf_gauss (D, -1); +elseif (diff >= 2) && (diff <= nb_params) + % Differentiate wrt param(diff) = - log (invRho(diff-1)) + ind = diff - 1; + if compute_Kx_cache || isempty (Kx_cache) + Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_gauss (D, 1)); + compute_Kx_cache = false; + end + if pairwise + k = ((xs(:, ind) - ys(:, ind)) .^ 2) .* Kx_cache; + else + k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; + end +else + stk_error ('Incorrect value for the ''diff'' parameter.', ... + 'InvalidArgument'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y, K1, K2, K3 +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (6, dim); + +%!error K0 = stk_gausscov_aniso (); +%!error K0 = stk_gausscov_aniso (param); +%!error K0 = stk_gausscov_aniso (param, x); +%!test K1 = stk_gausscov_aniso (param, x, y); +%!test K2 = stk_gausscov_aniso (param, x, y, -1); +%!test K3 = stk_gausscov_aniso (param, x, y, -1, false); +%!assert (isequal (K1, K2)); +%!assert (isequal (K1, K3)); + +%!test % df versus ordinary array +%! u = double (x); v = double (y); +%! K1 = stk_gausscov_aniso (param, u, v, -1); +%! K2 = stk_gausscov_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); + +%!error stk_gausscov_aniso (param, x, y, -2); +%!test stk_gausscov_aniso (param, x, y, -1); +%!error stk_gausscov_aniso (param, x, y, 0); +%!test stk_gausscov_aniso (param, x, y, 1); +%!test stk_gausscov_aniso (param, x, y, 2); +%!error stk_gausscov_aniso (param, x, y, 3); +%!error stk_gausscov_aniso (param, x, y, nan); +%!error stk_gausscov_aniso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5; 2.4; 2.6]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_gausscov_aniso (param, x, y); +%! K2 = stk_gausscov_aniso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:(dim + 1), +%! dK = stk_gausscov_aniso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_gausscov_aniso (param, x, y); +%! K2 = stk_gausscov_aniso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:(dim + 1), +%! dK1 = stk_gausscov_aniso (param, x, y, i); +%! dK2 = stk_gausscov_aniso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_gausscov_iso.m b/inst/covfcs/stk_gausscov_iso.m new file mode 100644 index 0000000..e17edff --- /dev/null +++ b/inst/covfcs/stk_gausscov_iso.m @@ -0,0 +1,171 @@ +% STK_GAUSSCOV_ISO computes the isotropic Gaussian covariance function +% +% CALL: K = stk_gausscov_iso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the isotropic Gaussian covariance function with parameters PARAM. The +% output matrix K has size NX x NY, where NX is the number of rows in X and NY +% the number of rows in Y. The vector of parameters must have two elements: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = - log (RHO), where RHO is the range parameter. +% +% CALL: dK = stk_gausscov_iso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to PARAM(DIFF) +% if DIFF is equal to 1 or 2, or the covariance matrix itself if DIFF is equal +% to -1 (in which case this is equivalent to stk_gausscov_iso (PARAM, X, Y)). +% +% CALL: K = stk_gausscov_iso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) between +% the sets of locations X and Y. The output K is a vector of length N, where +% N is the common number of rows of X and Y. +% +% See also: stk_rbf_gauss, stk_gausscov_aniso + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_gausscov_iso (param, x, y, diff, pairwise) + +persistent x0 y0 param0 pairwise0 D + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check param +if numel (param) ~= 2 + stk_error ('param should have two elements.', 'InvalidArgument'); +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (invRho > 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) || ... + ~ isequal ({x, y, param}, {x0, y0, param0}) || ... + ~ isequal (pairwise, pairwise0) + % compute the distance matrix + D = invRho * stk_dist (x, y, pairwise); + % save arguments for the nex call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; +end + +if diff == -1 + % compute the value (not a derivative) + k = Sigma2 * stk_rbf_gauss (D, -1); +elseif diff == 1 + % diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_gauss (D, -1); +elseif diff == 2 + % diff wrt param(3) = - log(invRho) + k = D .* (Sigma2 * stk_rbf_gauss (D, 1)); +else + error('there must be something wrong here !'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (5, dim); + +%!error K = stk_gausscov_iso ([param; 1.234], x, y); + +%!error stk_gausscov_iso (); +%!error stk_gausscov_iso (param); +%!error stk_gausscov_iso (param, x); +%!test stk_gausscov_iso (param, x, y); +%!test stk_gausscov_iso (param, x, y, -1); +%!test stk_gausscov_iso (param, x, y, -1, false); + +%!error stk_gausscov_iso (param, x, y, -2); +%!test stk_gausscov_iso (param, x, y, -1); +%!error stk_gausscov_iso (param, x, y, 0); +%!test stk_gausscov_iso (param, x, y, 1); +%!test stk_gausscov_iso (param, x, y, 2); +%!error stk_gausscov_iso (param, x, y, 3); +%!error stk_gausscov_iso (param, x, y, nan); +%!error stk_gausscov_iso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_gausscov_iso (param, x, y); +%! K2 = stk_gausscov_iso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:2, +%! dK = stk_gausscov_iso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_gausscov_iso (param, x, y); +%! K2 = stk_gausscov_iso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:2, +%! dK1 = stk_gausscov_iso (param, x, y, i); +%! dK2 = stk_gausscov_iso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_materncov32_aniso.m b/inst/covfcs/stk_materncov32_aniso.m new file mode 100644 index 0000000..e5677c6 --- /dev/null +++ b/inst/covfcs/stk_materncov32_aniso.m @@ -0,0 +1,203 @@ +% STK_MATERNCOV32_ANISO computes the anisotropic Matern covariance with nu=3/2 +% +% CALL: K = stk_materncov32_aniso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the anisotropic Matern covariance function with nu=3/2 and +% parameters PARAM. The output matrix K has size NX x NY, where NX is the +% number of rows in X and NY the number of rows in Y. The vector of +% parameters must have DIM + 1 elements, where DIM is the common number +% of columns of X and Y: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter +% for the ith dimension. +% +% CALL: dK = stk_materncov32_aniso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_aniso +% (PARAM, X, Y)). +% +% CALL: K = stk_materncov32_aniso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_materncov32_aniso (param, x, y, diff, pairwise) + +persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check consistency for the number of factors +dim = size (x, 2); +if (size (y, 2) ~= dim) + stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); +end + +% check param +nb_params = dim + 1; +if (numel (param) ~= nb_params) + stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); +else + param = reshape (param, 1, nb_params); % row vector +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2:end)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ all (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + xs = bsxfun (@times, x, invRho); + ys = bsxfun (@times, y, invRho); + D = stk_dist (xs, ys, pairwise); + % save arguments for the next call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; + % recomputation of Kx_cache is required + compute_Kx_cache = true; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_matern32 (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_matern32 (D, -1); +elseif (diff >= 2) && (diff <= nb_params) + %%% diff wrt param(diff) = - log(invRho(diff-1)) + ind = diff - 1; + if compute_Kx_cache || isempty (Kx_cache) + Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_matern32 (D, 1)); + compute_Kx_cache = false; + end + if pairwise + k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; + else + k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; + end +else + stk_error ('Incorrect value for the ''diff'' parameter.', ... + 'InvalidArgument'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y, K1, K2, K3 +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (6, dim); + +%!error K0 = stk_materncov32_aniso (); +%!error K0 = stk_materncov32_aniso (param); +%!error K0 = stk_materncov32_aniso (param, x); +%!test K1 = stk_materncov32_aniso (param, x, y); +%!test K2 = stk_materncov32_aniso (param, x, y, -1); +%!test K3 = stk_materncov32_aniso (param, x, y, -1, false); +%!assert (isequal (K1, K2)); +%!assert (isequal (K1, K3)); + +%!test % df versus ordinary array +%! u = double (x); v = double (y); +%! K1 = stk_materncov32_aniso (param, u, v, -1); +%! K2 = stk_materncov32_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); +%! assert (isequal (K1, K2)); + +%!error stk_materncov32_aniso (param, x, y, -2); +%!test stk_materncov32_aniso (param, x, y, -1); +%!error stk_materncov32_aniso (param, x, y, 0); +%!test stk_materncov32_aniso (param, x, y, 1); +%!test stk_materncov32_aniso (param, x, y, 2); +%!error stk_materncov32_aniso (param, x, y, 3); +%!error stk_materncov32_aniso (param, x, y, nan); +%!error stk_materncov32_aniso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5; 2.4; 2.6]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_materncov32_aniso (param, x, y); +%! K2 = stk_materncov32_aniso (param, x, y, -1); +%! assert (isequal (size(K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:(dim + 1), +%! dK = stk_materncov32_aniso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_materncov32_aniso (param, x, y); +%! K2 = stk_materncov32_aniso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:(dim + 1), +%! dK1 = stk_materncov32_aniso (param, x, y, i); +%! dK2 = stk_materncov32_aniso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_materncov32_iso.m b/inst/covfcs/stk_materncov32_iso.m new file mode 100644 index 0000000..e5b3f43 --- /dev/null +++ b/inst/covfcs/stk_materncov32_iso.m @@ -0,0 +1,172 @@ +% STK_MATERNCOV32_ISO computes the isotropic Matern covariance with nu=3/2 +% +% CALL: K = stk_materncov32_iso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and +% Y, using the isotropic Matern covariance function with nu=3/2 and +% parameters PARAM. The output matrix K has size NX x NY, where NX is +% the number of rows in X and NY the number of rows in Y. The vector of +% parameters must have two elements: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = - log (RHO), where RHO is the range parameter. +% +% CALL: dK = stk_materncov32_iso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_iso +% (PARAM, X, Y)). +% +% CALL: K = stk_materncov32_iso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_materncov32_iso (param, x, y, diff, pairwise) + +persistent x0 y0 param0 pairwise0 D + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check param +if numel (param) ~= 2 + stk_error ('param should have two elements.', 'InvalidArgument'); +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + D = invRho * stk_dist (x, y, pairwise); + % save arguments for the nex call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_matern32 (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_matern32 (D, -1); +elseif diff == 2 + %%% diff wrt param(3) = - log(invRho) + k = D .* (Sigma2 * stk_rbf_matern32 (D, 1)); +else + error ('there must be something wrong here !'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (5, dim); + +%!error K = stk_materncov32_iso ([param; 1.234], x, y); + +%!error stk_materncov32_iso (); +%!error stk_materncov32_iso (param); +%!error stk_materncov32_iso (param, x); +%!test stk_materncov32_iso (param, x, y); +%!test stk_materncov32_iso (param, x, y, -1); +%!test stk_materncov32_iso (param, x, y, -1, false); + +%!error stk_materncov32_iso (param, x, y, -2); +%!test stk_materncov32_iso (param, x, y, -1); +%!error stk_materncov32_iso (param, x, y, 0); +%!test stk_materncov32_iso (param, x, y, 1); +%!test stk_materncov32_iso (param, x, y, 2); +%!error stk_materncov32_iso (param, x, y, 3); +%!error stk_materncov32_iso (param, x, y, nan); +%!error stk_materncov32_iso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_materncov32_iso (param, x, y); +%! K2 = stk_materncov32_iso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:2, +%! dK = stk_materncov32_iso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_materncov32_iso (param, x, y); +%! K2 = stk_materncov32_iso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:2, +%! dK1 = stk_materncov32_iso (param, x, y, i); +%! dK2 = stk_materncov32_iso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_materncov52_aniso.m b/inst/covfcs/stk_materncov52_aniso.m new file mode 100644 index 0000000..748f7bc --- /dev/null +++ b/inst/covfcs/stk_materncov52_aniso.m @@ -0,0 +1,195 @@ +% STK_MATERNCOV52_ANISO computes the anisotropic Matern covariance with nu=5/2 +% +% CALL: K = stk_materncov52_aniso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the anisotropic Matern covariance function with nu=5/2 and +% parameters PARAM. The output matrix K has size NX x NY, where NX is the +% number of rows in X and NY the number of rows in Y. The vector of +% parameters must have DIM + 1 elements, where DIM is the common number +% of columns of X and Y: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter for +% the i-th dimension. +% +% CALL: dK = stk_materncov52_aniso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_aniso +% (PARAM, X, Y)). +% +% CALL: K = stk_materncov52_aniso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_materncov52_aniso (param, x, y, diff, pairwise) + +persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check consistency for the number of factors +dim = size (x, 2); +if (size (y, 2) ~= dim) + stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); +end + +% check param +nb_params = dim + 1; +if (numel (param) ~= nb_params) + stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); +else + param = reshape (param, 1, nb_params); % row vector +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2:end)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ all (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + xs = bsxfun (@times, x, invRho); + ys = bsxfun (@times, y, invRho); + D = stk_dist (xs, ys, pairwise); + % save arguments for the next call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; + % recomputation of Kx_cache is required + compute_Kx_cache = true; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_matern52 (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_matern52 (D, -1); +elseif (diff >= 2) && (diff <= nb_params) + %%% diff wrt param(diff) = - log(invRho(diff-1)) + ind = diff - 1; + if compute_Kx_cache || isempty (Kx_cache) + Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_matern52 (D, 1)); + compute_Kx_cache = false; + end + if pairwise + k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; + else + k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; + end +else + stk_error ('Incorrect value for the ''diff'' parameter.', ... + 'InvalidArgument'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (5, dim); + +%!error stk_materncov52_aniso (); +%!error stk_materncov52_aniso (param); +%!error stk_materncov52_aniso (param, x); +%!test stk_materncov52_aniso (param, x, y); +%!test stk_materncov52_aniso (param, x, y, -1); +%!test stk_materncov52_aniso (param, x, y, -1, false); + +%!error stk_materncov52_aniso (param, x, y, -2); +%!test stk_materncov52_aniso (param, x, y, -1); +%!error stk_materncov52_aniso (param, x, y, 0); +%!test stk_materncov52_aniso (param, x, y, 1); +%!test stk_materncov52_aniso (param, x, y, 2); +%!error stk_materncov52_aniso (param, x, y, 3); +%!error stk_materncov52_aniso (param, x, y, nan); +%!error stk_materncov52_aniso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5; 2.4; 2.6]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_materncov52_aniso (param, x, y); +%! K2 = stk_materncov52_aniso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:(dim + 1), +%! dK = stk_materncov52_aniso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_materncov52_aniso (param, x, y); +%! K2 = stk_materncov52_aniso(param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:(dim + 1), +%! dK1 = stk_materncov52_aniso (param, x, y, i); +%! dK2 = stk_materncov52_aniso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_materncov52_iso.m b/inst/covfcs/stk_materncov52_iso.m new file mode 100644 index 0000000..793f9ec --- /dev/null +++ b/inst/covfcs/stk_materncov52_iso.m @@ -0,0 +1,172 @@ +% STK_MATERNCOV52_ISO computes the isotropic Matern covariance +% +% CALL: K = stk_materncov52_iso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the isotropic Matern covariance function with nu=5/2 and parameters +% PARAM. The output matrix K has size NX x NY, where NX is the number of +% rows in X and NY the number of rows in Y. The vector of parameters must +% have two elements: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = - log (RHO), where RHO is the range parameter. +% +% CALL: dK = stk_materncov52_iso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_iso +% (PARAM, X, Y)). +% +% CALL: K = stk_materncov52_iso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_materncov52_iso (param, x, y, diff, pairwise) + +persistent x0 y0 param0 pairwise0 D + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check param +if numel (param) ~= 2 + stk_error ('param should have two elements.', 'InvalidArgument'); +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + D = invRho * stk_dist (x, y, pairwise); + % save arguments for the nex call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_matern52 (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_matern52 (D, -1); +elseif diff == 2 + %%% diff wrt param(3) = - log(invRho) + k = D .* (Sigma2 * stk_rbf_matern52 (D, 1)); +else + error ('there must be something wrong here !'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (5, dim); + +%!error K = stk_materncov52_iso ([param; 1.234], x, y); + +%!error stk_materncov52_iso (); +%!error stk_materncov52_iso (param); +%!error stk_materncov52_iso (param, x); +%!test stk_materncov52_iso (param, x, y); +%!test stk_materncov52_iso (param, x, y, -1); +%!test stk_materncov52_iso (param, x, y, -1, false); + +%!error stk_materncov52_iso (param, x, y, -2); +%!test stk_materncov52_iso (param, x, y, -1); +%!error stk_materncov52_iso (param, x, y, 0); +%!test stk_materncov52_iso (param, x, y, 1); +%!test stk_materncov52_iso (param, x, y, 2); +%!error stk_materncov52_iso (param, x, y, 3); +%!error stk_materncov52_iso (param, x, y, nan); +%!error stk_materncov52_iso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_materncov52_iso (param, x, y); +%! K2 = stk_materncov52_iso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:2, +%! dK = stk_materncov52_iso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_materncov52_iso (param, x, y); +%! K2 = stk_materncov52_iso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:2, +%! dK1 = stk_materncov52_iso (param, x, y, i); +%! dK2 = stk_materncov52_iso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_materncov_aniso.m b/inst/covfcs/stk_materncov_aniso.m new file mode 100644 index 0000000..45c9efc --- /dev/null +++ b/inst/covfcs/stk_materncov_aniso.m @@ -0,0 +1,201 @@ +% STK_MATERNCOV_ANISO computes the anisotropic Matern covariance +% +% CALL: K = stk_materncov_aniso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the anisotropic Matern covariance function with parameters PARAM. +% The output matrix K has size NX x NY, where NX is the number of rows in +% X and NY the number of rows in Y. The vector of parameters must have +% DIM + 1 elements, where DIM is the common number of columns of X and Y: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = log(NU), where NU is the regularity parameter, +% +% * PARAM(2+i) = - log (RHO(i)), where RHO(i) is the range parameter for +% the ith dimension. +% +% CALL: dK = stk_materncov_aniso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_aniso +% (PARAM, X, Y)). +% +% CALL: K = stk_materncov_aniso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_materncov_aniso (param, x, y, diff, pairwise) + +persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check size consistency +dim = size (x, 2); +if (size (y, 2) ~= dim) + stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); +end + +% check param +nb_params = dim + 2; +if (numel (param) ~= nb_params) + stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); +else + param = reshape (param, 1, nb_params); % row vector +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +Nu = exp (param(2)); +invRho = exp (param(3:end)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (Nu > 0) || ~ all (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + xs = bsxfun (@times, x, invRho); + ys = bsxfun (@times, y, invRho); + D = stk_dist (xs, ys, pairwise); + % save arguments for the next call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; + % recomputation of Kx_cache is required + compute_Kx_cache = true; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_matern (Nu, D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_matern (Nu, D, -1); +elseif diff == 2 + %%% diff wrt param(2) = log(Nu) + k = Nu * Sigma2 * stk_rbf_matern (Nu, D, 1); +elseif (diff >= 3) && (diff <= nb_params) + %%% diff wrt param(diff) = - log(invRho(diff-2)) + ind = diff - 2; + if compute_Kx_cache || isempty (Kx_cache) + Kx_cache = 1./(D+eps) .* (Sigma2 * stk_rbf_matern (Nu, D, 2)); + compute_Kx_cache = false; + end + if pairwise + k = (xs(:, ind) - ys(:, ind)) .^ 2 .* Kx_cache; + else + k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; + end +else + stk_error ('Incorrect value for the ''diff'' parameter.', ... + 'InvalidArgument'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 1.5; 2.8]); +%! x = stk_sampling_randunif(5, dim); +%! y = stk_sampling_randunif(5, dim); + +%!error stk_materncov_aniso(); +%!error stk_materncov_aniso(param); +%!error stk_materncov_aniso(param, x); +%!test stk_materncov_aniso(param, x, y); +%!test stk_materncov_aniso(param, x, y, -1); +%!test stk_materncov_aniso(param, x, y, -1, false); + +%!error stk_materncov_aniso(param, x, y, -2); +%!test stk_materncov_aniso(param, x, y, -1); +%!error stk_materncov_aniso(param, x, y, 0); +%!test stk_materncov_aniso(param, x, y, 1); +%!test stk_materncov_aniso(param, x, y, 2); +%!test stk_materncov_aniso(param, x, y, 3); +%!error stk_materncov_aniso(param, x, y, 4); +%!error stk_materncov_aniso(param, x, y, nan); +%!error stk_materncov_aniso(param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 1.5; 2.8; 2.7; 2.9]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif(nx, dim); +%! y = stk_sampling_randunif(ny, dim); + +%!test +%! K1 = stk_materncov_aniso(param, x, y); +%! K2 = stk_materncov_aniso(param, x, y, -1); +%! assert(isequal(size(K1), [nx ny])); +%! assert(stk_isequal_tolabs(K1, K2)); + +%!test +%! for i = 1:(dim+2), +%! dK = stk_materncov_aniso(param, x, y, i); +%! assert(isequal(size(dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif(n, dim); +%! y = stk_sampling_randunif(n, dim); +%! +%! K1 = stk_materncov_aniso(param, x, y); +%! K2 = stk_materncov_aniso(param, x, y, -1, true); +%! assert(isequal(size(K1), [n n])); +%! assert(stk_isequal_tolabs(K2, diag(K1))); +%! +%! for i = 1:(dim+2), +%! dK1 = stk_materncov_aniso(param, x, y, i); +%! dK2 = stk_materncov_aniso(param, x, y, i, true); +%! assert(isequal(size(dK1), [n n])); +%! assert(stk_isequal_tolabs(dK2, diag(dK1))); +%! end diff --git a/inst/covfcs/stk_materncov_iso.m b/inst/covfcs/stk_materncov_iso.m new file mode 100644 index 0000000..f8a28ad --- /dev/null +++ b/inst/covfcs/stk_materncov_iso.m @@ -0,0 +1,179 @@ +% STK_MATERNCOV_ISO computes the isotropic Matern covariance +% +% CALL: K = stk_materncov_iso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the isotropic Matern covariance function with parameters PARAM. The +% output matrix K has size NX x NY, where NX is the number of rows in X +% and NY the number of rows in Y. The vector of parameters must have +% three elements: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = log(NU), where NU is the regularity parameter, +% +% * PARAM(3) = - log (RHO), where RHO is the range parameter. +% +% CALL: dK = stk_materncov_iso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_iso +% (PARAM, X, Y)). +% +% CALL: K = stk_materncov_iso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_materncov_iso (param, x, y, diff, pairwise) + +persistent x0 y0 param0 pairwise0 D + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check param +if numel (param) ~= 3 + stk_error ('param should have two elements.', 'InvalidArgument'); +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +Nu = exp (param(2)); +invRho = exp (param(3)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (Nu > 0) || ~ (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + D = invRho * stk_dist (x, y, pairwise); + % save arguments for the nex call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_matern (Nu, D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_matern (Nu, D, -1); +elseif diff == 2 + %%% diff wrt param(2) = log(Nu) + k = Nu * Sigma2 * stk_rbf_matern (Nu, D, 1); +elseif diff == 3 + %%% diff wrt param(3) = - log(invRho) + k = D .* (Sigma2 * stk_rbf_matern (Nu, D, 2)); +else + error ('there must be something wrong here !'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 1.5; 2.9]); +%! x = stk_sampling_randunif(5, dim); +%! y = stk_sampling_randunif(5, dim); + +%!error K = stk_materncov_iso ([param; 1.234], x, y); + +%!error stk_materncov_iso(); +%!error stk_materncov_iso(param); +%!error stk_materncov_iso(param, x); +%!test stk_materncov_iso(param, x, y); +%!test stk_materncov_iso(param, x, y, -1); +%!test stk_materncov_iso(param, x, y, -1, false); + +%!error stk_materncov_iso(param, x, y, -2); +%!test stk_materncov_iso(param, x, y, -1); +%!error stk_materncov_iso(param, x, y, 0); +%!test stk_materncov_iso(param, x, y, 1); +%!test stk_materncov_iso(param, x, y, 2); +%!test stk_materncov_iso(param, x, y, 3); +%!error stk_materncov_iso(param, x, y, 4); +%!error stk_materncov_iso(param, x, y, nan); +%!error stk_materncov_iso(param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 1.5; 2.9]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_materncov_iso (param, x, y); +%! K2 = stk_materncov_iso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:3, +%! dK = stk_materncov_iso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif(n, dim); +%! y = stk_sampling_randunif(n, dim); +%! +%! K1 = stk_materncov_iso(param, x, y); +%! K2 = stk_materncov_iso(param, x, y, -1, true); +%! assert(isequal(size(K1), [n n])); +%! assert(stk_isequal_tolabs(K2, diag(K1))); +%! +%! for i = 1:3, +%! dK1 = stk_materncov_iso(param, x, y, i); +%! dK2 = stk_materncov_iso(param, x, y, i, true); +%! assert(isequal(size(dK1), [n n])); +%! assert(stk_isequal_tolabs(dK2, diag(dK1))); +%! end diff --git a/inst/covfcs/stk_noisecov.m b/inst/covfcs/stk_noisecov.m new file mode 100644 index 0000000..3fdaab9 --- /dev/null +++ b/inst/covfcs/stk_noisecov.m @@ -0,0 +1,93 @@ +% STK_NOISECOV [deprecated] +% +% See also: stk_covmat_noise + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function K = stk_noisecov (ni, lognoisevariance, diff, pairwise) + +if (nargin < 3) || (isempty (diff)) + diff = -1; % Default: compute the value (not a derivative) +end + +if nargin < 4 + pairwise = false; % Default: matrix +end + +if isscalar (lognoisevariance) % Homoscedastic + % Remark: the result does not depend on diff + + if pairwise + if lognoisevariance == -inf + K = zeros (ni, 1); + else + K = (exp (lognoisevariance)) * (ones (ni, 1)); + end + else + if lognoisevariance == -inf + K = zeros (ni); + else + K = (exp (lognoisevariance)) * (eye (ni)); + end + end + +else % Heteroscedastic + + s = size (lognoisevariance); + if ~ ((isequal (s, [1, ni])) || (isequal (s, [ni, 1]))) + fprintf ('lognoisevariance has size:\n'); display (s); + stk_error (sprintf (['lognoisevariance was expected to be either a ' ... + 'scalar or a vector of length %d\n'], ni), 'IncorrectSize'); + end + + if diff ~= -1 + error ('diff ~= -1 is not allowed in the heteroscedastic case'); + end + + if pairwise + K = exp (lognoisevariance(:)); + else + K = diag (exp (lognoisevariance)); + end + +end + +end % function + + +%!shared ni, lognoisevariance, diff +%! ni = 5; +%! lognoisevariance = 0.0; +%! diff = -1; + +%!error K = stk_noisecov (); +%!error K = stk_noisecov (ni); +%!test K = stk_noisecov (ni, lognoisevariance); +%!test K = stk_noisecov (ni, lognoisevariance, diff); +%!test K = stk_noisecov (ni, lognoisevariance, diff, true); diff --git a/inst/covfcs/stk_sphcov_aniso.m b/inst/covfcs/stk_sphcov_aniso.m new file mode 100644 index 0000000..635b445 --- /dev/null +++ b/inst/covfcs/stk_sphcov_aniso.m @@ -0,0 +1,202 @@ +% STK_SPHCOV_ANISO computes the anisotropic spherical covariance function +% +% CALL: K = stk_sphcov_aniso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and Y, +% using the anisotropic spherical covariance function with parameters PARAM. +% The output matrix K has size NX x NY, where NX is the number of rows in X +% and NY the number of rows in Y. The vector of parameters must have DIM + 1 +% elements, where DIM is the common number of columns of X and Y: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter +% for the ith dimension. +% +% CALL: dK = stk_sphcov_aniso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_aniso +% (PARAM, X, Y)). +% +% CALL: K = stk_sphcov_aniso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_sphcov_aniso (param, x, y, diff, pairwise) + +persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check consistency for the number of factors +dim = size (x, 2); +if (size (y, 2) ~= dim) + stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); +end + +% check param +nb_params = dim + 1; +if (numel (param) ~= nb_params) + stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); +else + param = reshape (param, 1, nb_params); % row vector +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2:end)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ all (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + xs = bsxfun (@times, x, invRho); + ys = bsxfun (@times, y, invRho); + D = stk_dist (xs, ys, pairwise); + % save arguments for the next call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; + % recomputation of Kx_cache is required + compute_Kx_cache = true; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_spherical (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_spherical (D, -1); +elseif (diff >= 2) && (diff <= nb_params) + %%% diff wrt param(diff) = - log(invRho(diff-1)) + ind = diff - 1; + if compute_Kx_cache || isempty (Kx_cache) + Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_spherical (D, 1)); + compute_Kx_cache = false; + end + if pairwise + k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; + else + k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; + end +else + stk_error ('Incorrect value for the ''diff'' parameter.', ... + 'InvalidArgument'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y, K1, K2, K3 +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (6, dim); + +%!error K0 = stk_sphcov_aniso (); +%!error K0 = stk_sphcov_aniso (param); +%!error K0 = stk_sphcov_aniso (param, x); +%!test K1 = stk_sphcov_aniso (param, x, y); +%!test K2 = stk_sphcov_aniso (param, x, y, -1); +%!test K3 = stk_sphcov_aniso (param, x, y, -1, false); +%!assert (isequal (K1, K2)); +%!assert (isequal (K1, K3)); + +%!test % df versus ordinary array +%! u = double (x); v = double (y); +%! K1 = stk_sphcov_aniso (param, u, v, -1); +%! K2 = stk_sphcov_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); +%! assert (isequal (K1, K2)); + +%!error stk_sphcov_aniso (param, x, y, -2); +%!test stk_sphcov_aniso (param, x, y, -1); +%!error stk_sphcov_aniso (param, x, y, 0); +%!test stk_sphcov_aniso (param, x, y, 1); +%!test stk_sphcov_aniso (param, x, y, 2); +%!error stk_sphcov_aniso (param, x, y, 3); +%!error stk_sphcov_aniso (param, x, y, nan); +%!error stk_sphcov_aniso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5; 2.4; 2.6]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_sphcov_aniso (param, x, y); +%! K2 = stk_sphcov_aniso (param, x, y, -1); +%! assert (isequal (size(K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:(dim + 1), +%! dK = stk_sphcov_aniso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_sphcov_aniso (param, x, y); +%! K2 = stk_sphcov_aniso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:(dim + 1), +%! dK1 = stk_sphcov_aniso (param, x, y, i); +%! dK2 = stk_sphcov_aniso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/covfcs/stk_sphcov_iso.m b/inst/covfcs/stk_sphcov_iso.m new file mode 100644 index 0000000..3ec866e --- /dev/null +++ b/inst/covfcs/stk_sphcov_iso.m @@ -0,0 +1,172 @@ +% STK_SPHCOV_ISO computes the isotropic spherical covariance function +% +% CALL: K = stk_sphcov_iso (PARAM, X, Y) +% +% computes the covariance matrix K between the sets of locations X and +% Y, using the isotropic spherical covariance function with parameters PARAM. +% The output matrix K has size NX x NY, where NX is the number of rows in X +% and NY the number of rows in Y. The vector of parameters must have two +% elements: +% +% * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, +% +% * PARAM(2) = - log (RHO), where RHO is the range parameter. +% +% CALL: dK = stk_sphcov_iso (PARAM, X, Y, DIFF) +% +% computes the derivative of the covariance matrix with respect to +% PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is +% equal to -1 (in which case this is equivalent to stk_materncov_iso +% (PARAM, X, Y)). +% +% CALL: K = stk_sphcov_iso (PARAM, X, Y, DIFF, PAIRWISE) +% +% computes the covariance vector (or a derivative of it if DIFF > 0) +% between the sets of locations X and Y. The output K is a vector of +% length N, where N is the common number of rows of X and Y. + +% Copyright Notice +% +% Copyright (C) 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function k = stk_sphcov_iso (param, x, y, diff, pairwise) + +persistent x0 y0 param0 pairwise0 D + +% process input arguments +x = double (x); +y = double (y); +if nargin < 4, diff = -1; end +if nargin < 5, pairwise = false; end + +% check param +if numel (param) ~= 2 + stk_error ('param should have two elements.', 'InvalidArgument'); +end + +% extract parameters from the "param" vector +Sigma2 = exp (param(1)); +invRho = exp (param(2)); + +% check parameter values +if ~ (Sigma2 > 0) || ~ (invRho >= 0) + error ('Incorrect parameter value.'); +end + +% check if all input arguments are the same as before +% (or if this is the first call to the function) +if isempty (x0) || isempty (y0) || isempty (param0) ... + || ~ isequal ({x, y, param}, {x0, y0, param0}) ... + || ~ isequal (pairwise, pairwise0) + % compute the distance matrix + D = invRho * stk_dist (x, y, pairwise); + % save arguments for the nex call + x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; +end + +if diff == -1 + %%% compute the value (not a derivative) + k = Sigma2 * stk_rbf_spherical (D, -1); +elseif diff == 1 + %%% diff wrt param(1) = log(Sigma2) + k = Sigma2 * stk_rbf_spherical (D, -1); +elseif diff == 2 + %%% diff wrt param(3) = - log(invRho) + k = D .* (Sigma2 * stk_rbf_spherical (D, 1)); +else + error ('there must be something wrong here !'); +end + +end % function + + +%% +% 1D, 5x5 + +%!shared param, x, y +%! dim = 1; +%! param = log ([1.0; 2.5]); +%! x = stk_sampling_randunif (5, dim); +%! y = stk_sampling_randunif (5, dim); + +%!error K = stk_sphcov_iso ([param; 1.234], x, y); + +%!error stk_sphcov_iso (); +%!error stk_sphcov_iso (param); +%!error stk_sphcov_iso (param, x); +%!test stk_sphcov_iso (param, x, y); +%!test stk_sphcov_iso (param, x, y, -1); +%!test stk_sphcov_iso (param, x, y, -1, false); + +%!error stk_sphcov_iso (param, x, y, -2); +%!test stk_sphcov_iso (param, x, y, -1); +%!error stk_sphcov_iso (param, x, y, 0); +%!test stk_sphcov_iso (param, x, y, 1); +%!test stk_sphcov_iso (param, x, y, 2); +%!error stk_sphcov_iso (param, x, y, 3); +%!error stk_sphcov_iso (param, x, y, nan); +%!error stk_sphcov_iso (param, x, y, inf); + +%% +% 3D, 4x10 + +%!shared dim, param, x, y, nx, ny +%! dim = 3; +%! param = log ([1.0; 2.5]); +%! nx = 4; ny = 10; +%! x = stk_sampling_randunif (nx, dim); +%! y = stk_sampling_randunif (ny, dim); + +%!test +%! K1 = stk_sphcov_iso (param, x, y); +%! K2 = stk_sphcov_iso (param, x, y, -1); +%! assert (isequal (size (K1), [nx ny])); +%! assert (stk_isequal_tolabs (K1, K2)); + +%!test +%! for i = 1:2, +%! dK = stk_sphcov_iso (param, x, y, i); +%! assert (isequal (size (dK), [nx ny])); +%! end + +%!test +%! n = 7; +%! x = stk_sampling_randunif (n, dim); +%! y = stk_sampling_randunif (n, dim); +%! +%! K1 = stk_sphcov_iso (param, x, y); +%! K2 = stk_sphcov_iso (param, x, y, -1, true); +%! assert (isequal (size (K1), [n n])); +%! assert (stk_isequal_tolabs (K2, diag (K1))); +%! +%! for i = 1:2, +%! dK1 = stk_sphcov_iso (param, x, y, i); +%! dK2 = stk_sphcov_iso (param, x, y, i, true); +%! assert (isequal (size (dK1), [n n])); +%! assert (stk_isequal_tolabs (dK2, diag (dK1))); +%! end diff --git a/inst/examples/01_kriging_basics/stk_example_kb01.m b/inst/examples/01_kriging_basics/stk_example_kb01.m new file mode 100644 index 0000000..cac22e5 --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb01.m @@ -0,0 +1,110 @@ +% STK_EXAMPLE_KB01 Ordinary kriging in 1D, with noiseless data +% +% This example shows how to compute ordinary kriging predictions on a +% one-dimensional noiseless dataset. +% +% The word 'ordinary' indicates that the mean function of the GP prior is +% assumed to be constant and unknown. +% +% A Matern covariance function is used for the Gaussian Process (GP) prior. +% The parameters of this covariance function are assumed to be known (i.e., +% no parameter estimation is performed here). +% +% Note that the kriging predictor, which is the posterior mean of the GP, +% interpolates the data in this noiseless example. +% +% See also: stk_example_kb01n, stk_example_kb02 + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% Dataset + +% Load a 1D noiseless dataset +[xi, zi, ref] = stk_dataset_twobumps ('noiseless'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + +stk_figure ('stk_example_kb01 (a)'); +stk_plot1d (xi, zi, xt, zt); stk_legend; +stk_title ('True function and observed data'); +stk_labels ('input variable x', 'response z'); + + +%% Specification of the model +% +% We choose a Matern covariance with "fixed parameters" (in other words, the +% parameters of the covariance function are provided by the user rather than +% estimated from data). +% + +% The following line defines a model with a constant but unknown mean (ordinary +% kriging) and a Matern covariance function. (Some default parameters are also +% set, but we override them below.) +model = stk_model (@stk_materncov_iso); + +% NOTE: the suffix '_iso' indicates an ISOTROPIC covariance function, but the +% distinction isotropic / anisotropic is irrelevant here since DIM = 1. + +% Parameters for the Matern covariance function +% ("help stk_materncov_iso" for more information) +SIGMA2 = 0.5; % variance parameter +NU = 4.0; % regularity parameter +RHO1 = 0.4; % scale (range) parameter +model.param = log ([SIGMA2; NU; 1/RHO1]); + +model + + +%% Carry out the kriging prediction and display the result +% +% The result of a kriging predicition is provided by stk_predict() in an object +% zp of type stk_dataframe, with two columns: "zp.mean" (the kriging mean) and +% "zp.var" (the kriging variance). +% + +% Carry out the kriging prediction at points xt +zp = stk_predict (model, xi, zi, xt); + +% Display the result +stk_figure ('stk_example_kb01 (b)'); +stk_plot1d (xi, zi, xt, zt, zp); stk_legend; +stk_title ('Kriging prediction based on noiseless observations'); +stk_labels ('input variable x', 'response z'); + + +%#ok<*NOPTS> + +%!test stk_example_kb01; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb01n.m b/inst/examples/01_kriging_basics/stk_example_kb01n.m new file mode 100644 index 0000000..03337bf --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb01n.m @@ -0,0 +1,111 @@ +% STK_EXAMPLE_KB01N Ordinary kriging in 1D, with noisy data +% +% This example shows how to compute ordinary kriging predictions on a +% one-dimensional noisy dataset. +% +% The Gaussian Process (GP) prior is the same as in stk_example_kb01. +% +% The observation noise is Gaussian and homoscedastic (constant variance). +% Its variance is assumed to be known. +% +% Note that the kriging predictor, which is the posterior mean of the GP, +% does NOT interpolate the data in this noisy example. +% +% See also: stk_example_kb01, stk_example_kb02n + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% Dataset + +% Load a 1D noisy dataset (homoscedastic Gaussian noise) +[xi, zi, ref] = stk_dataset_twobumps ('noisy1'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + +stk_figure ('stk_example_kb01n (a)'); +stk_plot1d (xi, zi, xt, zt); stk_legend; +stk_title ('True function and observed data'); +stk_labels ('input variable x', 'response z'); + + +%% Specification of the model +% +% We choose a Matern covariance with "fixed parameters" (in other words, the +% parameters of the covariance function are provided by the user rather than +% estimated from data). +% + +% The following line defines a model with a constant but unknown mean (ordinary +% kriging) and a Matern covariance function. (Some default parameters are also +% set, but we override them below.) +model = stk_model (@stk_materncov_iso); + +% NOTE: the suffix '_iso' indicates an ISOTROPIC covariance function, but the +% distinction isotropic / anisotropic is irrelevant here since DIM = 1. + +% Parameters for the Matern covariance function +% ("help stk_materncov_iso" for more information) +SIGMA2 = 0.5; % variance parameter +NU = 4.0; % regularity parameter +RHO1 = 0.4; % scale (range) parameter +model.param = log ([SIGMA2; NU; 1/RHO1]); + +% It is assumed in this example that the variance of the noise is known +model.lognoisevariance = 2 * log (ref.noise_std); + +model + + +%% Carry out the kriging prediction and display the result +% +% The result of a kriging predicition is provided by stk_predict() in an object +% zp of type stk_dataframe, with two columns: "zp.mean" (the kriging mean) and +% "zp.var" (the kriging variance). +% + +% Carry out the kriging prediction at points xt +zp = stk_predict (model, xi, zi, xt); + +% Display the result +stk_figure ('stk_example_kb01n (b)'); +stk_plot1d (xi, zi, xt, zt, zp); stk_legend; +stk_title ('Kriging prediction based on noisy observations'); +stk_labels ('input variable x', 'response z'); + + +%#ok<*NOPTS> + +%!test stk_example_kb01n; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb02.m b/inst/examples/01_kriging_basics/stk_example_kb02.m new file mode 100644 index 0000000..c87c8a1 --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb02.m @@ -0,0 +1,89 @@ +% STK_EXAMPLE_KB02 Ordinary kriging in 1D with parameter estimation +% +% This example shows how to estimate covariance parameters and compute +% ordinary kriging predictions on a one-dimensional noiseless dataset. +% +% The model and data are the same as in stk_example_kb01, but this time the +% parameters of the covariance function are estimated using the Restricted +% Maximum Likelihood (ReML) method. +% +% See also: stk_example_kb01, stk_example_kb02n + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% Dataset + +% Load a 1D noiseless dataset +[xi, zi, ref] = stk_dataset_twobumps ('noiseless'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + +stk_figure ('stk_example_kb02 (a)'); +stk_plot1d (xi, zi, xt, zt); stk_legend; +stk_title ('True function and observed data'); + + +%% Specification of the model + +% Define a model with a constant but unknown mean (ordinary kriging) +% and a Matern covariance function, the parameters of which will be +% estimated from the data. +model = stk_model (@stk_materncov_iso); + + +%% Parameter estimation + +% Here, the parameters of the Matern covariance function are estimated +% by the REML (REstricted Maximum Likelihood) method. +model.param = stk_param_estim (model, xi, zi); + +model + + +%% Carry out the kriging prediction and display the result + +% Compute the kriging predictor (and the kriging variance) on the grid +zp = stk_predict (model, xi, zi, xt); + +stk_figure ('stk_example_kb02 (b)'); +stk_plot1d (xi, zi, xt, zt, zp); stk_legend; +stk_title ('Kriging prediction with estimated parameters'); +stk_labels ('input variable x', 'response z'); + + +%#ok<*NOPTS> + +%!test stk_example_kb02; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb02n.m b/inst/examples/01_kriging_basics/stk_example_kb02n.m new file mode 100644 index 0000000..cef906a --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb02n.m @@ -0,0 +1,95 @@ +% STK_EXAMPLE_KB02N Noisy ordinary kriging in 1D with parameter estimation +% +% This example shows how to estimate covariance parameters and compute +% ordinary kriging predictions on a one-dimensional noisy dataset. +% +% The model and data are the same as in stk_example_kb02, but this time the +% parameters of the covariance function and the variance of the noise are +% jointly estimated using the Restricted Maximum Likelihood (ReML) method. +% +% See also: stk_example_kb01n, stk_example_kb02 + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% Dataset + +% Load a 1D noisy dataset (homoscedastic Gaussian noise) +[xi, zi, ref] = stk_dataset_twobumps ('noisy1'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + +stk_figure ('stk_example_kb02n (a)'); +stk_plot1d (xi, zi, xt, zt); stk_legend; +stk_title ('True function and noisy observed data'); + + +%% Specification of the model + +% Define a model with a constant but unknown mean (ordinary kriging) +% and a Matern covariance function, the parameters of which will be +% estimated from the data. +model = stk_model (@stk_materncov_iso); + +% Indicate that with the noise variance to be estimated +model.lognoisevariance = nan; + + +%% Parameter estimation + +% Here, the parameters of the Matern covariance function are estimated +% by the REML (REstricted Maximum Likelihood) method. +[model.param, model.lognoisevariance] = stk_param_estim (model, xi, zi); + +model + +fprintf ('True noise variance = %.4f\n', ref.noise_std ^ 2); +fprintf ('Estimated noise variance = %.4f\n\n', exp (model.lognoisevariance)); + + +%% Carry out the kriging prediction and display the result + +% Compute the kriging predictor (and the kriging variance) on the grid +zp = stk_predict (model, xi, zi, xt); + +stk_figure ('stk_example_kb02n (b)'); +stk_plot1d (xi, zi, xt, zt, zp); stk_legend; +stk_title ('Kriging prediction with estimated parameters'); +stk_labels ('input variable x', 'response z'); + + +%#ok<*NOPTS> + +%!test stk_example_kb02n; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb03.m b/inst/examples/01_kriging_basics/stk_example_kb03.m new file mode 100644 index 0000000..047566a --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb03.m @@ -0,0 +1,156 @@ +% STK_EXAMPLE_KB03 Ordinary kriging in 2D +% +% An anisotropic Matern covariance function is used for the Gaussian Process +% (GP) prior. The parameters of this covariance function (variance, regularity +% and ranges) are estimated using the Restricted Maximum Likelihood (ReML) +% method. +% +% The mean function of the GP prior is assumed to be constant and unknown. This +% default choice can be overridden by means of the model.lm property. +% +% The function is sampled on a space-filling Latin Hypercube design, and the +% data is assumed to be noiseless. + +% Copyright Notice +% +% Copyright 2016 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_kb03'); + +CONTOUR_LINES = 40; % number of levels in contour plots +DOT_STYLE = {'ro', 'MarkerFaceColor', 'r', 'MarkerSize', 4}; + + +%% CHOICE OF A TWO-DIMENSIONAL TEST FUNCTION + +CASENUM = 1; + +switch CASENUM + + case 1 % The classical BRANIN-HOO test function + f = @stk_testfun_braninhoo; + DIM = 2; + BOX = [[-5; 10], [0; 15]]; + NI = 20; + + case 2 % Another test function + f_ = inline (['exp(1.8*(x1+x2)) + 3*x1 + 6*x2.^2' ... + '+ 3*sin(4*pi*x1)'], 'x1', 'x2'); + f = @(x)(f_(x(:, 1), x(:, 2))); + DIM = 2; + BOX = [[-1; 1], [-1; 1]]; + NI = 40; % This second function is much harder to approximate. + +end + +% Optional: create an hyper-rectangle object for the input space +BOX = stk_hrect (BOX, {'x_1', 'x_2'}) + + +%% COMPUTE AND VISUALIZE THE FUNCTION ON A 80 x 80 REGULAR GRID + +% Size of the regular grid +NT = 80 ^ DIM; + +% The function stk_sampling_regulargrid() does the job of creating the grid +xt = stk_sampling_regulargrid (NT, DIM, BOX); + +% Compute the corresponding responses +zt = stk_feval (f, xt); + +% Since xt is a regular grid, we can do a contour plot +stk_subplot (2, 2, 1); contour (xt, f, CONTOUR_LINES); +axis (BOX); stk_title ('function to be approximated'); + + +%% CHOOSE A KRIGING (GAUSSIAN PROCESS) MODEL + +% We start with a generic (anisotropic) Matern covariance function. +model = stk_model (@stk_materncov_aniso, DIM); + +% As a default choice, a constant (but unknown) mean is used, +% i.e., model.lm = stk_lm_constant. +% model.lm = stk_lm_affine; %%% UNCOMMENT TO USE A LINEAR TREND +% model.lm = stk_lm_quadratic; %%% UNCOMMENT TO USE A "FULL QUADRATIC" TREND + + +%% EVALUATE THE FUNCTION ON A "MAXIMIN LHS" DESIGN + +xi = stk_sampling_maximinlhs (NI, DIM, BOX); +zi = stk_feval (f, xi); + +% Add the design points to the first plot +hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); + + +%% ESTIMATE THE PARAMETERS OF THE COVARIANCE FUNCTION + +% Uncomment to use a little bit of "regularization noise": +% model.lognoisevariance = 2 * log (1e-4); % Noise std = 1e-4 (small) + +% Compute an initial guess for the parameters of the Matern covariance (param0) +param0 = stk_param_init (model, xi, zi, BOX); + +% % Alternative: user-defined initial guess for the parameters of +% % the Matern covariance (see "help stk_materncov_aniso" for more information) +% SIGMA2 = var (zi); +% NU = 2; +% RHO1 = (BOX(2,1) - BOX(1,1)) / 10; +% RHO2 = (BOX(2,2) - BOX(1,2)) / 10; +% param0 = log ([SIGMA2; NU; 1/RHO1; 1/RHO2]); +% model.lognoisevariance = 2 * log (1e-5); + +model.param = stk_param_estim (model, xi, zi, param0); + + +%% CARRY OUT KRIGING PREDICITION AND VISUALIZE + +% Here, we compute the kriging prediction on each point of the grid +zp = stk_predict (model, xi, zi, xt); + +% Display the result using a contour plot, to be compared with the contour +% lines of the true function +stk_subplot (2, 2, 2); contour (xt, zp.mean, CONTOUR_LINES); +tsc = sprintf ('approximation from %d points', NI); hold on; +plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); +hold off; axis (BOX(:)); stk_title (tsc); + + +%% VISUALIZE THE ACTUAL PREDICTION ERROR AND THE KRIGING STANDARD DEVIATION + +stk_subplot (2, 2, 3); pcolor (xt, log (abs (zp.mean - zt))); +hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); +hold off; axis (BOX(:)); stk_title ('true approx error (log)'); + +stk_subplot (2, 2, 4); pcolor (xt, 0.5 * log (zp.var)); +hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); +hold off; axis (BOX(:)); stk_title ('kriging std (log)'); + + +%#ok<*NOPTS> + +%!test stk_example_kb03; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb04.m b/inst/examples/01_kriging_basics/stk_example_kb04.m new file mode 100644 index 0000000..593e1c5 --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb04.m @@ -0,0 +1,33 @@ +% STK_EXAMPLE_KB04 Estimating the variance of the noise +% +% This example no longer exists. See stk_example_kb02n instead. +% +% See also: stk_example_kb01n, stk_example_kb02n + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome (); diff --git a/inst/examples/01_kriging_basics/stk_example_kb05.m b/inst/examples/01_kriging_basics/stk_example_kb05.m new file mode 100644 index 0000000..e26359b --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb05.m @@ -0,0 +1,124 @@ +% STK_EXAMPLE_KB05 Generation of conditioned sample paths +% +% A Matern Gaussian process model is used, with constant but unknown mean +% (ordinary kriging) and known covariance parameters. +% +% Given noiseless observations from the unknown function, a batch of conditioned +% sample paths is drawn using the "conditioning by kriging" technique. In short, +% this means that unconditioned sample path are simulated first (using +% stk_generate_samplepaths), and then conditioned on the observations by kriging +% (using stk_conditioning). +% +% Note: in this example, for pedagogical purposes, conditioned samplepaths are +% simulated in two steps: first, unconditioned samplepaths are simulated; +% second, conditioned samplepaths are obtained using conditioning by kriging. +% In practice, these two steps can be carried out all at once using +% stk_generate_samplepath (see, e.g., stk_example_kb09). +% +% See also: stk_generate_samplepaths, stk_conditioning, stk_example_kb09 + + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_kb05'); + + +%% Dataset + +% Load a 1D noiseless dataset +[xi, zi, ref] = stk_dataset_twobumps ('noiseless'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + +% Indices of the evaluation points xi in the grid +xi_ind = ref.xi_ind; + + +%% Specification of the model +% +% We choose a Matern covariance with "fixed parameters" (in other +% words, the parameters of the covariance function are provided by the user +% rather than estimated from data). +% + +% The following line defines a model with a constant but unknown mean +% (ordinary kriging) and a Matern covariance function. (Some default +% parameters are also set, but we override them below.) +model = stk_model (@stk_materncov_iso); + +% Parameters for the Matern covariance +% ("help stk_materncov_iso" for more information) +SIGMA2 = 1.0; % variance parameter +NU = 4.0; % regularity parameter +RHO1 = 0.4; % scale (range) parameter +model.param = log ([SIGMA2; NU; 1/RHO1]); + + +%% Generate (unconditional) sample paths + +NB_PATHS = 10; + +zsim = stk_generate_samplepaths (model, xt, NB_PATHS); + +% Display the result +stk_subplot (2, 2, 1); plot (xt, zsim, 'LineWidth', 2); +stk_title ('Unconditional sample paths'); +stk_labels ('input variable x', 'response z'); + + +%% Carry out the kriging prediction and generate conditional sample paths + +% Carry out the kriging prediction at points xt +[zp, lambda] = stk_predict (model, xi, zi, xt); + +% Condition sample paths on the observations +zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); + +% Display the observations only +stk_subplot (2, 2, 2); stk_plot1d (xi, zi); +stk_title ('Observations'); +stk_labels ('input variable x', 'response z'); + +% Display the conditional sample paths +stk_subplot (2, 2, 3); plot (xt, zsimc, 'LineWidth', 2); hold on; +plot (xi, zi, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); +stk_title ('Conditional sample paths'); +stk_labels ('input variable x', 'response z'); + +% Display the kriging and credible intervals +stk_subplot (2, 2, 4); stk_plot1d (xi, zi, xt, zt, zp, zsimc); +stk_title ('Prediction and credible intervals'); +stk_labels ('input variable x', 'response z'); + + +%!test stk_example_kb05; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb06.m b/inst/examples/01_kriging_basics/stk_example_kb06.m new file mode 100644 index 0000000..521ccb5 --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb06.m @@ -0,0 +1,101 @@ +% STK_EXAMPLE_KB06 Ordinary kriging VS kriging with a linear trend +% +% The same dataset is analyzed using two variants of kriging. +% +% The left panel shows the result of ordinary kriging, in other words, Gaussian +% process interpolation assuming a constant (but unknown) mean. The right panel +% shows the result of adding a linear trend in the mean of the Gaussian process. +% +% The difference with the left plot is clear in extrapolation: the first predic- +% tor exhibits a "mean reverting" behaviour, while the second one captures an +% increasing trend in the data. + +% Copyright Notice +% +% Copyright (C) 2016 CantraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_kb06'); + + +%% Preliminaries + +DIM = 1; % Dimension of the factor space +BOX = [-2.0; 2.0]; % Factor space +NT = 1e3; % Number of points in the grid +xt = stk_sampling_regulargrid (NT, DIM, BOX); % Construct a regular grid + + +%% Data + +xi = stk_dataframe ([0.00; 0.10; 0.20], {'x'}); % Evaluation points +zi = stk_dataframe ([0.00; 0.09; 0.21], {'z'}); % Evaluation results + + +%% Default parameters for the Matern covariance +% Parameters used as initial values for stk_param_estim() + +SIGMA2 = 1.0; % variance parameter +NU = 2.0; % regularity parameter +RHO1 = 0.4; % scale (range) parameter + +param0 = log ([SIGMA2; NU; 1/RHO1]); + + +%% Ordinary kriging (constant mean) + +model = stk_model (@stk_materncov_iso, DIM); +model.lognoisevariance = 2 * log (1e-10); +% model.lm = stk_lm_constant is the default + +% Estimate the parameters of the covariance +model.param = stk_param_estim (model, xi, zi, param0); + +% Carry out kriging prediction +zp = stk_predict (model, xi, zi, xt); + +% Plot the result +stk_subplot (1, 2, 1); stk_plot1d (xi, zi, xt, [], zp); +stk_title ('Ordinary kriging'); ylim ([-5 5]); + + +%% Linear trend (aka "universal kriging") + +% We just need to change the value of 'order' in the model +model.lm = stk_lm_affine; + +% Re-estimate the parameters of the covariance +model.param = stk_param_estim (model, xi, zi, param0); + +% Carry out kriging prediction +zp = stk_predict (model, xi, zi, xt); + +% Plot the result +stk_subplot (1, 2, 2); stk_plot1d (xi, zi, xt, [], zp); +stk_title ('Kriging with linear trend'); ylim ([-5 5]); + + +%!test stk_example_kb06; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb07.m b/inst/examples/01_kriging_basics/stk_example_kb07.m new file mode 100644 index 0000000..4ce9a1c --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb07.m @@ -0,0 +1,97 @@ +% STK_EXAMPLE_KB07 Simulation of sample paths from a Matern process + +% Copyright Notice +% +% Copyright (C) 2018, 2021 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; + + +%% Define the factor space & a Matern GP model on it + +% Factor space +DIM = 1; +BOX = [-1.0; 1.0]; + +% Grid +N = 400; +x = stk_sampling_regulargrid (N, DIM, BOX); + +% Covariance parameters +SIGMA2 = 1.0; % Variance parameter +NU = 2.5; % Regularity parameter +RHO = 0.4; % Scale (range) parameter + +% Model +model = stk_model (@stk_materncov_iso); +model.param = log ([SIGMA2; NU; 1/RHO]); + +NB_PATHS = 10; + + +%% Generate sample paths with different values of nu + +stk_figure ('stk_example_kb07: changing nu'); + +nu_list = [0.5 1.5 2.5 10.0]; + +for k = 1:4 + + model.param(2) = log (nu_list(k)); + model.param(3) = log (1 / RHO); + + zsim = stk_generate_samplepaths (model, x, NB_PATHS); + + % Display the result + stk_subplot (2, 2, k); plot (x, zsim, 'LineWidth', 2); + stk_title (sprintf ('Matern, nu = %.1f', nu_list(k))); + stk_labels ('input variable x', 'response z', 'FontWeight', 'bold'); + +end + + +%% Generate sample paths with different values of rho + +stk_figure ('stk_example_kb07: changing rho'); + +rho_list = [0.1 0.2 0.4 0.8]; + +for k = 1:4 + + model.param(2) = log (NU); + model.param(3) = log (1 / rho_list(k)); + + zsim = stk_generate_samplepaths (model, x, NB_PATHS); + + % Display the result + stk_subplot (2, 2, k); plot (x, zsim, 'LineWidth', 2); + stk_title (sprintf ('Matern, rho = %.1f', rho_list(k))); + stk_labels ('input variable x', 'response z', 'FontWeight', 'bold'); + +end + + +%!test stk_example_kb07; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb08.m b/inst/examples/01_kriging_basics/stk_example_kb08.m new file mode 100644 index 0000000..247d06f --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb08.m @@ -0,0 +1,97 @@ +% STK_EXAMPLE_KB08 Generation of conditioned sample paths made easy +% +% It has been demonstrated, in stk_example_kb05, how to generate conditioned +% sample paths using unconditioned sample paths and conditioning by kriging. +% +% This example shows how to do the same in a more concise way, letting STK +% take care of the details. + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_kb08'); + +NB_PATHS = 10; % number of sample paths that we want to produce + + +%% Dataset + +% Load a 1D noiseless dataset +[xi, zi, ref] = stk_dataset_twobumps ('noiseless'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + +% Indices of the evaluation points xi in the grid +xi_ind = ref.xi_ind; + + +%% Specification of the model + +model = stk_model (@stk_materncov_iso); + +% Parameters for the Matern covariance +% ("help stk_materncov_iso" for more information) +SIGMA2 = 1.0; % variance parameter +NU = 4.0; % regularity parameter +RHO1 = 0.4; % scale (range) parameter +model.param = log ([SIGMA2; NU; 1/RHO1]); + + +%% Method 1: explicit conditioning by kriging (as in stk_example_kb05) + +zsim = stk_generate_samplepaths (model, xt, NB_PATHS); + +% Carry out the kriging prediction at points xt +[zp, lambda] = stk_predict (model, xi, zi, xt); + +% Condition sample paths on the observations +zsimc1 = stk_conditioning (lambda, zi, zsim, xi_ind); + + +%% Method 2: let STK take care of the details + +zsimc2 = stk_generate_samplepaths (model, xi, zi, xt, NB_PATHS); + + +%% Figure + +stk_subplot (1, 2, 1); plot (xt, zsimc1, 'LineWidth', 2); hold on; +plot (xi, zi, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); +stk_title (sprintf ('%d conditional sample paths', NB_PATHS)); +stk_labels ('input variable x', 'response z'); + +stk_subplot (1, 2, 2); plot (xt, zsimc2, 'LineWidth', 2); hold on; +plot (xi, zi, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); +stk_title (sprintf ('another set of %d sample paths', NB_PATHS)); +stk_labels ('input variable x', 'response z'); + + +%!test stk_example_kb08; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb09.m b/inst/examples/01_kriging_basics/stk_example_kb09.m new file mode 100644 index 0000000..ee7a777 --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb09.m @@ -0,0 +1,85 @@ +% STK_EXAMPLE_KB09 Generation of sample paths conditioned on noisy observations +% +% A Matern Gaussian process model is used, with constant but unknown mean +% (ordinary kriging) and known covariance parameters. +% +% Given noisy observations from the unknown function, a batch of conditioned +% sample paths is drawn using the "conditioning by kriging" technique +% (stk_generate_samplepaths function). +% +% See also: stk_generate_samplepaths, stk_conditioning, stk_example_kb05 + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_kb09'); + + +%% Dataset + +% Load a 1D noisy dataset (heteroscedastic Gaussian noise) +[xi, zi, ref] = stk_dataset_twobumps ('noisy2'); + +% The grid where predictions must be made +xt = ref.xt; + +% Reference values on the grid +zt = ref.zt; + + +%% Gaussian process model + +% Define a model with a constant but unknown mean (ordinary kriging) +% and a Matern 5/2 covariance function, the parameters of which will be +% estimated from the data. +model = stk_model (@stk_materncov52_iso); + +% Variance of the heteroscedastic noise (assumed to be known). +% Note that ref.noise_std is a *vector* in this case. +model.lognoisevariance = 2 * log (ref.noise_std); + +% ReML parameter estimation +model.param = stk_param_estim (model, xi, zi); + + +%% Generate conditional sample paths + +NB_PATHS = 20; + +zp = stk_predict (model, xi, zi, xt); + +z_sim_cond = stk_generate_samplepaths (model, xi, zi, xt, NB_PATHS); + +% Display the result +stk_plot1d (xi, zi, xt, zt, zp, z_sim_cond); +h = stk_legend (); set (h, 'Location', 'NorthWest'); +stk_title ('Prediction and credible intervals'); +stk_labels ('input variable x', 'response z'); + + +%!test stk_example_kb09; close all; diff --git a/inst/examples/01_kriging_basics/stk_example_kb10.m b/inst/examples/01_kriging_basics/stk_example_kb10.m new file mode 100644 index 0000000..5326258 --- /dev/null +++ b/inst/examples/01_kriging_basics/stk_example_kb10.m @@ -0,0 +1,70 @@ +% STK_EXAMPLE_KB10 Leave-one-out (LOO) cross validation +% +% This example demonstrate the use of Leave-one-out (LOO) cross-validation to +% produced goodness-of-fit graphical diagnostics. +% +% The dataset comes from the "borehole model" response function, evaluated +% without noise on a space-filling design of size 10 * DIM = 80. It is analyzed +% using a Gaussian process prior with unknown constant mean (with a uniform +% prior) and anisotropic stationary Matern covariance function (regularity 5/2; +% variance and range parameters estimated by restricted maximum likelihood). +% +% See also stk_predict_leaveoneout, stk_plot_predvsobs, stk_plot_histnormres + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome (); + +% Define the input domain (see stk_testfun_borehole.m) +BOX = stk_hrect ([ ... + 0.05 100 63070 990 63.1 700 1120 9855; ... + 0.15 50000 115600 1110 116 820 1680 12045], ... + {'rw', 'r', 'Tu', 'Hu', 'Tl', 'Hl', 'L', 'Kw'}); + +% Generate dataset +d = size (BOX, 2); +x = stk_sampling_maximinlhs (10 * d, d, BOX); % Space-filling LHS of size 10*d +y = stk_testfun_borehole (x); % Obtain the responses on the DoE x + +% Build Gaussian process model +M_prior = stk_model (@stk_materncov52_aniso, d); % prior +M_prior.param = stk_param_estim (M_prior, x, y); % ReML parameter estimation + +% Compute LOO predictions and residuals +[y_LOO, res_LOO] = stk_predict_leaveoneout (M_prior, x, y); + +% Plot predictions VS observations (left planel) +% and normalized residuals (right panel) +stk_figure ('stk_example_kb10 (a)'); stk_plot_predvsobs (y, y_LOO); +stk_figure ('stk_example_kb10 (b)'); stk_plot_histnormres (res_LOO.norm_res); + +% Note that the three previous lines can be summarized, +% if you only need the two diagnostic plots, as: +% +% stk_predict_leaveoneout (M_prior, x, y); +% +% (calling stk_predict_leaveoneout with no output arguments creates the plots). diff --git a/inst/examples/02_design_of_experiments/stk_example_doe01.m b/inst/examples/02_design_of_experiments/stk_example_doe01.m new file mode 100644 index 0000000..b6357d8 --- /dev/null +++ b/inst/examples/02_design_of_experiments/stk_example_doe01.m @@ -0,0 +1,77 @@ +% STK_EXAMPLE_DOE01 Examples of two-dimensional designs +% +% All designs are constructed on the hyper-rectangle BOX = [0; 2] x [0; 4]. +% +% Examples of the following designs are shown: +% a) Regular grid --> stk_sampling_regulargrid, +% b) "Maximin" latin hypercube sample --> stk_sampling_maximinlhs, +% c) RR2-scrambled Halton sequence --> stk_sampling_halton_rr2, +% d) Uniformly distributed random sample --> stk_sampling_randunif. + +% Copyright Notice +% +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + +DIM = 2; % dimension of the factor space +BOX = [0 0; 2 4]; % factor space +N = 49; % size of the space-filling designs + +stk_figure (sprintf ('stk_exampke_doe01 - Several designs with N = %d', N)); + +PLOT_OPTIONS = {'ko', 'MarkerSize', 4, 'MarkerFaceColor', 'k'}; + + +%% Regular grid + +x = stk_sampling_regulargrid (N, DIM, BOX); +stk_subplot (2, 2, 1); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); +stk_title ('a) Regular grid'); + + +%% "Maximin" Latin Hypercube samples + +x = stk_sampling_maximinlhs (N, DIM, BOX); +stk_subplot (2, 2, 2); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); +stk_title ('b) "Maximin" LHS'); + + +%% Halton sequence with RR2 scrambling + +x = stk_sampling_halton_rr2 (N, DIM, BOX); +stk_subplot (2, 2, 3); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); +stk_title ('c) Halton-RR2'); + + +%% Random (uniform) sampling + +x = stk_sampling_randunif (N, DIM, BOX); +stk_subplot (2, 2, 4); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); +stk_title ('d) Random'); + + +%!test stk_example_doe01; close all; diff --git a/inst/examples/02_design_of_experiments/stk_example_doe02.m b/inst/examples/02_design_of_experiments/stk_example_doe02.m new file mode 100644 index 0000000..8fbde94 --- /dev/null +++ b/inst/examples/02_design_of_experiments/stk_example_doe02.m @@ -0,0 +1,87 @@ +% STK_EXAMPLE_DOE02 "Sequential Maximin" design +% +% In this example, a two-dimensional space-filling design is progressively +% enriched with new points using a "sequential maximin" approach. More +% precisely, the k-th point X(k, :) is selected to maximize the distance to the +% set of all previously selected points X(1, :), X(2, :), ..., X(k-1, :). +% +% NOTES: +% +% * The resulting design is NOT optimal with respect to the maximin criterion +% (separation distance). +% +% * This procedure is not truly a *sequential* design procedure, since the +% choice of the k-th point X(k, :) does NOT depend on the response at the +% previously selected locations X(i, :), i < k. +% +% REFERENCE +% +% [1] Emmanuel Vazquez and Julien Bect, "Sequential search based on kriging: +% convergence analysis of some algorithms", In: ISI - 58th World +% Statistics Congress of the International Statistical Institute (ISI'11), +% Dublin, Ireland, August 21-26, 2011. + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_doe02'); + + +%% Preliminaries + +DIM = 2; BOX = repmat ([0; 1], 1, DIM); + +% start from, e. g., a random/maximin LHS +N0 = 10; x = stk_sampling_maximinlhs (N0, DIM, BOX); + +% final size of the desired DoE +NB_ITER = 10; + +% plot styles +STYLE_CURRENT = {'bo', 'MarkerFaceColor', 0.7 * ones(1, 3)}; +STYLE_NEXT = {'ro', 'MarkerFaceColor', 'y'}; + + +%% Sequential design +% +% This section can be run several times, to produce a bigger DoE ! +% + +for i = 1:NB_ITER, + % compute the current fill distance + % & the point where the maximum is attained + [fd, next_x] = stk_filldist (x, BOX); + % plot + cla; plot (x(:, 1), x(:, 2), STYLE_CURRENT{:}); + hold on; plot (next_x(:, 1), next_x(:, 2), STYLE_NEXT{:}); + stk_title (sprintf ('n = %d, fd = %.2e\n', size (x, 1), fd)); + drawnow; pause (0.5); + % enrich the DoE + x = [x; next_x]; +end + + +%!test stk_example_doe02; close all; diff --git a/inst/examples/02_design_of_experiments/stk_example_doe03.m b/inst/examples/02_design_of_experiments/stk_example_doe03.m new file mode 100644 index 0000000..e1d5816 --- /dev/null +++ b/inst/examples/02_design_of_experiments/stk_example_doe03.m @@ -0,0 +1,183 @@ +% STK_EXAMPLE_DOE03 A simple illustration of 1D Bayesian optimization +% +% Our goal here is to optimize (maximize) the one-dimensional function +% +% x |--> x * sin (x) +% +% over the interval [0; 4 * pi]. +% +% A Matern 5/2 prior with known parameters is used. +% +% Evaluations points are chosen sequentially using the Expected Improvement (EI) +% criterion, starting from an initial design of N0 = 3 points. + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2020 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_doe03'); + + +%% Problem definition +% +% Here we define a one-dimensional maximization problem. +% +% The goal is to find the maximum of f on the domain BOX. +% + +% 1D test function +f = @(x)(x .* sin (x)); % Define a 1D test function +DIM = 1; % Dimension of the factor space +BOX = stk_hrect ([0; 12], {'x'}); % Factor space (hyper-rectangle object) + +% Space discretization +NT = 400; % Number of points in the grid +xg = stk_sampling_regulargrid (NT, DIM, BOX); + +% Give explicit names to the points of the grid +xg.rownames = arrayfun ... + (@(i)(sprintf ('xg(%03d)', i)), 1:NT, 'UniformOutput', false)'; + +% Values of the function on the grid +zg = stk_feval (f, xg); +zg.colnames = {'z'}; + + +%% Initial design of experiments +% +% We start with an initial design of N0 points, regularly spaced on the domain. +% + +% Size of the initial design +N0 = 3; + +% Construction of the initial design +x0 = stk_sampling_regulargrid (N0, DIM, BOX); + +% Give explicit names to the points in the initial design +x0.rownames = arrayfun ... + (@(i)(sprintf ('x0(%03d)', i)), 1:N0, 'UniformOutput', false)'; + +% Values of the function on the initial design +z0 = stk_feval (f, x0); +z0.colnames = {'z'}; + + +%% Specification of the model (Gaussian process prior) +% +% We choose a Matern 5/2 covariance with "fixed parameters" (in other +% words, the variance and range parameters of the covariance function are +% provided by the user rather than estimated from data). +% +% NOTE: in a "real life" application, the hyper-parameters would not be +% fixed but estimated from data. Fixed parameters are used here for the +% sake of illustration: estimating them would require a larger initial +% design, which in turn would spoil the fun from a sequential design point +% of view (because the example is very simple). + +model = stk_model (@stk_materncov52_iso); +% NOTE: the suffix '_iso' indicates an ISOTROPIC covariance function, but the +% distinction isotropic / anisotropic is irrelevant here since DIM = 1. + +% Parameters for the Matern covariance function +% ("help stk_materncov52_iso" for more information) +SIGMA2 = 4.0 ^ 2; % Variance parameter +RHO = 2.0; % Length scale (range) parameter +model.param = log ([SIGMA2; 1/RHO]); + +% Play with the parameter of the model to understand their influence on the +% behaviour of the algorithm ! + + +%% Sequential design of experiments +% +% Here, evaluations points are chosen sequentially using the Expected +% Improvement (EI) criterion, starting from the initial design defined above. +% +% The algorithm stops when either the maximum number of iterations is reached or +% the maximum of the EI criterion falls below some threshold. +% + +% Start with the initial design defined above +data = [x0, z0]; + +% Number of points to be added adaptively +NB_ITER = 20; + +% Current value of the maximum of the Expected Improvement +EI_max = +inf; + +% Value of EI_max for the stopping criterion +EI_max_stop = (max (zg) - min (zg)) / 1e5; + +% Iteration number +iter = 0; + +while (iter < NB_ITER) && (EI_max > EI_max_stop), + + % Trick: add a small "regularization" noise to our model + model.lognoisevariance = 2 * log (min (1e-4, EI_max / 1e3)); + + % Carry out the kriging prediction + z_pred = stk_predict (model, data.x, data.z, xg); + + % Compute the Expected Improvement (EI) criterion on the grid + % (note the minus signs to address a *maximization* problem) + EI_val = stk_sampcrit_ei_eval (-z_pred.mean, sqrt (z_pred.var), -data.z); + + % Pick the point where the EI is maximum as our next evaluation point + [EI_max, i_max] = max (EI_val); + + % Figure: upper panel + stk_subplot (2, 1, 1); cla; + stk_plot1d (data.x, data.z, xg, zg, z_pred); xlim (BOX); hold on; + plot (xg(i_max), zg(i_max), 'ro', 'MarkerFaceColor', 'y'); + + % Figure: lower panel + stk_subplot (2, 1, 2); cla; + plot (xg, EI_val); xlim (BOX); hold on; + plot (xg(i_max), EI_max, 'ro', 'MarkerFaceColor', 'y'); + stk_ylabel ('EI'); + + if EI_max > EI_max_stop, + % Add the new evaluation to the DoE + new_row = [xg(i_max, :), zg(i_max, :)]; + data = [data; new_row]; %#ok + iter = iter + 1; + end + + drawnow; %pause (0.2); + +end + +% Display the final DoE +disp (data); + +% Total number of evaluations ? +fprintf ('\nNumber of evaluations: %d + %d = %d.\n\n', N0, iter, N0 + iter); + + +%!test stk_example_doe03; close all; diff --git a/inst/examples/02_design_of_experiments/stk_example_doe04.m b/inst/examples/02_design_of_experiments/stk_example_doe04.m new file mode 100644 index 0000000..f122224 --- /dev/null +++ b/inst/examples/02_design_of_experiments/stk_example_doe04.m @@ -0,0 +1,103 @@ +% STK_EXAMPLE_DOE04 Probability of misclassification +% +% The upper panel shows posterior means and variances as usual, and the +% threshold of interest, which is at T = 0.85 (dashed line). +% +% The lower panel shows the probability of misclassification as a function of x +% (blue curve), i.e., the probability that the actual value of the function is +% not on the same side of the threshold as the prediction (posterior mean). +% +% We also plot the expected future probability of misclassification (magenta +% curve), should a new evaluation be made at x = 3. +% +% Note that both probabilities are obtained using stk_pmisclass. + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_doe04'); + +T = 0.85; + +f = @sin; % test function +DIM = 1; % dimension of the factor space +BOX = [0.0; 3.0]; % factor space + +x_obs = stk_dataframe ([0 0.2 0.4 1.5 2.0]', {'x'}); +z_obs = stk_feval (f, x_obs); + +n = 400; +x = stk_sampling_regulargrid (n, DIM, BOX); x.colnames = {'x'}; +z = stk_feval (f, x); + +model = stk_model (@stk_materncov52_iso); +model.param = log ([0.1 0.8]); + + +%% Current probability of misclassification +% +% Here we plot the CURRENT probability of misclassification of the response with +% respect to the threshold T---i.e., the probability of misclassification given +% the available data (x_obs, z_obs). + +z_pred = stk_predict (model, x_obs, z_obs, x); + +pmisclass = stk_pmisclass (T, z_pred); + +subplot (2, 1, 1); stk_plot1d (x_obs, z_obs, x, z, z_pred); +hold on; plot (xlim, T * [1 1], 'k--'); + +subplot (2, 1, 2); plot (x, pmisclass); +ylim ([0; 0.5]); stk_ylabel ('pmisclass'); + + +%% Expected future probability of misclassification +% +% Now we plot the EXPECTED FUTURE probability of misclassification for an +% additional evaluation at xnew---i.e, the expectation of the probability of +% misclassification given the available data (x_obs, z_obs) and the future +% response (x_new, f(x_new)). Teh expectation is taken with respect to the +% unknown future response f(x_new). + +xnew = 3.0; % Location of the next evaluation + +[z_pred, ignore_lambda, ignore_mu, Kpost_all] = ... + stk_predict (model, x_obs, z_obs, [x; xnew]); +% Note: in recent versions of Octave or Matlab, you can use ~ to +% ignore unwanted output arguments + +xihat_xt = z_pred(1:n, :); + +K12 = Kpost_all(1:n, end); % Posterior covariance between locations x and x_new +K22 = Kpost_all(end, end); % Posterior variance at xnew + +expected_pmisclass = stk_pmisclass (T, xihat_xt, K12, K22); + +hold on; plot (x, expected_pmisclass, 'm'); + +legend ('current pmisclass', 'expected pmisclass', 'Location', 'SouthWest') + +%!test stk_example_doe04; close all; diff --git a/inst/examples/02_design_of_experiments/stk_example_doe05.m b/inst/examples/02_design_of_experiments/stk_example_doe05.m new file mode 100644 index 0000000..84be3e2 --- /dev/null +++ b/inst/examples/02_design_of_experiments/stk_example_doe05.m @@ -0,0 +1,205 @@ +% STK_EXAMPLE_DOE05 A simple illustration of 1D Bayesian optimization +% +% Our goal here is to minimize the one-dimensional function +% +% x |--> x * sin (x) +% +% over the interval [0; 4 * pi], using noisy evaluations. +% +% Evaluations points are chosen sequentially using either AKG criterion +% (default) or the EQI criterion (set SAMPCRIT_NAME to 'EQI'); + +% Copyright Notice +% +% Copyright (C) 2015-2017, 2020 CentraleSupelec +% Copyright (C) 2016 EDF R&D +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Tom Assouline, Florent Autret & Stefano Duhamel (for EDF R&D) + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_doe05'); + + +%% Problem definition +% Here we define a one-dimensional optimization problem. +% The goal is to find the minimum of f on the domain BOX. + +% 1D test function +f = @(x)(x .* sin (x)); % Define a 1D test function... +% f = @(x)((x - 6) .^ 2) % ...or another one? +DIM = 1; % Dimension of the factor space +BOX = stk_hrect ([0; 12], {'x'}); % Factor space (hyper-rectangle object) + +% Variance of the observation noise +NOISE_VARIANCE = 2 ^ 2; + +% Space discretization +GRID_SIZE = 200; % Number of points in the grid +xg = stk_sampling_regulargrid (GRID_SIZE, DIM, BOX); + +% Give explicit names to the points of the grid +xg.rownames = arrayfun ... + (@(i)(sprintf ('xg(%03d)', i)), 1:GRID_SIZE, 'UniformOutput', false)'; + +% Values of the function on the grid +zg = stk_feval (f, xg); +zg.colnames = {'z'}; + + +%% Parameters affecting the sequential design algorithm + +N0 = 5; % Size of the initial (regularly spaced) design +BUDGET = 100; % Total evaluation budget +REESTIM_PERIOD = 10; % How often should we re-estimate the cov parameters ? +SAMPCRIT_NAME = 'AKG'; % Choose a particular sampling criterion + +% Note: the three criteria proposed here compute an "expected improvement" of +% some kind. As such, they return positive values, and must be maximized. + +switch SAMPCRIT_NAME + case 'EQI' + QUANTILE_ORDER = 0.5; + POINT_BATCH_SIZE = @(x, n) BUDGET - n; + sampcrit = stk_sampcrit_eqi ([], QUANTILE_ORDER, POINT_BATCH_SIZE); + case 'AKG' + % Use the "approximate KG" criterion, with Scott's original method + % for the construction of the reference grid (i.e., taking past + % observations points plus the candidate point as the reference grid). + sampcrit = stk_sampcrit_akg (); + case 'KG' + % Use the "exact KG" criterion, with can be obtained by taking the + % reference grid equal to the entire input grid + sampcrit = stk_sampcrit_akg ([], xg); +end + + +%% Initial design of experiments + +% Construction of the initial design +x0 = stk_sampling_regulargrid (N0, DIM, BOX); + +% Give explicit names to the points in the initial design +x0.rownames = arrayfun ... + (@(i)(sprintf ('init%03d', i)), 1:N0, 'UniformOutput', false)'; + +% Simulate noisy observations of the initial design +z0 = stk_feval (f, x0); z0.colnames = {'z'}; +z0 = z0 + sqrt (NOISE_VARIANCE) * randn (size (z0)); + + +%% Specification of the model (Gaussian process prior) + +model0 = stk_model (@stk_materncov52_iso); + +% Assume that the variance of the observation noise is known +model0.lognoisevariance = log (NOISE_VARIANCE); + +% Add a prior on covariance parameters (log (sigma^2), log (1/rho)) +model0.prior.mean = log ([1.0; 1/4.0]); +model0.prior.invcov = diag (1 ./ [+inf log(2)^2]); + + +%% Sequential design of experiments +% Here, evaluations points are chosen sequentially using the sampling criterion, +% starting from the initial design defined above. + +% Plot only once in a while +PLOT_PERIOD = 5; + +% Start from the initial design +x = x0; +z = z0; + +for iter = 1:(BUDGET - N0) + + if mod (iter, REESTIM_PERIOD) == 1 + % Create posterior model object from scratch + % (covariance function parameters estimated by marginal MAP) + model = stk_model_gpposterior (model0, x, z); + else + % Update posterior model object + % (covariance function parameters not re-estimated) + model = stk_model_update (model, x_new, z_new); + end + + % Instanciate sampling criterion object with model + sampcrit.model = model; + + % Compute the sampling criterion on the grid + [crit_val, z_pred] = sampcrit (xg); + + if mod (iter, PLOT_PERIOD) == 1 + + % Figure: upper panel + stk_subplot (2, 1, 1); cla; + stk_plot1d ([],[], xg, zg, z_pred); + hold on; plot (x, z, 'k.'); + title (sprintf ('n = %d + %d = %d.\n\n', N0, iter - 1, N0 + iter - 1)); + + % Figure: lower panel + stk_subplot (2, 1, 2); cla; + plot (xg, crit_val); xlim (BOX); ylabel (SAMPCRIT_NAME); + + end + + % Stop if the criterion becomes equal to zero everywhere + if all (crit_val == 0), break; end + + % Pick the point where the sampling criterion is maximum + % as our next evaluation point + [crit_max, i_max] = max (crit_val); + x_new = xg(i_max, :); + + % Simulate a new observation at the selected location + z_new = zg(i_max, :) + sqrt (NOISE_VARIANCE) * randn; + + % Indicate new point on the lower panel + if mod (iter, PLOT_PERIOD) == 1 + hold on; plot (x_new, crit_max, 'ro', 'MarkerFaceColor', 'y'); + end + + % Add the new evaluation to the DoE + x = [x; x_new]; + z = [z; z_new]; + + drawnow; % pause + +end + +% Display the final DoE +data = stk_dataframe ([x z], {'x', 'z'}); disp (data); + +% Premature stopping ? +if iter < (BUDGET - N0) + warning ('The algorithm stopped prematurely.'); + iter = iter - 1; +end + +% Total number of evaluations ? +fprintf ('\nNumber of evaluations: %d + %d = %d.\n\n', N0, iter, N0 + iter); + + +%#ok<*AGROW> + +%!test stk_example_doe05; close all; diff --git a/inst/examples/02_design_of_experiments/stk_example_doe06.m b/inst/examples/02_design_of_experiments/stk_example_doe06.m new file mode 100644 index 0000000..e6d5e66 --- /dev/null +++ b/inst/examples/02_design_of_experiments/stk_example_doe06.m @@ -0,0 +1,246 @@ +% STK_EXAMPLE_DOE06 Sequential design for the estimation of an excursion set +% +% In this example, we consider the problem of estimating the set +% +% Gamma = { x in X | f(x) > z_crit }, +% +% where z_crit is a given value, and/or its volume. +% +% In a typical "structural reliability analysis" problem, Gamma would +% represent the failure region of a certain system, and its volume would +% correspond to the probability of failure (assuming a uniform distribution +% for the input). +% +% A Matern 5/2 prior with known parameters is used for the function f, and +% the evaluations points are chosen sequentially using any of the sampling +% criterion described in [1] (see also [2], section 4.3). +% +% REFERENCE +% +% [1] B. Echard, N. Gayton and M. Lemaire (2011). AK-MCS: an active +% learning reliability method combining Kriging and Monte Carlo +% simulation. Structural Safety, 33(2), 145-154. +% +% [2] J. Bect, D. Ginsbourger, L. Li, V. Picheny and E. Vazquez (2012). +% Sequential design of computer experiments for the estimation of a +% probability of failure. Statistics and Computing, 22(3), 773-793. + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% Problem definition + +% Variables names +input_name = 'x'; +output_name = 'z'; + +% 1D test function +f = @(x)(x .* (sin (24 * x .^ 0.7) - 0.3)); +x_domain = stk_hrect ([0; 1], {input_name}); + +% Threshold +z_crit = 0.15; + + +%% Monte Carlo + +% Choose a MC sample size that would produce an estimate of the volume of +% the set with standard deviation <= 0.005 (0.5% of the total volume). +MC_target_std = 0.005; +MC_sample_size = 0.25 / (MC_target_std ^ 2); % = 10 000 + +% Draw a MC sample in the input domain +x_MC = stk_sampling_randunif (MC_sample_size, [], x_domain); +x_MC.rownames = arrayfun (@(i)(sprintf ('MC point #%05d', i)), ... + 1:MC_sample_size, 'UniformOutput', false)'; +x_MC = sort (x_MC, 'ascend'); % Better for plotting + +% Compute the MC estimator, which will be our reference value for the +% volume. Note that here we evaluate f on the entire MC set, but ONLY to +% get the reference value (we do not use these evaluations below !). +z_MC = stk_feval (f, x_MC); +z_MC.colnames = {output_name}; +vol_ref = mean (z_MC > z_crit); + +fprintf ('Volume (reference value): %.2f%%\n', vol_ref * 100); + + +%% Plot problem + +% Spatial discretization (used for plotting only) +grid_size = 1000; +x_grid = stk_sampling_regulargrid (grid_size, [], x_domain); +x_grid.rownames = arrayfun ... + (@(i)(sprintf ('grid point #%03d', i)), 1:grid_size, 'UniformOutput', false)'; + +% Values of the response on the grid +z_grid = stk_feval (f, x_grid); +z_grid.colnames = {output_name}; + +stk_figure ('stk_example_doe06: Ground truth'); +plot (x_grid, z_grid, 'b'); hold on; +b = z_grid > z_crit; tmp = z_grid; tmp(~b) = nan; +plot (x_grid, tmp, 'r', 'LineWidth', 3); clear tmp; +plot (xlim, z_crit * [1 1], 'r--'); +title ('Groung truth'); +legend ('z = f(x), below z_{crit}', 'z = f(x), above z_{crit}', ... + 'z_{crit}', 'Location', 'SouthWest'); + + +%% Initial design of experiments + +% Start with an initial design of N0 points, regularly spaced on the domain. +n_init = 4; +x_init = stk_sampling_regulargrid (n_init, [], x_domain); +x_init.rownames = arrayfun ... + (@(i)(sprintf ('initial design #%d', i)), 1:n_init, 'UniformOutput', false)'; + +% Values of the function on the initial design +z_init = stk_feval (f, x_init); +z_init.colnames = {output_name}; + +data_init = [x_init, z_init]; display (data_init); + + +%% Specification of a Gaussian process prior + +% Same as in stk_example_doe03 (read explanation there). +model = stk_model (@stk_materncov52_iso); +SIGMA2 = 4.0 ^ 2; % Variance parameter +RHO = 0.5; % Length scale (range) parameter +model.param = log ([SIGMA2; 1/RHO]); + + +%% Sequential design of experiments + +% Start with the initial design defined above +data = data_init; + +% Iteration number & maximal number of points to be added adaptively +NB_ITER = 50; + +% Upper bound on the posterior std of the volume & target accuracy +vol_std_ub = +inf; +vol_std_tol = MC_target_std * 0.1; + +% Prepare monitoring plot +h_monit = stk_figure ('stk_example_doe06: Monitor'); + +% Record history of volume estimates & misclassification counts +vol_hist = nan (n_init - 1, 1); +nmisclass_hist = nan (n_init - 1, 1); + +% Choose which volume estimator to use: 'plugin' or 'bayes' +% (this does not impact the sequence of points that we choose) +vol_estim_type = 'plugin'; + +for iter = 0:NB_ITER + fprintf ('Iteration #%d\n', iter + 1); + fprintf ('| Current sample size: n = %d\n', n_init + iter); + + % Trick: add a small "regularization" noise to our model + model.lognoisevariance = log (SIGMA2 * 1e-12); + + % Carry out the kriging prediction + M_post = stk_model_gpposterior (model, data.x, data.z); + z_MC_pred = stk_predict (M_post, x_MC); + + % Count misclassified samples + % (this is for educational purposes: we are not supposed to know z_MC) + nmisclass = sum ((z_MC_pred.mean > z_crit) ~= (z_MC > z_crit)); + nmisclass_hist = [nmisclass_hist; nmisclass]; %#ok + + % Compute "maximal probability of misclassification" criterion + % (equivalent to EGL's criterion, but better-looking on plots) + [p, q] = stk_distrib_normal_cdf ... + (z_crit, z_MC_pred.mean, sqrt (z_MC_pred.var)); + crit_val = min (p, q); + + % Compute volume estimate + if strcmp (vol_estim_type, 'bayes') + vol_estim = mean (q); + else + assert (strcmp (vol_estim_type, 'plugin')); + vol_estim = mean (z_MC_pred.mean > z_crit); + end + vol_hist = [vol_hist; vol_estim]; %#ok + fprintf ('| Volume estimate (%s): %.5f [ref: %.5f]\n', ... + vol_estim_type, vol_estim, vol_ref); + + % Compute an upper-bound on the posterior std of the estimator + if strcmp (vol_estim_type, 'bayes') + vol_std_ub = sqrt (mean (p .* q)); + else + vol_std_ub = sqrt (mean (min (p, q))); + end + fprintf ('| Upper-bound on posterior std: %.4e [target: %.3e]\n', ... + vol_std_ub, vol_std_tol); + + % Pick the point where the criterion is maximal + [crit_max, i_max] = max (crit_val); + + % Figure: upper panel + figure (h_monit); stk_subplot (2, 1, 1); cla; + stk_plot1d (data.x, data.z, x_grid, z_grid, stk_predict (M_post, x_grid)); + xlim (x_domain); hold on; plot (xlim, z_crit * [1 1], 'r--'); + plot (x_MC(i_max), z_MC_pred.mean(i_max), 'ro', 'MarkerFaceColor', 'y'); + + % Figure: lower panel + stk_subplot (2, 1, 2); cla; + plot (x_MC, crit_val, 'Linewidth', 2); xlim (x_domain); hold on; + plot (x_MC(i_max), crit_max, 'ro', 'MarkerFaceColor', 'y'); + stk_ylabel ('criterion'); + + if (iter >= NB_ITER) || (vol_std_ub <= vol_std_tol) + break + end + + % Add the new evaluation to the DoE + data = [data; [x_MC(i_max, :), z_MC(i_max, :)]]; %#ok + + drawnow (); % pause (0.5); +end + +% Display full history: DoE + volume estimates +vol_err = vol_hist - vol_ref; +estim_history = stk_dataframe ([vol_hist vol_err nmisclass_hist], ... + {'vol_estim' 'vol_err', 'nmisclass'}); +history = [data estim_history]; display (history); + +% Display final result +fprintf ('Final result:\n'); +fprintf ('| Number of evaluations: %d + %d = %d.\n', ... + n_init, iter, n_init + iter); +fprintf ('| Volume estimate (%s): %.4f%% [ref: %.4f%%]\n\n', ... + vol_estim_type, vol_estim * 100, vol_ref * 100); + + +%#ok<*SPERR> + +%!test stk_example_doe06; close all; diff --git a/inst/examples/03_miscellaneous/stk_example_misc01.m b/inst/examples/03_miscellaneous/stk_example_misc01.m new file mode 100644 index 0000000..e3aaa69 --- /dev/null +++ b/inst/examples/03_miscellaneous/stk_example_misc01.m @@ -0,0 +1,76 @@ +% STK_EXAMPLE_MISC01 Several correlation functions from the Matern family +% +% The Matern 1/2 correlation function is also known as the "exponential correla- +% tion function". This is the correlation function of an Ornstein-Ulhenbeck pro- +% cess. +% +% The Matern covariance function tends to the Gaussian correlation function when +% its regularity (smoothness) parameter tends to infinity. +% +% See also: stk_materncov_iso, stk_materncov_aniso + +% Copyright Notice +% +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_misc01'); + + +%% List of correlation functions + +SIGMA2 = 1.0; % variance parameter +RHO1 = 1.0; % scale (range) parameter + +% kriging with constant mean function (ordinary kriging) +list_cov = {... + 'Matern 1/2', 'stk_materncov_iso', log([SIGMA2; 0.5; 1/RHO1]); ... + 'Matern 3/2', 'stk_materncov32_iso', log([SIGMA2; 1/RHO1]); ... + 'Matern 5/2', 'stk_materncov52_iso', log([SIGMA2; 1/RHO1]); ... + 'Matern 8.0', 'stk_materncov_iso', log([SIGMA2; 8.0; 1/RHO1]); ... + 'Gaussian', 'stk_gausscov_iso', log([SIGMA2; 1/RHO1]) }; + +NB_COVARIANCE_FUNCTIONS = size (list_cov, 1); + + +%% Visualisation + +x1 = 0.0; +x2 = stk_sampling_regulargrid (1000, 1, [-5; 5]); + +col = {'r', 'b', 'g', 'k', 'm--'}; + +for j = 1:NB_COVARIANCE_FUNCTIONS, + covfun = list_cov{j, 2}; + param = list_cov{j, 3}; + plot (x2, feval (covfun, param, x1, x2 ), col{j}); + hold on; +end + +stk_labels ('x', 'correlation r(x)'); legend (list_cov{:, 1}); +stk_title ('Some members of the Matern family'); + + +%!test stk_example_misc01; close all; diff --git a/inst/examples/03_miscellaneous/stk_example_misc02.m b/inst/examples/03_miscellaneous/stk_example_misc02.m new file mode 100644 index 0000000..dbb05ad --- /dev/null +++ b/inst/examples/03_miscellaneous/stk_example_misc02.m @@ -0,0 +1,136 @@ +% STK_EXAMPLE_MISC02 How to use priors on the covariance parameters +% +% A Matern covariance in dimension one is considered as an example. A Gaussian +% prior is used for all three parameters: log-variance, log-regularity and log- +% inverse-range. The corresponding parameter estimates are Maximum A Posteriori +% (MAP) estimates or, more precisely, Restricted MAP (ReMAP) estimates. +% +% Several values for the variance of the prior are successively considered, to +% illustrate the effect of this prior variance on the parameter estimates. When +% the variance is small, the MAP estimate is close to the mode of the prior. On +% the other hand, when the variance is large, the prior becomes "flat" and the +% MAP estimate is close to the ReML estimate (see figure b). + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% DEFINE AN ARTIFICIAL ONE-DIMENSIONAL DATASET + +DIM = 1; % dimension of the factor space +BOX = [0.0; 1.0]; % factor space + +xi = [0.25; 0.26; 0.50; 0.60]; +zi = [1.00; 1.10; 0.20; 0.35]; + + +%% SPECIFICATION OF THE MODEL & REML ESTIMATION + +model = stk_model (@stk_materncov_iso); + +% small "regularization noise". +model.lognoisevariance = 2 * log (1e-6); + +% Mode of the prior on the parameters of the Matern covariance +% (also serves as an initial guess for the optimization) +SIGMA2 = 1.0; % variance parameter +NU = 2.0; % regularity parameter +RHO1 = 0.4; % scale (range) parameter +param0 = log ([SIGMA2; NU; 1/RHO1]); + +% Estimate covariance parameters (without prior) +model.param = stk_param_estim (model, xi, zi, param0); +param_opt_reml = model.param; + + +%% EXPERIMENT WITH SEVERAL VALUES FOR PRIOR VARIANCES + +std_list = [10 1 0.2 0.01]; + +NT = 400; % nb of points in the grid +xt = stk_sampling_regulargrid (NT, DIM, BOX); + +stk_figure ('stk_example_misc02 (a)'); + +param_opt = zeros (length (param0), length (std_list)); +for k = 1:length (std_list), + + % Prior on the parameters of the Matern covariance + model.prior.mean = param0; + model.prior.invcov = eye (length (param0)) ./ (std_list(k)^2); + + % Estimate covariance parameters (with a prior) + model.param = stk_param_estim (model, xi, zi, param0); + param_opt(:, k) = model.param; + + % Carry out kriging prediction + zp = stk_predict (model, xi, zi, xt); + + % Plot predicted values and pointwise confidences intervals + stk_subplot (2, 2, k); stk_plot1d (xi, zi, xt, [], zp); + stk_labels ('input x', 'predicted output z'); + stk_title (sprintf ('prior std = %.2f', std_list(k))); +end + + +%% FIGURE: ESTIMATED PARAMETER VERSUS PRIOR STD + +stk_figure ('stk_example_misc02 (b)'); + +param_name = {'SIGMA2', 'NU', '1/RHO'}; + +for j = 1:3, + + stk_subplot (2, 2, j); + + % estimated parameter versus prior std + h = semilogx (std_list, exp (param_opt(j, :)), 'ko-'); + set (h, 'LineWidth', 2, 'MarkerFaceColor', 'y'); + stk_labels ('prior std', param_name{j}); + + % add an horizontal line showing the value of REML estimation + hold on; semilogx (xlim, exp (param_opt_reml(j)) * [1 1], 'r--'); + + % add a second horizontal line showing the mode of the prior + hold on; semilogx (xlim, exp (param0(j)) * [1 1], 'b--'); + + % adjust ylim + yy = exp ([param_opt(j, :) param_opt_reml(j) param0(j)]); + ylim_min = min (yy); ylim_max = max (yy); delta = ylim_max - ylim_min; + ylim ([ylim_min - 0.05*delta ylim_max + 0.05*delta]); + +end + +if ~ strcmp (graphics_toolkit (), 'gnuplot') + h1 = legend ('MAP estimates', 'REML estimate', 'mode of the prior'); + h2 = stk_subplot (2, 2, 4); axis off; + set (h1, 'Position', get (h2, 'Position')); +end + + +%!test stk_example_misc02; close all; diff --git a/inst/examples/03_miscellaneous/stk_example_misc03.m b/inst/examples/03_miscellaneous/stk_example_misc03.m new file mode 100644 index 0000000..413d4bc --- /dev/null +++ b/inst/examples/03_miscellaneous/stk_example_misc03.m @@ -0,0 +1,95 @@ +% STK_EXAMPLE_MISC03 How to deal with (known) seasonality + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome + + +%% Sinusoid + noise + +t_obs = (0:0.05:12)'; +S_obs = sin (t_obs + 0.3) + 0.1 * randn (size (t_obs)); + +stk_figure ('stk_example_misc03'); plot (t_obs, S_obs, 'k.'); +stk_labels ('month number t', 'sunspots S'); + +t = (0:0.01:30)'; + + +%% Gaussian process model with constant prior mean + +model = stk_model (@stk_materncov52_iso); +model.lognoisevariance = nan; + +% Initial guess for the parameters of the Matern covariance +[param0, lnv0] = stk_param_init (model, t_obs, S_obs); + +% Estimate the parameters +[model.param, model.lognoisevariance] = stk_param_estim ... + (model, t_obs, S_obs, param0, lnv0); + +% Carry out the kriging prediction +S_posterior = stk_predict (model, t_obs, S_obs, t); + +% Display the result +hold on; plot (t, S_posterior.mean, 'r-'); + + +%% Gaussian process model with seasonality + +% Periodicity assumed to be known +T0 = 2 * pi; + +% Construct a prior model with sinusoidal trend +model2 = stk_model (@stk_materncov52_iso); +model2.lm = @(t)([ones(length(t),1) sin(2*pi*t/T0) cos(2*pi*t/T0)]); +model2.lognoisevariance = nan; + +% Initial guess for the parameters of the Matern covariance +[param0, lnv0] = stk_param_init (model2, t_obs, S_obs); + +% Estimate the parameters +[model2.param, model2.lognoisevariance] = ... + stk_param_estim (model2, t_obs, S_obs, param0, lnv0); + +% Carry out the kriging prediction +S_posterior = stk_predict (model2, t_obs, S_obs, t); + +% Display the result +hold on; plot (t, S_posterior.mean, 'g-'); + + +%% Display models + +model +model2 + + +%#ok<*NOPTS> + +%!test stk_example_misc03; close all; diff --git a/inst/examples/03_miscellaneous/stk_example_misc04.m b/inst/examples/03_miscellaneous/stk_example_misc04.m new file mode 100644 index 0000000..4c58aaa --- /dev/null +++ b/inst/examples/03_miscellaneous/stk_example_misc04.m @@ -0,0 +1,102 @@ +% STK_EXAMPLE_MISC04 Pareto front simulation +% +% DESCRIPTION +% +% We consider a bi-objective optimization problem, where the objective +% functions are modeled as a pair of independent stationary Gaussian +% processes with a Matern 5/2 anisotropic covariance function. +% +% Figure (a): represent unconditional realizations of the Pareto front and +% and estimate of the probability of being non-dominated at each point +% of the objective space. +% +% Figure (b): represent conditional realizations of the Pareto front and +% and estimate of the posteriorior probability of being non-dominated +% at each point of the objective space. +% +% EXPERIMENTAL FUNCTION WARNING +% +% This script uses the stk_plot_probdom2d function, which is currently +% considered an experimental function. Read the help for more information. +% +% REFERENCE +% +% [1] Michael Binois, David Ginsbourger and Olivier Roustant, Quantifying +% uncertainty on Pareto fronts with Gaussian Process conditional simu- +% lations, European J. of Operational Research, 2043(2):386-394, 2015. +% +% See also: stk_plot_probdom2d + +% Copyright Notice +% +% Copyright (C) 2017, 2019 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; + + +%% Objective functions + +DIM = 2; +BOX = [[0; 5] [0; 3]]; + +f1 = @(x) 4 * x(:,1) .^ 2 + 4 * x(:,2) .^ 2; +f2 = @(x) (x(:,1) - 5) .^ 2 + (x(:,2) - 5) .^ 2; + + +%% Data + +n_obs = 10; + +x_obs = stk_sampling_maximinlhs (n_obs, [], BOX); + +z_obs = zeros (n_obs, 2); +z_obs(:, 1) = f1 (x_obs.data); % Remark: f1 (x_obs) should be OK... +z_obs(:, 2) = f2 (x_obs.data); % ... but see Octave bug #49267 + + +%% Stationary GP models + +model1 = stk_model (@stk_materncov52_aniso, DIM); +model1.param = stk_param_estim (model1, x_obs, z_obs(:, 1)); + +model2 = stk_model (@stk_materncov52_aniso, DIM); +model2.param = stk_param_estim (model2, x_obs, z_obs(:, 2)); + +stk_figure ('stk_example_misc04 (a)'); + +stk_plot_probdom2d (model1, model2, BOX); + + +%% Conditionned GP models + +stk_figure ('stk_example_misc04 (b)'); + +stk_plot_probdom2d ( ... + stk_model_gpposterior (model1, x_obs, z_obs(:, 1)), ... + stk_model_gpposterior (model2, x_obs, z_obs(:, 2)), BOX); + + +%!test stk_example_misc04; close all; diff --git a/inst/examples/03_miscellaneous/stk_example_misc05.m b/inst/examples/03_miscellaneous/stk_example_misc05.m new file mode 100644 index 0000000..84f9b1b --- /dev/null +++ b/inst/examples/03_miscellaneous/stk_example_misc05.m @@ -0,0 +1,106 @@ +% STK_EXAMPLE_MISC05 Parameter estimation for heteroscedastic noise variance +% +% DESCRIPTION +% +% We consider a 1d prediction problem with noisy data, where the variance of +% the noise depends on the input location. +% +% A simple heteroscedastic model is used, where the only parameter to be +% estimated is a dispersion parameter (the square of a scale parameter). +% More preciesely, the variance of the noise is assumed to be of the form +% +% tau^2(x) = phi * (x + 1) ^ 2, +% +% and the dispersion parameter phi is estimated together with the parameters +% of the covariance function. +% +% EXPERIMENTAL FEATURE WARNING +% +% This script demonstrates an experimental feature of STK (namely, gaussian +% noise model objects). STK users that wish to experiment with it are +% welcome to do so, but should be aware that API-breaking changes are likely +% to happen in future releases. We invite them to direct any questions, +% remarks or comments about this experimental feature to the STK mailing +% list. +% +% See also: stk_example_kb09 + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +stk_disp_examplewelcome; stk_figure ('stk_example_misc05'); + +% Load a 1D noisy dataset (heteroscedastic Gaussian noise) +[xi, zi, ref] = stk_dataset_twobumps ('noisy2'); xt = ref.xt; zt = ref.zt; + + +%% Gaussian process model + +model = stk_model (@stk_materncov52_iso); + +% Variance of the heteroscedastic noise: tau^2(x) = exp(param) * (x + 1) ^ 2 +% (note that the true variance function for this dataset is not exactly of this form...) +model.lognoisevariance = stk_gaussiannoise_het0 (@(x) (x + 1) .^ 2, 1.0); + +% NOTE: yes, it feels a little weird to store a "noise model" in a field +% called "lognoisevariance"... but please keep in mind that this is just an +% experimental feature of STK for now ;-) + + +%% Parameter estimation + +% Currently stk_param_init does not support this noise variance model, +% and therefore we have to provide an explicit starting point for the +% estimation procedure +covparam0 = [0 0]; +gn0 = stk_gaussiannoise_het0 (@(x) (x + 1) .^ 2, 1.0); + +% ReML parameter estimation: here, we estimate jointly the parameters of the +% covariance function (log-variance, log-range) and the parameter of the +% variance function +[model.param, model.lognoisevariance] = ... + stk_param_estim (model, xi, zi, covparam0, gn0); + +% Display models +model, gn = model.lognoisevariance + + +%% Prediction + +zp = stk_predict (model, xi, zi, xt); + +% Display the result +stk_plot1d (xi, zi, xt, zt, zp); +h = stk_legend (); set (h, 'Location', 'NorthWest'); +stk_title ('Prediction and credible intervals'); +stk_labels ('input variable x', 'response z'); + + +%#ok<*NOPTS> + +%!test +%! stk_example_misc05; close all; +%! assert (isa (model.lognoisevariance, 'stk_gaussiannoise_het0')); diff --git a/inst/examples/datasets/stk_dataset_twobumps.m b/inst/examples/datasets/stk_dataset_twobumps.m new file mode 100644 index 0000000..5a47d05 --- /dev/null +++ b/inst/examples/datasets/stk_dataset_twobumps.m @@ -0,0 +1,152 @@ +% STK_DATASET_TWOBUMPS defines datasets based on the TwoBumps response function + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement (STK toolbox) +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +% Copying Permission Statement (this file) +% +% To the extent possible under law, Julien Bect and Emmanuel Vazquez +% have waived all copyright and related or neighboring rights to +% stk_dataset_twobumps.m. This work is published from France. +% +% License: CC0 + +function [xi, zi, ref] = stk_dataset_twobumps (dataset_name, simulate) + +if nargin < 2 + % Default: use saved versions of noisy datasets (for reproducibility) + simulate = false; +end + +ref.f = @stk_testfun_twobumps; + +% Factor space (i.e., input space) +ref.box = [-1.0; 1.0]; + +% Reference dataset +ref.xt = stk_sampling_regulargrid (400, [], ref.box); +ref.zt = stk_feval (ref.f, ref.xt); + +switch dataset_name + + case 'noiseless' + + % Indices of six evaluation points in xt + ref.xi_ind = [1 20 90 200 300 350]; + + % Evaluation points + xi = ref.xt(ref.xi_ind, 1); + + % Evaluation results + zi = stk_feval (ref.f, xi); + + case 'noisy1' + + % Number of noisy observations + n = 20; + + % Standard deviation of the (Gaussian) observation noise + ref.noise_std = 0.2; + + % Evaluation points on a regular grid + xi = stk_sampling_regulargrid (n, [], ref.box); + + % Standard Gaussian noise + if simulate + u = randn (n, 1); + else + u = [ ... + +2.494262357945395; -0.734979628183384; +0.482374373838845; ... + +0.723297790408916; -0.698828108725056; -0.544234733755390; ... + +0.200719359571192; +0.114419113713883; -2.430087055004133; ... + +0.982006706100309; +1.043148691468279; +0.332804939718977; ... + -0.014386709815515; -0.470223054833317; -0.504604762739981; ... + +1.214912259853930; -0.514268293209969; +0.195757395918953; ... + +1.517874831056133; +0.753351049482162]; + end + + % Evaluation results with homoscedastic Gaussian noise + zi = stk_feval (ref.f, xi) + ref.noise_std * u; + + case 'noisy2' + + % Standard deviation function of the heteroscedastic noise + ref.noise_std_func = @(x) 0.1 + (x + 1) .^ 2; + + % Evaluation points + xi1 = stk_sampling_regulargrid (30, [], ref.box); + xi2 = stk_sampling_regulargrid (50, [], [0; 1]); + xi = [xi1; xi2]; + n = size (xi, 1); + + % Standard deviation of the noise + ref.noise_std = ref.noise_std_func (xi.data); + + % Standard Gaussian noise + if simulate + u = randn (n, 1); + else + u = [ ... + -0.791478467901437; -1.762943052690207; -0.001299829346851; ... + +0.732147620330301; +0.605023011882157; -0.235236784824946; ... + +1.229945155335280; +0.886837017097442; +0.488261575509975; ... + +0.424488726533523; +1.754745494583444; -0.441222483623965; ... + +0.879192878193787; +0.324020151981654; +0.084432929005424; ... + -0.604693498668125; -0.031299228423533; +0.007433332039656; ... + -0.107529006311618; +0.890983601251905; -0.696857251549359; ... + -0.394367071934840; +1.209585103839413; +0.720950468832869; ... + +0.188359447172079; -0.659677837960163; +0.254008558054221; ... + -1.264954661580136; +0.816118804592636; +0.202455570359224; ... + +0.734286747946277; -0.244906212630412; +0.274108676705772; ... + -0.862005106214534; +0.434343874659720; -0.117332608645138; ... + -0.914714934350702; +0.115661357086073; -0.325149459903396; ... + +0.639533386284049; +0.509460672890649; -0.852768546081912; ... + +0.186192416612840; +0.313594500855111; +0.294019880744365; ... + -1.130158251045297; -0.766406113410912; -1.866775028802603; ... + -0.947126212506609; +0.538816492914357; +0.511602507613618; ... + +0.823135354100495; -1.756797156406481; -0.312291404135173; ... + +0.087942003030425; +0.567707468547421; +2.032871465968247; ... + +1.898136463799602; +0.017457787439612; -0.544269383534046; ... + -0.031505371902443; -0.152838878112194; -1.329039092306233; ... + +1.080298915753245; +1.010267794177553; -0.786523836101804; ... + -1.172017693806294; +0.545622109584444; -0.565273496172850; ... + +1.395393272315889; +2.249339864785413; +1.152166643543791; ... + -0.529253078296878; -0.550879429738137; -0.658033963155681; ... + -2.229148823293678; -0.883276090753784; -1.048334125700457; ... + +0.787058154693710; +2.284606236947447]; + end + + % Evaluation results with homoscedastic Gaussian noise + zi = stk_feval (ref.f, xi) + ref.noise_std .* u; + + otherwise + + error ('Unknown dataset name.'); + +end % switch + +end % function diff --git a/inst/examples/test_functions/stk_testcase_truss3.m b/inst/examples/test_functions/stk_testcase_truss3.m new file mode 100644 index 0000000..2f22f31 --- /dev/null +++ b/inst/examples/test_functions/stk_testcase_truss3.m @@ -0,0 +1,242 @@ +% STK_TESTCASE_TRUSS3 provides information about the 'truss3' test case +% +% CALL: TC = stk_testcase_truss3 () +% +% returns a structure TC that describes the 'truss3' test case, borrowed +% from [1, chapter 9]. This structure contains two fields: +% +% * .constants: all the numerical constants for this problem, +% +% * .search_domain: an stk_hrect object that specifies the search domain +% of the optimization problem. +% +% TEST CASE OVERVIEW +% +% The system considered in this test case is the following 3-bar truss: +% +% <--------- D -----------> +% <--- w ---> +% ------A==========B==============C------ +% \_ | __/ ^ +% \_ | (2) __/ | +% \_ | __/ L +% (1) \_ | __/ (3) | +% \_P_/ v +% +% Nodes A, B and C are fixed (pin joints). Node P is submitted to both an +% horizontal load F1 (e.g., wind) and a vertical load F2 (suspended load). +% +% The design variables are the cross-sections a1, a2 and a3 of the three +% bars, and the horizontal position w of the vertical bar. The quantities +% of interest are the total volume of the structure, the mechanical +% (tensile) stress in the bars, and the displacement of P. Various +% formulations of optimization problems can be considered, depending on +% which quantities are selected as contraints and objectives, and whether +% or not uncertainties are taken into account (robust formulations). +% +% NUMERICAL CONSTANTS +% +% The numerical values borrowed from [1] have been converted to SI +% units. The fields of TC.constants are: +% +% * .D: truss width [m], +% * .L: length of the vertical bar [m], +% * .E: Young's modulus [Pa], +% +% * .a_min: minimal cross-section [m^2], +% * .a_max: maximal cross-section [m^2], +% * .w_min: minimal value of the position of the vertical bar [m], +% * .w_max: maximal value of the position of the vertical bar [m], +% +% * .F1_mean: mean (nominal) value of the horizontal load [N], +% * .F1_std: standard deviation of the horizontal load [N], +% * .F2_mean: mean (nominal) value of the vertical load [N] +% * .F2_std: standard deviation of the vertical load [N]. +% +% The standard deviations .F1_std and .F2_std are used in the formulation +% of robust optimization problems related to this test case [see 1, chap 11]. +% +% NUMERICAL FUNCTIONS +% +% Two numerical functions are provided to compute the quantities of interest +% of this test case: +% +% * stk_testfun_truss3_vol: computes the total volume of the structure, +% +% * stk_testfun_truss3_bb: computes the tensile stress in the bars and the +% displacement of P. +% +% Both functions have the same syntax: +% +% V = stk_testfun_truss3_vol (X, CONST) +% +% Z = stk_testfun_truss3_bb (X, CONST) +% +% where CONST is a structure containing the necessary numerical constants. +% To use the constants from [1], pass TC.constants as second input argument. +% +% Both function accept as first input argument an N x D matrix (or data +% frame) where D is either 4 or 6: +% +% * columns 1--3: cross-section a1, a2 and a3, +% +% * column 4: position w of the horizontal bar, +% +% * column 5-6 (optional): horizontal and vertical loads F1, F2. +% +% The second function is named 'bb' for 'black box', as it plays the role of +% a (supposedly expensive to evaluate) black box computer model for this +% test case. The output Z has five columns, corresponding to: +% +% * columns 1--2: horizontal and vertical displacement y1, y2 of P, +% +% * columns 3--5: tensile stress sigma_j in bars j = 1, 2 and 3. +% +% EXAMPLE +% +% tc = stk_testcase_truss3 (); n = 5; +% +% % Draw 5 points uniformly in the 4D input domain ("design space") +% xd = stk_sampling_randunif (n, [], tc.search_domain) +% +% % Compute the volumes +% v = stk_testfun_truss3_vol (xd, tc.constants) +% +% % Compute displacements and stresses for nominal loads +% z = stk_testfun_truss3_bb (xd, tc.constants) +% +% % Draw loads from normal distributions +% F = stk_dataframe (zeros (n, 2), {'F1' 'F2'}); +% F(:, 1) = tc.constants.F1_mean + tc.constants.F1_std * randn (n, 1); +% F(:, 2) = tc.constants.F2_mean + tc.constants.F2_std * randn (n, 1); +% +% % Compute displacements and stresses for the random loads +% x = [xd F] +% z = stk_testfun_truss3_bb (x, tc.constants) +% +% REFERENCE +% +% [1] Indraneel Das, Nonlinear Multicriteria Optimization and Robust +% Optimality. PhD thesis, Rice University, 1997. +% +% [2] Juhani Koski, Defectiveness of weighting method in multicriterion +% optimization of structures. Int. J. for Numerical Methods in +% Biomedical Engineering, 1(6):333-337, 1985. +% +% See also: stk_testfun_truss3_vol, stk_testfun_truss3_bb + +% Copyright Notice +% +% This file: stk_testcase_truss3.m was written in 2017 +% by Julien Bect . +% +% To the extent possible under law, the author(s) have dedicated all +% copyright and related and neighboring rights to this file to the pub- +% lic domain worldwide. This file is distributed without any warranty. +% +% This work is published from France. +% +% You should have received a copy of the CC0 Public Domain Dedication +% along with this file. If not, see +% . + +% Copying Permission Statement (STK toolbox as a whole) +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function tc = stk_testcase_truss3 () + +tc = struct (); + +%--- Numerical constants ------------------------------------------------------- + +% Conversion from feet to meters +m_per_foot = 0.3048; +m_per_inch = m_per_foot / 12; + +% Conversion from lbf (pound-force) to newtons (N) +N_per_lbf = 4.4482216152605; +N_per_kip = 1000 * N_per_lbf; + +% Conversion from psi (pound-force per square inch) to Pa (pascals) +Pa_per_psi = N_per_lbf / (m_per_inch ^ 2); +Ps_per_ksi = 1000 * Pa_per_psi; + +% Constants in Das (97) (differs from the test case used by Koski (1985)) + +% Truss width +constants.D = 120 * m_per_foot; % [m] 120 feet ~ 36.6 m + +% Length of the vertical bar +constants.L = 60 * m_per_foot; % [m] 60 feet ~ 18.3 m + +% Young's modulus (steel) +constants.E = 29e3 * Ps_per_ksi; % [Pa] 29e3 ksi ~ 200 GPa + +% Minimal and maximal cross-sections +constants.a_min = 0.8 * m_per_inch ^ 2; % [m^2] 0.8 in^2 ~ 5.2 cm^2 +constants.a_max = 3.0 * m_per_inch ^ 2; % [m^2] 0.8 in^2 ~ 19.4 cm^2 + +% Bounds the position of the vertical bar +constants.w_min = constants.D / 4; % [m] +constants.w_max = 3 * constants.w_min; % [m] + +% Normal distribution on the loads +constants.F1_mean = 100 * N_per_kip; +constants.F1_std = 15 * N_per_kip; +constants.F2_mean = 1000 * N_per_kip; +constants.F2_std = 25 * N_per_kip; + +%--- Search domain (bounds on design variables) -------------------------------- + +a_dom = stk_hrect ( ... % Bounds on cross-sections + repmat ([constants.a_min; constants.a_max], 1, 3), {'a1', 'a2', 'a3'}); + +w_dom = stk_hrect ( ... % Bounds on w + [constants.w_min; constants.w_max], {'w'}); + +search_domain = [a_dom w_dom]; + +%--- Store everything inside a structure --------------------------------------- + +tc.constants = constants; +tc.search_domain = search_domain; + +end % function + + +%!shared tc, xd, n +%! tc = stk_testcase_truss3 (); n = 5; +%! xd = stk_sampling_randunif (n, [], tc.search_domain); + +%!test +%! v = stk_testfun_truss3_vol (xd, tc.constants); +%! z = stk_testfun_truss3_bb (xd, tc.constants); +%! assert (isequal (size (v), [n 1])); +%! assert (isequal (size (z), [n 5])); + +%!test +%! F = stk_dataframe (zeros (n, 2), {'F1' 'F2'}); +%! F(:, 1) = tc.constants.F1_mean + tc.constants.F1_std * randn (n, 1); +%! F(:, 2) = tc.constants.F2_mean + tc.constants.F2_std * randn (n, 1); +%! x = [xd F]; +%! v = stk_testfun_truss3_vol (x, tc.constants); +%! z = stk_testfun_truss3_bb (x, tc.constants); +%! assert (isequal (size (v), [n 1])); +%! assert (isequal (size (z), [n 5])); diff --git a/inst/examples/test_functions/stk_testfun_borehole.m b/inst/examples/test_functions/stk_testfun_borehole.m new file mode 100644 index 0000000..592d5e9 --- /dev/null +++ b/inst/examples/test_functions/stk_testfun_borehole.m @@ -0,0 +1,95 @@ +% STK_TESTFUN_BOREHOLE computes the "borehole model" response function +% +% CALL: Y = stk_testfun_borehole (X) +% +% computes the responses Y(i, :) of the "borehole model" [1-3] for the +% input vectors X(i, :). +% +% The output Y is the water flow rate through the borehole (m3/yr). +% +% The input variables (columns of X) are: +% +% X(:, 1) = rw radius of borehole (m), +% X(:, 2) = r radius of influence (m), +% X(:, 3) = Tu transmissivity of upper aquifer (m2/yr), +% X(:, 4) = Hu potentiometric head of upper aquifer (m), +% X(:, 5) = Tl transmissivity of lower aquifer (m2/yr), +% X(:, 6) = Hl potentiometric head of lower aquifer (m), +% X(:, 7) = L length of borehole (m), +% X(:, 8) = Kw hydraulic conductivity of borehole (m/yr), +% +% and their usual domain of variation is: +% +% input_domain = stk_hrect ([ ... +% 0.05 100 63070 990 63.1 700 1120 9855; ... +% 0.15 50000 115600 1110 116.0 820 1680 12045], ... +% {'rw', 'r', 'Tu', 'Hu', 'Tl', 'Hl', 'L', 'Kw'}) +% +% REFERENCES +% +% [1] Harper, W. V. & Gupta, S. K. (1983). Sensitivity/uncertainty analysis +% of a borehole scenario comparing Latin Hypercube Sampling and determinis- +% tic sensitivity approaches. Technical report BMI/ONWI-516, Battelle +% Memorial Inst., Office of Nuclear Waste Isolation, Columbus, OH (USA). +% +% [2] Morris, M. D., Mitchell, T. J. & Ylvisaker, D. (1993). Bayesian design +% and analysis of computer experiments: use of derivatives in surface +% prediction. Technometrics, 35(3):243-255. +% +% [3] Surjanovic, S. & Bingham, D. Virtual Library of Simulation Experiments: +% Test Functions and Datasets. Retrieved February 1, 2016, from +% http://www.sfu.ca/~ssurjano/borehole.html. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect +% +% Based on the "Virtual Library for Simulation Experiments" +% Copyright (C) 2013 Derek Bingham, Simon Fraser University +% Authors: Sonja Surjanovic & Derek Bingham (dbingham@stat.sfu.ca) +% Distributed under the GPLv2 licence +% http://www.sfu.ca/~ssurjano/Code/borehole.html + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = stk_testfun_borehole (x) + +x = double (x); + +rw = x(:, 1); +r = x(:, 2); +Tu = x(:, 3); +Hu = x(:, 4); +Tl = x(:, 5); +Hl = x(:, 6); +L = x(:, 7); +Kw = x(:, 8); + +A = 2 * pi * Tu .* (Hu - Hl); +B = 2 * L .* Tu ./ ((log (r ./ rw)) .* (rw .^ 2) .* Kw); +C = Tu ./ Tl; +D = (log (r ./ rw)) .* (1 + B + C); + +y = A ./ D; + +end % function diff --git a/inst/examples/test_functions/stk_testfun_braninhoo.m b/inst/examples/test_functions/stk_testfun_braninhoo.m new file mode 100644 index 0000000..b12fecc --- /dev/null +++ b/inst/examples/test_functions/stk_testfun_braninhoo.m @@ -0,0 +1,57 @@ +% STK_TESTFUN_BRANINHOO computes the Branin-Hoo function. +% +% The Branin-Hoo function (Branin and Hoo, 1972) is a classical test +% function for global optimization algorithms, which belongs to the +% well-known Dixon-Szego test set (Dixon and Szego, 1978). It is usually +% minimized over [-5; 10] x [0; 15]. +% +% REFERENCES +% +% [1] Branin, F. H. and Hoo, S. K. (1972), A Method for Finding Multiple +% Extrema of a Function of n Variables, in Numerical methods of +% Nonlinear Optimization (F. A. Lootsma, editor, Academic Press, +% London), 231-237. +% +% [2] Dixon L.C.W., Szego G.P., Towards Global Optimization 2, North- +% Holland, Amsterdam, The Netherlands (1978) + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = stk_testfun_braninhoo (x) + +x = double (x); + +x1 = x(:, 1); +x2 = x(:, 2); + +a = 5.1 / (4 * pi * pi); +b = 5 / pi; +c = 10 * (1 - 1 / (8 * pi)); + +y = (x2 - a * x1 .* x1 + b * x1 - 6) .^ 2 + c * cos (x1) + 10; + +end % function diff --git a/inst/examples/test_functions/stk_testfun_goldsteinprice.m b/inst/examples/test_functions/stk_testfun_goldsteinprice.m new file mode 100644 index 0000000..cc286ed --- /dev/null +++ b/inst/examples/test_functions/stk_testfun_goldsteinprice.m @@ -0,0 +1,97 @@ +% STK_TESTFUN_GOLDSTEINPRICE computes the Goldstein-Price function +% +% The Goldstein-Price function [1] is a classical test function for +% global optimization algorithms, which belongs to the well-known +% Dixon-Szego test set [2]. +% +% It is usually minimized over [-2; 2] x [-2; 2]. It has a unique +% global minimum at x = [0, -1] with f(x) = 3, and several local minima. +% +% REFERENCES +% +% [1] Goldstein, A.A. and Price, I.F. (1971), On descent from local +% minima. Mathematics of Computation, 25(115). +% +% [2] Dixon L.C.W., Szego G.P. (1978), Towards Global Optimization 2, +% North-Holland, Amsterdam, The Netherlands + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect +% +% Based on the "Virtual Library for Simulation Experiments" +% Copyright (C) 2013 Derek Bingham, Simon Fraser University +% Authors: Sonja Surjanovic & Derek Bingham (dbingham@stat.sfu.ca) +% Distributed under the GPLv2 licence +% http://www.sfu.ca/~ssurjano/Code/goldprm.html + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function y = stk_testfun_goldsteinprice (x) + +if nargin == 0, + visu_goldsteinprice (); + return; +end + +x = double (x); + +x1 = x(:, 1); +x2 = x(:, 2); + +x1x1 = x1 .^ 2; +x2x2 = x2 .^ 2; +x1x2 = x1 .* x2; + +A1 = (x1 + x2 + 1) .^ 2; +A2 = 19 - 14*x1 + 3*x1x1 - 14*x2 + 6*x1x2 + 3*x2x2; +A = 1 + A1 .* A2; % 4th degree polynomial + +B1 = (2*x1 - 3*x2) .^ 2; +B2 = 18 - 32*x1 + 12*x1x1 + 48*x2 - 36*x1x2 + 27*x2x2; +B = 30 + B1 .* B2; % 4th degree polynomial + +y = A .* B; % 8th degree polynomial + +end % function + + +function visu_goldsteinprice () + +s = 'Goldstein-Price function'; stk_figure (s); + +xt = stk_sampling_regulargrid (80^2, 2, [[-2; 2], [-2; 2]]); +xt.colnames = {'x_1', 'x_2'}; + +surf (xt, @stk_testfun_goldsteinprice); +hold on; plot3 (0, -1, 3, 'r.'); +colorbar; stk_title (s); + +end % function + + +%!test % Use with nargin == 0 for visualisation +%! stk_testfun_goldsteinprice (); close all; + +%!assert (stk_isequal_tolabs ... +%! (stk_testfun_goldsteinprice ([0, -1]), 3.0, 1e-12)) diff --git a/inst/examples/test_functions/stk_testfun_truss3_bb.m b/inst/examples/test_functions/stk_testfun_truss3_bb.m new file mode 100644 index 0000000..19e87c0 --- /dev/null +++ b/inst/examples/test_functions/stk_testfun_truss3_bb.m @@ -0,0 +1,129 @@ +% STK_TESTFUN_TRUSS3_BB computes displacements and stresses for 'truss3' +% +% CALL: Z = stk_testfun_truss3_bb (X, CONST) +% +% See also: stk_testcase_truss3, stk_testfun_truss3_vol + +% Copyright Notice +% +% This file: stk_testfun_truss3_bb.m was written in 2017 +% by Julien Bect . +% +% To the extent possible under law, the author(s) have dedicated all +% copyright and related and neighboring rights to this file to the pub- +% lic domain worldwide. This file is distributed without any warranty. +% +% This work is published from France. +% +% You should have received a copy of the CC0 Public Domain Dedication +% along with this file. If not, see +% . + +% Copying Permission Statement (STK toolbox as a whole) +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = stk_testfun_truss3_bb (x, const) + +% Convert input to double-precision input data +% (and get rid of extra structure such as table or stk_dataframe objects) +x_ = double (x); + +% Check input size +[n, dim] = size (x_); +switch dim + + case 4 + % Use nominal loads + F = zeros (n, 2); + F(:, 1) = const.F1_mean; + F(:, 2) = const.F2_mean; + x_ = [x_ F]; + + case 6 + % Loads have been provided as well + + otherwise + error ('Incorrect number of variables.'); + +end + +% Extract variables +a = x_(:, 1:3); % Cross-sections of the bars [m^2] +w = x_(:, 4); % Horizontal position of bar #2 [m] +F = x_(:, 5:6); % Horizontal and vertical loads [N] + +% Extract constants +D = const.D; % Total width of the structure [m] +L = const.L; % Length of the vertical bar [m] +E = const.E; % Young's modulus [Pa] + +% Check w values +D_w = D - w; +if any (w < 0) || any (D_w < 0) + error ('w should be between 0 and D.') +end + +% Lengths +LL = repmat (L, [n 3]); +LL(:, 1) = sqrt (L ^ 2 + w .^ 2); +LL(:, 3) = sqrt (L ^ 2 + D_w .^ 2); + +% Sines and cosines +sin_theta = L ./ LL(:, 1); +cos_theta = w ./ LL(:, 1); +sin_alpha = L ./ LL(:, 3); +cos_alpha = D_w ./ LL(:, 3); + +% Linear relation between tensile forces and elongations, +% assuming linear elasticity (Hooke's law) +C = E * a ./ LL; + +% Compute displacement of node P and stresses +y = zeros (n, 2); % Displacement of node P +s = zeros (n, 3); % Tensile stress in the bars +for i = 1:n + + % Rectangular matrix A for Equ. 9.1 in Das (1997) p.65, gives the + % equilibrium relation between tensile forces and loads (small displacements) + A = [cos_theta(i) sin_theta(i); 0 1; -cos_alpha(i) sin_alpha(i)]; + + % Stiffness matrix + K = A' * (diag (C(i, :))) * A; + + % Compute the displacement of node P + y(i, :) = F(i, :) / K; + + % Bar elongations + delta = y(i, :) * A'; + + % Tensile stresses (Hooke's law) + s(i, :) = E * delta ./ LL(i, :); + +end + +% Output: return displacement of node P and tensile stresses (five outputs) +z = [y s]; + +% df-in/df-out +if isa (x, 'stk_dataframe') + z = stk_dataframe (z, {'y1' 'y2' 'sigma1' 'sigma2' 'sigma3'}, x.rownames); +end + +end % function diff --git a/inst/examples/test_functions/stk_testfun_truss3_vol.m b/inst/examples/test_functions/stk_testfun_truss3_vol.m new file mode 100644 index 0000000..b5cd2d7 --- /dev/null +++ b/inst/examples/test_functions/stk_testfun_truss3_vol.m @@ -0,0 +1,71 @@ +% STK_TESTFUN_TRUSS3_VOL computes the volume of the 'truss3' structure +% +% CALL: V = stk_testfun_truss3_vol (X, CONST) +% +% See also: stk_testcase_truss3, stk_testfun_truss3_bb + + +% Copyright Notice +% +% This file: stk_testfun_truss3_vol.m was written in 2017 +% by Julien Bect . +% +% To the extent possible under law, the author(s) have dedicated all +% copyright and related and neighboring rights to this file to the pub- +% lic domain worldwide. This file is distributed without any warranty. +% +% This work is published from France. +% +% You should have received a copy of the CC0 Public Domain Dedication +% along with this file. If not, see +% . + +% Copying Permission Statement (STK toolbox as a whole) +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function V = stk_testfun_truss3_vol (x, const) + +% Convert input to double-precision input data +% (and get rid of extra structure such as table or stk_dataframe objects) +x_ = double (x); + +% Extract design variables +a1 = x_(:, 1); +a2 = x_(:, 2); +a3 = x_(:, 3); +w = x_(:, 4); + +% Extract constants +L = const.L; +D = const.D; + +% Length of bar 1 and bar 3 +L1 = sqrt (L ^ 2 + w .^ 2); +L3 = sqrt (L ^ 2 + (D - w) .^ 2); + +% Total volume +V = a1 .* L1 + a2 * L + a3 .* L3; + +% df-in/df-out +if isa (x, 'stk_dataframe') + V = stk_dataframe (V, {'V'}, x.rownames); +end + +end % function diff --git a/inst/examples/test_functions/stk_testfun_twobumps.m b/inst/examples/test_functions/stk_testfun_twobumps.m new file mode 100644 index 0000000..4401d20 --- /dev/null +++ b/inst/examples/test_functions/stk_testfun_twobumps.m @@ -0,0 +1,57 @@ +% STK_TESTFUN_TWOBUMPS computes the TwoBumps response function +% +% CALL: Z = stk_testfun_twobumps (X) +% +% computes the response Z of the TwoBumps function at X. +% +% The TwoBumps function is defined as: +% +% TwoBumps(x) = - (0.7x + sin(5x + 1) + 0.1 sin(10x)) +% +% for x in [-1.0; 1.0]. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Authors: Julien Bect +% Emmanuel Vazquez +% +% This response function (its opposite, actually) has been present as an +% example in the STK toolbox since the very first releases (STK 1.0, 2011). + +% Copying Permission Statement (STK toolbox) +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +% Copying Permission Statement (this file) +% +% To the extent possible under law, Julien Bect and Emmanuel Vazquez +% have waived all copyright and related or neighboring rights to +% stk_testfun_twobumps.m. This work is published from France. +% +% License: CC0 + +function z = stk_testfun_twobumps (x) + +x = double (x); + +z = -(0.7 * x + (sin (5 * x + 1)) + 0.1 * (sin (10 * x))); + +end % function diff --git a/inst/lm/@stk_lm_affine/feval.m b/inst/lm/@stk_lm_affine/feval.m new file mode 100644 index 0000000..244a13b --- /dev/null +++ b/inst/lm/@stk_lm_affine/feval.m @@ -0,0 +1,41 @@ +% FEVAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = feval (lm, x) %#ok + +n = size (x, 1); +z = horzcat (ones (n, 1), x); + +end % function + + +%!test +%! n = 15; d = 4; +%! x = stk_sampling_randunif (n, d); +%! P = feval (stk_lm_affine (), x); +%! assert (isequal (size (P), [n, d + 1])); diff --git a/inst/lm/@stk_lm_affine/stk_lm_affine.m b/inst/lm/@stk_lm_affine/stk_lm_affine.m new file mode 100644 index 0000000..e928b4c --- /dev/null +++ b/inst/lm/@stk_lm_affine/stk_lm_affine.m @@ -0,0 +1,41 @@ +% STK_LM_AFFINE creates an affine linear model object +% +% CALL: LM = STK_LM_AFFINE () +% +% creates an affine linear model object LM. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_affine () + +lm = class (struct (), 'stk_lm_affine'); + +end % function stk_lm_affine + + +%!test stk_test_class ('stk_lm_affine') diff --git a/inst/lm/@stk_lm_constant/feval.m b/inst/lm/@stk_lm_constant/feval.m new file mode 100644 index 0000000..db739fc --- /dev/null +++ b/inst/lm/@stk_lm_constant/feval.m @@ -0,0 +1,41 @@ +% FEVAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = feval (lm, x) %#ok + +n = size (x, 1); +z = ones (n, 1); + +end % function + + +%!test +%! n = 15; d = 4; +%! x = stk_sampling_randunif (n, d); +%! P = feval (stk_lm_constant (), x); +%! assert (isequal (size (P), [n, 1])); diff --git a/inst/lm/@stk_lm_constant/stk_lm_constant.m b/inst/lm/@stk_lm_constant/stk_lm_constant.m new file mode 100644 index 0000000..17b1d4d --- /dev/null +++ b/inst/lm/@stk_lm_constant/stk_lm_constant.m @@ -0,0 +1,41 @@ +% STK_LM_CONSTANT creates a constant linear model object +% +% CALL: LM = STK_LM_CONSTANT () +% +% creates a constant linear model object LM. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_constant () + +lm = class (struct (), 'stk_lm_constant'); + +end % function + + +%!test stk_test_class ('stk_lm_constant') diff --git a/inst/lm/@stk_lm_cubic/feval.m b/inst/lm/@stk_lm_cubic/feval.m new file mode 100644 index 0000000..0925bae --- /dev/null +++ b/inst/lm/@stk_lm_cubic/feval.m @@ -0,0 +1,62 @@ +% FEVAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = feval (lm, x) %#ok + +x = double (x); + +[n, d] = size (x); + +% Use stk_lm_quadratic to compute the quadratic part +z2 = feval (stk_lm_quadratic, x); + +% And now compute all monomials of degree exactly 3 +z3 = zeros (n, d * (2 + d * (3 + d)) / 6); + +c = 1; +for i = 1:d + u = x(:, i); + for j = i:d + v = u .* x(:, j); + for k = j:d + z3(:, c) = v .* x(:, k); + c = c + 1; + end + end +end + +z = horzcat (z2, z3); + +end % function + + +%!test +%! n = 15; d = 4; +%! x = stk_sampling_randunif (n, d); +%! P = feval (stk_lm_cubic (), x); +%! assert (isequal (size (P), [n, 1 + d * (11 + d * (6 + d)) / 6])) diff --git a/inst/lm/@stk_lm_cubic/stk_lm_cubic.m b/inst/lm/@stk_lm_cubic/stk_lm_cubic.m new file mode 100644 index 0000000..3a665c1 --- /dev/null +++ b/inst/lm/@stk_lm_cubic/stk_lm_cubic.m @@ -0,0 +1,41 @@ +% STK_LM_CUBIC creates a cubic linear model object +% +% CALL: LM = STK_LM_CUBIC () +% +% creates a cubic linear model object LM. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_cubic () + +lm = class (struct (), 'stk_lm_cubic'); + +end % function + + +%!test stk_test_class ('stk_lm_cubic') diff --git a/inst/lm/@stk_lm_matrix/feval.m b/inst/lm/@stk_lm_matrix/feval.m new file mode 100644 index 0000000..a1e712e --- /dev/null +++ b/inst/lm/@stk_lm_matrix/feval.m @@ -0,0 +1,40 @@ +% FEVAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = feval (lm, x) + +x = double (x); + +if isempty (lm.data), + n = size (x, 1); + z = zeros (n, 0); +else + z = lm.data(x, :); +end + +end % function diff --git a/inst/lm/@stk_lm_matrix/stk_lm_matrix.m b/inst/lm/@stk_lm_matrix/stk_lm_matrix.m new file mode 100644 index 0000000..a9b1997 --- /dev/null +++ b/inst/lm/@stk_lm_matrix/stk_lm_matrix.m @@ -0,0 +1,61 @@ +% STK_LM_MATRIX creates a linear model object defined on a finite space +% +% CALL: LM = STK_LM_MATRIX (P) +% +% creates a linear model object LM with "design matrix" P. Such an object +% describes a linear model on a finite space of cardinality N, where N is the +% number of rows of P. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_matrix (data) + +if nargin == 0 + lm = struct ('data', []); +else + lm = struct ('data', data); +end + +lm = class (lm, 'stk_lm_matrix'); + +end % function + + +%!test stk_test_class ('stk_lm_matrix') + +%!test %%% dim 1 +%! data = rand (10, 1); idx = 3:7; +%! lm = stk_lm_matrix (data); +%! assert (isa (lm, 'stk_lm_matrix')); +%! assert (isequal (data(idx, :), feval (lm, idx))); + +%!test %%% dim 3 +%! data = rand (10, 3); idx = 3:7; +%! lm = stk_lm_matrix (data); +%! assert (isa (lm, 'stk_lm_matrix')); +%! assert (isequal (data(idx, :), feval (lm, idx))); diff --git a/inst/lm/@stk_lm_null/feval.m b/inst/lm/@stk_lm_null/feval.m new file mode 100644 index 0000000..255705f --- /dev/null +++ b/inst/lm/@stk_lm_null/feval.m @@ -0,0 +1,40 @@ +% FEVAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = feval (lm, x) %#ok + +n = size (x, 1); +z = zeros (n, 0); + +end % function + +%!test +%! n = 15; d = 4; +%! x = stk_sampling_randunif (n, d); +%! P = feval (stk_lm_null (), x); +%! assert (isequal (size (P), [n, 0])); diff --git a/inst/lm/@stk_lm_null/stk_lm_null.m b/inst/lm/@stk_lm_null/stk_lm_null.m new file mode 100644 index 0000000..0c999a0 --- /dev/null +++ b/inst/lm/@stk_lm_null/stk_lm_null.m @@ -0,0 +1,41 @@ +% STK_LM_NULL creates a null linear model object +% +% CALL: LM = STK_LM_NULL () +% +% creates a null linear model object LM. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_null () + +lm = class (struct (), 'stk_lm_null'); + +end % function + + +%!test stk_test_class ('stk_lm_null') diff --git a/inst/lm/@stk_lm_quadratic/feval.m b/inst/lm/@stk_lm_quadratic/feval.m new file mode 100644 index 0000000..9367de7 --- /dev/null +++ b/inst/lm/@stk_lm_quadratic/feval.m @@ -0,0 +1,51 @@ +% FEVAL [overload base function] + +% Copyright Notice +% +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = feval (lm, x) %#ok + +x = double (x); + +[n, d] = size (x); + +z = horzcat (ones (n, 1), x, zeros (n, d * (d + 1) / 2)); +k = d + 2; +for i = 1:d + for j = i:d + z(:,k) = x(:, i) .* x(:, j); + k = k + 1; + end +end + +end % function + + +%!test +%! n = 15; d = 4; +%! x = stk_sampling_randunif (n, d); +%! P = feval (stk_lm_quadratic (), x); +%! assert (isequal (size (P), [n, 1 + d * (d + 3) / 2])); diff --git a/inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m b/inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m new file mode 100644 index 0000000..3094e5c --- /dev/null +++ b/inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m @@ -0,0 +1,41 @@ +% STK_LM_QUADRATIC creates a quadratic linear model object +% +% CALL: LM = STK_LM_QUADRATIC () +% +% creates a quadratic linear model object LM. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_quadratic () + +lm = class (struct (), 'stk_lm_quadratic'); + +end % function + + +%!test stk_test_class ('stk_lm_quadratic') diff --git a/inst/lm/stk_lm_polynomial.m b/inst/lm/stk_lm_polynomial.m new file mode 100644 index 0000000..21dd37e --- /dev/null +++ b/inst/lm/stk_lm_polynomial.m @@ -0,0 +1,85 @@ +% STK_LM_POLYNOMIAL creates a polynomial linear model object +% +% CALL: LM = STK_LM_POLYNOMIAL (D) +% +% creates a polynomial linear model object LM of degree D. + +% Copyright Notice +% +% Copyright (C) 2016-2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lm = stk_lm_polynomial (order) + +% nargin check neded here. See https://sourceforge.net/p/kriging/tickets/52. +if nargin < 1 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +switch order + + case -1, % 'simple' kriging + lm = stk_lm_null (); + + case 0, % 'ordinary' kriging + lm = stk_lm_constant (); + + case 1, % affine trend + lm = stk_lm_affine (); + + case 2, % quadratic trend + lm = stk_lm_quadratic (); + + case 3, % cubic trend + lm = stk_lm_cubic (); + + otherwise, % syntax error + stk_error ('order should be in {-1, 0, 1, 2, 3}', 'InvalidArgument'); +end + +end % function + + +%!error lm = stk_lm_polynomial (); + +%!test +%! lm = stk_lm_polynomial (-1); +%! assert (isa (lm, 'stk_lm_null')); + +%!test +%! lm = stk_lm_polynomial (0); +%! assert (isa (lm, 'stk_lm_constant')); + +%!test +%! lm = stk_lm_polynomial (1); +%! assert (isa (lm, 'stk_lm_affine')); + +%!test +%! lm = stk_lm_polynomial (2); +%! assert (isa (lm, 'stk_lm_quadratic')); + +%!test +%! lm = stk_lm_polynomial (3); +%! assert (isa (lm, 'stk_lm_cubic')); diff --git a/inst/misc/benchmarks/stk_benchmark_.m b/inst/misc/benchmarks/stk_benchmark_.m new file mode 100644 index 0000000..0671673 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_.m @@ -0,0 +1,63 @@ +% STK_BENCHMARK_ Benchmark stk_predict + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function t = stk_benchmark_ (testfun, nargout, nrep) + +varargout = cell (1, nargout); + +% First, warm up + choose number of repetitions +nrep_internal = 1; +ok = false; +while ~ ok + + tic; + for ii = 1:nrep_internal + [varargout{:}] = testfun (); %#ok<*NASGU> + end + t_ = toc (); + + if t_ > 1e-2 + ok = true; + else + nrep_internal = nrep_internal * 2; + end +end + +% Do the actual measurements +t = zeros (1, nrep); +for i = 1:nrep + + tic; + for ii = 1:nrep_internal + [varargout{:}] = testfun (); %#ok<*NASGU> + end + t(i) = toc / nrep_internal; + +end + +end % function diff --git a/inst/misc/benchmarks/stk_benchmark_bivnorm.m b/inst/misc/benchmarks/stk_benchmark_bivnorm.m new file mode 100644 index 0000000..cfe6890 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_bivnorm.m @@ -0,0 +1,69 @@ +% STK_BENCHMARK_BIVNORM + +% Copyright Notice +% +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +mu = [1 2]; % means +sigma = [3 4]; % standard deviations +rho = 0.37; % correlation coefficients + +n = 1e5; +z = 10 * (rand (n, 2) - 0.5); + +% Covariance matrix (for use with mvncdf) +K11 = sigma(1) ^ 2; +K12 = sigma(1) * sigma(2) * rho; +K22 = sigma(2) ^2; + +% Compute with mvncdf +tic; +p_mvncdf = mvncdf (z, mu, [K11 K12; K12 K22]); +t_mvncdf = toc; + +% Compute with stk_distrib_bivnorm_cdf +tic; +p_stk = stk_distrib_bivnorm_cdf (z, mu(1), mu(2), sigma(1), sigma(2), rho); +t_stk = toc; + +err = abs (p_stk - p_mvncdf); +fprintf ('t_stk = %.1f microseconds/eval\n', t_stk / n * 1e6); +fprintf ('t_mvncdf = %.1f microseconds/eval\n', t_mvncdf / n * 1e6); +fprintf ('t_mvncdf / t_stk = %.1f\n', t_mvncdf / t_stk); +fprintf ('maximal absolute difference: %.2g\n', max (err)) +fprintf ('maximal relative difference: %.2g\n', max (err ./ p_stk)) + + +%%% Example of a "large" difference (approx. 1e-8 relative error) +% +% z1 = -3.798119125813876 +% z2 = -4.397490942716200 +% +% p1 = stk_distrib_bivnorm_cdf ([z1 z2], 1, 2, 3, 4, 0.37) +% % -> 1.0015256831575151e-02 +% +% p2 = mvncdf ([z1 z2], [1 2], [9 4.44; 4.44 16]); +% % -> 1.0015256938405132e-02 (Matlab R2012a) +% % -> 1.0015256831575156e-02 (Matlab R2016a) diff --git a/inst/misc/benchmarks/stk_benchmark_cov1.m b/inst/misc/benchmarks/stk_benchmark_cov1.m new file mode 100644 index 0000000..0c2f1fb --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_cov1.m @@ -0,0 +1,49 @@ +% STK_BENCHMARK_COV1 + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +%% Benchmark parameters + +DIM = 1; N = 500; REP = 5; + +covname = 'stk_materncov_iso'; + + +%% Evaluate computation time + +model = stk_model (covname, DIM); +model.param = [0 0 0]; + +tic; +for i = 1:REP, + x = stk_sampling_regulargrid (N, DIM); + K = stk_make_matcov (model, x, x); +end +t = toc / REP; + +fprintf ('% 20s: %.3f seconds\n', covname, t); diff --git a/inst/misc/benchmarks/stk_benchmark_cov2.m b/inst/misc/benchmarks/stk_benchmark_cov2.m new file mode 100644 index 0000000..58b831b --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_cov2.m @@ -0,0 +1,127 @@ +% STK_BENCHMARK_COV2 + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +%% Benchmark parameters + +DIM = 1; + +N_START = 50; +N_MAX = 2000; + +covnames = { ... + 'stk_materncov32_iso', ... + 'stk_materncov52_iso', ... + 'stk_materncov_iso' }; + +nb_cov = length (covnames); + +result = struct ('covname', [], 't', [], 'n', []); + +stk_figure ('stk_benchmark_cov2'); + + +%% Main loop + +for j = 1:4, + + switch j + case 1 + disp ('Using stk_parallel_engine_none...'); + stk_parallel_stop (); + case 2 + disp ('parallelization on (if available) / msfb = Inf'); + stk_parallel_start (); + M = stk_options_get ('stk_rbf_matern', 'min_size_for_parallelization'); + stk_options_set ('stk_rbf_matern', 'min_size_for_parallelization', +Inf); + case 3 + disp ('parallelization on (if available) / msfb = 1'); + stk_options_set ('stk_rbf_matern', 'min_size_for_parallelization', 1); + case 4 + fprintf ('parallelization on (if available) / msfb = %d (default)', M); + stk_options_set ('stk_rbf_matern', 'min_size_for_parallelization', M); + end + + for k = 1:nb_cov, % loop over covariance functions + + result(j, k).covname = covnames{k}; + model = stk_model (covnames{k}, DIM); + model.param = zeros (size (model.param)); + + REP = 5000; + n = N_START; + + while n <= N_MAX + + tic; + x = stk_sampling_regulargrid (n, DIM); + for i = 1:REP, + K = stk_make_matcov (model, x, x); + end + t = toc / REP; + + result(j, k).n(end+1) = n; + result(j, k).t(end+1) = t; + + cla; loglog (result(j, k).n, result(j, k).t, 'o-'); drawnow; + + n = ceil (n * 1.4); + REP = ceil (1 / t); + end + end +end + + +%% Figure + +legtxt = {}; %#ok<*AGROW> + +loglog (vertcat(result(1, :).n)', vertcat(result(1, :).t)', 'x:'); hold on; +for k = 1:nb_cov + legtxt = [legtxt {sprintf('%s (par. off)', covnames{k})}]; +end + +loglog (vertcat(result(2, :).n)', vertcat(result(2, :).t)', 'o-'); +for k = 1:nb_cov + legtxt = [legtxt {sprintf('%s (par. on, msfp=+Inf)', covnames{k})}]; +end + +loglog (vertcat(result(3, :).n)', vertcat(result(3, :).t)', 's--'); +for k = 1:nb_cov + legtxt = [legtxt {sprintf('%s (par. on, msfp=1)', covnames{k})}]; +end + +loglog (vertcat(result(4, :).n)', vertcat(result(4, :).t)', 'd-.'); +for k = 1:nb_cov + legtxt = [legtxt {sprintf('%s (par. on, msfp=%d)', covnames{k}, M)}]; +end + +h = legend (legtxt, 'Location', 'NorthWest'); +set (h, 'Interpreter', 'none'); + +stk_labels ('n', 'computation time'); diff --git a/inst/misc/benchmarks/stk_benchmark_examples.m b/inst/misc/benchmarks/stk_benchmark_examples.m new file mode 100644 index 0000000..9740e96 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_examples.m @@ -0,0 +1,93 @@ +% STK_BENCHMARK_EXAMPLES benchmarks all examples + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function results = stk_benchmark_examples (nb_rep) + +% Number of repetitions for each example script? +if nargin < 1 + nb_rep = 5; +end + +% Save results +results = []; + +% Browse example directory +d0 = fileparts (which ('stk_init')); +d0 = fullfile (d0, 'examples'); +S0 = dir (d0); +for i = 1:(length (S0)) + if S0(i).isdir && (S0(i).name(1) ~= '.') + + % Browse sub-directory + d1 = fullfile (d0, S0(i).name); + S1 = dir (d1); + for j = 1:(length (S1)) + if regexp (S1(j).name, '^stk_example.*\.m') + + res.name = S1(j).name; + res.fullname = fullfile (d1, S1(j).name); + res.runtime = zeros (1, nb_rep); + + % Run and time + for k = 1:nb_rep + t0 = tic (); + try + run_in_isolation (res.fullname); + res.runtime(k) = toc (t0); + catch + toc (t0); % stop the timer + res.runtime(k) = nan; + end + close all; drawnow (); + end + + res.median_runtime = median (res.runtime); + if isempty (results) + results = res; + else + results(end+1) = res; + end + end + end + end +end + +% Display tic/toc results +for i = 1:(length (results)) + fprintf ('%20s: %7.3f sec\n', results(i).name, results(i).median_runtime); +end + +end % function + + +function run_in_isolation (fullname) + +run (fullname); +drawnow (); + +end % function diff --git a/inst/misc/benchmarks/stk_benchmark_init.m b/inst/misc/benchmarks/stk_benchmark_init.m new file mode 100644 index 0000000..fcef2c2 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_init.m @@ -0,0 +1,43 @@ +% STK_BENCHMARK_INIT measures stk_init's runtime +% +% Loading STK should be as fast as possible... +% +% This script can be used to tic-toc or profile stk_init (). + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +NREP = 10; + +t0 = tic (); + +for i = 1:NREP, + stk_init (); +end + +t = (toc (t0)) / NREP; + +fprintf ('Average runtime for a call to stk_init: %.3f seconds\n', t); diff --git a/inst/misc/benchmarks/stk_benchmark_logdet.m b/inst/misc/benchmarks/stk_benchmark_logdet.m new file mode 100644 index 0000000..8058268 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_logdet.m @@ -0,0 +1,62 @@ +% STK_BENCHMARK_LOGDET1 + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +% NREP = 1000; n = 20; % test on small matrices +NREP = 100; n = 200; % test on large matrices + +d = 2; +x = stk_sampling_maximinlhs (n, d, [], 10); +model = stk_model (@stk_materncov52_aniso, d); +model.param = zeros (size (model.param)); + +propname = { ... + 'log_det_covariance_matrix_a', ... + 'log_det_covariance_matrix_b', ... + 'log_det_covariance_matrix_c', ... + 'log_det_covariance_matrix_d', ... + 'log_det_covariance_matrix_e' }; + +L = length (propname); +t = zeros (L, 1); +v = zeros (L, 1); + +for k = 1:L + fprintf ('Method %d/%d: %s...', k, L, propname{k}); + tic; + for i = 1:NREP, + kreq = stk_kreq_qr (model, x); + logdet = get (kreq, propname{k}); + end + t(k) = toc / NREP; + v(k) = logdet; + fprintf ('\n'); +end + +display (t) +display (v) diff --git a/inst/misc/benchmarks/stk_benchmark_loocv.m b/inst/misc/benchmarks/stk_benchmark_loocv.m new file mode 100644 index 0000000..b8cb482 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_loocv.m @@ -0,0 +1,85 @@ +% STK_BENCHMARK_LOOCV Benchmark stk_predict_leaveoneout +% +% Compare run time of virtual LOO-CV implementation with respect to +% the old, "direct" implementation. +% +% Note: correctness of implementation is already taken care of in the +% unit tests. We only care about computation speed here. + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function t_out = stk_benchmark_loocv () + +nrep = 100; + +n = [10 20 40 80 160 320]; +m = numel (n); + +t_virtual = zeros (nrep, m); +t_direct = zeros (nrep, m); + +for i = 1:m + + fprintf ('i = %d/%d...\n', i, m); + + % Prepare test + d = 1; + x_obs = stk_sampling_regulargrid (n(i), d, [0; 2*pi]); + z_obs = stk_feval (@sin, x_obs); + model = stk_model (@stk_materncov32_iso, d); + model.param = log ([1; 5]); + model.lognoisevariance = (1 + rand (n(i), 1)) * 1e-3; + M_post = stk_model_gpposterior (model, x_obs, z_obs); + + testfun = @() stk_predict_leaveoneout (M_post); + t_virtual(:, i) = stk_benchmark_ (testfun, 2, nrep); + + testfun = @() stk_predict_leaveoneout_direct (M_post); + t_direct(:, i) = stk_benchmark_ (testfun, 2, nrep); +end + +% Express results in ms +t_virtual = t_virtual * 1000; +t_direct = t_direct * 1000; + +t = stk_dataframe (zeros (m, 4), {'virtual', '[mad]', 'direct', '[mad]'}); +for i = 1:m + t.rownames{i} = sprintf ('n = % 3d', n(i)); + t(i, 1) = median (t_virtual(:, i)); + t(i, 2) = median (abs (t_virtual(:, i) - t.virtual(i))); + t(i, 3) = median (t_direct(:, i)); + t(i, 4) = median (abs (t_direct(:, i) - t.direct(i))); +end + +if nargout == 0 + loocv_benchmark_results = t; + display (loocv_benchmark_results); +else + t_out = t; +end + +end % function diff --git a/inst/misc/benchmarks/stk_benchmark_paramestim.m b/inst/misc/benchmarks/stk_benchmark_paramestim.m new file mode 100644 index 0000000..0746cd6 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_paramestim.m @@ -0,0 +1,94 @@ +% STK_BENCHMARK_PARAMESTIM A simple 1D parameter estimation benchmark + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_benchmark_paramestim () + +NREP = 20; + +for noise_std = [0 0.1], + for ni = [10 50], + + t = zeros (1, NREP + 1); + + for i = 1:(NREP + 1), + tic; + test_function (ni, noise_std); + t(i) = toc; + end + + t = t(2:end); + + fprintf ('noise_std = %.1f ', noise_std); + fprintf ('ni = %d ', ni); + + t_est = median (t); + t_mad = mean (abs (t - t_est)); + fprintf ('t = %.3f [%.3f]\n', t_est, t_mad); + + drawnow (); + end +end + +end + + +function test_function (ni, noise_std) + +f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); +DIM = 1; % Dimension of the factor space +BOX = [-1.0; 1.0]; % Factor space + +NOISY = (noise_std > 0); + +NITER = 5; % number of random designs generated in stk_sampling_maximinlhs() +xi = stk_sampling_maximinlhs (ni, DIM, BOX, NITER); % evaluation points + +zi = stk_feval (f, xi); % evaluation results + +if NOISY, + zi = zi + noise_std * randn (ni, 1); +end + +model = stk_model (@stk_materncov_iso); + +if ~ NOISY, + % Noiseless case: set a small "regularization" noise + % the (log)variance of which is provided by stk_param_init + model.lognoisevariance = 1e-10; +else + % Otherwise, set the variance of the noise + % (assumed to be known, not estimated, in this example) + model.lognoisevariance = 2 * log (noise_std); +end + +% Estimate the parameters +model.param = stk_param_estim (model, xi, zi, log ([1.0; 4.0; 1/0.4])); + +end diff --git a/inst/misc/benchmarks/stk_benchmark_predict.m b/inst/misc/benchmarks/stk_benchmark_predict.m new file mode 100644 index 0000000..bdbcb4d --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_predict.m @@ -0,0 +1,92 @@ +% STK_BENCHMARK_PREDICT Benchmark stk_predict + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function t_out = stk_benchmark_predict () + +nrep = 100; + +n_obs_list = [1 10 100]; +n_prd_list = [1 10 100 1000]; + +[n_obs, n_prd] = ndgrid (n_obs_list, n_prd_list); +m = numel (n_obs); + +t = zeros (nrep, m); + +M_prior = test_A_init (); + +for i = 1:m + fprintf ('i = %d/%d...\n', i, m); + testfun = @() test_A (M_prior, n_obs(i), n_prd(i)); + t(:, i) = stk_benchmark_ (testfun, 1, nrep); +end + +% Express results in ms +t = t * 1000; + +t_out = stk_dataframe (zeros (m, 2), {'median', 'mad'}); +for i = 1:m + t_out.rownames{i} = sprintf ('% 4d /% 4d', n_obs(i), n_prd(i)); + t_out.median(i) = median (t(:, i)); + t_out.mad(i) = median (abs (t(:, i) - t_out.median(i))); +end + +% Boxplots (if available) +h_fig = stk_figure ('stk_benchmark_predict'); +try + boxplot (log10 (t * 1000)); + set(gca (), 'xticklabel', t_out.rownames); + stk_labels ('n_{obs} / n_{pred}', 'log10 (t) [ms]'); +catch + close (h_fig); +end + +end % function + + +function M_prior = test_A_init () + +% M_prior = stk_model (@stk_materncov32_iso); +% M_prior.param = [0; 0]; + +% This works even in very releases of STK +M_prior = stk_model (); +M_prior.covariance_type = 'stk_materncov32_iso'; +M_prior.param = [0; 0]; + +end % function + + +function z_prd = test_A (M_prior, n_obs, n_prd) + +x_obs = (linspace (0, 1, n_obs))'; +z_obs = sin (x_obs); +x_prd = rand (n_prd, 1); +z_prd = stk_predict (M_prior, x_obs, z_obs, x_prd); + +end diff --git a/inst/misc/benchmarks/stk_benchmark_uppertriangular.m b/inst/misc/benchmarks/stk_benchmark_uppertriangular.m new file mode 100644 index 0000000..a9092a8 --- /dev/null +++ b/inst/misc/benchmarks/stk_benchmark_uppertriangular.m @@ -0,0 +1,92 @@ +% STK_BENCHMARK_UPPERTRIANGULAR times some computations with UT matrices + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + + +%% Prepare benchmark + +n = 100; NREP = 200; + +model = stk_model (@stk_materncov32_iso); +model.param = [0 0]; +x = (linspace (0, 1, n))'; +K = stk_make_matcov (model, x); + +% Assume that the Cholesky factorization of K is available +C = chol (K); + + +%% First test: K ^ (-1) + +tic (); +for i = 1:NREP + M1 = inv (K); +end +t1 = toc (); + +tic +for i = 1:NREP + B2 = inv (C'); + M2 = B2' * B2; +end +t2 = toc (); + +tic +for i = 1:NREP + B3 = linsolve (C, eye (n), struct ('UT', true, 'TRANSA', true)); + M3 = B3' * B3; +end +t3 = toc (); + +t = [t1 t2 t3]' + + +%% Second test: W * K^(-1) * W' + +W = randn (n); + +tic (); +for i = 1:NREP + M1 = W * (inv (K)) * (W'); +end +t1 = toc (); + +tic +for i = 1:NREP + B2 = (C') \ (W'); + M2 = B2' * B2; +end +t2 = toc (); + +tic +for i = 1:NREP + B3 = linsolve (C, W', struct ('UT', true, 'TRANSA', true)); + M3 = B3' * B3; +end +t3 = toc (); + +t = [t1 t2 t3]' diff --git a/inst/misc/design/stk_maxabscorr.m b/inst/misc/design/stk_maxabscorr.m new file mode 100644 index 0000000..957b9e1 --- /dev/null +++ b/inst/misc/design/stk_maxabscorr.m @@ -0,0 +1,76 @@ +% STK_MAXABSCORR computes the maximal absolute correlation for a set of points +% +% CALL: MAC = stk_maxabscorr (X) +% +% computes the Maximum Absolute (linear) Correlation MAC between the columns +% of the array X. +% +% NOTES: +% +% * The construction of experimental designs (more specifically, Latin +% hypercubes samples) with a small MAC is considered, e.g., by Florian +% (1992) and Cioppa & Lucas (2007). +% +% * When X is a Latin hypercube sample, the linear (Pearson) correlation +% coefficients and Spearman's rank correlation coefficients coincide. +% +% REFERENCES +% +% [1] Ales Florian, "An Efficient Sampling Scheme: Updated Latin Hypercube +% Sampling", Probabilistic Engineering Mechanics, 7:123-130, 1992. +% http://dx.doi.org/10.1016/0266-8920(92)90015-A +% +% [2] Thomas M. Cioppa and Thomas W. Lucas, "Efficient Nearly Orthogonal and +% Space-Filling Latin Hypercubes, Technometrics, 49:1, 45-55, 2007. +% http://dx.doi.org/10.1198/004017006000000453 +% +% See also: stk_mindist, stk_filldist, stk_phipcrit + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function mac = stk_maxabscorr (x) + +x = double (x); +x = bsxfun (@minus, x, mean (x)); + +n = size (x, 2); + +M = 0; +for i = 1:(n-1) + for j = (i+1):n + M = max (M, abs (sum (x(:, i) .* x(:, j)))); + end +end + +mac = M / n; + +end % function + + +%!assert (stk_isequal_tolabs (0.0, ... % Test on an OLHS(5) +%! stk_maxabscorr ([0.4 0.8 0 -0.4 -0.8; -0.8 0.4 0 0.8 -0.4]'))); diff --git a/inst/misc/design/stk_phipcrit.m b/inst/misc/design/stk_phipcrit.m new file mode 100644 index 0000000..5e3a4ea --- /dev/null +++ b/inst/misc/design/stk_phipcrit.m @@ -0,0 +1,124 @@ +% STK_PHIPCRIT computes the "phi_p" criterion of Morris & Mitchell +% +% CALL: D = stk_phipcrit (X, P) +% +% computes the phi_P criterion on the set of points X, which is defined for +% an n x d array X as +% +% D = (sum_{1 <= i < j <= n} d_ij ^ (-p)) ^ (1/p) +% +% where d_ij is the Euclidean distance in R^d between X(i,:) and X(j,:). +% +% CALL: D = stk_phipcrit (X) +% +% computes the phi_P criterion with P = 50. +% +% NOTES: +% +% * In the special case P = 2, this criterion has first been introduced by +% Audze & Eglais (1977). +% +% * When p -> +Inf, the value of the phi_p criterion tends to the inverse of +% the mindist criterion. The phi_p criterion with a high value of p is +% often used in place of the mindist criterion for its being easier to +% optimize. Morris & Mitchell recommend using p in the range 20-50 for this +% purpose. +% +% REFERENCES +% +% [1] Max D. Morris and Toby J. Mitchell, "Exploratory Designs for Computer +% Experiments", Journal of Statistical Planning and Inference, +% 43(3):381-402, 1995. +% +% [2] P. Audze and V. Eglais, "New approach for planning out experiments", +% Problems of Dynamics and Strengths, 35:104-107, 1977. +% +% [3] Luc Pronzato and Werner G. Muller, "Design of computer +% experiments: space filling and beyond", Statistics and Computing, +% 22(3):681-701, 2012. +% +% [4] G. Damblin, M. Couplet and B. Iooss, "Numerical studies of space filling +% designs: optimization of Latin hypercube samples and subprojection +% properties", Journal of Simulation, in press. +% +% See also: stk_mindist, stk_filldist + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function phi = stk_phipcrit (x, p) + +if nargin < 2, + p = 50; +end + +% compute the distance matrix +D = stk_dist (x); + +% compute mindist +D = D + diag (inf (1, size (x, 1))); +z = min (D(:)); + +% compute the value of the criterion +if z > 0 + tmp = triu ((D / z) .^ (-p), 1); + phi = 1 / z * sum(tmp(:)) .^ (1/p); +else + phi = Inf; +end + +end % function + + +%!shared x +%! x = [0, 0.2, 0.4, 0.6, 0.8, 1.0; +%! 0, 0.6, 0.8, 1.0, 0.2, 0.4]'; + +%!assert (stk_isequal_tolabs ... +%! (stk_phipcrit (x, 10), 3.946317664423303, 1e-15)) + +%!assert (stk_isequal_tolabs ... +%! (stk_phipcrit (x, 50), 3.614077252813102, 1e-15)); + +%!assert (stk_isequal_tolabs ... +%! (stk_phipcrit (x, 100), 3.574589859827413, 1e-15)); + +%!assert (stk_isequal_tolabs ... +%! (stk_phipcrit (x, 1e9), 1 / stk_mindist (x), 1e-8)); + +%!assert (isequal (stk_phipcrit (ones (2)), Inf)); + +% library (DiceDesign) # load DiceDesign 1.2 +% options (digits = 16) # display 16 significat digits +% +% x <- data.frame (x1 = c(0, 0.2, 0.4, 0.6, 0.8, 1.0), +% x2 = c(0, 0.6, 0.8, 1.0, 0.2, 0.4)) +% +% phiP (x, 10) # 3.946317664423303 +% phiP (x, 50) # 3.614077252813102 +% phiP (x, 100) # 3.574589859827413 +% phiP (x, 1000) # Inf, but we can do better diff --git a/inst/misc/dist/stk_dist.m b/inst/misc/dist/stk_dist.m new file mode 100644 index 0000000..b6e553f --- /dev/null +++ b/inst/misc/dist/stk_dist.m @@ -0,0 +1,136 @@ +% STK_DIST computes a matrix of (Euclidean) distances +% +% CALL: D = stk_dist(X, Y) +% +% computes the matrix of distances between X and Y. More precisely, if +% X is an nX x d matrix, and Y an nY x d matrix, the D is an nX x nY +% matrix with +% +% D_{i,j} = norm(X(i,:) - Y(j,:)), +% +% where norm(.) denotes the Euclidean norm in R^d. +% +% See also: stk_mindist, stk_filldist, norm + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function D = stk_dist(x, y, pairwise) + +% read argument #1 +x = double(x); + +% read argument #2 +if nargin < 2, + y = []; +else + y = double(y); +end + +% read argument #3 +if nargin < 3, + pairwise = false; +else + if ~islogical(pairwise) + errmsg = 'Argument ''pairwise'' should be either true or false.'; + stk_error(errmsg, 'TypeMismatch'); + end +end + +if pairwise, + if isempty(y), + D = zeros(size(x, 1), 1); + else + D = __stk_dist_pairwise__ (x, y); + %D = sqrt (sum ((x - y) .^ 2, 2)); % The MEX-file is usually faster + end +else + if isempty(y), + D = __stk_dist_matrixx__(x); + else + D = __stk_dist_matrixy__(x, y); + end +end + +end % function + +%% +% Check that an error is raised in nargin is neither 1 nor 2 + +%!error stk_dist(); +%!error stk_dist(0, 0, 0); +%!error stk_dist(0, 0, 0, 0); + +%% +% Check that an error is raised when the number of columns differs + +%!error stk_dist(0, ones(1, 2)); +%!error stk_dist(eye(3), ones(1, 2)); +%!error stk_dist(ones(2, 1), zeros(2)); + +%% +% Test with some simple matrices + +%!shared x, y, z +%! x = zeros(11, 5); +%! y = zeros(13, 5); +%! z = ones(7, 5); + +%!test +%! Dx = stk_dist(x); +%! assert(isequal(Dx, zeros(11))); + +%!test +%! Dxx = stk_dist(x, x); +%! assert(isequal(Dxx, zeros(11))); + +%!test +%! Dxy = stk_dist(x, y); +%! assert(isequal(Dxy, zeros(11, 13))); + +%!test +%! Dzz = stk_dist(z, z); +%! assert(isequal(Dzz, zeros(7))); + +%!test +%! Dxz = stk_dist(x, z); +%! assert(stk_isequal_tolabs(Dxz, sqrt(5)*ones(11, 7))); + +%!test +%! x = randn(5,3); +%! y = randn(5,3); +%! D1 = stk_dist(x, y, true); % pairwise +%! D2 = stk_dist(x, y); +%! assert(stk_isequal_tolabs(D1, diag(D2))); + +%!test +%! x = randn(5,3); +%! D1 = stk_dist(x, [], true); % pairwise +%! assert(stk_isequal_tolabs(D1, zeros(5, 1))); +%! D1 = stk_dist(x, x, true); % pairwise +%! assert(stk_isequal_tolabs(D1, zeros(5, 1))); diff --git a/inst/misc/dist/stk_filldist.m b/inst/misc/dist/stk_filldist.m new file mode 100644 index 0000000..d066839 --- /dev/null +++ b/inst/misc/dist/stk_filldist.m @@ -0,0 +1,201 @@ +% STK_FILLDIST computes the fill distance of a set of points +% +% CALL: FD = stk_filldist(X, BOX) +% +% computes the fill distance FD of the dataset X in the hyper-rectangle +% BOX, using the computational-geometric algorithm of L. Pronzato and +% W. G. Muller [1]. Recall that +% +% D = max_{Y in BOX} min_{1 <= i <= n} norm(X(i,:) - Y), (1) +% +% where norm(.) denotes the Euclidean norm in R^d. Optimal designs with +% respect to the fill distance are sometimes called "minimax" designs +% (see, e.g., [2]). +% +% CALL: FD = stk_filldist(X) +% +% assumes that the fill distance is to be computed with respect to the +% hyperrectangle BOX = [0; 1]^d. +% +% CALL: FD = stk_filldist(X, Y) +% +% computes the fill distance FD of X using the "test set" Y. More preci- +% sely, if X and Y are respectively n x d and m x d, then +% +% FD = max_{1 <= j <= m} min_{1 <= i <= n} norm(X(i,:) - Y(j,:)), +% +% If Y is dense enough in some subset BOX of R^d, then FD should be close +% to the actual fill distance of X in BOX. +% +% CALL: [FD, YMAX] = stk_filldist(...) +% +% also returns the point YMAX where the maximal distance is attained. +% +% NOTE: +% +% stk_filldist is actually a wrapper around stk_filldist_discretized and +% stk_filldist_exact. Which function to call is guessed based on the number +% of rows of the second argument. Because of that, the test set Y is required +% to have at least 3 rows. +% +% REFERENCES +% +% [1] Luc Pronzato and Werner G. Muller, "Design of computer +% experiments: space filling and beyond", Statistics and Computing, +% 22(3):681-701, 2012. +% +% [2] Mark E. Johnson, Leslie M. Moore and Donald Ylvisaker, "Minimax +% and maximin distance designs", Journal of Statistical Planning +% and Inference, 26(2):131-148, 1990. +% +% See also: stk_dist, stk_mindist, stk_filldist_exact, stk_filldist_discretized + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [fd, ymax] = stk_filldist(x, arg2) + +x = double(x); + +if nargin == 1, % defaults: "exact" over [0; 1]^d + + default_box = repmat([0; 1], 1, size(x, 2)); + fd = stk_filldist_exact(x, default_box); + +else + + arg2 = double(arg2); + + ny = size(arg2, 1); + + if ny == 2, % arg2 is interpreted as a box + + [fd, ymax] = stk_filldist_exact(x, arg2); + + elseif ny > 2, % arg2 is interpreted a discrete test set + + [fd, idx_max] = __stk_filldist_discr_mex__(x, arg2); + ymax = arg2(idx_max, :); + + else + + errmsg = 'Incorrect size for argument #2: nb rows > 1 expected.'; + stk_error(errmsg, 'InvalidArgument'); + + end + +end % if + +end % function + + +%% +% Check that both double-precision matrices and stk_dataframe objects are accepted + +%!test %%% exact +%! d = 3; x = rand(7, d); box = repmat([0; 1], 1, d); +%! fd1 = stk_filldist(x, box); +%! fd2 = stk_filldist(stk_dataframe(x), stk_dataframe(box)); +%! assert(stk_isequal_tolabs(fd1, fd2)); + +%!test %%% discretized +%! d = 3; x = rand(7, d); y = rand(20, d); +%! fd1 = stk_filldist(x, y); +%! fd2 = stk_filldist(stk_dataframe(x), stk_dataframe(y)); +%! assert(stk_isequal_tolabs(fd1, fd2)); + +%% +% fd = 0 if X = Y (discretized filldist) + +%!test +%! n = 5; % must be bigger than 2 +%! for dim = 1:10, +%! x = rand(n, dim); +%! fd = stk_filldist(x, x); +%! assert(stk_isequal_tolabs(fd, 0.0)); +%! end + +%% +% One point in the middle of [0; 1]^d (exact & discretized filldist) + +%!test %%% exact +%! for dim = 1:6, +%! x = 0.5 * ones(1, dim); +%! fd = stk_filldist(x); % [0; 1]^d is the default box +%! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); +%! end + +%!test %%% discretized +%! for dim = 1:6, +%! x = 0.5 * ones(1, dim); +%! y = stk_sampling_regulargrid(2^dim, dim); % [0; 1]^d is the default box +%! fd = stk_filldist(x, y); +%! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); +%! end + +%% +% One point in the middle of [1; 2]^d (exact filldist) + +%!test +%! for dim = [1 3 7], +%! box = repmat([1; 2], 1, dim); +%! x = 1 + 0.5 * ones(1, dim); +%! fd = stk_filldist(x, box); +%! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); +%! end + +%% +% 20 points in [-1; 1]^3 + +%!test +%! dim = 3; +%! box = repmat([-1; 1], 1, dim); +%! x = stk_sampling_randunif(20, dim, box); +%! y = stk_sampling_regulargrid(3^dim, dim, box); +%! fd1 = stk_filldist(x, box); +%! fd2 = stk_filldist(x, y); +%! assert(fd1 >= fd2 - 10 * eps); + +%% +% One point at the origin, BOX = [0; 1]^d + +%!test %%% exact +%! for dim = [1 3 7], +%! x = zeros(1, dim); +%! [fd, ymax] = stk_filldist_exact(x); +%! assert(stk_isequal_tolabs(fd, sqrt(dim))); +%! assert(stk_isequal_tolabs(ymax, ones(1, dim))); +%! end + +%!test %%% discretized +%! for dim = [1 3 7], +%! x = zeros(1, dim); +%! y = stk_sampling_regulargrid(3^dim, dim); +%! [fd, ymax] = stk_filldist(x, y); +%! assert(stk_isequal_tolabs(fd, sqrt(dim))); +%! assert(stk_isequal_tolabs(ymax, ones(1, dim))); +%! end diff --git a/inst/misc/dist/stk_filldist_discretized.m b/inst/misc/dist/stk_filldist_discretized.m new file mode 100644 index 0000000..931ee76 --- /dev/null +++ b/inst/misc/dist/stk_filldist_discretized.m @@ -0,0 +1,138 @@ +% STK_FILLDIST_DISCRETIZED computes the (discrete) fill distance of a set of points +% +% CALL: FD = stk_filldist_discretized(X, Y) +% +% computes the fill distance FD of X using the "test set" Y. More precisely, if +% X and Y are respectively n x d and m x d, then +% +% FD = max_{1 <= j <= m} min_{1 <= i <= n} norm(X(i,:) - Y(j,:)), +% +% where norm(.) denotes the Euclidean norm in R^d. If Y is dense enough in some +% subset BOX of R^d, then FD should be close to the actual fill distance of X in +% BOX (see: stk_filldist_exact). Optimal designs with respect to the fill distance +% are sometimes called "minimax" designs (see, e.g., [1]). +% +% CALL: [D, ARGMAX] = stk_filldist_discretized(X, Y) +% +% also returns the value ARGMAX of the index j for which the maximum is attained. +% (If the maximum is obtained for several values of j, the smallest is returned.) +% +% REFERENCE +% +% [1] Mark E. Johnson, Leslie M. Moore and Donald Ylvisaker, "Minimax +% and maximin distance designs", Journal of Statistical Planning +% and Inference, 26(2):131-148, 1990. +% +% See also: stk_filldist, stk_filldist_exact, stk_dist, stk_mindist + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [fd, ymax] = stk_filldist_discretized(x, y) + +x = double(x); +y = double(y); + +% call MEX-file +[fd, idx_max] = __stk_filldist_discr_mex__(x, y); +ymax = y(idx_max, :); + +end % function + + +%% +% Two non-empty matrices are expected as input arguments + +%!error stk_filldist_discretized(0.0) % incorrect nb of arguments +%!error stk_filldist_discretized(0.0, []) % second arg is empty +%!error stk_filldist_discretized([], 0.0) % first arg is empty + +%% +% Check that both double-precision matrices and stk_dataframe objects are accepted + +%!test +%! d = 3; x = rand(7, d); y = rand(20, d); +%! fd1 = stk_filldist_discretized(x, y); +%! fd2 = stk_filldist_discretized(stk_dataframe(x), stk_dataframe(y)); +%! assert(stk_isequal_tolabs(fd1, fd2)); + +%% +% fd = 0 if X = Y + +%!test +%! n = 5; +%! for dim = 1:10, +%! x = rand(n, dim); +%! fd = stk_filldist_discretized(x, x); +%! assert(stk_isequal_tolabs(fd, 0.0)); +%! end + +%% +% fd = norm if nx = ny = 1 + +%!test +%! for dim = 1:10, +%! x = rand(1, dim); +%! y = rand(1, dim); +%! fd = stk_filldist_discretized(x, y); +%! assert(stk_isequal_tolabs(fd, norm(x - y))); +%! end + +%% +% Filldist = max(dist) if ny = 1 + +%!test +%! n = 4; +%! for dim = 2:10, +%! x = zeros(n, dim); +%! y = rand(1, dim); +%! fd = stk_filldist_discretized(x, y); +%! assert(stk_isequal_tolabs(fd, max(stk_dist(x, y)))); +%! end + +%% +% One point in the middle of [0; 1]^d + +%!test +%! for dim = [1 3 6], +%! x = 0.5 * ones(1, dim); +%! y = stk_sampling_regulargrid(2^dim, dim); % [0; 1]^d is the default box +%! fd = stk_filldist_discretized(x, y); +%! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); +%! end + +%% +% One point at the origin, BOX = [0; 1]^d + +%!test +%! for dim = [1 3 7], +%! x = zeros(1, dim); +%! y = stk_sampling_regulargrid(3^dim, dim); +%! [fd, ymax] = stk_filldist_discretized(x, y); +%! assert(stk_isequal_tolabs(fd, sqrt(dim))); +%! assert(stk_isequal_tolabs(ymax, ones(1, dim))); +%! end diff --git a/inst/misc/dist/stk_filldist_exact.m b/inst/misc/dist/stk_filldist_exact.m new file mode 100644 index 0000000..b250dc1 --- /dev/null +++ b/inst/misc/dist/stk_filldist_exact.m @@ -0,0 +1,200 @@ +% STK_FILLDIST_EXACT computes the (exact) fill distance of a set of points +% +% CALL: FD = stk_filldist_exact(X, BOX) +% +% computes the fill distance FD of the dataset X in the hyper-rectangle +% BOX, using the computational-geometric algorithm of L. Pronzato and +% W. G. Muller [1]. Recall that +% +% D = max_{Y in BOX} min_{1 <= i <= n} norm(X(i,:) - Y), (1) +% +% where norm(.) denotes the Euclidean norm in R^d. Optimal designs with +% respect to the fill distance are sometimes called "minimax" designs +% (see, e.g., [2]). +% +% CALL: FD = stk_filldist_exact(X) +% +% assumes that the fill distance is to be computed with respect to the +% hyperrectangle BOX = [0; 1]^d. +% +% CALL: [FD, YMAX] = stk_filldist_exact(...) +% +% also returns the point YMAX where the maximal distance is attained, +% i.e., the argmax in equation (1). +% +% REFERENCES +% +% [1] Luc Pronzato and Werner G. Muller, "Design of computer +% experiments: space filling and beyond", Statistics and Computing, +% 22(3):681-701, 2012. +% +% [2] Mark E. Johnson, Leslie M. Moore and Donald Ylvisaker, "Minimax +% and maximin distance designs", Journal of Statistical Planning +% and Inference, 26(2):131-148, 1990. +% +% See also: stk_filldist, stk_filldist_discretized, stk_dist, stk_mindist + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013 SUPELEC, Guillaume Carlier & Florian Pasanisi +% +% Authors: Julien Bect +% Florian Pasanisi +% and Guillaume Carlier +% +% Maintainer: Julien Bect +% +% Guillaume Carlier and Florian Pasanisi wrote a first implementation +% of the algorithm following the paper of Pronzato & Muller (2011), +% which was subsequently streamlined and adapted to the STK toolbox +% by Julien Bect. + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [fd, ymax] = stk_filldist_exact(x, box) %--------------------------------------- + +x = double(x); +[n, d] = size(x); + +if nargin == 1, + box = repmat([0; 1], 1, d); +else + box = double(box); +end + +%--- Construct a triangulation that covers [0; 1]^d ------------------------------------- + +x = add_symm(x, box); % extend using symmetries with respect to the faces + +% 2013/03/13: at the present time, Octave doesn't have the 'stable' option +% (but, fortunately, we don't really care about doing a STABLE sort here...) + +% remove duplicates to avoid a a warning in delaunayn() +x = unique(x, 'rows'); + +dt = delaunayn(x); % Delaunay trianulation +nt = length(dt(:, 1)); % number of triangles + +%--- Compute centers and radiuses ------------------------------------------------------- + +center = zeros(nt, d); % prepare for computing the centers +rsquared = zeros(nt, 1); % prepare for computing the (squared) radiuses + +for i = 1:nt, + Z = x(dt(i, :), :); % vertices of the simplex + W = sum(Z.^2, 2); % squared norms + C = repmat(Z(1, :), d, 1) - Z(2:end, :); + B = (W(1) - W(2:end))/2; + center(i, :) = transpose(C\B); + rsquared(i, 1) = sum(center(i,:).^2) + W(1) - 2 * Z(1, :) * center(i, :)'; +end + +%--- Find the simplices for which the center is (almost) inside the box ----------------- + +% enlarge box for numerical tolerance +TOLERANCE = 1e-10; +bbox = box + TOLERANCE * [-1; 1] * diff(box); + +inside = true(size(center, 1), 1); +for j = 1:d, + inside = inside & (center(:, j) >= bbox(1, j)) ... + & (center(:, j) <= bbox(2, j)) ; +end + +%--- Grand finale ----------------------------------------------------------------------- + +% maximal radius for centers that are almost inside the box +[rsquared_max, idx_max] = max(rsquared .* double(inside)); + +% project on the box +ymax = max(min(center(idx_max, :), box(2, :)), box(1, :)); + +% fill distance +fd = sqrt(rsquared_max); + +% safety net +if isinf(fd) || any(isnan(ymax)), + errmsg = 'This is surprising... How did I get here ???'; + stk_error(errmsg, 'AlgorithmFailure'); +end + +end % function + + +%%%%%%%%%%%%%%% +% add_sym % +%%%%%%%%%%%%%%% + +function y = add_symm(x, box) %---------------------------------------------------------- + +[n d] = size(x); +k = 2 * d + 1; +y = repmat(x, k, 1); + +for j = 1:d + y(n*j+1:(j+1)*n, j) = 2 * box(1, j) - x(1:n, j); + y((k-j)*n+1:(k+1-j)*n, j) = 2 * box(2, j) - x(1:n, j); +end + +end % function + + +%% +% Check that both double-precision matrices and stk_dataframe objects are accepted + +%!test +%! d = 3; x = rand(7, d); box = repmat([0; 1], 1, d); +%! fd1 = stk_filldist_exact(x, box); +%! fd2 = stk_filldist_exact(stk_dataframe(x), stk_dataframe(box)); +%! assert(stk_isequal_tolabs(fd1, fd2)); + +%% +% One point in the middle of [0; 1]^d + +%!test +%! for dim = 1:6, +%! x = 0.5 * ones(1, dim); +%! fd = stk_filldist_exact(x); % [0; 1]^d is the default box +%! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); +%! end + +%% +% One point in the middle of [1; 2]^d + +%!test +%! for dim = [1 3 7], +%! box = repmat([1; 2], 1, dim); +%! x = 1 + 0.5 * ones(1, dim); +%! fd = stk_filldist_exact(x, box); +%! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); +%! end + +%% +% One point at the origin, BOX = [0; 1]^d + +%!test +%! for dim = [1 3 7], +%! x = zeros(1, dim); +%! [fd, ymax] = stk_filldist_exact(x); +%! assert(stk_isequal_tolabs(fd, sqrt(dim))); +%! assert(stk_isequal_tolabs(ymax, ones(1, dim))); +%! end diff --git a/inst/misc/dist/stk_gpquadform.m b/inst/misc/dist/stk_gpquadform.m new file mode 100644 index 0000000..4b30b97 --- /dev/null +++ b/inst/misc/dist/stk_gpquadform.m @@ -0,0 +1,183 @@ +% STK_GPQUADFORM [experimental, not part of public API yet... UAYOR!] +% +% CALL: Q = stk_gpquadform (X, Y, RX, RY) +% +% computes a matrix Q, whose entries Q(i,j) are given by a Gibbs- +% Paciorek quadratic form +% +% Q(i,j) = \sum_{k = 1}^d (X(i,k) - Y(j,k))^2 / R(i,j,k)^2, +% +% where +% +% R(i,j,k)^2 = RX(i,k)^2 + RY(i,k)^2, +% +% assuming that +% +% * X and RX have size [nX d], +% * Y and RY have size [nY d]. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function Q = stk_gpquadform (x, y, rx, ry, pairwise) + +% read argument #4 +if nargin < 4 + if isempty (y) + ry = rx; + else + errmsg = 'Not enough input arguments.'; + stk_error (errmsg, 'NotEnoughInputArgs'); + end +else + if (isempty (y)) && (~ isempty (ry)) && (~ isequal (rx, ry)) + errmsg = 'ry should be empty or equal to rx'; + stk_error (errmsg, 'InvalidArgument'); + end +end + + +% read argument #5 +if nargin < 5 + pairwise = false; +else + if ~ islogical (pairwise) + errmsg = 'Argument ''pairwise'' should be either true or false.'; + stk_error (errmsg, 'TypeMismatch'); + end +end + +if pairwise, + if isempty (y), + Q = zeros (size (x, 1), 1); + else + Q = __stk_gpquadform_pairwise__ (x, y, rx, ry); + end +else + if isempty (y), + Q = __stk_gpquadform_matrixx__ (x, rx); + else + Q = __stk_gpquadform_matrixy__ (x, y, rx, ry); + end +end + +end % function + + +%%%%%%%%% +% TESTS % +%%%%%%%%% + +%!shared x, y, z, rx, ry, rz +%! x = rand(5, 2); rx = rand(5, 2) + 1; +%! y = rand(6, 2); ry = rand(6, 2) + 1; +%! z = rand(5, 3); rz = rand(5, 3) + 1; + +%% +% Check that an error is raised when sizes are incompatible + +%!error Q = stk_gpquadform(x, ry, y, ry) +%!error Q = stk_gpquadform(x, rz, y, ry) +%!error Q = stk_gpquadform(x, rx, y, rx) +%!error Q = stk_gpquadform(x, rx, y, rz) +%!error Q = stk_gpquadform(x, rx, z, ry) + +%% +% Tests with r = 1/sqrt(2) + +%!shared x, y, z, rx, ry, rz +%! x = zeros (11, 5); rx = 1/sqrt(2) * ones (11, 5); +%! y = zeros (13, 5); ry = 1/sqrt(2) * ones (13, 5); +%! z = ones ( 7, 5); rz = 1/sqrt(2) * ones ( 7, 5); + +%!test +%! Qx = stk_gpquadform(x, [], rx); +%! assert(isequal(Qx, zeros(11))); + +%!test +%! Qxx = stk_gpquadform(x, x, rx, rx); +%! assert(isequal(Qxx, zeros(11))); + +%!test +%! Qxy = stk_gpquadform(x, y, rx, ry); +%! assert(isequal(Qxy, zeros(11, 13))); + +%!test +%! Qzz = stk_gpquadform(z, [], rz); +%! assert(isequal(Qzz, zeros(7))); + +%!test +%! Qxz = stk_gpquadform(x, z, rx, rz); +%! assert(stk_isequal_tolabs(Qxz, 5 * ones(11, 7))); + +%% +% Tests with a random r + +%!test +%! x = randn(5, 3); rx = 1 + rand(5, 3); +%! y = randn(5, 3); ry = 1 + rand(5, 3); +%! Q1 = stk_gpquadform(x, y, rx, ry, true); % pairwise +%! Q2 = stk_gpquadform(x, y, rx, ry, false); +%! assert(isequal(size(Q1), [5 1])); +%! assert(isequal(size(Q2), [5 5])); +%! assert(stk_isequal_tolabs(Q1, diag(Q2))); + +%!test +%! x = randn(5, 3); rx = 1 + rand(5, 3); +%! Q1 = stk_gpquadform(x, [], rx, [], true); % pairwise +%! assert(stk_isequal_tolabs(Q1, zeros(5, 1))); +%! Q1 = stk_gpquadform(x, x, rx, rx, true); % pairwise +%! assert(stk_isequal_tolabs(Q1, zeros(5, 1))); + + +%% +% Tests with r = 2 + +%!shared x, y, z, rx, ry, rz +%! x = zeros (11, 5); rx = 2 * ones (11, 5); +%! y = zeros (13, 5); ry = 2 * ones (13, 5); +%! z = ones ( 7, 5); rz = 2 * ones ( 7, 5); + +%!test +%! Qx = stk_gpquadform(x, [], rx); +%! assert(isequal(Qx, zeros(11))); + +%!test +%! Qxx = stk_gpquadform(x, x, rx, rx); +%! assert(isequal(Qxx, zeros(11))); + +%!test +%! Qxy = stk_gpquadform(x, y, rx, ry); +%! assert(isequal(Qxy, zeros(11, 13))); + +%!test +%! Qzz = stk_gpquadform(z, [], rz); +%! assert(isequal(Qzz, zeros(7))); + +%!test +%! Qxz = stk_gpquadform(x, z, rx, rz); +%! assert(stk_isequal_tolabs(Qxz, 5/8 * ones(11, 7))); diff --git a/inst/misc/dist/stk_mindist.m b/inst/misc/dist/stk_mindist.m new file mode 100644 index 0000000..0b117f7 --- /dev/null +++ b/inst/misc/dist/stk_mindist.m @@ -0,0 +1,117 @@ +% STK_MINDIST computes the separation distance of a set of points +% +% CALL: D = stk_mindist(X) +% +% computes the separation distance D of X. More precisely, if X is an +% n x d matrix, then +% +% D = min_{1 <= i < j <= n} norm(X(i,:) - X(j,:)), +% +% where norm(.) denotes the Euclidean norm in R^d. +% +% See also: stk_dist, stk_filldist + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function md = stk_mindist(x) + +% call MEX-file +md = __stk_mindist_mex__(double(x)); + +end % function + + +%% +% Check that both double-precision matrices and stk_dataframe objects are accepted + +%!test +%! d = 3; x = rand(7, d); +%! md1 = stk_mindist(x); +%! md2 = stk_mindist(stk_dataframe(x)); +%! assert(stk_isequal_tolabs(md1, md2)); + +%% +% Check that sk_mindist(x) is empty when x has zero lines + +%!test +%! for nc = [0 5 10], +%! x = zeros(0, nc); +%! d = stk_mindist(x); +%! assert(isempty(d)); +%! end + +%% +% Check that sk_mindist(x) is empty when x has only one line. + +%!test +%! for nc = [0 5 10], +%! x = rand(1, nc); +%! d = stk_mindist(x); +%! assert(isempty(d)); +%! end + +%% +% Check that sk_mindist(x) is 0.0 when x has 0 columns (but at least 2 lines) + +%!test +%! for nr = [2 5 10], +%! x = zeros(nr, 0); +%! d = stk_mindist(x); +%! assert(isequal(d, 0.0)); +%! end + +%% +% Random matrices with at least 2 lines and 1 column + +%!test +%! +%! nrep = 20; +%! TOL_REL = 1e-15; +%! +%! for irep = 1:nrep, +%! +%! n = 2 + floor(rand * 10); +%! d = 1 + floor(rand * 10); +%! x = rand(n, d); +%! z = stk_mindist(x); +%! +%! assert(isequal(size(d), [1, 1])); +%! assert(~isnan(d)); +%! assert(~isinf(d)); +%! +%! % check the result +%! mindist = Inf; +%! for i = 1:(n-1), +%! for j = (i+1):n, +%! mindist = min(mindist, norm(x(i,:) - x(j,:))); +%! end +%! end +%! assert(abs(z - mindist) <= TOL_REL * mindist); +%! +%! end diff --git a/inst/misc/distrib/stk_distrib_bivnorm_cdf.m b/inst/misc/distrib/stk_distrib_bivnorm_cdf.m new file mode 100644 index 0000000..bfe637b --- /dev/null +++ b/inst/misc/distrib/stk_distrib_bivnorm_cdf.m @@ -0,0 +1,187 @@ +% STK_DISTRIB_BIVNORM_CDF [STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [p, q] = stk_distrib_bivnorm_cdf (z, mu1, mu2, sigma1, sigma2, rho) + +%--- Split z into [z1, z2] ----------------------------------------------------- + +s = size (z); +if s(end) ~= 2 + stk_error (['Incorrect size: expecting an array with length 2 ' ... + 'on its last dimension.'], 'IncorrectSize'); +end + +S = struct ('type', '()', 'subs', {repmat({':'}, size(s))}); + +S.subs{end} = 1; z1 = subsref (z, S); +S.subs{end} = 2; z2 = subsref (z, S); + +%--- Substract the means ------------------------------------------------------- + +if ~ isequal (mu1, 0) + z1 = bsxfun (@minus, z1, mu1); +end + +if ~ isequal (mu2, 0) + z2 = bsxfun (@minus, z2, mu2); +end + +%--- Bring everything to a common size ----------------------------------------- + +if ~ isequal (size (z1), size (z2), size (sigma1), size (sigma2), size (rho)) + [z1, z2, sigma1, sigma2, rho] = stk_commonsize ... + (z1, z2, sigma1, sigma2, rho); +end + +p = nan (size (z1)); +q = nan (size (z1)); + +%--- Deal with special cases --------------------------------------------------- + +b1 = (sigma1 == 0.0); +if any (b1) % First component is zero a.s. + [p(b1) q(b1)] = handle_singular_case (b1, z1, z2, sigma2); +end + +b2 = (~ b1) & (sigma2 == 0.0); +if any (b2) % Second component is zero a.s. + [p(b2) q(b2)] = handle_singular_case (b2, z2, z1, sigma1); +end + +%--- Deal with the general case ------------------------------------------------ + +b0 = ~ (b1 | b2); +if any (b0) + z1 = z1(b0) ./ sigma1(b0); + z2 = z2(b0) ./ sigma2(b0); + [p(b0), q(b0)] = __stk_distrib_bivnorm0_cdf__ ([z1 z2], rho(b0)); +end + +end % function + + +function [p q] = handle_singular_case (b1, z1, z2, sigma2) + +z1_ = z1(b1); +z2_ = z2(b1); +sigma2_ = sigma2(b1); + +% Values for the case z1 < 0 +s = size (z1_); +p = zeros (s); +q = ones (s); + +b1p = (z1_ >= 0); +if any (b1p) + [p(b1p) q(b1p)] = stk_distrib_normal_cdf (z2_(b1p), 0, sigma2_(b1p)); +end + +end % function + +%!test +%! +%! z1 = [0 1; -1 2]; +%! z2 = [0 1; 1 -2]; +%! +%! z = cat (3, z1, z2); % 2 x 2 x 2 +%! +%! mu1 = 0; % 1 x 1 x 1 +%! mu2 = [0 1]; % 1 x 2 x 1 +%! +%! sigma1 = [1 3]; % 1 x 2 x 1 +%! sigma2 = [1; 2]; % 2 x 1 x 1 +%! +%! rho = [0; 0.5]; % 2 x 1 x 1 +%! +%! %% BROADCASTING => the result will be a 2 x 2 matrix +%! +%! p = stk_distrib_bivnorm_cdf (z, mu1, mu2, sigma1, sigma2, rho); +%! +%! p11 = 0.25; % mvncdf ([ 0 0], [0 0], [1 0; 0 1]); +%! p12 = 0.315279329909118; % mvncdf ([ 1 1], [0 1], [9 0; 0 1]); +%! p21 = 0.146208349559646; % mvncdf ([-1 1], [0 0], [1 1; 1 4]); +%! p22 = 0.064656239880040; % mvncdf ([ 2 -2], [0 1], [9 3; 3 4]); +%! +%! assert (stk_isequal_tolabs (p, [p11 p12; p21 p22], 1e-14)) + + +%%% [p, q] = stk_distrib_bivnorm_cdf ([inf z], 0, 0, 1, 1, 0) with various z's + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([inf -inf], 0, 0, 1, 1, 0); +%! assert ((p == 0.0) && (q == 1.0)) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([inf -10], 0, 0, 1, 1, 0); +%! assert (stk_isequal_tolrel (p, 7.619853024160489e-24, 1e-12)) +%! assert (q == 1.0) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([inf 0], 0, 0, 1, 1, 0); +%! assert (stk_isequal_tolrel (p, 0.5, 1e-12)) +%! assert (stk_isequal_tolrel (q, 0.5, 1e-12)) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([inf 10], 0, 0, 1, 1, 0); +%! assert (p == 1.0); +%! assert (stk_isequal_tolrel (q, 7.619853024160489e-24, 1e-12)) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([inf inf], 0, 0, 1, 1, 0); +%! assert ((p == 1.0) && (q == 0.0)) + + +%%% [p, q] = stk_distrib_bivnorm_cdf ([z inf], 0, 0, 1, 1, 0) with various z's + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([-inf inf], 0, 0, 1, 1, 0); +%! assert ((p == 0.0) && (q == 1.0)) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([-10 inf], 0, 0, 1, 1, 0); +%! assert (stk_isequal_tolrel (p, 7.619853024160489e-24, 1e-12)) +%! assert (q == 1.0) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([0 inf], 0, 0, 1, 1, 0); +%! assert (stk_isequal_tolrel (p, 0.5, 1e-12)) +%! assert (stk_isequal_tolrel (q, 0.5, 1e-12)) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([10 inf], 0, 0, 1, 1, 0); +%! assert (p == 1.0); +%! assert (stk_isequal_tolrel (q, 7.619853024160489e-24, 1e-12)) + +%!test +%! [p, q] = stk_distrib_bivnorm_cdf ([inf inf], 0, 0, 1, 1, 0); +%! assert ((p == 1.0) && (q == 0.0)) + +%!test % A mixture of singular and non-singular cases +%! p = stk_distrib_bivnorm_cdf ([0 0], 0, 0, [1; 0], 1, 0); +%! assert (isequal (p, [0.25; 0.5])); diff --git a/inst/misc/distrib/stk_distrib_logpdf.m b/inst/misc/distrib/stk_distrib_logpdf.m new file mode 100644 index 0000000..2448d16 --- /dev/null +++ b/inst/misc/distrib/stk_distrib_logpdf.m @@ -0,0 +1,55 @@ +% STK_DISTRIB_LOGPDF [STK internal] +% +% Trying to make things cleaner, until we finally develop an elegant system of +% probability distribution objects... +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. Please be aware that +% API-breaking changes are likely to happen in future releases. + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2016 LNE +% +% Authors: Julien Bect +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function logpdf = stk_distrib_logpdf (distrib, z) + +delta = z - distrib.mean; + +if isfield (distrib, 'invcov') + + % We assume (but do not check) that .var is absent or compatible with invcov... + + logpdf = - 0.5 * (delta' * distrib.invcov * delta); + +else % assume isfield (distrib, 'var') + + logpdf = - 0.5 * (delta' * (distrib.var \ delta)); + +end + +end % function diff --git a/inst/misc/distrib/stk_distrib_logpdf_grad.m b/inst/misc/distrib/stk_distrib_logpdf_grad.m new file mode 100644 index 0000000..ac8a17a --- /dev/null +++ b/inst/misc/distrib/stk_distrib_logpdf_grad.m @@ -0,0 +1,55 @@ +% STK_DISTRIB_LOGPDF_GRAD [STK internal] +% +% Trying to make things cleaner, until we finally develop an elegant system of +% probability distribution objects... +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. Please be aware that +% API-breaking changes are likely to happen in future releases. + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2016 LNE +% +% Authors: Julien Bect +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function dlogpdf = stk_distrib_logpdf_grad (distrib, z) + +delta = z - distrib.mean; + +if isfield (distrib, 'invcov') + + % We assume (but do not check) that .var is absent or compatible with invcov... + + dlogpdf = - distrib.invcov * delta; + +else % assume isfield (distrib, 'var') + + dlogpdf = - distrib.var \ delta; + +end + +end % function diff --git a/inst/misc/distrib/stk_distrib_normal_cdf.m b/inst/misc/distrib/stk_distrib_normal_cdf.m new file mode 100644 index 0000000..143ac3b --- /dev/null +++ b/inst/misc/distrib/stk_distrib_normal_cdf.m @@ -0,0 +1,117 @@ +% STK_DISTRIB_NORMAL_CDF [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [p, q] = stk_distrib_normal_cdf (z, mu, sigma) + +if nargin > 1, + z = bsxfun (@minus, z, mu); +end + +if nargin < 3, + sigma = 1; +end + +if isscalar (sigma) + if sigma > 0 + z = z / sigma; + k0 = false; + k1 = true; + elseif sigma == 0 + k0 = true; + k1 = false; + else + k0 = false; + k1 = false; + end +else + if ~ isequal (size (z), size (sigma)) + [z, sigma] = stk_commonsize (z, sigma); + end + k0 = (sigma == 0); + k1 = (sigma > 0); + z(k1) = z(k1) ./ sigma(k1); +end + +p = nan (size (z)); +q = nan (size (z)); + +kp = (z >= 0); +kz = ~ isnan (z); + +if any (k1) % sigma > 0 + + k1 = bsxfun (@and, k1, kz); + k1n = k1 & (~ kp); + k1p = k1 & kp; + + % Deal with positive values of x: compute q first, then p = 1 - q + q_k1p = 0.5 * erfc (0.707106781186547524 * z(k1p)); + q(k1p) = q_k1p; + p(k1p) = 1 - q_k1p; + + % Deal with negative values of x: compute p first, then q = 1 - p + p_k1n = 0.5 * erfc (- 0.707106781186547524 * z(k1n)); + p(k1n) = p_k1n; + q(k1n) = 1 - p_k1n; + +end + +if any (k0) % sigma == 0 + + k0 = bsxfun (@and, k0, kz); + + p_k0 = double (kp(k0)); + p(k0) = p_k0; + q(k0) = 1 - p_k0; + +end + +end % function + + +%!assert (stk_isequal_tolrel (stk_distrib_normal_cdf ([1; 3], 1, [1 10]), ... +%! [0.5, ... % normcdf ((1 - 1) / 1) +%! 0.5; ... % normcdf ((1 - 1) / 10) +%! 0.5 * erfc(-sqrt(2)), ... % normcdf ((3 - 1) / 1) +%! 0.5 * erfc(-0.1*sqrt(2)) ... % normcdf ((3 - 1) / 10) +%! ], eps)); + +%!test +%! [p, q] = stk_distrib_normal_cdf (10); +%! assert (isequal (p, 1.0)); +%! assert (stk_isequal_tolrel (q, 7.6198530241604975e-24, eps)); + +%!assert (isequal (stk_distrib_normal_cdf ( 0.0), 0.5)); +%!assert (isequal (stk_distrib_normal_cdf ( inf), 1.0)); +%!assert (isequal (stk_distrib_normal_cdf (-inf), 0.0)); +%!assert (isnan (stk_distrib_normal_cdf ( nan))); +%!assert (isnan (stk_distrib_normal_cdf (0, 0, -1))); +%!assert (isequal (stk_distrib_normal_cdf (0, 0, 0), 1.0)); +%!assert (isequal (stk_distrib_normal_cdf (0, 1, 0), 0.0)); +%!assert (isequal (stk_distrib_normal_cdf (1, 0, 0), 1.0)); diff --git a/inst/misc/distrib/stk_distrib_normal_crps.m b/inst/misc/distrib/stk_distrib_normal_crps.m new file mode 100644 index 0000000..8adb407 --- /dev/null +++ b/inst/misc/distrib/stk_distrib_normal_crps.m @@ -0,0 +1,142 @@ +% STK_DISTRIB_NORMAL_CRPS computes the CRPS for Gaussian predictive distributions +% +% CALL: CRPS = stk_distrib_normal_crps (Z, MU, SIGMA) +% +% computes the Continuous Ranked Probability Score (CRPS) of Z with respect +% to a Gaussian predictive distribution with mean MU and standard deviation +% SIGMA. +% +% The CRPS is defined as the integral of the Brier score for the event +% {Z <= z}, when z ranges from -inf to +inf: +% +% CRPS = int_{-inf}^{+inf} [Phi((z - MU)/SIGMA) - u(z - Z)]^2 dz, +% +% where Phi is the normal cdf and u the Heaviside step function. The CRPS +% is equal to zero if, and only if, the predictive distribution is a Dirac +% distribution (SIGMA = 0) and the observed value is equal to the predicted +% value (Z = MU). +% +% REFERENCE +% +% [1] Tilmann Gneiting and Adrian E. Raftery, "Strictly proper scoring +% rules, prediction, and estimation", Journal of the American +% Statistical Association, 102(477):359-378, 2007. +% +% See also: stk_distrib_normal_cdf, stk_predict_leaveoneout + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2017 CentraleSupelec & LNE +% +% Authors: Remi Stroh +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crps = stk_distrib_normal_crps(z, mu, sigma) + + +%% Center and reduce the data + +if nargin > 1 && ~ isempty (mu) + delta = bsxfun (@minus, z, mu); % compute z - m +else + % Default: mu = 0; + delta = z; +end + +if nargin > 2 && ~ isempty (sigma) + sigma(sigma < 0) = nan; +else + % Default: sigma = 1 + sigma = 1; +end + +% Check size +[delta, sigma] = stk_commonsize (delta, sigma); + + +%% Formula for CRPS + +crps = nan (size (delta)); + +b0 = ~ (isnan (delta) | isnan (sigma)); +b1 = (sigma > 0); + +% Compute the CRPS where sigma > 0 +b = b0 & b1; +if any (b) + u = delta(b) ./ sigma(b); % (z - m)/s + crps(b) = sigma(b) .* (2 * stk_distrib_normal_pdf (u)... + + u .* (2 * stk_distrib_normal_cdf (u) - 1)) - sigma(b) / (sqrt (pi)); +end + +% Compute the CRPS where sigma == 0: CRPS = abs(z - mu) +b = b0 & (~ b1); +crps(b) = abs (delta(b)); + +% Correct numerical inaccuracies +crps(crps < 0) = 0; + +end + + +% Check particular values + +%!assert (stk_isequal_tolabs (stk_distrib_normal_crps (0.0, 0.0, 0.0), 0.0)) +%!assert (stk_isequal_tolabs (stk_distrib_normal_crps (0.0, 0.0, 1.0), (sqrt(2) - 1)/sqrt(pi))) + +% Compute Continuous Ranked Probability Score (CRPS) + +%!shared n, x_obs, mu, sigma, crps, crps_exp +%! x_obs = [ 1.78; -2.29; -1.62; -5.89; 2.88; 0.65; 2.74; -3.42]; % observations +%! mu = [-0.31; -0.59; 1.48; -1.57; -0.05; -0.27; 1.05; 1.27]; % predictions +%! sigma = [ 2.76; 6.80; 1.63; 1.19; 4.98; 9.60; 5.85; 2.24]; % standard dev +%! n = size(x_obs, 1); +%! crps = stk_distrib_normal_crps (x_obs, mu, sigma); + +%!assert (isequal (size (crps), [n, 1])) +%!assert (all (crps >= 0)) +%!assert (stk_isequal_tolabs (crps, stk_distrib_normal_crps(mu, x_obs, sigma))) + +%!assert (stk_isequal_tolabs (stk_distrib_normal_crps (x_obs, mu, 0), abs (x_obs - mu))) + +% % Numerical integration to get the reference results used below +% crps_ref = nan (n, 1); +% for k = 1:n +% x1 = linspace (mu(k) - 6*sigma(k), x_obs(k), 2e6); +% x2 = linspace (x_obs(k), mu(k) + 6*sigma(k), 2e6); +% F1 = stk_distrib_normal_cdf (x1, mu(k), sigma(k)) .^ 2; +% F2 = stk_distrib_normal_cdf (mu(k), x2, sigma(k)) .^ 2; +% crps_ref(k) = trapz ([x1 x2], [F1 F2]); +% end + +%! crps_ref = [ ... +%! 1.247856605928301 ... +%! 1.757798727719891 ... +%! 2.216236225997414 ... +%! 3.648696666764968 ... +%! 1.832355265287495 ... +%! 2.278618297947438 ... +%! 1.560544734359158 ... +%! 3.455697443411153 ]; +%! assert (stk_isequal_tolabs (crps, crps_ref, 1e-10)); diff --git a/inst/misc/distrib/stk_distrib_normal_ei.m b/inst/misc/distrib/stk_distrib_normal_ei.m new file mode 100644 index 0000000..e2229c0 --- /dev/null +++ b/inst/misc/distrib/stk_distrib_normal_ei.m @@ -0,0 +1,145 @@ +% STK_DISTRIB_NORMAL_EI computes the normal (Gaussian) expected improvement +% +% CALL: EI = stk_distrib_normal_ei (Z) +% +% computes the expected improvement of a standard normal (Gaussian) +% random variable above the threshold Z. +% +% CALL: EI = stk_distrib_normal_ei (Z, MU, SIGMA) +% +% computes the expected improvement of a Gaussian random variable +% with mean MU and standard deviation SIGMA, above the threshold Z. +% +% CALL: EI = stk_distrib_normal_ei (Z, MU, SIGMA, MINIMIZE) +% +% computes the expected improvement of a Gaussian random variable +% with mean MU and standard deviation SIGMA, below the threshold Z +% if MINIMIZE is true, above the threshold Z otherwise. +% +% NOTE +% +% Starting with STK 2.4.1, it is recommended to use stk_sampcrit_ei_eval +% instead of this function. Be careful, however, with the "direction" of +% the improvement that you want to compute: +% +% EI = stk_sampcrit_ei_eval (MU, SIGMA, Z) +% +% computes the expected improvement *below* the threshold Z, and is thus +% equivalent to +% +% EI = stk_distrib_normal_ei (Z, MU, SIGMA, true) +% +% To compute the expected improvement *above* Z, change signs as follows: +% +% EI = stk_sampcrit_ei_eval (-MU, SIGMA, -Z) +% +% REFERENCES +% +% [1] D. R. Jones, M. Schonlau and William J. Welch. Efficient global +% optimization of expensive black-box functions. Journal of Global +% Optimization, 13(4):455-492, 1998. +% +% [2] J. Mockus, V. Tiesis and A. Zilinskas. The application of Bayesian +% methods for seeking the extremum. In L.C.W. Dixon and G.P. Szego, +% editors, Towards Global Optimization, volume 2, pages 117-129, North +% Holland, New York, 1978. +% +% See also stk_sampcrit_ei_eval, stk_distrib_student_ei + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Romain Benassi + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ei = stk_distrib_normal_ei (z, mu, sigma, minimize) + +if nargin > 1, + delta = bsxfun (@minus, mu, z); +else + % Default: mu = 0; + delta = - z; +end + +if nargin > 2, + sigma(sigma < 0) = nan; +else + % Default: sigma = 1 + sigma = 1; +end + +% Default: compute the EI for a maximization problem +if nargin > 3, + minimize = logical (minimize); +else + minimize = false; +end + +% Reduce to the maximization case +if minimize, + delta = - delta; +end + +[delta, sigma] = stk_commonsize (delta, sigma); + +ei = nan (size (delta)); + +b0 = ~ (isnan (delta) | isnan (sigma)); +b1 = (sigma > 0); + +% Compute the EI where sigma > 0 +b = b0 & b1; +if any (b) + u = delta(b) ./ sigma(b); + ei(b) = sigma(b) .* (stk_distrib_normal_pdf (u) ... + + u .* stk_distrib_normal_cdf (u)); +end + +% Compute the EI where sigma == 0 +b = b0 & (~ b1); +ei(b) = max (0, delta(b)); + +% Correct numerical inaccuracies +ei(ei < 0) = 0; + +end % function + + +%!assert (stk_isequal_tolrel (stk_distrib_normal_ei (0.0), 1 / sqrt (2 * pi), eps)) + +%!test % Decreasing as a function of z +%! ei = stk_distrib_normal_ei (linspace (-10, 10, 200)); +%! assert (all (diff (ei) < 0)) + +%!shared M, mu, sigma, ei +%! M = randn (1, 10); +%! mu = randn (5, 1); +%! sigma = 1 + rand (1, 1, 7); +%! ei = stk_distrib_normal_ei (M, mu, sigma); + +%!assert (isequal (size (ei), [5, 10, 7])) +%!assert (all (ei(:) >= 0)) +%!assert (isequal (ei, stk_distrib_normal_ei (M, mu, sigma, false))); +%!assert (isequal (ei, stk_distrib_normal_ei (-M, -mu, sigma, true))); diff --git a/inst/misc/distrib/stk_distrib_normal_pdf.m b/inst/misc/distrib/stk_distrib_normal_pdf.m new file mode 100644 index 0000000..3b0e4bb --- /dev/null +++ b/inst/misc/distrib/stk_distrib_normal_pdf.m @@ -0,0 +1,74 @@ +% STK_DISTRIB_NORMAL_PDF [STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function density = stk_distrib_normal_pdf (z, mu, sigma) + +if nargin > 1, + z = bsxfun (@minus, z, mu); +end + +if nargin > 2, + [z, sigma] = stk_commonsize (z, sigma); + z = z ./ sigma; + k0 = (sigma > 0); +else + sigma = 1; + k0 = 1; +end + +xx = z .^ 2; +density = nan (size (z)); + +k0 = k0 & (~ isnan (z)); +kb = (xx > 1491); % when x^2 > 1491, the result is 0 in double precision + +% Deal with "large" values of abs(x) +k = k0 & kb; +density(k) = 0; + +% Deal with "small" values of abs(x) +k = k0 & (~ kb); +density(k) = 0.39894228040143268 * exp (- 0.5 * xx(k)); + +density = bsxfun (@rdivide, density, sigma); + +end % function + + +%!assert (stk_isequal_tolrel (stk_distrib_normal_pdf ([1; 3], 1, [1 10]), ... +%! [1 / sqrt(2 * pi) ... % normpdf ((1 - 1) / 1) +%! 0.1 / sqrt(2 * pi); ... % normpdf ((1 - 1) / 10) / 10 +%! exp(-2) / sqrt(2 * pi) ... % normpdf ((3 - 1) / 1) +%! 3.910426939754558780e-2 ... % normpdf ((3 - 1) / 10) / 10 +%! ], eps)); + +%!assert (isequal (stk_distrib_normal_pdf (inf), 0.0)); +%!assert (isequal (stk_distrib_normal_pdf (-inf), 0.0)); +%!assert (isnan (stk_distrib_normal_pdf (nan))); +%!assert (isnan (stk_distrib_normal_pdf (0, 0, -1))); diff --git a/inst/misc/distrib/stk_distrib_student_cdf.m b/inst/misc/distrib/stk_distrib_student_cdf.m new file mode 100644 index 0000000..560afa1 --- /dev/null +++ b/inst/misc/distrib/stk_distrib_student_cdf.m @@ -0,0 +1,98 @@ +% STK_DISTRIB_STUDENT_CDF [STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect +% +% This code is very loosely based on Octave's tcdf function: +% ## Copyright (C) 2013 Julien Bect +% ## Copyright (C) 2012 Rik Wehbring +% ## Copyright (C) 1995-2012 Kurt Hornik + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [p, q] = stk_distrib_student_cdf (z, nu, mu, sigma) + +if nargin > 2, + z = bsxfun (@minus, z, mu); +end + +if nargin > 3, + z = bsxfun (@rdivide, z, sigma); +end + +xx = z .^ 2; +[z, xx, nu] = stk_commonsize (z, xx, nu); + +% Return NaN for negative values of nu (or nu == NaN, or x == NaN) +p = nan (size (z)); +q = nan (size (z)); +k0 = (nu > 0) & (~ isnan (z)); + +% Gaussian case (nu = +inf) +k_inf = isinf (nu); k = k0 & k_inf; +[p(k), q(k)] = stk_distrib_normal_cdf (z(k)); + +k0 = k0 & (~ k_inf); +kp = (z > 0); +kn = k0 & (~ kp); +kp = k0 & kp; +k_big_abs = (xx > nu); + +% Student case (nu < +inf) for positive x: compute q first, then p = 1 - q +k = kp & k_big_abs; +q(k) = betainc (nu(k) ./ (nu(k) + xx(k)), nu(k)/2, 1/2) / 2; +k = kp & (~ k_big_abs); +q(k) = 0.5 * (1 - betainc (xx(k) ./ (nu(k) + xx(k)), 1/2, nu(k)/2)); +p(kp) = 1 - q(kp); + +% Student case (nu < +inf) for negative x: compute p first, then q = 1 - p +k = kn & k_big_abs; +p(k) = betainc (nu(k) ./ (nu(k) + xx(k)), nu(k)/2, 1/2) / 2; +k = kn & (~ k_big_abs); +p(k) = 0.5 * (1 - betainc (xx(k) ./ (nu(k) + xx(k)), 1/2, nu(k)/2)); +q(kn) = 1 - p(kn); + +end % function + + +%!assert (stk_isequal_tolrel ( ... +%! stk_distrib_student_cdf ([-1; 0; 1], [1 2], 0, [1 10]), ... +%! [0.25, ... % tcdf ((-1 - 0)/1, 1) +%! 4.6473271920707004e-01; ... % tcdf ((-1 - 0)/10, 2) +%! 0.50, ... % tcdf (( 0 - 0)/1, 1) +%! 0.50; ... % tcdf (( 0 - 0)/10, 2) +%! 0.75, ... % tcdf (( 1 - 0)/1, 1) +%! 5.3526728079292996e-01 ... % tcdf (( 1 - 0)/10, 2) +%! ], 4 * eps)) + +%!test +%! [p, q] = stk_distrib_student_cdf (1e10, 2); +%! assert (isequal (p, 1.0)); +%! assert (stk_isequal_tolrel (q, 4.999999999999999999925e-21, 10 * eps)); + +%!assert (isequal (stk_distrib_student_cdf (0.0, 1), 0.5)); +%!assert (isequal (stk_distrib_student_cdf (inf, 1), 1.0)); +%!assert (isequal (stk_distrib_student_cdf (-inf, 1), 0.0)); +%!assert (isnan (stk_distrib_student_cdf (nan, 1))); diff --git a/inst/misc/distrib/stk_distrib_student_ei.m b/inst/misc/distrib/stk_distrib_student_ei.m new file mode 100644 index 0000000..601cdbe --- /dev/null +++ b/inst/misc/distrib/stk_distrib_student_ei.m @@ -0,0 +1,139 @@ +% STK_DISTRIB_STUDENT_EI computes the Student expected improvement +% +% CALL: EI = stk_distrib_student_ei (Z, NU) +% +% computes the expected improvement of a Student random variable with NU +% degrees of freedom above the threshold Z. +% +% CALL: EI = stk_distrib_student_ei (Z, NU, MU, SIGMA) +% +% computes the expected improvement of a Student random variable with NU +% degrees of freedom, location parameter MU and scale parameter SIGMA, +% above the threshold Z. +% +% CALL: EI = stk_distrib_student_ei (Z, NU, MU, SIGMA, MINIMIZE) +% +% computes the expected improvement of a Student random variable with NU +% degrees of freedom, location parameter MU and scale parameter SIGMA, +% below the threshold Z if MINIMIZE is true, above the threshold Z +% otherwise. +% +% REFERENCES +% +% [1] R. Benassi, J. Bect and E. Vazquez. Robust Gaussian process-based +% global optimization using a fully Bayesian expected improvement +% criterion. In: Learning and Intelligent Optimization (LION 5), +% LNCS 6683, pp. 176-190, Springer, 2011 +% +% [2] B. Williams, T. Santner and W. Notz. Sequential Design of Computer +% Experiments to Minimize Integrated Response Functions. Statistica +% Sinica, 10(4):1133-1152, 2000. +% +% See also stk_distrib_normal_ei + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Authors: Julien Bect +% Romain Benassi + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ei = stk_distrib_student_ei (z, nu, mu, sigma, minimize) + +nu(nu < 0) = nan; + +if nargin > 2, + delta = bsxfun (@minus, mu, z); +else + % Default: mu = 0; + delta = - z; +end + +if nargin > 3, + sigma(sigma < 0) = nan; +else + % Default + sigma = 1; +end + +% Default: compute the EI for a maximization problem +if nargin > 4, + minimize = logical (minimize); +else + minimize = false; +end + +% Reduce to the maximization case +if minimize, + delta = - delta; +end + +[delta, nu, sigma] = stk_commonsize (delta, nu, sigma); + +ei = nan (size (delta)); + +b0 = ~ (isnan (delta) | isnan (nu) | isnan (sigma)); +b1 = (nu > 1); +b2 = (sigma > 0); + +% The EI is infinite for nu <= 1 +ei(b0 & (~ b1)) = +inf; +b0 = b0 & b1; + +% Compute the EI where nu > 1 and sigma > 0 +b = b0 & b2; +if any (b) + u = delta(b) ./ sigma(b); nu = nu(b); + ei(b) = sigma(b) .* ((nu + u .^ 2) ./ (nu - 1) ... + .* stk_distrib_student_pdf (u, nu) ... + + u .* stk_distrib_student_cdf (u, nu)); +end + +% Compute the EI where nu > 1 and sigma == 0 +b = b0 & (~ b2); +ei(b) = max (0, delta(b)); + +% Correct numerical inaccuracies +ei(ei < 0) = 0; + +end % function + + +%!assert (stk_isequal_tolrel (stk_distrib_student_ei (0, 2), 1 / sqrt (2), eps)) + +%!test % Decreasing as a function of z +%! ei = stk_distrib_student_ei (linspace (-10, 10, 200), 3.33); +%! assert (all (diff (ei) < 0)) + +%!shared M, mu, sigma, ei, nu +%! M = randn (1, 10); +%! mu = randn (5, 1); +%! sigma = 1 + rand (1, 1, 7); +%! nu = 2; +%! ei = stk_distrib_student_ei (M, nu, mu, sigma); + +%!assert (isequal (size (ei), [5, 10, 7])) +%!assert (all (ei(:) >= 0)) +%!assert (isequal (ei, stk_distrib_student_ei (M, nu, mu, sigma, false))); +%!assert (isequal (ei, stk_distrib_student_ei (-M, nu, -mu, sigma, true))); diff --git a/inst/misc/distrib/stk_distrib_student_pdf.m b/inst/misc/distrib/stk_distrib_student_pdf.m new file mode 100644 index 0000000..7264ba6 --- /dev/null +++ b/inst/misc/distrib/stk_distrib_student_pdf.m @@ -0,0 +1,82 @@ +% STK_DISTRIB_STUDENT_PDF [STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect +% +% This code is very loosely based on Octave's tpdf function: +% ## Copyright (C) 2012 Rik Wehbring +% ## Copyright (C) 1995-2012 Kurt Hornik + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function density = stk_distrib_student_pdf (z, nu, mu, sigma) + +if nargin > 2, + z = bsxfun (@minus, z, mu); +end + +if nargin > 3, + z = bsxfun (@rdivide, z, sigma); +else + sigma = 1; +end + +C = sqrt (nu) .* beta (nu / 2, 0.5); + +if isscalar (nu) + if nu == +inf + % Gaussian case (nu = +inf) + density = 0.39894228040143268 * exp (- 0.5 * (z .^ 2)); + else + % Student case (nu < +inf) + density = exp (- 0.5 * (nu + 1) * log (1 + z .^ 2 / nu)) / C; + end +else + [z, nu, C] = stk_commonsize (z, nu, C); + density = nan (size (z)); + % Gaussian case (nu = +inf) + k = (nu == +inf); + density(k) = 0.39894228040143268 * exp (- 0.5 * (z(k) .^ 2)); + % Student case (nu < +inf) + k = (nu > 0); nu = nu(k); + density(k) = exp (- 0.5 * (nu + 1) .* log (1 + z(k) .^ 2 ./ nu)) ./ C(k); +end + +density = bsxfun (@rdivide, density, sigma); + +end % function + + +%!assert (stk_isequal_tolrel ( ... +%! stk_distrib_student_pdf ([1; 3], [1; 2], [0 1], [1 10]), ... +%! [0.50 / pi ... % tpdf ((1 - 1) / 10, 1) +%! 0.10 / pi; ... % tpdf ((1 - 1) / 10, 1) / 10 +%! 1 / (11 * sqrt(11)) ... % tpdf ((3 - 0) / 1, 2) / 1 +%! 3.4320590294804165e-02 ... % tpdf ((3 - 1) / 10, 2) / 10 +%! ], eps)); + +%!assert (isequal (stk_distrib_student_pdf ( inf, 1.0), 0.0)); +%!assert (isequal (stk_distrib_student_pdf (-inf, 1.0), 0.0)); +%!assert (isnan (stk_distrib_student_pdf ( nan, 1.0))); diff --git a/inst/misc/error/stk_assert_box.m b/inst/misc/error/stk_assert_box.m new file mode 100644 index 0000000..0b049a9 --- /dev/null +++ b/inst/misc/error/stk_assert_box.m @@ -0,0 +1,74 @@ +% STK_ASSERT_BOX [STK internal] + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_assert_box (box, dim) + +mnemonic = 'InvalidBox'; + +% Name of the input variable (if available) +boxname = inputname (1); +if isempty (boxname), + boxname = 'box'; +end + +% Pretend that the error has been thrown by the caller +stack = dbstack; stack = stack(2:end); + +if (~ isnumeric (box)) || (ndims (box) ~= 2) %#ok see CODING_GUDELINES + errmsg = sprintf ('%s is not a numeric matrix.', boxname); + stk_error (errmsg, mnemonic, stack); +end + +[n, d] = size (box); +if n ~= 2, + errmsg = sprintf ('%s should have two rows, not more, not less.', boxname); + stk_error (errmsg, mnemonic, stack); +end + +if d == 0, + errmsg = sprintf ('%s should have at least one column.', boxname); + stk_error (errmsg, mnemonic, stack); +end + +if (nargin == 2) && (d ~= dim) + errmsg = sprintf ('%s should have exactly %d columns.', boxname, dim); + stk_error (errmsg, mnemonic, stack); +end + +if any (isnan (box)), + errmsg = sprintf ('%s should at least one column.', boxname); + stk_error (errmsg, mnemonic, stack); +end + +if any (box(1, :) > box(2, :)), + errmsg = sprintf ('%s has invalid boundaries.', boxname); + stk_error (errmsg, mnemonic, stack); +end + +end % function diff --git a/inst/misc/error/stk_assert_model_struct.m b/inst/misc/error/stk_assert_model_struct.m new file mode 100644 index 0000000..470fdd8 --- /dev/null +++ b/inst/misc/error/stk_assert_model_struct.m @@ -0,0 +1,45 @@ +% STK_ASSERT_MODEL_STRUCT [STK internal] +% +% INTERNAL FUNCTION WARNING: +% This function is currently considered as internal: API-breaking changes are +% likely to happen in future releases. Please don't rely on it directly. +% +% See also: stk_model + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_assert_model_struct (model) + +% Just a quick check +if ~ (isstruct (model) && isfield (model, 'param')) + + stk_error (['The input argument does not look like a valid ' ... + 'STK model structure.'], 'InvalidArgument'); + +end + +end % function diff --git a/inst/misc/error/stk_assert_no_duplicates.m b/inst/misc/error/stk_assert_no_duplicates.m new file mode 100644 index 0000000..2a2d01d --- /dev/null +++ b/inst/misc/error/stk_assert_no_duplicates.m @@ -0,0 +1,51 @@ +% STK_ASSERT_NO_DUPLICATES generates an error if there are duplicates + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_assert_no_duplicates (x) + +mnemonic = 'DuplicatedRows'; + +% Name of the input variable (if available) +boxname = inputname (1); +if isempty (boxname) + boxname = 'input array'; +end + +% Pretend that the error has been thrown by the caller +stack = dbstack; stack = stack(2:end); + +% Detect duplicated rows +x = double (x); +n = size (x, 1); +y = unique (x, 'rows'); +if size (y, 1) < n + errmsg = sprintf ('%s has duplicated rows', boxname); + stk_error (errmsg, mnemonic, stack); +end + +end % function diff --git a/inst/misc/error/stk_error.m b/inst/misc/error/stk_error.m new file mode 100644 index 0000000..f6ee32b --- /dev/null +++ b/inst/misc/error/stk_error.m @@ -0,0 +1,95 @@ +% STK_ERROR throws an STK error with a good-looking error identifier. + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2012 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_error (errmsg, mnemonic, stack) + +% Second component of error identifier = name of calling function +% (unless stk_error has been called directly from the base workspace) +if nargin < 3, + + try + stack = dbstack ('-completenames'); + % In Octave, -completenames is at best ignored (in recent versions) + % or generates an error (in, e.g., Octave 3.6.2). + catch + stack = dbstack (); + end + + if length (stack) == 1, + caller = 'BaseWorkspace'; + else + % pretend that the error has been thrown by the caller + stack = stack(2:end); + % and get caller name to form the error identifier + caller = stack(1).name; + end +else + % If a "stack" has been provided by the user, we use it without asking + % questions (if it's a struct) + if ~ isstruct (stack) || ~ isfield (stack, 'name'), + % We will throw an error, but not the one we were requested to! + errmsg = 'Argument "stack" should be a valid stack structure.'; + mnemonic = 'InvalidArgument'; + stack = dbstack (); + end + caller = stack(1).name; +end + +% Keep only subfunction name (Octave) +gt_pos = strfind (caller, '>'); +if ~ isempty (gt_pos), + caller = caller((gt_pos + 1):end); +end + +% Construct the error structure +errstruct = struct (... + 'message', errmsg, ... + 'identifier', sprintf ('STK:%s:%s', caller, mnemonic), ... + 'stack', stack); + +% Note: the 'stack' argument is ignore in Octave 4.0.0 and earlier +% releases (see https://savannah.gnu.org/bugs/?47107) + +error (errstruct); + +end % function + + +%!shared errmsg, mnemonic, badstack +%! errmsg = 'Go ahead, make my day.'; +%! mnemonic = 'ClintEastwood'; +%! badstack = 0; % not a valid stack structure + +% Valid use of stk_error +%!error stk_error(errmsg, mnemonic); + +% Use of an incorrect stack structure +%!error stk_error (errmsg, mnemonic, badstack); +%!error id=STK:stk_error:InvalidArgument stk_error (errmsg, mnemonic, badstack); diff --git a/inst/misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m b/inst/misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m new file mode 100644 index 0000000..b2c3a55 --- /dev/null +++ b/inst/misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m @@ -0,0 +1,49 @@ +% STK_MINIMIZE_BOXCONSTRAINED performs boxconstrained minimisation using fmincon. +% +% CALL: U_OPT = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% estimates the parameters U_OPT within the user-defined lowerbounds LB +% and upper bounds UB, which gives the minimum value of the function F. A +% starting point U_INIT must be provided. +% +% CALL: [U_OPT, LIK] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% also estimates the minimum function value LIK after the boxconstrained +% minimisation using fmincon. +% +% NOTE: Here ALGO is an input argument to the function, that is an object of +% class 'stk_optim_fmincon'. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [u_opt, lik] = stk_minimize_boxconstrained (algo, f, u_init, lb, ub) + +[u_opt, lik] = fmincon (f, u_init, [], [], [], [], lb, ub, [], algo.options); + +end % function diff --git a/inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m b/inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m new file mode 100644 index 0000000..a8667e6 --- /dev/null +++ b/inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m @@ -0,0 +1,81 @@ +% STK_OPTIM_FMINCON constructs an object of class 'stk_optim_fmincon'. +% +% CALL: ALGO = stk_optim_fmincon () +% +% constructs an algorithm object ALGO of class 'stk_optim_fmincon' +% with a default set of options. +% +% CALL: ALGO = stk_optim_fmincon (opt) +% +% constructs an algorithm object ALGO of class 'stk_optim_fmincon' +% with a user-defined set of options, defined by the structure opt. + +% Copyright Notice +% +% Copyright (C) 2015-2017 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function algo = stk_optim_fmincon (varargin) + +% Some default options +options0 = optimset ( ... + 'Display', 'off', ... + 'GradObj', 'on', ... + 'MaxFunEvals', 500, ... + 'TolFun', 1e-5, ... + 'TolX', 1e-6 ); + +% The 'algorithm' option is not supported by optimset in Octave +% (e.g., 4.0.0) and in some old versions of Matlab (e.g., r2007a) +ws = warning ('off', 'all'); +try + % Try to use the interior-point algorithm, which has been + % found to provide satisfactory results in many cases + options = optimset (options0, 'algorithm', 'interior-point'); +catch + % FIXME: This is brutal. We should catch selectively the error raised + % by Matlab when (in old releases) 'algorithm' is not a legal parameter + % name or (does this exist?) 'interior-point' is not an algorithm name. + options = options0; +end + +warning (ws); + +% TODO: see if the 'UseParallel' option can be useful + +% Take user options into account +if nargin > 0 + options = optimset (options, varargin{:}); +end + +base = stk_optim_optimizer_ (true, false); +algo = struct ('options', options); +algo = class (algo, 'stk_optim_fmincon', base); + +end % function + + +%!test stk_test_class ('stk_optim_fmincon') diff --git a/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m b/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m new file mode 100644 index 0000000..b9d9763 --- /dev/null +++ b/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m @@ -0,0 +1,62 @@ +% STK_MINIMIZE_BOXCONSTRAINED [overload STK function] +% +% CALL: [U_OPT, LIK] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% NOTE +% +% This function simply ignores the bounds, since fminsearch does not handle +% them. This is provided as a last recourse for Matlab users that have +% neither the Optimization toolbox nor MOSEK. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Authors: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [u_opt, lik] = stk_minimize_boxconstrained (algo, f, u_init, lb, ub) + +persistent already_warned + +if isempty (already_warned) + + w_id = 'STK:stk_optim_fminsearch:stk_minimize_boxconstrained:BoxIgnored'; + + warning (['STK is going to use fminsearch for a box-constrained ' ... + 'optimization problem. There is no guarantee that the solution ' ... + 'will be inside the box. You should consider getting a proper ' ... + 'box-constrained optimizer.']); + + % Even if the persistent gets cleared, don't display the warning again. + % This trick allows us to avoid mlock'ing the file. + warning ('off', w_id); + + already_warned = 1; +end + +[u_opt, lik] = stk_minimize_unconstrained (algo, f, u_init); + +end % function + + +%#ok<*INUSD> % lb and ub are ignored on purpose diff --git a/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m b/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m new file mode 100644 index 0000000..df963e4 --- /dev/null +++ b/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m @@ -0,0 +1,48 @@ +% STK_MINIMIZE_UNCONSTRAINED performs unconstrained minimisation using fminsearch. +% +% CALL: U_OPT = stk_minimize_unconstrained (ALGO, F, U_INIT) +% +% estimates the parameters U_OPT without any bounds, which gives the minimum +% value of the function F. A starting point U_INIT must be provided. +% +% CALL: [U_OPT, LIK] = stk_minimize_unconstrained (ALGO, F, U_INIT) +% +% also estimates the minimum function value LIK after the unconstrained +% minimisation using fminsearch. +% +% NOTE: Here ALGO is an input argument to the function, that is an object of +% class 'stk_optim_fminsearch'. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [u_opt,lik] = stk_minimize_unconstrained (algo, f, u_init) + +[u_opt,lik] = fminsearch (f, u_init, algo.options); + +end % function diff --git a/inst/misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m b/inst/misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m new file mode 100644 index 0000000..2c1e5c0 --- /dev/null +++ b/inst/misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m @@ -0,0 +1,62 @@ +% STK_OPTIM_FMINSEARCH constructs an object of class 'stk_optim_fminsearch'. +% +% CALL: ALGO = stk_optim_fminsearch () +% +% constructs an algorithm object ALGO of class 'stk_optim_fminsearch' +% with a default set of options. +% +% CALL: X = stk_optim_fminsearch (opt) +% +% constructs an algorithm object ALGO of class 'stk_optim_fminsearch' +% with a user-defined set of options, defined by the structure opt. + +% Copyright Notice +% +% Copyright (C) 2015-2017 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function algo = stk_optim_fminsearch (varargin) + +% Some default options +options = optimset ( ... + 'Display', 'off', ... + 'MaxFunEvals', 500, ... + 'TolFun', 1e-5, ... + 'TolX', 1e-6 ); + +% Take user options into account +if nargin > 0 + options = optimset (options, varargin{:}); +end + +base = stk_optim_optimizer_ (false, true); +algo = struct ('options', options); +algo = class (algo, 'stk_optim_fminsearch', base); + +end % function + + +%!test stk_test_class ('stk_optim_fminsearch') diff --git a/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m b/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m new file mode 100644 index 0000000..698e52d --- /dev/null +++ b/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m @@ -0,0 +1,830 @@ +% -*- texinfo -*- +% @deftypefn {Function File} {[@var{x}, @var{obj}, @var{info}, @var{iter}, @var{nf}, @var{lambda}] =} sqp (@var{x0}, @var{phi}) +% @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}) +% @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}) +% @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}) +% @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}) +% @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}, @var{tol}) +% Minimize an objective function using sequential quadratic programming (SQP). +% +% Solve the nonlinear program +% @tex +% $$ +% \min_x \phi (x) +% $$ +% @end tex +% @ifnottex +% +% @example +% @group +% min phi (x) +% x +% @end group +% @end example +% +% @end ifnottex +% subject to +% @tex +% $$ +% g(x) = 0 \qquad h(x) \geq 0 \qquad lb \leq x \leq ub +% $$ +% @end tex +% @ifnottex +% +% @example +% @group +% g(x) = 0 +% h(x) >= 0 +% lb <= x <= ub +% @end group +% @end example +% +% @end ifnottex +% @noindent +% using a sequential quadratic programming method. +% +% The first argument is the initial guess for the vector @var{x0}. +% +% The second argument is a function handle pointing to the objective function +% @var{phi}. The objective function must accept one vector argument and +% return a scalar. +% +% The second argument may also be a 2- or 3-element cell array of function +% handles. The first element should point to the objective function, the +% second should point to a function that computes the gradient of the +% objective function, and the third should point to a function that computes +% the Hessian of the objective function. If the gradient function is not +% supplied, the gradient is computed by finite differences. If the Hessian +% function is not supplied, a BFGS update formula is used to approximate the +% Hessian. +% +% When supplied, the gradient function @code{@var{phi}@{2@}} must accept one +% vector argument and return a vector. When supplied, the Hessian function +% @code{@var{phi}@{3@}} must accept one vector argument and return a matrix. +% +% The third and fourth arguments @var{g} and @var{h} are function handles +% pointing to functions that compute the equality constraints and the +% inequality constraints, respectively. If the problem does not have +% equality (or inequality) constraints, then use an empty matrix ([]) for +% @var{g} (or @var{h}). When supplied, these equality and inequality +% constraint functions must accept one vector argument and return a vector. +% +% The third and fourth arguments may also be 2-element cell arrays of +% function handles. The first element should point to the constraint +% function and the second should point to a function that computes the +% gradient of the constraint function: +% @tex +% $$ +% \Bigg( {\partial f(x) \over \partial x_1}, +% {\partial f(x) \over \partial x_2}, \ldots, +% {\partial f(x) \over \partial x_N} \Bigg)^T +% $$ +% @end tex +% @ifnottex +% +% @example +% @group +% [ d f(x) d f(x) d f(x) ] +% transpose ( [ ------ ----- ... ------ ] ) +% [ dx_1 dx_2 dx_N ] +% @end group +% @end example +% +% @end ifnottex +% The fifth and sixth arguments, @var{lb} and @var{ub}, contain lower and +% upper bounds on @var{x}. These must be consistent with the equality and +% inequality constraints @var{g} and @var{h}. If the arguments are vectors +% then @var{x}(i) is bound by @var{lb}(i) and @var{ub}(i). A bound can also +% be a scalar in which case all elements of @var{x} will share the same +% bound. If only one bound (lb, ub) is specified then the other will +% default to (-@var{realmax}, +@var{realmax}). +% +% The seventh argument @var{maxiter} specifies the maximum number of +% iterations. The default value is 100. +% +% The eighth argument @var{tol} specifies the tolerance for the stopping +% criteria. The default value is @code{sqrt (eps)}. +% +% The value returned in @var{info} may be one of the following: +% +% @table @asis +% @item 101 +% The algorithm terminated normally. +% All constraints meet the specified tolerance. +% +% @item 102 +% The BFGS update failed. +% +% @item 103 +% The maximum number of iterations was reached. +% +% @item 104 +% The stepsize has become too small, i.e., +% @tex +% $\Delta x,$ +% @end tex +% @ifnottex +% delta @var{x}, +% @end ifnottex +% is less than @code{@var{tol} * norm (x)}. +% @end table +% +% An example of calling @code{sqp}: +% +% @example +% function r = g (x) +% r = [ sum(abs(x).^2)-10; +% x(2)*x(3)-5*x(4)*x(5); +% x(1)^3+x(2)^3+1 ]; +% end % function +% +% function obj = phi (x) +% obj = exp (prod (x)) - 0.5*(x(1)^3+x(2)^3+1)^2; +% end % function +% +% x0 = [-1.8; 1.7; 1.9; -0.8; -0.8]; +% +% [x, obj, info, iter, nf, lambda] = sqp (x0, @@phi, @@g, []) +% +% x = +% +% -1.71714 +% 1.59571 +% 1.82725 +% -0.76364 +% -0.76364 +% +% obj = 0.053950 +% info = 101 +% iter = 8 +% nf = 10 +% lambda = +% +% -0.0401627 +% 0.0379578 +% -0.0052227 +% @end example +% +% @seealso{qp} +% @end deftypefn + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% +% Author: Julien Bect +% +% This file is based on Octave's sqp function (distributed under the +% GPLv3 licence) with minor modifications to be usable under Matlab. +% The original copyright notice is as follows: +% +% Copyright (C) 2005-2015 John W. Eaton +% Copyright (C) 2013-2015 Arun Giridhar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +% Original Copying Permission Statement +% +% This file is part of Octave. +% +% Octave is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 3 of the License, or (at +% your option) any later version. +% +% Octave is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Octave; see the file COPYING. If not, see +% . + +function [x, obj, info, iter, nf, lambda] = sqp_quadprog ... + (x0, objf, cef, cif, lb, ub, maxiter, tolerance) + + globals = struct (); % data and handles, needed and changed by subfunctions + + if (nargin < 2 || nargin > 8 || nargin == 5) + print_usage (); + end % if + + if (~ isvector (x0)) + error ('sqp: X0 must be a vector'); + end % if + if (size (x0, 1) == 1) + x0 = x0'; + end % if + + have_hess = 0; + if (iscell (objf)) + switch (numel (objf)) + case 1 + obj_fun = objf{1}; + obj_grd = @(x) fd_obj_grd (x, obj_fun); + case 2 + obj_fun = objf{1}; + obj_grd = objf{2}; + case 3 + obj_fun = objf{1}; + obj_grd = objf{2}; + obj_hess = objf{3}; + have_hess = 1; + otherwise + error ('sqp: invalid objective function specification'); + end % switch + else + obj_fun = objf; % No cell array, only obj_fun set + obj_grd = @(x) fd_obj_grd (x, obj_fun); + end % if + + ce_fun = @empty_cf; + ce_grd = @empty_jac; + if (nargin > 2) + if (iscell (cef)) + switch (numel (cef)) + case 1 + ce_fun = cef{1}; + ce_grd = @(x) fd_ce_jac (x, ce_fun); + case 2 + ce_fun = cef{1}; + ce_grd = cef{2}; + otherwise + error ('sqp: invalid equality constraint function specification'); + end % switch + elseif (~ isempty (cef)) + ce_fun = cef; % No cell array, only constraint equality function set + ce_grd = @(x) fd_ce_jac (x, ce_fun); + end % if + end % if + + ci_fun = @empty_cf; + ci_grd = @empty_jac; + if (nargin > 3) + % constraint function given by user with possible gradient + globals.cif = cif; + % constraint function given by user without gradient + globals.cifcn = @empty_cf; + if (iscell (cif)) + if (~ isempty (cif)) + globals.cifcn = cif{1}; + end % if + elseif (~ isempty (cif)) + globals.cifcn = cif; + end % if + + if (nargin < 5 || (nargin > 5 && isempty (lb) && isempty (ub))) + % constraint inequality function only without any bounds + ci_grd = @(x) fd_ci_jac (x, globals.cifcn); + if (iscell (cif)) + switch (length (cif)) + case 1 + ci_fun = cif{1}; + case 2 + ci_fun = cif{1}; + ci_grd = cif{2}; + otherwise + error ('sqp: invalid inequality constraint function specification'); + end % switch + elseif (~ isempty (cif)) + ci_fun = cif; % No cell array, only constraint inequality function set + end % if + else + % constraint inequality function with bounds present + ub_idx = true (size (x0)); lb_idx = ub_idx; + lb_grad = eye (size (x0, 1)); ub_grad = - lb_grad; + if (isvector (lb)) + tmp_lb = lb(:); globals.lb = tmp_lb; + tmp_idx = (lb ~= -Inf); lb_idx(:) = tmp_idx; + globals.lb = globals.lb(tmp_idx, 1); + lb_grad = lb_grad(lb_idx, :); + elseif (isempty (lb)) + if (isa (x0, 'single')) + tmp_lb = - realmax ('single'); globals.lb = tmp_lb; + else + tmp_lb = -realmax; globals.lb = tmp_lb; + end % if + else + error ('sqp: invalid lower bound'); + end % if + + if (isvector (ub)) + tmp_ub = ub(:); globals.ub = tmp_ub; + tmp_idx = (ub ~= Inf); ub_idx(:) = tmp_idx; + globals.ub = globals.ub(tmp_idx, 1); + ub_grad = ub_grad(ub_idx, :); + elseif (isempty (ub)) + if (isa (x0, 'single')) + tmp_ub = realmax ('single'); globals.ub = tmp_ub; + else + tmp_ub = realmax; globals.ub = tmp_ub; + end % if + else + error ('sqp: invalid upper bound'); + end % if + + if (any (tmp_lb > tmp_ub)) + error ('sqp: upper bound smaller than lower bound'); + end % if + bounds_grad = [lb_grad; ub_grad]; + ci_fun = @(x) cf_ub_lb (x, lb_idx, ub_idx, globals); + ci_grd = @(x) cigrad_ub_lb (x, bounds_grad, globals); + end % if + + end % if % if (nargin > 3) + + iter_max = 100; + if (nargin > 6 && ~ isempty (maxiter)) + if (isscalar (maxiter) && maxiter > 0 && fix (maxiter) == maxiter) + iter_max = maxiter; + else + error ('sqp: invalid number of maximum iterations'); + end % if + end % if + + tol = sqrt (eps); + if (nargin > 7 && ~ isempty (tolerance)) + if (isscalar (tolerance) && tolerance > 0) + tol = tolerance; + else + error ('sqp: invalid value for TOLERANCE'); + end % if + end % if + + % Initialize variables for search loop + % Seed x with initial guess and evaluate objective function, constraints, + % and gradients at initial value x0. + % + % obj_fun -- objective function + % obj_grad -- objective gradient + % ce_fun -- equality constraint functions + % ci_fun -- inequality constraint functions + % A == [grad_{x_1} cx_fun, grad_{x_2} cx_fun, ..., grad_{x_n} cx_fun]^T + x = x0; + + obj = feval (obj_fun, x0); + globals.nfun = 1; + + c = feval (obj_grd, x0); + + % Choose an initial NxN symmetric positive definite Hessian approximation B. + n = length (x0); + if (have_hess) + B = feval (obj_hess, x0); + else + B = eye (n, n); + end % if + + ce = feval (ce_fun, x0); + F = feval (ce_grd, x0); + + ci = feval (ci_fun, x0); + C = feval (ci_grd, x0); + + A = [F; C]; + + % Choose an initial lambda (x is provided by the caller). + lambda = 100 * ones (size (A, 1), 1); + + qp_iter = 1; + alpha = 1; + + info = 0; + % report (); % Called with no arguments to initialize reporting + % report (iter, qp_iter, alpha, __sqp_nfun__, obj); + + for iter = 1:iter_max % FIXME in Octave -> shift by one (check iter_max = 1) ??? + + % Check convergence. This is just a simple check on the first + % order necessary conditions. + nr_f = size (F, 1); + + lambda_e = lambda((1:nr_f)'); + lambda_i = lambda((nr_f+1:end)'); + + con = [ce; ci]; + + t0 = norm (c - A' * lambda); + t1 = norm (ce); + t2 = all (ci >= 0); + t3 = all (lambda_i >= 0); + t4 = norm (lambda .* con); + + % Normal convergence. All constraints are satisfied + % and objective has converged. + if (t2 && t3 && max ([t0; t1; t4]) < tol) + info = 101; + break; + end % if + + % Compute search direction p by solving QP. + g = -ce; + d = -ci; + + % [p, obj_qp, INFO, lambda] = qp (x, B, c, F, g, [], [], d, C, ... + % Inf (size (d))); + + B = 0.5 * (B + B'); % Prevents quadprog warning + + % Matlab's quadprog issues a warning when changing its default solver, + % but we don't want to see that in the output of sqp. + ws = warning ('off', 'all'); + + try + % Call quadprog to solve the QP subproblem + quadprog_options = optimset ('Display', 'off'); + [p, ~, quadprog_exitflag, ~, lambda] = quadprog ... + (B, c, -C, -d, F, g, [], [], x, quadprog_options); + catch + warning (ws); + rethrow (lasterror ()); + end + + warning (ws); + + % Recreate a vector of Lagrange multipliers similar to qp's one + lambda = [- lambda.eqlin; lambda.ineqlin]; + + % VERY crude processing of quadprog_exitflag + if quadprog_exitflag <= 0 + error ('quadprog failed to solve QP subproblem'); + end + + % info = INFO.info; + % + % % FIXME: check QP solution and attempt to recover if it has failed. + % % For now, just warn about possible problems. + % + % id = 'Octave:SQP-QP-subproblem'; + % switch (info) + % case 2 + % warning (id, 'sqp: QP subproblem is non-convex and unbounded'); + % case 3 + % warning (id, 'sqp: QP subproblem failed to converge in %d iterations', ... + % INFO.solveiter); + % case 6 + % warning (id, 'sqp: QP subproblem is infeasible'); + % end % switch + + % Choose mu such that p is a descent direction for the chosen + % merit function phi. + [x_new, alpha, obj_new, globals] = ... + linesearch_L1 (x, p, obj_fun, obj_grd, ce_fun, ci_fun, lambda, ... + obj, globals); + + % Evaluate objective function, constraints, and gradients at x_new. + c_new = feval (obj_grd, x_new); + + ce_new = feval (ce_fun, x_new); + F_new = feval (ce_grd, x_new); + + ci_new = feval (ci_fun, x_new); + C_new = feval (ci_grd, x_new); + + A_new = [F_new; C_new]; + + % Set + % + % s = alpha * p + % y = grad_x L (x_new, lambda) - grad_x L (x, lambda}) + + y = c_new - c; + + if (~ isempty (A)) + t = ((A_new - A)'*lambda); + y = y - t; + end % if + + delx = x_new - x; + + % Check if step size has become too small (indicates lack of progress). + if (norm (delx) < tol * norm (x)) + info = 104; + break; + end % if + + if (have_hess) + + B = feval (obj_hess, x); + + else + % Update B using a quasi-Newton formula. + delxt = delx'; + + % Damped BFGS. Or maybe we would actually want to use the Hessian + % of the Lagrangian, computed directly? + d1 = delxt*B*delx; + + t1 = 0.2 * d1; + t2 = delxt*y; + + if (t2 < t1) + theta = 0.8*d1/(d1 - t2); + else + theta = 1; + end % if + + r = theta*y + (1-theta)*B*delx; + + d2 = delxt*r; + + % Check if the next BFGS update will work properly. + % If d1 or d2 vanish, the BFGS update will fail. + if (d1 == 0 || d2 == 0) + info = 102; + break; + end % if + + B = B - B*delx*delxt*B/d1 + r*r'/d2; + + end % if + + x = x_new; + + obj = obj_new; + + c = c_new; + + ce = ce_new; + F = F_new; + + ci = ci_new; + C = C_new; + + A = A_new; + + % report (iter, qp_iter, alpha, __sqp_nfun__, obj); + + end % for + + % Check if we've spent too many iterations without converging. + if (iter >= iter_max) + info = 103; + end % if + + nf = globals.nfun; + +end % function + + +function [merit, obj, globals] = phi_L1 (obj, obj_fun, ce_fun, ci_fun, ... + x, mu, globals) + + ce = feval (ce_fun, x); + ci = feval (ci_fun, x); + + idx = ci < 0; + + con = [ce; ci(idx)]; + + if (isempty (obj)) + obj = feval (obj_fun, x); + globals.nfun = globals.nfun + 1; + end % if + + merit = obj; + t = norm (con, 1) / mu; + + if (~ isempty (t)) + merit = merit + t; + end % if + +end % function + + +function [x_new, alpha, obj, globals] = ... + linesearch_L1 (x, p, obj_fun, obj_grd, ce_fun, ci_fun, lambda, ... + obj, globals) + + % Choose parameters + % + % eta in the range (0, 0.5) + % tau in the range (0, 1) + + eta = 0.25; + tau = 0.5; + + delta_bar = sqrt (eps); + + if (isempty (lambda)) + mu = 1 / delta_bar; + else + mu = 1 / (norm (lambda, Inf) + delta_bar); + end % if + + alpha = 1; + + c = feval (obj_grd, x); + ce = feval (ce_fun, x); + + [phi_x_mu, obj, globals] = phi_L1 (obj, obj_fun, ce_fun, ci_fun, x, ... + mu, globals); + + D_phi_x_mu = c' * p; + d = feval (ci_fun, x); + % only those elements of d corresponding + % to violated constraints should be included. + idx = d < 0; + t = - norm ([ce; d(idx)], 1) / mu; + if (~ isempty (t)) + D_phi_x_mu = D_phi_x_mu + t; + end % if + + while (1) + [p1, obj, globals] = phi_L1 ([], obj_fun, ce_fun, ci_fun, ... + x+alpha*p, mu, globals); + p2 = phi_x_mu+eta*alpha*D_phi_x_mu; + if (p1 > p2) + % Reset alpha = tau_alpha * alpha for some tau_alpha in the + % range (0, tau). + tau_alpha = 0.9 * tau; % ?? + alpha = tau_alpha * alpha; + else + break; + end % if + end % while + + x_new = x + alpha * p; + +end % function + + +function grd = fdgrd (f, x) + + if (~ isempty (f)) + y0 = feval (f, x); + nx = length (x); + grd = zeros (nx, 1); + deltax = sqrt (eps); + for i = 1:nx + t = x(i); + x(i) = x(i) + deltax; + grd(i) = (feval (f, x) - y0) / deltax; + x(i) = t; + end % for + else + grd = zeros (0, 1); + end % if + +end % function + + +function jac = fdjac (f, x) + + nx = length (x); + if (~ isempty (f)) + y0 = feval (f, x); + nf = length (y0); + nx = length (x); + jac = zeros (nf, nx); + deltax = sqrt (eps); + for i = 1:nx + t = x(i); + x(i) = x(i) + deltax; + jac(:,i) = (feval (f, x) - y0) / deltax; + x(i) = t; + end % for + else + jac = zeros (0, nx); + end % if + +end % function + + +function grd = fd_obj_grd (x, obj_fun) + + grd = fdgrd (obj_fun, x); + +end % function + + +function res = empty_cf (x) + + res = zeros (0, 1); + +end % function + + +function res = empty_jac (x) + + res = zeros (0, length (x)); + +end % function + + +function jac = fd_ce_jac (x, ce_fun) + + jac = fdjac (ce_fun, x); + +end % function + + +function jac = fd_ci_jac (x, cifcn) + + % cifcn = constraint function without gradients and lb or ub + jac = fdjac (cifcn, x); + +end % function + + +function res = cf_ub_lb (x, lbidx, ubidx, globals) + + % combine constraint function with ub and lb + if (isempty (globals.cifcn)) + res = [x(lbidx,1)-globals.lb; globals.ub-x(ubidx,1)]; + else + res = [feval(globals.cifcn,x); x(lbidx,1)-globals.lb; + globals.ub-x(ubidx,1)]; + end % if + +end % function + + +function res = cigrad_ub_lb (x, bgrad, globals) + + cigradfcn = @(x) fd_ci_jac (x, globals.cifcn); + + if (iscell (globals.cif) && length (globals.cif) > 1) + cigradfcn = globals.cif{2}; + end % if + + if (isempty (cigradfcn)) + res = bgrad; + else + res = [feval(cigradfcn,x); bgrad]; + end % if + +end % function + +% Utility function used to debug sqp +function report (iter, qp_iter, alpha, nfun, obj) + + if (nargin == 0) + printf (' Itn ItQP Step Nfun Objective\n'); + else + printf ('%5d %4d %8.1g %5d %13.6e\n', iter, qp_iter, alpha, nfun, obj); + end % if + +end % function + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Test Code + +%!test if (exist ('quadprog', 'file') == 2) +%! +%! x0 = [-1.8; 1.7; 1.9; -0.8; -0.8]; +%! +%! [x, obj, info, iter, nf, lambda] = sqp_quadprog ... +%! (x0, @sqp_quadprog_testf, @sqp_quadprog_testg, []); +%! +%! x_opt = [-1.717143501952599; +%! 1.595709610928535; +%! 1.827245880097156; +%! -0.763643103133572; +%! -0.763643068453300]; +%! +%! obj_opt = 0.0539498477702739; +%! +%! assert (stk_isequal_tolrel (x, x_opt, 8 * sqrt (eps))); +%! assert (stk_isequal_tolrel (obj, obj_opt, sqrt (eps))); +%! +%! end + +% Test input validation +%!error sqp_quadprog () +%!error sqp_quadprog (1) +%!error sqp_quadprog (1,2,3,4,5,6,7,8,9) +%!error sqp_quadprog (1,2,3,4,5) +%!error sqp_quadprog (ones (2,2)) +%!error sqp_quadprog (1, cell (4,1)) +%!error sqp_quadprog (1, cell (3,1), cell (3,1)) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (3,1)) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1), ones (2,2),[]) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[], ones (2,2)) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),1,-1) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[], ones (2,2)) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],-1) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],1.5) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],[], ones (2,2)) +%!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],[],-1) + diff --git a/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m b/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m new file mode 100644 index 0000000..1c5a076 --- /dev/null +++ b/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m @@ -0,0 +1,5 @@ +function obj = sqp_quadprog_testf (x) + +obj = exp (prod (x)) - 0.5*(x(1)^3 + x(2)^3 + 1)^2; + +end % function diff --git a/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m b/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m new file mode 100644 index 0000000..4b3b987 --- /dev/null +++ b/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m @@ -0,0 +1,7 @@ +function r = sqp_quadprog_testg (x) + +r = [sum(abs(x).^2)-10; ... + x(2)*x(3)-5*x(4)*x(5); ... + x(1)^3+x(2)^3+1 ]; + +end % function diff --git a/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m b/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m new file mode 100644 index 0000000..3d7d275 --- /dev/null +++ b/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m @@ -0,0 +1,62 @@ +% STK_MINIMIZE_BOXCONSTRAINED performs boxconstrained minimisation using sqp. +% +% CALL: U_OPT = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% estimates the parameters U_OPT within the user-defined lowerbounds LB +% and upper bounds UB, which gives the minimum value of the function F. A +% starting point U_INIT must be provided. +% +% CALL: [U_OPT, LIK] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% also estimates the minimum function value LIK after the boxconstrained +% minimisation using sqp. +% +% NOTE: Here ALGO is an input argument to the function, that is an object of +% class 'stk_optim_octavesqp'. + +% Copyright Notice +% +% Copyright (C) 2015, 2018, 2021 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [u_opt, lik] = stk_minimize_boxconstrained (algo, f, u_init, lb, ub) + +nabla_f = @(u)(nabla_f_ (f, u)); + +[u_opt, lik] = feval (algo.sqp, u_init, {f nabla_f}, [], [], lb, ub, ... + algo.options.maxiter, algo.options.tol); + +end % function + + +function df = nabla_f_ (f, u) + +% Note: with this implementation, f_val is computed twice +% (once when f is called by sqp, and once again when nabla_f is called) + +[~, df] = f (u); + +end % function diff --git a/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m b/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m new file mode 100644 index 0000000..edb1e05 --- /dev/null +++ b/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m @@ -0,0 +1,48 @@ +% STK_MINIMIZE_UNCONSTRAINED performs unconstrained minimisation using sqp. +% +% CALL: U_OPT = stk_minimize_unconstrained (ALGO, F, U_INIT) +% +% estimates the parameters U_OPT without any bounds, which gives the minimum +% value of the function F. A starting point U_INIT must be provided. +% +% CALL: [U_OPT, LIK] = stk_minimize_unconstrained (ALGO, F, U_INIT) +% +% also estimates the minimum function value LIK after the unconstrained +% minimisation using sqp. +% +% NOTE: Here ALGO is an input argument to the function, that is an object of +% class 'stk_optim_octavesqp'. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [u_opt,lik] = stk_minimize_unconstrained (algo, f, u_init) + +[u_opt, lik] = stk_minimize_boxconstrained (algo, f, u_init, [], []); + +end % function diff --git a/inst/misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m b/inst/misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m new file mode 100644 index 0000000..73049f8 --- /dev/null +++ b/inst/misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m @@ -0,0 +1,99 @@ +% STK_OPTIM_OCTAVESQP constructs an object of class 'stk_optim_octavesqp'. +% +% CALL: ALGO = stk_optim_octavesqp () +% +% constructs an algorithm object ALGO of class 'stk_optim_octavesqp' +% with a default set of options. +% +% CALL: ALGO = stk_optim_octavesqp (opt) +% +% constructs an algorithm object ALGO of class 'stk_optim_octavesqp' +% with a user-defined set of options, defined by the structure opt. + +% Copyright Notice +% +% Copyright (C) 2015-2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function algo = stk_optim_octavesqp (user_options) + +% Default options +options.maxiter = 500; % Octave's default is 100 +options.tol = sqrt (eps); % This is Octave's default +options.qp_solver = []; % We provide a default choice below, if needed + +% Process user options +if nargin > 0 + fn = fieldnames (user_options); + for i = 1:(numel (fn)) + switch lower (fn{i}) + case 'maxiter' + options.maxiter = user_options.maxiter; + case 'tol' + options.tol = user_options.tol; + case 'qp_solver' + options.qp_solver = user_options.qp_solver; + otherwise + stk_error (sprintf ('Unknown option: %s.\n',fn{i}), ... + 'InvalidArgument'); + end + end +end + +% Provide default QP solver if needed +if isempty (options.qp_solver) + if exist ('OCTAVE_VERSION', 'builtin') == 5 % Octave + % Octave's core qp function + options.qp_solver = 'qp'; + else + % quadprog from Mathworks' Optimization toolbox or from MOSEK + options.qp_solver = 'quadprog'; + end +end + +% Choose the appropriate optimizer, depending on the value of qp_solver +switch options.qp_solver + case 'qp' + optimizer = 'sqp'; + case 'quadprog' + optimizer = 'sqp_quadprog'; + otherwise + stk_error (sprintf (['Incorrect value for option qp_solver %s.\n\n' ... + 'qp_solver must be either ''qp'' or ''quadprog''.\n'], ... + options.qp_solver), 'InvalidArgument'); +end + +% Note: do NOT rewrite to use handles instead of strings for optimizer +% (see bug report https://savannah.gnu.org/bugs/index.php?47828) + +base = stk_optim_optimizer_ (true, true); +algo = struct ('options', options, 'sqp', optimizer); +algo = class (algo, 'stk_optim_octavesqp', base); + +end % function + + +%!test stk_test_class ('stk_optim_octavesqp') diff --git a/inst/misc/optim/@stk_optim_optimizer_/stk_optim_isavailable.m b/inst/misc/optim/@stk_optim_optimizer_/stk_optim_isavailable.m new file mode 100644 index 0000000..cd4fab7 --- /dev/null +++ b/inst/misc/optim/@stk_optim_optimizer_/stk_optim_isavailable.m @@ -0,0 +1,43 @@ +% STK_OPTIM_ISAVAILABLE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_optim_isavailable (algo) + +if algo.does_boxconstrained + b1 = stk_optim_testmin_box (algo); +end + +if algo.does_unconstrained + b2 = stk_optim_testmin_unc (algo); +end + +b = (algo.does_boxconstrained || algo.does_unconstrained) ... + && ((~ algo.does_boxconstrained) || b1) ... + && ((~ algo.does_unconstrained) || b2); + +end % function diff --git a/inst/misc/optim/@stk_optim_optimizer_/stk_optim_optimizer_.m b/inst/misc/optim/@stk_optim_optimizer_/stk_optim_optimizer_.m new file mode 100644 index 0000000..68aac49 --- /dev/null +++ b/inst/misc/optim/@stk_optim_optimizer_/stk_optim_optimizer_.m @@ -0,0 +1,58 @@ +% STK_OPTIM_OPTIMIZER_ [STK internal] +% +% CALL: ALGO = stk_optim_optimizer_ (DOES_BOXCONSTRAINED, DOES_UNCONSTRAINED) +% +% constructs an abstract algorithm object ALGO of class stk_optim_optimizer_. +% The first (resp. second) input argument indicates whether the object +% reprensents an algorithm that supports constrained (resp. +% unconstrained) optimization. +% +% STK INTERNAL WARNING: +% +% The class @stk_optim_optimizer_ is considered as internal. Its +% implementation and interface are likely to change in future releases. +% Ordinary users should refrain from using it directly. + +% Copyright Notice +% +% Copyright (C) 2017-2019 CentraleSupelec +% +% Authors: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function algo = stk_optim_optimizer_ (does_boxconstrained, does_unconstrained) + +if nargin == 0 + does_boxconstrained = false; + does_unconstrained = false; +end + +algo = struct ( ... + 'does_boxconstrained', does_boxconstrained, ... + 'does_unconstrained', does_unconstrained ); + +algo = class (algo, 'stk_optim_optimizer_'); + +end % function + + +%!test stk_test_class ('stk_optim_optimizer_') diff --git a/inst/misc/optim/stk_minimize_boxconstrained.m b/inst/misc/optim/stk_minimize_boxconstrained.m new file mode 100644 index 0000000..6ca3b80 --- /dev/null +++ b/inst/misc/optim/stk_minimize_boxconstrained.m @@ -0,0 +1,87 @@ +% STK_MINIMIZE_BOXCONSTRAINED performs box-constrained minimization +% +% CALL: U_OPT = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% minimizes the objective function F between LB and UB, using algorithm +% ALGO with starting point U_INIT. The best point found by the algorithm is +% returned as U_OPT. The value of ALGO can be 'fmincon', 'octavesqp', or any +% algorithm object implementing the 'stk_minimize_boxconstrained' method. +% +% CALL: [U_OPT, F_OPT] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) +% +% also returns the best objective value F_OPT. +% +% See also stk_minimize_unconstrained, stk_optim_octavesqp, stk_optim_fmincon + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_minimize_boxconstrained (algo, varargin) + +switch algo + + case 'fmincon' + algo = stk_optim_fmincon (); + + case 'octavesqp' + algo = stk_optim_octavesqp (); + + otherwise + stk_error (['The first input argument should be an algorithm ' ... + 'object, implementing the stk_minimize_boxconstrained ', ... + 'method.'], 'InvalidArgument'); +end + +varargout = cell (1, max (1, nargout)); +[varargout{:}] = stk_minimize_boxconstrained (algo, varargin{:}); + +end % function + + +%!test % Call fmincon using function name +%! if stk_optim_isavailable ('fmincon') +%! assert (stk_optim_testmin_box ('fmincon')); +%! end + +%!test % Call fmincon directly, using algorithm object +%! if stk_optim_isavailable ('fmincon') +%! algo = stk_optim_fmincon ('TolX', 1e-12, 'TolFun', 1e-12); +%! assert (stk_optim_testmin_box (algo)); +%! end + +%!test % Call sqp using function name +%! if stk_optim_isavailable ('octavesqp') +%! assert (stk_optim_testmin_box ('octavesqp')); +%! end + +%!test % Call sqp directly, using algorithm object +%! if stk_optim_isavailable ('octavesqp') +%! algo = stk_optim_octavesqp (); +%! assert (stk_optim_testmin_box (algo)); +%! end + +%!error assert (stk_optim_testmin_box ('InexistentOptimizer')); +%!error assert (stk_optim_testmin_box (100)); diff --git a/inst/misc/optim/stk_minimize_unconstrained.m b/inst/misc/optim/stk_minimize_unconstrained.m new file mode 100644 index 0000000..3f4b1f3 --- /dev/null +++ b/inst/misc/optim/stk_minimize_unconstrained.m @@ -0,0 +1,87 @@ +% STK_MINIMIZE_UNCONSTRAINED performs unconstrained minimization +% +% CALL: U_OPT = stk_minimize_unconstrained (ALGO, F, U_INIT) +% +% minimizes the objective function F, using algorithm ALGO with starting +% point U_INIT. The best point found by the algorithm is returned as U_OPT. +% The value of ALGO can be 'fminsearch', 'octavesqp', or any algorithm object +% implementing the 'stk_minimize_boxconstrained' method. +% +% CALL: [U_OPT, F_OPT] = stk_minimize_unconstrained (ALGO, F, U_INIT) +% +% also returns the best objective value F_OPT. +% +% See also stk_minimize_boxconstrained, stk_optim_octavesqp, stk_optim_fminsearch + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_minimize_unconstrained (algo, varargin) + +switch algo + + case 'fminsearch' + algo = stk_optim_fminsearch (); + + case 'octavesqp' + algo = stk_optim_octavesqp (); + + otherwise + stk_error (['The first input argument should be an algorithm ' ... + 'object, implementing the stk_minimize_unconstrained ', ... + 'method.'], 'InvalidArgument'); +end + +varargout = cell (1, max (1, nargout)); +[varargout{:}] = stk_minimize_unconstrained (algo, varargin{:}); + +end % function + + +%!test % Call fminsearch using function name +%! if stk_optim_isavailable ('fminsearch') +%! assert (stk_optim_testmin_unc ('fminsearch')); +%! end + +%!test % Call fminsearch directly, using algorithm object +%! if stk_optim_isavailable ('fminsearch') +%! algo = stk_optim_fminsearch ('TolX', 1e-12, 'TolFun', 1e-12); +%! assert (stk_optim_testmin_unc (algo)); +%! end + +%!test % Call sqp using function name +%! if stk_optim_isavailable ('octavesqp') +%! assert (stk_optim_testmin_unc ('octavesqp')); +%! end + +%!test % Call sqp directly, using algorithm object +%! if stk_optim_isavailable ('octavesqp') +%! algo = stk_optim_octavesqp (); +%! assert (stk_optim_testmin_unc (algo)); +%! end + +%!error assert (stk_optim_testmin_unc ('InexistentOptimizer')); +%!error assert (stk_optim_testmin_unc (100)); diff --git a/inst/misc/optim/stk_optim_isavailable.m b/inst/misc/optim/stk_optim_isavailable.m new file mode 100644 index 0000000..7e8077c --- /dev/null +++ b/inst/misc/optim/stk_optim_isavailable.m @@ -0,0 +1,59 @@ +% STK_OPTIM_ISAVAILABLE checks if a given optimizer is available +% +% CALL: B = stk_optim_isavailable (ALGO) +% +% return true is ALGO is available, and false otherwise. ALGO can be the +% short name of an algorithm (such as 'octavesqp'), the corresponding class +% name (such as 'stk_optim_octavesqp'), a handle on the class constructor +% (such as @stk_optim_octavesqp) or an algorithm object. + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_optim_isavailable (algo, varargin) + +switch algo + + case 'fmincon' + A = stk_optim_fmincon (varargin{:}); + + case 'fminsearch' + A = stk_optim_fminsearch (varargin{:}); + + case 'octavesqp' + A = stk_optim_octavesqp (varargin{:}); + + otherwise + try + A = feval (algo, varargin{:}); + catch + stk_error ('Invalid input argument', 'InvalidArgument'); + end +end + +b = stk_optim_isavailable (A); + +end % function diff --git a/inst/misc/optim/stk_optim_testmin_box.m b/inst/misc/optim/stk_optim_testmin_box.m new file mode 100644 index 0000000..46a0287 --- /dev/null +++ b/inst/misc/optim/stk_optim_testmin_box.m @@ -0,0 +1,79 @@ +% STK_OPTIM_TESTMIN_BOX [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_optim_testmin_box (algo) + +if nargin == 1 + + try + % Starting point + x_init = 0.0; + + % Bounds + lb = -1.0; + ub = 0.1; + + [x_opt, obj_opt] = stk_minimize_boxconstrained ... + (algo, @objfun, x_init, lb, ub); + + assert (abs (x_opt - 0.1) < 1e-2); + assert (abs (obj_opt - 0.04) < 1e-2); + + b = true; + + catch %#ok + + b = false; + + end % try_catch + +elseif nargin == 0 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); + +end % if + +end % function + + +function [f, df] = objfun (x) + +f = (x - 0.3) .^ 2; +df = 2 * (x - 0.3); + +end % function + + +%!shared algo +%! algo = stk_options_get ('stk_param_estim', 'minimize_box'); + +%!error b = stk_optim_testmin_box (); + +%!assert (stk_optim_testmin_box (algo)); +%!assert (~ stk_optim_testmin_box ('dudule')); + + diff --git a/inst/misc/optim/stk_optim_testmin_unc.m b/inst/misc/optim/stk_optim_testmin_unc.m new file mode 100644 index 0000000..0189080 --- /dev/null +++ b/inst/misc/optim/stk_optim_testmin_unc.m @@ -0,0 +1,72 @@ +% STK_OPTIM_TESTMIN_UNC [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_optim_testmin_unc (algo) + +if nargin == 1 + + try + % Starting point + x_init = 0.0; + + [x_opt, obj_opt] = stk_minimize_unconstrained (algo, @objfun, x_init); + + assert (abs (x_opt - 0.3) < 1e-2); + assert (abs (obj_opt - 0.0) < 1e-2); + + b = true; + + catch %#ok + + b = false; + + end % try_catch + +elseif nargin == 0 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); + +end % if + +end % function + + +function [f, df] = objfun (x) + +f = (x - 0.3) .^ 2; +df = 2 * (x - 0.3); + +end % function + + +%!shared algo +%! algo = stk_options_get ('stk_param_estim', 'minimize_unc'); + +%!error b = stk_optim_testmin_unc (); + +%!assert (stk_optim_testmin_unc (algo)); +%!assert (~ stk_optim_testmin_unc ('dudule')); diff --git a/inst/misc/options/stk_options_get.m b/inst/misc/options/stk_options_get.m new file mode 100644 index 0000000..fafaf61 --- /dev/null +++ b/inst/misc/options/stk_options_get.m @@ -0,0 +1,88 @@ +% STK_OPTIONS_GET returns the value of one or all STK options +% +% See also: stk_options_set + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function argout = stk_options_get (varargin) + +opts = stk_options_set (); + +switch nargin + + case 0 % Nothing to do, just return the output + argout = opts; + + case 1 + switch varargin{1} + + case 'stk_sf_matern' + % TODO: Remove this warning in STK 3.x + warning (sprintf([ ... + 'stk_sf_matern and the corresponding options have been ' ... + 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); + argout = options.stk_rbf_matern; + + otherwise + argout = opts.(varargin{1}); + end + + case 2 + switch varargin{1} + + case 'stk_param_estim' + if strcmp (varargin{2}, 'optim_display_level') + % TODO: Remove this error in STK 3.x + error (sprintf ([ ... + 'Options stk_param_estim.optim_display_level has ' ... + 'been removed.\n\nDisplay options for optimization ' ... + 'algorithms can be set through the properties of ' ... + 'the algorithm objects instead.\n'])); + else + argout = opts.stk_param_estim.(varargin{2}); + end + + case 'stk_sf_matern' + % TODO: Remove this warning in STK 3.x + warning (sprintf([ ... + 'stk_sf_matern and the corresponding options have been ' ... + 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); + argout = options.stk_rbf_matern.(varargin{2}); + + otherwise + argout = opts.(varargin{1}).(varargin{2}); + end + + otherwise + stk_error ('Too many input arguments.', 'TooManyInputArgs'); + +end + +end % function + +%#ok<*SPWRN,*SPERR> diff --git a/inst/misc/options/stk_options_set.m b/inst/misc/options/stk_options_set.m new file mode 100644 index 0000000..f301917 --- /dev/null +++ b/inst/misc/options/stk_options_set.m @@ -0,0 +1,192 @@ +% STK_OPTIONS_SET sets the value of one or all STK options +% +% CALL: stk_options_set ('default') +% +% resets STK's default options. +% +% CALL: stk_options_set (OPTS) +% +% sets all options at once using the option structure OPTS. Such a +% structure can be obtained from stk_options_get. +% +% CALL: stk_options_set (BLOCKNAME, OPTS) +% +% sets all the options from a block BLOCKNAME, using the option +% structure OPTS. Such a structure can be obtained from +% stk_options_get as well. +% +% CALL: stk_options_set (BLOCKNAME, OPTNAME, OPTVAL) +% +% sets options BLACKNAME.OPTNAME to the value OPTVAL. +% +% CALL: OPTS = stk_options_set (...) +% +% returns the modified option structure, containing all STK's options. +% +% See also: stk_options_get + +% Copyright Notice +% +% Copyright (C) 2019 CentraleSupelec +% Copyright (C) 2015-2017 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% Copyright (C) 2013 SUPELEC +% +% Authors: Julien Bect +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function opts = stk_options_set (varargin) + +persistent options + +if isempty (options) + options = init_options (); + mlock; +end + +switch nargin + + case 0 % nothing to do, just return the output + + case 1 % reset + if (ischar (varargin{1})) && strcmp (varargin{1}, 'default') + options = init_options (); + elseif isstruct (varargin{1}) + options = varargin{1}; + else + stk_error ('Syntax error', 'SyntaxError'); + end + + case 2 + switch varargin{1} + + case 'stk_sf_matern' + % TODO: Remove this warning in STK 3.x + warning (sprintf([ ... + 'stk_sf_matern and the corresponding options have been ' ... + 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); + options.stk_rbf_matern = varargin{2}; + + otherwise + options.(varargin{1}) = varargin{2}; + end + + case 3 + switch varargin{1} + + case 'stk_param_estim' + if strcmp (varargin{2}, 'optim_display_level') + % TODO: Remove this warning in STK 3.x + warning (sprintf ([ ... + 'Options stk_param_estim.optim_display_level has ' ... + 'been removed.\n\nDisplay options for optimization ' ... + 'algorithms can be set through the properties of ' ... + 'the algorithm objects instead.\n'])); + else + options.stk_param_estim.(varargin{2}) = varargin{3}; + end + + case 'stk_sf_matern' + % TODO: Remove this warning in STK 3.x + warning (sprintf([ ... + 'stk_sf_matern and the corresponding options have been ' ... + 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); + options.stk_rbf_matern.(varargin{2}) = varargin{3}; + + otherwise + options.(varargin{1}).(varargin{2}) = varargin{3}; + end + + otherwise + stk_error ('Incorrect number of input arguments.', 'SyntaxError'); + +end + +if nargout > 0 + opts = options; +end + +end % function + +%#ok<*CTCH,*SPWRN> + + +function opts = init_options () + +opts = struct (); + +opts.stk_rbf_matern.min_size_for_parallelization = 1e5; +opts.stk_rbf_matern.min_block_size = 1e3; + +opts.stk_dataframe.disp_format = 'basic'; % 'basic' or 'verbose' +opts.stk_dataframe.disp_spstr = ' '; +opts.stk_dataframe.openvar_warndlg = true; + +opts.stk_param_getdefaultbounds.tolvar = 5.0; +opts.stk_param_getdefaultbounds.tolscale = 5.0; +opts.stk_param_getdefaultbounds.nu_min_dimfun = @(d) 0.5; +opts.stk_param_getdefaultbounds.nu_max_dimfun = @(d) min (50.0, 10 * d); + +opts.stk_figure.properties = {'InvertHardcopy', 'off', 'Color', [1 1 1]}; +opts.stk_xlabel.properties = {'FontSize', 10, 'Color', [0.2 0 1]}; +opts.stk_ylabel.properties = opts.stk_xlabel.properties; +opts.stk_zlabel.properties = opts.stk_xlabel.properties; +opts.stk_title.properties = {'FontSize', 10, 'FontWeight', 'bold'}; +opts.stk_axes.properties = {'FontSize', 8}; + +% Select optimizer for stk_param_estim +if exist ('OCTAVE_VERSION', 'builtin') == 5 + % In Octave we use sqp (which is always available) in both cases + opts.stk_param_estim.minimize_box = stk_optim_octavesqp (); + opts.stk_param_estim.minimize_unc = stk_optim_octavesqp (); +else + A_fminsearch = stk_optim_fminsearch (); + try + % See if the Mathworks' Optimization toolbox is installed + opts.stk_param_estim.minimize_box = stk_optim_fmincon (); + opts.stk_param_estim.minimize_unc = A_fminsearch; % FIXME: use fminunc ! + check_both (opts.stk_param_estim); + catch + try + % See sqp can be used with MOSEK's quadprog + % (or any other compatible replacement for quadprog) + A = stk_optim_octavesqp (struct ('qp_solver', 'quadprog')); + opts.stk_param_estim.minimize_box = A; + opts.stk_param_estim.minimize_unc = A; + check_both (opts.stk_param_estim); + catch + opts.stk_param_estim.minimize_box = A_fminsearch; + opts.stk_param_estim.minimize_unc = A_fminsearch; + end + end +end + +end % function + + +function check_both (opts) + +assert (stk_optim_testmin_box (opts.minimize_box)); +assert (stk_optim_testmin_unc (opts.minimize_unc)); + +end % function diff --git a/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m b/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m new file mode 100644 index 0000000..d816056 --- /dev/null +++ b/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m @@ -0,0 +1,37 @@ +% STK_PARALLEL_ENGINE_NONE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function pareng = stk_parallel_engine_none() + +pareng = class(struct(), 'stk_parallel_engine_none'); + +end % function + + +%!test stk_test_class ('stk_parallel_engine_none') diff --git a/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_feval.m b/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_feval.m new file mode 100644 index 0000000..b837860 --- /dev/null +++ b/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_feval.m @@ -0,0 +1,48 @@ +% STK_PARALLEL_FEVAL [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = stk_parallel_feval(eng, f, x, vectorized, min_block_size) + +% TODO: remplacer vectorized par max_block_size ? + +if vectorized % STK-style vectorization supported + + z = feval(f, x); + +else % STK-style vectorization not supported => loop over the rows of x + + n = size(x, 1); + z = zeros(n, 1); + + parfor i = 1:n, + z(i) = feval(f, x(i, :)); + end + +end + +end % function diff --git a/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_stop.m b/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_stop.m new file mode 100644 index 0000000..c962467 --- /dev/null +++ b/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_stop.m @@ -0,0 +1,33 @@ +% STK_PARALLEL_STOP [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_parallel_stop(eng) %#ok + +% nothing to do ! + +end % function diff --git a/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m new file mode 100644 index 0000000..a3c2f7c --- /dev/null +++ b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m @@ -0,0 +1,59 @@ +% STK_PARALLEL_ENGINE_PARFOR [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2017, 2021 CentraleSupelec +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function pareng = stk_parallel_engine_parfor() + +if exist ('parpool') + + try + parpool (); + catch + e = lasterror (); + if strfind (e.identifier, 'ConnectionOpen') + warning ('A worker pool is already open.'); + else + rethrow (e); + end + end + +else % try the old syntax + + if matlabpool ('size') > 0 + warning ('A worker pool is already open.'); + else + matlabpool open; + end + +end + +pareng = class (struct(), 'stk_parallel_engine_parfor'); + +end % function + +%#ok<*DPOOL> diff --git a/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_feval.m b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_feval.m new file mode 100644 index 0000000..3d39898 --- /dev/null +++ b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_feval.m @@ -0,0 +1,60 @@ +% STK_PARALLEL_FEVAL [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = stk_parallel_feval(eng, f, x, vectorized, min_block_size) + +% TODO: remplacer vectorized par max_block_size ? + +if vectorized % STK-style vectorization supported + + ncores = max(1, matlabpool('size')); + + blocks = stk_parallel_cutblocks(x, ncores, min_block_size); + + nb_blocks = length(blocks); + + z = cell(nb_blocks, 1); + + parfor b = 1:nb_blocks, + z{b} = feval(f, blocks(b).xi); + end + + z = vertcat(z{:}); + +else % STK-style vectorization not supported => loop over the rows of x + + n = size(x, 1); + z = zeros(n, 1); + + parfor i = 1:n, + z(i) = feval(f, x(i, :)); + end + +end + +end % function diff --git a/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_stop.m b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_stop.m new file mode 100644 index 0000000..f4b3bc6 --- /dev/null +++ b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_stop.m @@ -0,0 +1,39 @@ +% STK_PARALLEL_STOP [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_parallel_stop(eng) %#ok + +if matlabpool('size') == 0, + warning('There was no worker pool open.'); +else + matlabpool close; +end + +stk_parallel_engine_set(stk_parallel_engine_none()); + +end % function diff --git a/inst/misc/parallel/stk_parallel_cutblocks.m b/inst/misc/parallel/stk_parallel_cutblocks.m new file mode 100644 index 0000000..bac7af2 --- /dev/null +++ b/inst/misc/parallel/stk_parallel_cutblocks.m @@ -0,0 +1,56 @@ +% STK_PARALLEL_CUTBLOCKS [STK internal] + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function blocks = stk_parallel_cutblocks(x, ncores, min_block_size) + +x = double(x); +n = size(x, 1); + +%--- Choose the actual block size & number of blocks ---------------------------- + +nb_blocks = min(ncores, max(1, floor(n / min_block_size))); + +block_size = ceil(n / nb_blocks); + +%--- Cut blocks ----------------------------------------------------------------- + +ind1 = 1 + ((1:nb_blocks)' - 1) * block_size; +ind2 = min(n, ind1 + block_size - 1); + +% note: the last blocks can be slightly smaller than the others + +blocks = struct('i', cell(1, nb_blocks), 'j', [], 'xi', [], 'K', []); + +for b = 1:nb_blocks, + + blocks(b).i = ind1(b):ind2(b); + blocks(b).xi = x(blocks(b).i, :); + +end + +end % function diff --git a/inst/misc/parallel/stk_parallel_engine_get.m b/inst/misc/parallel/stk_parallel_engine_get.m new file mode 100644 index 0000000..fc971fd --- /dev/null +++ b/inst/misc/parallel/stk_parallel_engine_get.m @@ -0,0 +1,33 @@ +% STK_PARALLEL_ENGINE_GET returns the current parallelization engine. + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function pareng = stk_parallel_engine_get() + +pareng = stk_parallel_engine_set(); + +end % function diff --git a/inst/misc/parallel/stk_parallel_engine_set.m b/inst/misc/parallel/stk_parallel_engine_set.m new file mode 100644 index 0000000..eaffb2a --- /dev/null +++ b/inst/misc/parallel/stk_parallel_engine_set.m @@ -0,0 +1,51 @@ +% STK_PARALLEL_ENGINE_SET chooses a parallelization engine. + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function pareng = stk_parallel_engine_set(new_pareng) + +persistent current_pareng + +% initialization +if isempty(current_pareng) + + % no parallel engine, to begin with + current_pareng = stk_parallel_engine_none(); + + % lock the mfile in memory to prevent current_pareng from being cleared + mlock(); + +end + +if nargin > 0, + current_pareng = new_pareng; +end + +% Return the current parallel engine +pareng = current_pareng; + +end % function diff --git a/inst/misc/parallel/stk_parallel_feval.m b/inst/misc/parallel/stk_parallel_feval.m new file mode 100644 index 0000000..5796051 --- /dev/null +++ b/inst/misc/parallel/stk_parallel_feval.m @@ -0,0 +1,42 @@ +% STK_PARALLEL_FEVAL does parallel evaluations of a function. + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function z = stk_parallel_feval(f, x, vectorized, min_block_size) + +if nargin < 3, + vectorized = true; +end + +if nargin < 4, + min_block_size = 1; +end + +z = stk_parallel_feval(stk_parallel_engine_get(), ... + f, x, vectorized, min_block_size); + +end % function diff --git a/inst/misc/parallel/stk_parallel_start.m b/inst/misc/parallel/stk_parallel_start.m new file mode 100644 index 0000000..076c741 --- /dev/null +++ b/inst/misc/parallel/stk_parallel_start.m @@ -0,0 +1,50 @@ +% STK_PARALLEL_START starts the parallelization engine. + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function eng = stk_parallel_start () + +eng = stk_parallel_engine_get (); + +if strcmp (class (eng), 'stk_parallel_engine_none') %#ok + + % use Mathworks' PCT if available + if (exist ('OCTAVE_VERSION', 'builtin') ~= 5) ... % no Octave + && (exist ('matlabpool', 'file')) + eng = stk_parallel_engine_parfor (); + stk_parallel_engine_set (eng); + end + +else + + warning (['A parallel computing engine ' ... + 'is already started (or so it seems).']); %#ok + +end + +end % function diff --git a/inst/misc/parallel/stk_parallel_stop.m b/inst/misc/parallel/stk_parallel_stop.m new file mode 100644 index 0000000..6e7a068 --- /dev/null +++ b/inst/misc/parallel/stk_parallel_stop.m @@ -0,0 +1,33 @@ +% STK_PARALLEL_STOP stops the parallelization engine. + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_parallel_stop () + +stk_parallel_stop (stk_parallel_engine_get ()); + +end % function diff --git a/inst/misc/pareto/stk_dominatedhv.m b/inst/misc/pareto/stk_dominatedhv.m new file mode 100644 index 0000000..e9f05fd --- /dev/null +++ b/inst/misc/pareto/stk_dominatedhv.m @@ -0,0 +1,374 @@ +% STK_DOMINATEHV computes the hypervolume dominated by a set of points +% +% CALL: HV = stk_dominatedhv (Y, Y_REF) +% CALL: HV = stk_dominatedhv (Y, Y_REF, 0) +% +% computes the hypervolume dominated by the rows of Y, with respect to the +% reference point Y_REF (a row vector with the same number of columns as Y). +% It is expected that all the rows of Y are smaller than Y_REF +% (multi-objective minimization framework). +% +% CALL: HV = stk_dominatedhv (Y) +% CALL: HV = stk_dominatedhv (Y, [], 0) +% +% uses [0 0 ... 0] as a reference point. +% +% CALL: DECOMP = stk_dominatedhv (Y, Y_REF, 1) +% +% computes a signed decomposition of the dominated hyper-region delimited by +% the reference point Y_REF into overlapping rectangles. Assuming that Y is +% of size N x D, the result DECOMP is a structure with field .sign (N x 1), +% .xmin (N x D) and .xmax (N x D). The hypervolume can be recovered from this +% decomposition using +% +% HV = sum (DECOMP.sign .* prod (DECOMP.xmax - DECOMP.xmin, 2)) +% +% provided that the resulting decomposition is not empty. +% +% CALL: HV = stk_dominatedhv (Y, [], 1) +% +% computed a signed decomposition using [0 0 ... 0] as a reference point. +% +% NOTE: +% +% This function relies internally on the WFG algorithm [1, 2]. +% +% REFERENCES: +% +% [1] Lyndon While, Lucas Bradstreet and Luigi Barone, "A Fast Way of +% Calculating Exact Hypervolumes", IEEE Transactions on Evolutionary +% Computation, 16(1):86-95, 2012 +% http://dx.doi.org/10.1109/TEVC.2010.2077298 +% +% [2] WFG 1.10, released under the GPLv2 licence, available online from: +% http://www.wfg.csse.uwa.edu.au/hypervolume/ +% +% See also: sortrows, stk_isdominated, stk_paretofind + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018, 2022 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function result = stk_dominatedhv (y, y_ref, do_decomposition) + +% Missing or empty y_ref: will use [0 0 ... 0] as a reference point +if nargin < 2 + y_ref = []; +elseif ~ isempty (y_ref) + y_ref = double (y_ref); + d = size (y_ref, 2); + if (d == 0) || (~ isequal (size (y_ref), [1 d])) % isrow CG#08 + stk_error ('y_ref should be a numeric row vector.', 'IncorrectSize'); + end +end + +% Return the decomposition or just the value of the volume ? +if nargin < 3 + do_decomposition = false; +else + do_decomposition = logical (do_decomposition); +end + +% Pre-processing +if iscell (y), + y = cellfun (@(z) wfg_preprocessing (z, y_ref), y, 'UniformOutput', false); +else % y is a matrix + try + y = double (y); + assert (ndims (y) == 2); %#ok see CODING_GUDELINES + catch + stk_error (['y should either be a cell array or be (convertible ' ... + 'to) a numeric matrix'], 'InvalidArgument'); + end + y = wfg_preprocessing (y, y_ref); +end + +% COMPUTE +if ~ do_decomposition, + + % Compute the hypervolume only + result = __stk_dominatedhv_mex__ (y, false); + +else + + % Compute the decomposition into hyper-rectangles + result = __stk_dominatedhv_mex__ (y, true); + + % Post-processing + if iscell (y) + result = arrayfun (@(hv) wfg_postprocessing (hv, y_ref), ... + result, 'UniformOutput', true); + else + result = wfg_postprocessing (result, y_ref); + end +end + +end % function + + +function y = wfg_preprocessing (y, y_ref) + +y = double (y); + +% Keep only non-dominated points, and remove duplicates +y = unique (y(stk_paretofind (y), :), 'rows'); + +if isempty (y_ref) % Use [0 0 ... 0] as a reference point + + % WFG convention: maximization problem + y = - y; + +else % Reference point provided + + p = size (y, 2); + p_ref = size (y_ref, 2); + + % Check the size of y + if (p > p_ref) + stk_error (['The number of columns the data matrix should not be ' ... + 'larger than the number of columns of y_ref'], 'InvalidArgument'); + end + + % WFG convention: maximization problem + y = bsxfun (@minus, y_ref(1:p), y); + +end + +% Remove points that do not dominate the reference +b = any (y < 0, 2); +y(b, :) = []; + +end % function + + +function hv = wfg_postprocessing (hv, y_ref) + +p = size (hv.xmin, 2); +xmin = hv.xmin; + +if isempty (y_ref) + hv.xmin = - hv.xmax; + hv.xmax = - xmin; +else + hv.xmin = bsxfun (@minus, y_ref(1:p), hv.xmax); + hv.xmax = bsxfun (@minus, y_ref(1:p), xmin); +end + +end % function + + +%!error hv = stk_dominatedhv (); +%!error hv = stk_dominatedhv (-y, 'incorrect ref type'); +%!error hv = stk_dominatedhv (-y, [0 0]); +%!error hv = stk_dominatedhv (-y, [0 0 0 0 0], 0, 'too many input args'); + +%------------------------------------------------------------------------------- + +%!shared y, hv0 % Example from README.TXT in WFG 1.10 +%! +%! y = [ ... +%! 0.598 0.737 0.131 0.916 6.745; ... +%! 0.263 0.740 0.449 0.753 6.964; ... +%! 0.109 8.483 0.199 0.302 8.872 ]; +%! +%! hv0 = 1.1452351120; + +%!test +%! hv = stk_dominatedhv (-y); +%! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); + +%!test +%! yy = stk_dataframe (- y); % Check that @stk_dataframe inputs are accepted +%! hv = stk_dominatedhv (yy); +%! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); + +%!test +%! hv = stk_dominatedhv (-y, [], 0); +%! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); + +%!test +%! hv = stk_dominatedhv (-y, [0 0 0 0 0]); +%! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); + +%!test +%! hv = stk_dominatedhv (1 - y, [1 1 1 1 1]); +%! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); + +%!test +%! r = stk_dominatedhv (-y, [], 1); +%! hv = sum (r.sign .* prod (r.xmax - r.xmin, 2)); +%! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); + +%------------------------------------------------------------------------------- + +%!shared y1, y2, y0, S, S1 +%! y0 = [1.00 1.00]; % Reference point +%! y1 = [1.50 1.50]; % Above the reference point +%! y2 = [0.50 0.50]; % Below the reference point + +%!assert (isequal (0.00, stk_dominatedhv (y1, y0))); +%!assert (isequal (0.25, stk_dominatedhv (y2, y0))); +%!assert (isequal (0.25, stk_dominatedhv ([y1; y2], y0))); +%!assert (isequal (0.25, stk_dominatedhv ([y2; y1; y2], y0))); + +% Check decompositions: + +%!test S = stk_dominatedhv (y1, y0, 1); % empty decomposition +%!assert (isequal (size (S.xmin, 1), 0)); + +%!test S = stk_dominatedhv (y2, y0, 1); % trivial decomposition +%!assert (isequal (S.sign, 1)); +%!assert (isequal (S.xmin, y2)); +%!assert (isequal (S.xmax, y0)); + +%!test S1 = stk_dominatedhv ([y2; y0], y0, 1); % shoud be the same as before +%!assert (isequal (S1, S)); + +%!test S1 = stk_dominatedhv ([y2; y1], y0, 1); % shoud be the same as before +%!assert (isequal (S1, S)); + +%!test S1 = stk_dominatedhv ([y2; y2], y0, 1); % shoud be the same as before +%!assert (isequal (S1, S)); + +%------------------------------------------------------------------------------- + +%!test +%! for d = 1:10, +%! y = - 0.5 * ones (1, d); +%! hv = stk_dominatedhv (y); +%! assert (isequal (stk_dominatedhv (y), 0.5 ^ d)); +%! end + +%!test +%! for d = 1:10, +%! y = - 0.5 * ones (1, d); +%! r = stk_dominatedhv (y, [], 1); +%! hv = sum (r.sign .* prod (r.xmax - r.xmin, 2)); +%! assert (isequal (stk_dominatedhv (y), 0.5 ^ d)); +%! end + +%------------------------------------------------------------------------------- + +%!shared y, y_ref, dv, hv0 +%! y1 = [0.25 0.75]; +%! y2 = [0.50 0.50]; +%! y3 = [0.75 0.25]; +%! +%! y_ref = [1 1]; +%! +%! y = {[], y1, y2, y3; [y1; y2], [y1; y3], [y2; y3], [y1; y2; y3]}; +%! +%! dv = 0.25 ^ 2; hv0 = [0 3 4 3; 5 5 5 6] * dv; + +%!test +%! hv1 = stk_dominatedhv (y, y_ref); +%! assert (isequal (hv0, hv1)); + +%!test +%! r = stk_dominatedhv (y, y_ref, 1); +%! +%! % Check the first decomposition, which should be empty +%! assert (isempty (r(1).sign)); +%! assert (isempty (r(1).xmin)); +%! assert (isempty (r(1).xmax)); +%! +%! % Check the other decompositions +%! for i = 2:6, +%! hv2 = sum (r(i).sign .* prod (r(i).xmax - r(i).xmin, 2)); +%! assert (isequal (hv0(i), hv2)); +%! end + +%------------------------------------------------------------------------------- + +%!test +%! y = (0.3:0.1:0.8)'; +%! hv0 = 0.7; +%! hv1 = stk_dominatedhv (y, 1); +%! r = stk_dominatedhv (y, 1, true); +%! hv2 = sum (r.sign .* prod (r.xmax - r.xmin, 2)); + +%!test % four non-dominated points (hypervolume) +%! zr = [1 1]; +%! zi = [0.2 0.8; 0.4 0.6; 0.6 0.4; 0.8 0.2] +%! P = perms (1:4); +%! for i = 1:24 +%! HV = stk_dominatedhv (zi(P(i, :), :), zr, 0); +%! assert (stk_isequal_tolrel (HV, 0.4, 1e-15)); +%! end + +%!test % four non-dominated points (decomposition) +%! zr = [1 1]; +%! zi = [0.2 0.8; 0.4 0.6; 0.6 0.4; 0.8 0.2] +%! P = perms (1:4); +%! for i = 1:24 +%! S = stk_dominatedhv (zi(P(i, :), :), zr, 1); +%! HV = sum (S.sign .* prod (S.xmax - S.xmin, 2)); +%! assert (stk_isequal_tolrel (HV, 0.4, 1e-15)); +%! end + +%!test % a case with 8 points and 5 objectives +%! % http://sourceforge.net/p/kriging/tickets/33 +%! +%! yr = [1.03 0.91 0.96 1.99 16.2]; +%! +%! y = [ ... +%! 0.8180 0.5600 0.1264 1.0755 1.2462; ... +%! 0.8861 0.6928 0.2994 0.7228 0.9848; ... +%! 0.9021 0.8829 0.6060 0.1642 0.4282; ... +%! 0.9116 0.3097 0.8601 0.0468 0.2813; ... +%! 0.9306 0.1429 0.6688 0.1462 1.3661; ... +%! 0.9604 0.3406 0.4046 0.7239 1.8741; ... +%! 0.9648 0.7764 0.5199 0.4098 1.3436; ... +%! 0.9891 0.4518 0.7956 0.1164 1.2025]; +%! +%! hv1 = stk_dominatedhv (y, yr, 0); +%! +%! S = stk_dominatedhv (y, yr, 1); +%! hv2 = sum (S.sign .* prod (S.xmax - S.xmin, 2)); +%! +%! assert (isequal (size (S.sign), [87 1])); +%! assert (isequal (size (S.xmin), [87 5])); +%! assert (isequal (size (S.xmax), [87 5])); +%! assert (stk_isequal_tolrel (hv1, 1.538677420906463, 2 * eps)); +%! assert (stk_isequal_tolrel (hv1, hv2, eps)); + +%!test % with random data +%! NREP = 5; +%! for p = 1:5 +%! for n = 1:10 +%! for i = 1:NREP +%! % Draw random data +%! y = rand (n, p); +%! y = - y ./ (norm (y)); +%! % Compute hypervolume directly +%! hv1 = stk_dominatedhv (y, [], 0); +%! % Compute decomposition, then hypervolume +%! R = stk_dominatedhv (y, [], 1); +%! hv2 = sum (R.sign .* prod (R.xmax - R.xmin, 2)); +%! % Compare results +%! assert (stk_isequal_tolabs (hv1, hv2, eps)); +%! end +%! end +%! end diff --git a/inst/misc/pareto/stk_isdominated.m b/inst/misc/pareto/stk_isdominated.m new file mode 100644 index 0000000..f8d83a9 --- /dev/null +++ b/inst/misc/pareto/stk_isdominated.m @@ -0,0 +1,117 @@ +% STK_ISDOMINATED returns true for dominated rows +% +% CALL: ISDOM = stk_isdominated (A, B) +% +% returns a vector ISDOM of logicals, where ISDOM(i) is true if A(i, :) +% is dominated by one of the rows of B. A row B(j, :) is said to +% dominate A(i, :) if +% +% B(j, k) <= A(i, k) for all k in {1, 2, ..., d} +% +% and +% +% B(j, k) < A(i, k) for at least one such k, +% +% where d is the number of columns. In other words: smaller is better. +% +% CALL: ISDOM = stk_isdominated (A, B, DO_SORTROWS) +% +% does the same but, if DO_SORTROWS == false, assumes that the rows of +% B are already sorted in ascending lexical order. +% +% CALL: [ISDOM, DPOS] = stk_isdominated (A, B, DO_SORTROWS) +% +% also returns a vector DPOS such that DPOS(i) = 0 if A(i, :) is non- +% dominated, and DPOS(i) gives the index of a row in B that dominates +% A(i, :) otherwise. +% +% See also: sortrows, stk_paretofind, stk_dominatedhv + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [isdom, dpos, Bsnd] = stk_isdominated (A, B, do_sortrows) + +A = double (A); +B = double (B); + +if nargin < 3, + do_sortrows = true; +end + +if do_sortrows, + ndpos = stk_paretofind (B); + Bsnd = B(ndpos, :); +end + +if nargout < 2 + isdom = __stk_isdominated_mex__ (A, Bsnd); +else + [isdom, drank] = __stk_isdominated_mex__ (A, Bsnd); + if do_sortrows, + dpos = zeros (size (drank)); + dpos(isdom) = ndpos(drank(isdom)); + end +end + +end % function + + +%!test +%! A = [1 3 2]; +%! B = [0 0 0]; +%! [isdom, dpos] = stk_isdominated (A, B); +%! assert (isdom == 1); +%! assert (dpos == 1); + +%!test +%! A = [1 3 2]; +%! B = [0 0 3]; +%! [isdom, dpos] = stk_isdominated (A, B); +%! assert (isdom == 0); +%! assert (dpos == 0); + +%!test +%! A = [1 3 2]; +%! B = [0 0 0; 0 0 3]; +%! [isdom, dpos] = stk_isdominated (A, B); +%! assert (isdom == 1); +%! assert (dpos == 1); + +%!test +%! A = [1 3 2]; +%! B = [0 0 3; 0 0 0]; +%! [isdom, dpos] = stk_isdominated (A, B); +%! assert (isdom == 1); +%! assert (dpos == 2); + +%!test +%! A = [1 3 2; 1 0 1; -1 0 0; 1 3 2]; +%! B = [1 0 0; 0 0 3; 0 0 0]; +%! [isdom, dpos] = stk_isdominated (A, B); +%! assert (isequal (isdom, logical ([1; 1; 0; 1]))); +%! assert (isequal (dpos, [3; 3; 0; 3])); diff --git a/inst/misc/pareto/stk_paretofind.m b/inst/misc/pareto/stk_paretofind.m new file mode 100644 index 0000000..5252dab --- /dev/null +++ b/inst/misc/pareto/stk_paretofind.m @@ -0,0 +1,102 @@ +% STK_PARETOFIND finds non-dominated rows in an array +% +% CALL: [NDPOS, DRANK] = stk_paretofind (X) +% +% returns the indices NDPOS such that X(NDPOS, :) contains all non- +% dominated rows of X, sorted in (ascending) lexical order. A row +% X(i, :) is said to dominate another row X(j, :) if +% +% X(i, k) <= X(j, k) for all k in {1, 2, ..., d} +% +% and +% +% X(i, k) < X(j, k) for at least one such k, +% +% where d is the number of columns. In other words: smaller is better. +% For each row X(i, :), DRANK(i) is equal to zero if the row is non- +% dominated, and equal to the smallest j such that X(i, :) is dominated +% by X(NDPOS(j), :) otherwise. +% +% See also: sortrows, stk_isdominated, stk_dominatedhv + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_paretofind (x) + +varargout = cell (1, max (1, nargout)); + +[varargout{:}] = __stk_paretofind_mex__ (double (x)); + +end % function + + +%!shared x, ndpos, drank +%! x = [ ... +%! 0 2; ... +%! 2 2; ... +%! ]; + +%!test [ndpos, drank] = stk_paretofind (x); +%!assert (isequal (ndpos, 1)); +%!assert (isequal (drank, [0; 1])); + +%!shared x, ndpos, drank +%! x = [ ... +%! 3 2; ... +%! 2 2; ... +%! ]; + +%!test [ndpos, drank] = stk_paretofind (x); +%!assert (isequal (ndpos, 2)); +%!assert (isequal (drank, [1; 0])); + +%!shared x, ndpos, drank +%! x = [ ... +%! 1 0; ... +%! 2 0; ... +%! 0 2; ... +%! 2 2; ... +%! -1 3 ]; + +%!test [ndpos, drank] = stk_paretofind (x); +%!assert (isequal (ndpos, [5; 3; 1])); +%!assert (isequal (drank, [0; 3; 0; 2; 0])); + +%!shared x, ndpos, drank +%! x = [ ... +%! 1 0; ... +%! 2 0; ... +%! 0 2; ... +%! 2 2; ... +%! -1 3; ... +%! -1 4; ... +%! 2 2 ]; + +%!test [ndpos, drank] = stk_paretofind (x); +%!assert (isequal (ndpos, [5; 3; 1])); +%!assert (isequal (drank, [0; 3; 0; 2; 0; 1; 2])); diff --git a/inst/misc/plot/stk_axes.m b/inst/misc/plot/stk_axes.m new file mode 100644 index 0000000..2d9bf76 --- /dev/null +++ b/inst/misc/plot/stk_axes.m @@ -0,0 +1,45 @@ +% STK_AXES [STK internal] +% +% STK_AXES is a replacement for 'axes' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h = stk_axes (varargin) + +% Get global STK options +options = stk_options_get ('stk_axes', 'properties'); + +% Create figure +h = axes (options{:}); + +% Apply user-provided options +if ~ isempty (varargin) + set (h, varargin{:}); +end + +end % function diff --git a/inst/misc/plot/stk_figure.m b/inst/misc/plot/stk_figure.m new file mode 100644 index 0000000..5ceb8ec --- /dev/null +++ b/inst/misc/plot/stk_figure.m @@ -0,0 +1,61 @@ +% STK_FIGURE [STK internal] +% +% STK_FIGURE is a replacement for 'figure' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_fig = stk_figure (varargin) + +if mod (length (varargin), 2) ~= 0 + figname = varargin{1}; + user_options = varargin(2:end); +else + figname = ''; + user_options = varargin; +end + +% Get global STK options +options = stk_options_get ('stk_figure', 'properties'); + +% Create figure +h_fig = figure (options{:}); + +% Create axes +stk_axes; + +% Apply user-provided options +if ~ isempty (user_options) + set (h_fig, user_options{:}); +end + +% Set figure name and title +if ~ isempty (figname) + set (h_fig, 'Name', figname); +end + +end % function diff --git a/inst/misc/plot/stk_labels.m b/inst/misc/plot/stk_labels.m new file mode 100644 index 0000000..186dcd1 --- /dev/null +++ b/inst/misc/plot/stk_labels.m @@ -0,0 +1,49 @@ +% STK_LABELS [STK internal] +% +% STK_LABELS is a shortcut for stk_xlabel + stk_ylabel. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_labels = stk_labels (varargin) + +% Extract axis handle (if it is present) +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +if n_argin < 2, + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +xlab = varargin{1}; +ylab = varargin{2}; +options = varargin(3:end); + +h_labels = zeros (2, 1); +h_labels(1) = stk_xlabel (h_axes, xlab, options{:}); +h_labels(2) = stk_ylabel (h_axes, ylab, options{:}); + +end % function diff --git a/inst/misc/plot/stk_legend.m b/inst/misc/plot/stk_legend.m new file mode 100644 index 0000000..7f6fb65 --- /dev/null +++ b/inst/misc/plot/stk_legend.m @@ -0,0 +1,64 @@ +% STK_LEGEND create a legend automatically +% +% CALL: stk_legend () +% +% creates a legend automatically, using only the graphical objcts for which a +% non-empty DisplayName has been provided. +% +% CALL: h = stk_legend () +% +% also return a handle to the legend (which is either a numerical handle or a +% Legend object, depending on the version of Matlab/Octave that you are +% using). +% +% NOTE: +% +% Creating and displaying a legend is painfully slow in some versions of M/O. +% You should *really* avoid doing that inside a loop if you want a reasonably +% fast update of the display. +% +% See also: stk_plot1d + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_legend = stk_legend () + +h_list = get (gca (), 'Children'); +s_list = cell (size (h_list)); + +for i = 1:(length (h_list)) + s_list{i} = get (h_list(i), 'DisplayName'); +end + +b = ~ (strcmp (s_list, '')); +h_list = h_list(b); +s_list = s_list(b); + +h_legend = legend (h_list, s_list); +set (h_legend, 'Color', 0.98 * [1 1 1]); + +end % function diff --git a/inst/misc/plot/stk_plot_getaxesarg.m b/inst/misc/plot/stk_plot_getaxesarg.m new file mode 100644 index 0000000..9b8e473 --- /dev/null +++ b/inst/misc/plot/stk_plot_getaxesarg.m @@ -0,0 +1,60 @@ +% STK_PLOT_GETAXISARG [STK internal] + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [h_axes, argin, n_argin] = stk_plot_getaxesarg (varargin) + +if isempty (varargin) + + h_axes = []; + argin = {}; + n_argin = 0; + +else + + % Check if the first argument is a handle to existing axes + arg1_is_a_handle = false; + try %#ok + arg1_is_a_handle = (isscalar (varargin{1})) ... + && (strcmp (get (varargin{1}, 'type'), 'axes')); + end + + % Separate axis handle from the rest of the arguments + if arg1_is_a_handle + h_axes = varargin{1}; + argin = varargin(2:end); + else + h_axes = gca (); + argin = varargin; + end + + n_argin = length (argin); + +end + +end % function diff --git a/inst/misc/plot/stk_plot_shadedci.m b/inst/misc/plot/stk_plot_shadedci.m new file mode 100644 index 0000000..42f73c3 --- /dev/null +++ b/inst/misc/plot/stk_plot_shadedci.m @@ -0,0 +1,111 @@ +% STK_PLOT_SHADEDCI [STK internal] +% +% STK_PLOT_SHADEDCI represents pointwise confidence itervals using a shaded +% area. + +% Copyright Notice +% +% Copyright (C) 2015-2019 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = stk_plot_shadedci (varargin) + +[h_axes, x, z, opts] = parse_args_ (varargin{:}); + +x = double (x); + +% Avoid a dependency on the stat toolbox in Matlab: +% norminv (1 - 0.05/2) = 1.959964 +% norminv (1 - 0.01/2) = 2.575829 +% norminv (1 - 0.001/2) = 3.290527 +delta0 = [3.290527 2.575829 1.959964]; +gray_level = [0.95 0.85 0.75]; + +% Use fill or area ? +persistent use_fill +if isempty (use_fill) + v = regexp (version (), '^[0-9]*\.', 'match'); + + if exist ('OCTAVE_VERSION', 'builtin') + % In Octave 3.x, prefer area. There are several problems with fill + use_fill = (str2double (v{1}) >= 4); + else + % Problem: fill does not support the h_axes argument in Matlab < R2016a + use_fill = (str2double (v{1}) >= 9); % 9.0 is R2016a + end +end + +for k = 1:3 + + delta = delta0(k) * sqrt (abs (z.var)); + patch_color = gray_level(k) * [1 1 1]; + + if use_fill + xx = [x; flipud(x)]; + zz = [z.mean - delta; flipud(z.mean + delta)]; + h_plot = fill (h_axes, xx, zz, patch_color, 'EdgeColor', patch_color); + else + h_plot = area (h_axes, x, [z.mean - delta, 2 * delta]); + % Remove the first area object (between 0 and z.mean - delta) + delete (h_plot(1)); h_plot = h_plot(2); + set (h_plot, 'FaceColor', patch_color, 'LineStyle', '-', ... + 'LineWidth', 1, 'EdgeColor', patch_color); + end + hold on; + + % The options in 'opts', if any, are applied to all patch objects + if ~ isempty (opts) + set (h_plot, opts{:}); + end + + if k == 3 + set (h_plot, 'DisplayName', sprintf ('95%%/99%%/99.9%% CIs')); + end +end + +hold off; + +% Raise current axis to the top layer, to prevent it +% from being hidden by the grayed area +set (gca, 'Layer', 'top'); + +end % function + + +function [h_axes, x, z, opts] = parse_args_ (varargin) + +% Extract axis handle (if it is present) +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +if n_argin < 2 + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +x = varargin{1}; +z = varargin{2}; +opts = varargin(3:end); + +end % function diff --git a/inst/misc/plot/stk_subplot.m b/inst/misc/plot/stk_subplot.m new file mode 100644 index 0000000..bde3de3 --- /dev/null +++ b/inst/misc/plot/stk_subplot.m @@ -0,0 +1,50 @@ +% STK_SUBPLOT [STK internal] +% +% STK_SUBPLOT is a replacement for 'subplot' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_axes = stk_subplot (m, n, p, varargin) + +% Get global STK options +stk_options = stk_options_get ('stk_axes', 'properties'); + +% Create axes +h_axes = subplot (m, n, p); + +% Apply STK options first +if ~ isempty (stk_options) + set (h_axes, stk_options{:}); +end + +% Apply user-provided options +if ~ isempty (varargin) + set (h_axes, varargin{:}); +end + +end % function diff --git a/inst/misc/plot/stk_title.m b/inst/misc/plot/stk_title.m new file mode 100644 index 0000000..93fab4d --- /dev/null +++ b/inst/misc/plot/stk_title.m @@ -0,0 +1,53 @@ +% STK_TITLE [STK internal] +% +% STK_TITLE is a replacement for 'title' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h = stk_title (varargin) + +if ischar (varargin{1}) + args = varargin(1); % title + user_options = varargin(2:end); +else + args = varargin(1:2); % axes handle + title + user_options = varargin(3:end); +end + +% Get global STK options +stk_options = stk_options_get ('stk_title', 'properties'); + +% Display title with STK options +h = title (args{:}, stk_options{:}); + +% Apply user-provided options +if ~ isempty (user_options) + set (h, user_options{:}); +end + +end % function diff --git a/inst/misc/plot/stk_xlabel.m b/inst/misc/plot/stk_xlabel.m new file mode 100644 index 0000000..fb9eb48 --- /dev/null +++ b/inst/misc/plot/stk_xlabel.m @@ -0,0 +1,49 @@ +% STK_XLABEL [STK internal] +% +% STK_XLABEL is a replacement for 'xlabel' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_label = stk_xlabel (varargin) + +[h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); +xlab = varargin{1}; + +% Get global STK options +stk_options = stk_options_get ('stk_xlabel', 'properties'); +user_options = varargin(2:end); + +% Set x-label and apply STK options +h_label = xlabel (h_axes, xlab, stk_options{:}); + +% Apply user-provided options +if ~ isempty (user_options) + set (h_label, user_options{:}); +end + +end % function diff --git a/inst/misc/plot/stk_ylabel.m b/inst/misc/plot/stk_ylabel.m new file mode 100644 index 0000000..18d8bcf --- /dev/null +++ b/inst/misc/plot/stk_ylabel.m @@ -0,0 +1,49 @@ +% STK_YLABEL [STK internal] +% +% STK_YLABEL is a replacement for 'ylabel' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_label = stk_ylabel (varargin) + +[h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); +ylab = varargin{1}; + +% Get global STK options +stk_options = stk_options_get ('stk_ylabel', 'properties'); +user_options = varargin(2:end); + +% Set y-label and apply STK options +h_label = ylabel (h_axes, ylab, stk_options{:}); + +% Apply user-provided options +if ~ isempty (user_options) + set (h_label, user_options{:}); +end + +end % function diff --git a/inst/misc/plot/stk_zlabel.m b/inst/misc/plot/stk_zlabel.m new file mode 100644 index 0000000..1b9359a --- /dev/null +++ b/inst/misc/plot/stk_zlabel.m @@ -0,0 +1,49 @@ +% STK_ZLABEL [STK internal] +% +% STK_ZLABEL is a replacement for 'zlabel' for use in STK's examples. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_label = stk_zlabel (varargin) + +[h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); +zlab = varargin{1}; + +% Get global STK options +stk_options = stk_options_get ('stk_zlabel', 'properties'); +user_options = varargin(2:end); + +% Set z-label and apply STK options +h_label = zlabel (h_axes, zlab, stk_options{:}); + +% Apply user-provided options +if ~ isempty (user_options) + set (h_label, user_options{:}); +end + +end % function diff --git a/inst/misc/test/stk_is_lhs.m b/inst/misc/test/stk_is_lhs.m new file mode 100644 index 0000000..75f42ef --- /dev/null +++ b/inst/misc/test/stk_is_lhs.m @@ -0,0 +1,96 @@ +% STK_IS_LHS tests if a given set of points forms a LHS +% +% CALL: OK = stk_is_lhs (X, N, DIM, BOX) +% +% tests if X is a Latin Hypercube Sample (LHS) of size N, over the hyper- +% rectangle BOX of dimension DIM. The result OK is true if X is a LHS and +% false otherwise. +% +% CALL: OK = stk_is_lhs (X, N, DIM) +% +% tests if X is a Latin Hypercube Sample (LHS) of size N, over the hyper- +% rectangle [0; 1]^DIM. +% +% CALL: OK = stk_is_lhs (X) +% +% tests if X is a Latin Hypercube Sample (LHS). Both the size N and the +% number DIM of factors are inferred from X. +% +% All three calling syntaxes accept both matrix-type inputs or data structures +% (with an 'a' field) for X. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_is_lhs (x, n, dim, box) + +x = double (x); + +if nargin == 1, + [n dim] = size (x); +elseif nargin == 2, + if size (x, 1) ~= n, + b = false; return; + end + dim = size (x, 2); +else % nargin > 2 + if ~ isequal (size (x), [n dim]) + b = false; return; + end +end + +% read argument 'box' +if (nargin < 4) || (isempty (box)) + xmin = zeros (1, dim); + xmax = ones (1, dim); +else + if ~ isa (box, 'stk_hrect') + box = stk_hrect (box); + end + xmin = box.lower_bounds; + xmax = box.upper_bounds; +end + +for j = 1:dim, + + y = x(:,j); + + if (xmin(j) > min(y)) || (xmax(j) < max(y)) + b = false; return; + end + + y = (y - xmin(j)) / (xmax(j) - xmin(j)); + y = ceil (y * n); + if ~ isequal (sort (y), (1:n)'), + b = false; return; + end + +end + +b = true; + +end % function diff --git a/inst/misc/test/stk_isequal_tolabs.m b/inst/misc/test/stk_isequal_tolabs.m new file mode 100644 index 0000000..76ff6c3 --- /dev/null +++ b/inst/misc/test/stk_isequal_tolabs.m @@ -0,0 +1,129 @@ +% STK_ISEQUAL_TOLABS tests approximate equality of two matrices or structures. +% +% CALL: BOOL = stk_isequal_tolabs(A, B, TOLABS) +% +% returns true if A and B are numeric arrays of the same size, such that for +% any pair (a, b) of corresponding entries, +% +% abs(b - a) <= TOLABS. (1) +% +% For numeric array, the function returns false is either +% +% * the array don't have identical sizes, or +% * the array have identical sizes but (1) doesn't hold. +% +% If A and B are structures with the same list of fieldnames, the function +% works recursively on the fields, and returns true iff all the fields are +% approximately equal. +% +% CALL: b = stk_isequal_tolabs(a, b) +% +% uses the default value 1e-8 for TOLABS. +% +% See also isequal. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function res = stk_isequal_tolabs(a, b, tolabs) + +DEFAULT_TOLABS = 1e-8; + +if nargin == 2, + tolabs = DEFAULT_TOLABS; +end + +if isstruct(a) && isstruct(b), + + L = fieldnames(a); + if ~isequal(fieldnames(b), L), + res = false; + return; + end + res = true; + for k = 1:length(L), + if ~isfield(b, L{k}), + res = false; + return; + end + res = stk_isequal_tolabs(a.(L{k}), b.(L{k}), tolabs); + if ~ res, + return; + end + end + +elseif isnumeric(a) && isnumeric(b) + + res = all(abs(b(:) - a(:)) <= tolabs); + +elseif ischar (a) && ischar (b) + + res = strcmp (a, b); + +elseif iscell (a) && iscell (b) + + for i = 1:numel(a), + if ~stk_isequal_tolabs (a{i}, b{i}, tolabs); + res = false; + return; + end + end + + res = true; + +elseif (isa (a, 'stk_dataframe') || isa (a, 'stk_kreq_qr')) ... + && (strcmp (class (a), class (b))) + + res = stk_isequal_tolabs (struct (a), struct (b), tolabs); + +else + + res = false; + +end + +end % function + + +%!shared r1, r2, a, b, tolabs +%! a = 1.01; b = 1.02; tolabs = 0.1; + +%!error rr = stk_isequal_tolabs(); +%!error rr = stk_isequal_tolabs(a); +%!test r1 = stk_isequal_tolabs(a, b); +%!test r2 = stk_isequal_tolabs(a, b, tolabs); + +%!test assert(~r1); +%!test assert(r2); + +%!test +%! a = struct('u', []); b = struct('v', []); +%! assert(~ stk_isequal_tolabs(a, b)) +%!test +%! a = struct('u', 1.01); b = struct('u', 1.02); +%! assert(stk_isequal_tolabs(a, b, tolabs)) diff --git a/inst/misc/test/stk_isequal_tolrel.m b/inst/misc/test/stk_isequal_tolrel.m new file mode 100644 index 0000000..37c5296 --- /dev/null +++ b/inst/misc/test/stk_isequal_tolrel.m @@ -0,0 +1,139 @@ +% STK_ISEQUAL_TOLREL tests approximate equality of two matrices or structures. +% +% CALL: BOOL = stk_isequal_tolrel(A, B, TOLREL) +% +% returns true if A and B are numeric arrays of the same size, such that for +% any pair (a, b) of corresponding entries, +% +% abs(b - a) <= TOLABS, (1) +% +% where +% +% TOLABS = max(abs(A(:)), abs(B(:))) * TOLREL. +% +% For numeric array, the function returns false is either +% +% * the array don't have identical sizes, or +% * the array have identical sizes but (1) doesn't hold. +% +% If A and B are structures with the same list of fieldnames, the function +% works recursively on the fields, and returns true iff all the fields are +% approximately equal. +% +% CALL: b = stk_isequal_tolrel(a, b) +% +% uses the default value 1e-8 for TOLREL. +% +% See also isequal. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function res = stk_isequal_tolrel(a, b, tolrel) + +DEFAULT_TOLREL = 1e-8; + +if nargin == 2, + tolrel = DEFAULT_TOLREL; +end + +if isstruct(a) && isstruct(b), + + L = fieldnames(a); + if ~isequal(fieldnames(b), L), + res = false; + return; + end + res = true; + for k = 1:length(L), + if ~isfield(b, L{k}), + res = false; + return; + end + res = stk_isequal_tolrel(a.(L{k}), b.(L{k}), tolrel); + if ~ res, return; end + end + +elseif isnumeric(a) && isnumeric(b) + + if ~ isequal (size (a), size (b)) + res = false; + else + aa = a(:); + bb = b(:); + tolabs = max(abs(aa), abs(bb)) * tolrel; + res = all(abs(bb - aa) <= tolabs); + end + +elseif ischar (a) && ischar (b) + + res = strcmp (a, b); + +elseif iscell (a) && iscell (b) + + for i = 1:numel(a), + if ~ stk_isequal_tolrel (a{i}, b{i}, tolrel); + res = false; + return; + end + end + + res = true; + +elseif isa (a, 'stk_dataframe') && (strcmp (class (a), class (b))) + + res = stk_isequal_tolrel (struct (a), struct (b), tolrel); + +else + + res = false; + +end + +end % function + + +%!shared r1, r2, r3, a, b, tolrel +%! a = 1.01; b = 1.02; tolrel = 0.1; + +%!error rr = stk_isequal_tolrel(); +%!error rr = stk_isequal_tolrel(a); +%!test r1 = stk_isequal_tolrel(a, b); +%!test r2 = stk_isequal_tolrel(a, b, tolrel); +%!test r3 = stk_isequal_tolrel(a, [b b]); + +%!test assert (isequal (r1, false)); +%!test assert (isequal (r2, true)); +%!test assert (isequal (r3, false)); + +%!test +%! a = struct('u', []); b = struct('v', []); +%! assert(~ stk_isequal_tolrel(a, b)) +%!test +%! a = struct('u', 1.01); b = struct('u', 1.02); +%! assert(stk_isequal_tolrel(a, b, tolrel)) diff --git a/inst/misc/test/stk_runtests.m b/inst/misc/test/stk_runtests.m new file mode 100644 index 0000000..728ff43 --- /dev/null +++ b/inst/misc/test/stk_runtests.m @@ -0,0 +1,319 @@ +% STK_RUNTESTS runs all tests in a given directory (or in STK's searchpath). + +% Copyright Notice +% +% Copyright (C) 2015, 2017-2019 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect +% +% This file has been adapted from runtests.m in Octave 3.6.2 (which is +% distributed under the GNU General Public Licence version 3 (GPLv3)). +% The original copyright notice was as follows: +% +% Copyright (C) 2010-2012 John W. Eaton + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function test_results = stk_runtests (dirs) + +if nargin == 0 + + % Scan all STK directories if no input argument is provided + dirs = stk_init ('genpath'); + +else % The input argument is expected to be either a directory name... + + if ischar (dirs) + dirs = {dirs}; + elseif ~ iscell (dirs) % ...or a cell array of directory names. + stk_error (['A directory name, or a cell array of ' ... + 'directory names, was expected'], 'TypeMismatch'); + end + +end % if + +% Use the replacement that is provided with STK +res = stk_runtests_ (dirs); + +if nargout > 0 + test_results = res; +end + +end % function + + +function res = stk_runtests_ (dirs) + +t0 = tic (); + +% Current directory +here = pwd (); + +% Prepare output struct +res = struct ( ... + 'n_total', 0, ... + 'n_pass', 0, ... + 'n_xfail', 0, ... + 'n_files', 0, ... + 'n_notest', 0, ... + 'n_dirs', 0, ... + 'err', {{}} ); + +% Run tests all available tests in each directory +for i = 1:(numel (dirs)) + + if ~ exist (dirs{i}, 'dir') + stk_error (sprintf ('Directory not found: %s', dirs{i}), 'InvalidArgument'); + end + + % Get absolute path + cd (dirs{i}); dirname = pwd (); cd (here); + + [np, nt, nx, nn, nf, nd, res.err] = ... + run_all_tests (dirname, dirname, res.err); + + res.n_total = res.n_total + nt; + res.n_pass = res.n_pass + np; + res.n_xfail = res.n_xfail + nx; + res.n_files = res.n_files + nf; + res.n_notest = res.n_notest + nn; + res.n_dirs = res.n_dirs + nd; + +end + +res.runtime = toc (t0); + +if res.n_dirs > 1 + fprintf ('*** Summary for all %d directories:\n', res.n_dirs); + fprintf ('*** --> passed %d/%d tests', res.n_pass, res.n_total); + fprintf (' [%d expected failures]\n', res.n_xfail); + fprintf ('*** --> %d/%d files had no tests\n', res.n_notest, res.n_files); + fprintf ('*** --> RUNTIME: %.2f seconds\n\n', res.runtime); +end + +if ~ isempty (res.err) + fprintf ('!!! Summary of failed tests:\n'); + for i = 1:(size (res.err, 1)) + fprintf ('!!! %s [%d/%d]\n', res.err{i,1}, ... + res.err{i,2} - res.err{i,3}, res.err{i,2}); + end +end + +end % function + + +%%%%%%%%%%%%%%%%% +% run_all_tests % +%%%%%%%%%%%%%%%%% + +function [n_pass, n_total, n_xfail, n_notest, n_files, n_dirs, err] ... + = run_all_tests (testdir, basedir, err) + +% list directory content +dirinfo = dir(testdir); +flist = {dirinfo.name}; + +here = pwd (); cd (basedir); + +fprintf ('Processing files in %s:\n\n', testdir); +fflush (stdout); + +% init counters +n_total = 0; +n_pass = 0; +n_xfail = 0; +n_files = 0; +n_notest = 0; +n_dirs = 1; + +% list of subdirectories to be processed +subdirs_class = {}; +subdirs_private = {}; + +t0 = tic (); + +for i = 1:numel (flist) + f = flist{i}; + ff = fullfile(testdir, f); + if (length (f) > 2) && strcmp (f((end-1):end), '.m') + n_files = n_files + 1; + print_test_file_name (f); + if has_tests (ff) + % Silence all warnings & prepare for warning detection. + s = warning_off (); + try + % Do the actual tests. + [p, n, nx] = stk_test (ff, 'quiet', stdout); + % Note: the presence of the third argument (fid=stdout) forces + % stk_test in batch mode, which means that it doesn't stop at + % the first failed test. + print_pass_fail (n, p); + n_total = n_total + n; + n_pass = n_pass + p; + n_xfail = n_xfail + nx; + % Record function name if at least one test failed + if p < n + err = [err; {ff, n, p}]; + end + % Deal with warnings + if ~ isempty (lastwarn ()) + fprintf (' (warnings)'); + end + % Indicate if there were expected failures + if nx > 0 + fprintf (' [%d expected failures]', nx); + end + warning (s); + catch + % Restore warning state after error + warning (s); + rethrow (lasterror ()); + end + else + n_notest = n_notest + 1; + fprintf (' NO TESTS'); + end + fprintf ('\n'); + fflush (stdout); + elseif dirinfo(i).isdir && (f(1) == '@') + subdirs_class{end+1} = ff; + elseif dirinfo(i).isdir && strcmp(f, 'private') + subdirs_private{end+1} = ff; + end +end + +runtime = toc (t0); + +fprintf ([' --> passed %d/%d tests ' ... + '[%d expected failures]\n'], n_pass, n_total, n_xfail); +fprintf (' --> %d/%d files had no tests\n', n_notest, n_files); +fprintf (' --> RUNTIME: %.2f seconds\n\n', runtime); + +for i = 1:(length (subdirs_class)) + + [p, n, nx, nnt, nf, nd, err] = run_all_tests ... + (subdirs_class{i}, pwd(), err); + + n_total = n_total + n; + n_pass = n_pass + p; + n_xfail = n_xfail + nx; + n_files = n_files + nf; + n_notest = n_notest + nnt; + n_dirs = n_dirs + nd; +end + +for i = 1:(length (subdirs_private)) + + [p, n, nx, nnt, nf, nd, err] = run_all_tests ... + (subdirs_private{i}, subdirs_private{i}, err); + + n_total = n_total + n; + n_pass = n_pass + p; + n_xfail = n_xfail + nx; + n_files = n_files + nf; + n_notest = n_notest + nnt; + n_dirs = n_dirs + nd; +end + +cd (here); + +end % function + + +%%%%%%%%%%%%% +% has_tests % +%%%%%%%%%%%%% + +function retval = has_tests (f) + +fid = fopen (f); +if (fid >= 0) + str = fread (fid, '*char')'; + fclose (fid); + retval = ~ isempty (regexp ... + (str, '^%!(test|assert|error|warning)', 'lineanchors')); +else + error ('runtests: fopen failed: %s', f); +end + +end % function + + +%%%%%%%%%%%%%%%%%%% +% print_pass_fail % +%%%%%%%%%%%%%%%%%%% + +function print_pass_fail (n, p) + +if (n > 0) + fprintf (' PASS %2d/%-2d', p, n); + nfail = n - p; + if (nfail > 0) + fprintf (' FAIL %d', nfail); + end +end + +end % function + + +%%%%%%%%%%%%%%%%%%%%%%%% +% print_test_file_name % +%%%%%%%%%%%%%%%%%%%%%%%% + +function print_test_file_name (nm) + +filler = repmat ('.', 1, 50 - length(nm)); +fprintf (' %s %s', nm, filler); + +end % function + + +%%%%%%%%%%%%%%% +% warning_off % +%%%%%%%%%%%%%%% + +function s = warning_off () + +s = warning ('off', 'all'); + +% Check whether warnings can be still be recovered by lastwarn +% (see https://savannah.gnu.org/bugs/?41028) + +lastwarn (''); +warning ('ah:ah', 'toto'); +[msg, id] = lastwarn (); + +if ~ (strcmp (id, 'ah:ah') && strcmp (msg, 'toto')) + warning ('on', 'all'); + for i = 1:(length (s)) + if ~ isempty (regexp (s(i).identifier, '^Octave:', 'once')) + warning (s(i).state, s(i).identifier); + end + end +end + +lastwarn (''); + +end % function + + +%#ok<*AGROW> diff --git a/inst/misc/test/stk_test.m b/inst/misc/test/stk_test.m new file mode 100644 index 0000000..f6375db --- /dev/null +++ b/inst/misc/test/stk_test.m @@ -0,0 +1,704 @@ +% STK_TEST performs tests for a given M-file. +% +% FIXME (ticket #86): Convert help text below to plain text +% +% -*- texinfo -*- +% @deftypefn {Command} {} test @var{name} +% @deftypefnx {Command} {} test @var{name} quiet|normal|verbose +% @deftypefnx {Function File} {} test ('@var{name}', 'quiet|normal|verbose', @var{fid}) +% @deftypefnx {Function File} {} test ([], 'explain', @var{fid}) +% @deftypefnx {Function File} {@var{success} =} test (@dots{}) +% @deftypefnx {Function File} {[@var{n}, @var{max}] =} test (@dots{}) +% @deftypefnx {Function File} {[@var{code}, @var{idx}] =} test ('@var{name}', 'grabdemo') +% +% Perform tests from the first file in the loadpath matching @var{name}. +% @code{test} can be called as a command or as a function. Called with +% a single argument @var{name}, the tests are run interactively and stop +% after the first error is encountered. +% +% With a second argument the tests which are performed and the amount of +% output is selected. +% +% @table @asis +% @item 'quiet' +% Don't report all the tests as they happen, just the errors. +% +% @item 'normal' +% Report all tests as they happen, but don't do tests which require +% user interaction. +% +% @item 'verbose' +% Do tests which require user interaction. +% @end table +% +% The argument @var{fid} can be used to allow batch processing. Errors +% can be written to the already open file defined by @var{fid}, and +% hopefully when Octave crashes this file will tell you what was happening +% when it did. You can use @code{stdout} if you want to see the results as +% they happen. You can also give a file name rather than an @var{fid}, in +% which case the contents of the file will be replaced with the log from +% the current test. +% +% Called with a single output argument @var{success}, @code{test} returns +% true if all of the tests were successful. Called with two output arguments +% @var{n} and @var{max}, the number of successful tests and the total number +% of tests in the file @var{name} are returned. +% +% If the second argument is 'explain', then @var{name} is ignored and an +% explanation of the line markers used is written to the file @var{fid}. +% @seealso{assert, error, example} +% @end deftypefn + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012, 2013 SUPELEC +% +% Author: Julien Bect +% +% This file has been adapted from test.m in Octave 3.6.2, distributed +% under the GNU General Public Licence version 3 (GPLv3). The original +% copyright notice was as follows: +% +% Copyright (C) 2005-2012 Paul Kienzle + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = stk_test (varargin) + +varargout = cell (1, nargout); + +if exist ('OCTAVE_VERSION', 'builtin') == 5 + + % Use the original test function shipped with Octave + [varargout{:}] = test (varargin{:}); + +else % Matlab + + % Use the one that is provided with STK + [varargout{:}] = stk_test_ (varargin{:}); + +end % if + +end % function + + +function [x__ret1, x__ret2, x__ret3] = stk_test_ (x__name, x__flag, x__fid) + +SIGNAL_FAIL = '!!!!! '; % prefix: test had an unexpected result +SIGNAL_EMPTY = '????? '; % prefix: no tests in file +SIGNAL_BLOCK = '***** '; % prefix: code for the test +SIGNAL_FILE = '>>>>> '; % prefix: new test file + +nb_expected_failures = 0; % counter for expected failures ('xtest' blocks) + +% default value for input arg #2: 'quiet' +if nargin < 2 || isempty(x__flag), x__flag = 'quiet'; end + +% default value for input arg #3: [] (interactive mode, output --> stdout) +if nargin < 3, x__fid = []; end + +if (nargin < 1) || (nargin > 3), + error('Incorrect number of input arguments.'); +end + +% first argument must be a non-empty string +if isempty(x__name) || ~ischar(x__name), + error('The first argument of stk_test() must be a non-empty string'); +end + +% second argument must be a non-empty string +if ~isempty(x__flag) && ~ischar(x__flag), + error('The first argument of stk_test() must be either empty or a string'); +end + +x__batch = (~ isempty (x__fid)); + +% Decide if error messages should be collected. +x__close_fid = 0; +if (x__batch) + if (ischar (x__fid)) + x__fid = fopen (x__fid, 'wt'); + if (x__fid < 0) + error ('test: could not open log file'); + end + x__close_fid = 1; + end + %fprintf (x__fid, '%sprocessing %s\n', SIGNAL_FILE, x__name); + %fflush (x__fid); +else + x__fid = stdout; +end + +switch x__flag, + case 'normal', + x__verbose = x__batch; + case 'quiet', + x__verbose = 0; + case 'verbose', + x__verbose = 1; + otherwise, + error('test: unknown flag ''%s''', x__flag); +end + +% Locate the file to test. +x__file = file_in_loadpath (x__name, 'all'); +if (isempty (x__file)) + x__file = file_in_loadpath ([x__name, '.m'], 'all'); +end +if (isempty (x__file)) + x__file = file_in_loadpath ([x__name, '.cc'], 'all'); +end + +if (iscell (x__file)) + % If repeats, return first in path. + if (isempty (x__file)) + x__file = ''; + else + x__file = x__file{1}; + end +end +if (isempty (x__file)) + if (exist (x__name) == 3) + fprintf (x__fid, '%s%s source code with tests for dynamically linked function not found\n', SIGNAL_EMPTY, x__name); + else + fprintf (x__fid, '%s%s does not exist in path\n', SIGNAL_EMPTY, x__name); + end + fflush (x__fid); + if (nargout > 0) + x__ret1 = 0; x__ret2 = 0; + end + if (x__close_fid) + fclose(x__fid); + end + return; +end + +% Grab the test code from the file. +x__body = x__extract_test_code (x__file); + +if (isempty (x__body)) + fprintf (x__fid, '%s%s has no tests available\n', SIGNAL_EMPTY, x__file); + fflush (x__fid); + if (nargout > 0) + x__ret1 = 0; x__ret2 = 0; + end + if (x__close_fid) + fclose(x__fid); + end + return; +else + % Add a dummy comment block to the end for ease of indexing. + if (x__body (length(x__body)) == sprintf('\n')) + x__body = sprintf ('\n%s%%', x__body); + else + x__body = sprintf ('\n%s\n%%', x__body); + end +end + +% Chop it up into blocks for evaluation. +x__lineidx = find (x__body == sprintf('\n')); +x__blockidx = x__lineidx(find (~ isspace (x__body(x__lineidx+1))))+1; + +% Ready to start tests ... if in batch mode, tell us what is happening. +if (x__verbose) + disp ([SIGNAL_FILE, x__file]); +end + +% Assume all tests will pass. +x__all_success = 1; + +% Process each block separately, initially with no shared variables. +x__tests = 0; x__successes = 0; +x__shared_names = {}; +x__shared_vals = {}; +for x__i = 1:length(x__blockidx)-1 + + % Extract the block. + x__block = x__body(x__blockidx(x__i):x__blockidx(x__i+1)-2); + + % Let the user/logfile know what is happening. + if (x__verbose) + fprintf (x__fid, '%s%s\n', SIGNAL_BLOCK, x__block); + fflush (x__fid); + end + + % Split x__block into x__type and x__code. + x__idx = find (~ isletter (x__block)); + if (isempty (x__idx)) + x__type = x__block; + x__code = ''; + else + x__type = x__block(1:x__idx(1)-1); + x__code = x__block(x__idx(1):length(x__block)); + end + + % Assume the block will succeed. + x__success = 1; + x__msg = []; + + %%% SHARED + + if (strcmp (x__type, 'shared')) + x__istest = 0; + + % Separate initialization code from variables. + x__idx = find (x__code == sprintf('\n')); + if (isempty (x__idx)) + x__vars = x__code; + x__code = ''; + else + x__vars = x__code (1:x__idx(1)-1); + x__code = x__code (x__idx(1):length(x__code)); + end + + % Strip comments off the variables. + x__idx = find(x__vars == '%'); + if (~ isempty (x__idx)) + x__vars = x__vars(1:x__idx(1)-1); + end + + % Assign default values to variables. + try + x__vars = deblank (x__vars); + if (~ isempty (x__vars)) + x__shared_names = {}; + while ~isempty(x__vars) + [x__shared_names{end+1}, x__vars] = strtok(x__vars, ', '); %#ok + end + x__shared_vals = repmat({[]}, 1, length(x__shared_names)); + else + x__shared_names = {}; + x__shared_vals = {}; + end + catch + % Couldn't declare, so don't initialize. + x__code = ''; + x__success = 0; + x__msg = sprintf ('%sshared variable initialization failed\n', ... + SIGNAL_FAIL); + end + + % Initialization code will be evaluated below. + + elseif (strcmp (x__type, 'end')) + % end simply declares the end of a previous function block. + % There is no processing to be done here, just skip to next block. + x__istest = 0; + x__code = ''; + + %%% ASSERT + + elseif strcmp(x__type, 'assert') + x__istest = 1; + % Put the keyword back on the code. + x__code = x__block; + % The code will be evaluated below as a test block. + + %%% ERROR/WARNING + + elseif (strcmp (x__type, 'error') || strcmp(x__type, 'warning')) + x__istest = 1; + x__warning = strcmp (x__type, 'warning'); + [x__pattern, x__id, x__code] = getpattern (x__code); + if (x__id) + x__patstr = ['id=',x__id]; + else + x__patstr = ['<',x__pattern,'>']; + end + + % FIXME: in the Octave version, syntax errors are counted as + % failure, even for an 'error' block. This won't be the case here. + + if (x__success) + x__success = 0; + %x__warnstate = warning ('query', 'quiet'); + %warning ('on', 'quiet'); + try + % This code is supposed to fail, so we don't save the output + % into x__shared_vals. + eval_test_code(x__code, x__shared_names, x__shared_vals{:}); + if (~ x__warning) + x__msg = sprintf ('%sexpected %s but got no error\n', ... + SIGNAL_FAIL, x__patstr); + else + if (~ isempty (x__id)) + [ignore_arg, x__err] = lastwarn; + x__mismatch =~strcmp (x__err, x__id); + else + x__err = trimerr (lastwarn, 'warning'); + x__mismatch = isempty (regexp (x__err, x__pattern, 'once')); + end + %warning (x__warnstate.state, 'quiet'); + if (isempty (x__err)) + x__msg = sprintf ('%sexpected %s but got no warning\n', ... + SIGNAL_FAIL, x__patstr); + elseif (x__mismatch) + x__msg = sprintf ('%sexpected %s but got %s\n', ... + SIGNAL_FAIL, x__patstr, x__err); + else + x__success = 1; + end + end + + catch + if (~ isempty (x__id)) + [ignore_arg, x__err] = lasterr(); + x__mismatch =~strcmp (x__err, x__id); + else + x__err = trimerr (lasterr(), 'error'); + x__mismatch = isempty (regexp (x__err, x__pattern, 'once')); + end + %warning (x__warnstate.state, 'quiet'); + if (x__warning) + x__msg = sprintf ('%sexpected warning %s but got error %s\n', ... + SIGNAL_FAIL, x__patstr, x__err); + elseif (x__mismatch) + x__msg = sprintf ('%sexpected %s but got %s\n', ... + SIGNAL_FAIL, x__patstr, x__err); + else + x__success = 1; + end + end + clear x__testx__; + end + % Code already processed. + x__code = ''; + + %%% TEST + + elseif (strcmp (x__type, 'test') || strcmp (x__type, 'xtest')) + x__istest = 1; + % Code will be evaluated below. + + %%% Comment block. + + elseif ((x__block(1) == '%') || (x__block(1) == '#')) + x__istest = 0; + x__code = ''; % skip the code + + %%% Unknown block. + + else + x__istest = 1; + x__success = 0; + x__msg = sprintf ('%sunknown test type!\n', SIGNAL_FAIL); + x__code = ''; % skip the code + end + + % evaluate code for test, shared, and assert. + if (~ isempty(x__code)) + try + % FIXME: need to check for embedded test functions, which cause + % segfaults, until issues with subfunctions in functions are resolved. + embed_func = regexp (x__code, '^\s*function ', 'once', 'lineanchors'); + if (isempty (embed_func)) + [x__shared_vals{:}] = eval_test_code(x__code, ... + x__shared_names, x__shared_vals{:}); + else + error (['Functions embedded in %!test blocks are not allowed.\n', ... + 'Use the %!function/%!end syntax instead to define shared functions for testing.\n']); + end + catch + if (strcmp (x__type, 'xtest')) + x__msg = sprintf ('%sknown failure\n%s', SIGNAL_FAIL, lasterr ()); + nb_expected_failures = nb_expected_failures + 1; + else + x__msg = sprintf ('%stest failed\n%s', SIGNAL_FAIL, lasterr ()); + end + x__success = 0; + if (isempty (lasterr ())) + error ('empty error text, probably Ctrl-C --- aborting'); + end + end + clear x__testx__; + end + + % All done. Remember if we were successful and print any messages. + if (~ isempty (x__msg)) + % Make sure the user knows what caused the error. + if (~ x__verbose) + fprintf (x__fid, '%s%s\n', SIGNAL_BLOCK, x__block); + fflush (x__fid); + end + fprintf(x__fid, '%s', x__msg); + fprintf(x__fid, '%s', sprintf('\n')); + fflush (x__fid); + % FIXME: Dump the shared variables to x__fid... Octave uses fdisp() + % to do that, but Matlab doesn't have this function + end + if (x__success == 0) + x__all_success = 0; + % Stop after one error if not in batch mode. + if (~ x__batch) + if (nargout > 0) + x__ret1 = 0; x__ret2 = 0; + end + if (x__close_fid) + fclose(x__fid); + end + return; + end + end + x__tests = x__tests + x__istest; + x__successes = x__successes + x__success * x__istest; +end + +if nargout == 0 + if x__tests || (nb_expected_failures > 0) + if (nb_expected_failures) + fprintf ('PASSES %d out of %d tests (%d expected failures)\n', ... + x__successes, x__tests, nb_expected_failures); + else + fprintf ('PASSES %d out of %d tests\n', x__successes, x__tests); + end + else + fprintf ('%s%s has no tests available\n', SIGNAL_EMPTY, x__file); + end +elseif (nargout == 1) + x__ret1 = x__all_success; +else + x__ret1 = x__successes; + x__ret2 = x__tests; + x__ret3 = nb_expected_failures; +end + +end % function + + +%%%%%%%%%%%%%%%%%% +% eval_test_code % +%%%%%%%%%%%%%%%%%% +% +% Evaluate a block of code in a 'controlled' environment. +% +function varargout = eval_test_code(x__code, x__list_shared, varargin) + +% Check input arguments +if length(x__list_shared) ~= length(varargin), + error('Incorrect argument sizes.'); +end + +% Protect variable names x__list_shared, x__i +for i = 1:length(x__list_shared), + if strcmp(x__list_shared{i}, 'x__list_shared'), + error('x__list_shared cannot be used as a shared variable'); + elseif strcmp(x__list_shared{i}, 'x__i'), + error('x__i cannot be used as a shared variable'); + end +end + +% Prepare shared variables +for x__i = 1:length(x__list_shared) + eval(sprintf('%s = varargin{%d};', x__list_shared{x__i}, x__i)); +end + +% Run the code +if exist ('OCTAVE_VERSION', 'builtin') == 5 % Octave + + % Run without output capture (evalc is not implemented yet in Octave) + eval (x__code); + +else % Matlab + + % Run with output capture + % (TODO: compare the output with a reference, if provided) + gobble_output = evalc (x__code); %#ok + +end + +% Save shared variables +varargout = cell(1, length(x__list_shared)); +for x__i = 1:length(x__list_shared), + if ~exist(x__list_shared{x__i}, 'var'), + varargout{x__i} = []; + else + varargout{x__i} = eval(x__list_shared{x__i}); + end +end + +end % function + + +%%%%%%%%%%%%%% +% getpattern % +%%%%%%%%%%%%%% +% +% Strip from ' code'. +% Also handles 'id=ID code' +% +function [pattern, id, rest] = getpattern (str) + +pattern = '.'; +id = []; +rest = str; +str = trimleft (str); +if (~ isempty (str) && str(1) == '<') + close = index (str, '>'); + if (close) + pattern = str(2:close-1); + rest = str(close+1:end); + end +elseif (strncmp (str, 'id=', 3)) + [id, rest] = strtok (str(4:end)); +end + +end % function + + +%%%%%%%%%%% +% trimerr % +%%%%%%%%%%% +% +% Strip '.*prefix:' from '.*prefix: msg\n' and strip trailing blanks. +% +function msg = trimerr (msg, prefix) + +idx = index (msg, [prefix, ':']); +if (idx > 0) + msg(1:idx+length(prefix)) = []; +end +msg = trimleft (deblank (msg)); + +end % function + + +%%%%%%%%%%%% +% trimleft % +%%%%%%%%%%%% +% +% Strip leading blanks from string. +% +function str = trimleft (str) + +idx = find (isspace (str)); +leading = find (idx == 1:length(idx)); +if (~ isempty (leading)) + str = str(leading(end)+1:end); +end + +end % function + + +%%%%%%%%%%%%%%%%%%%%%%%% +% x__extract_test_code % +%%%%%%%%%%%%%%%%%%%%%%%% +% +function body = x__extract_test_code (nm) + +fid = fopen (nm, 'rt'); +if fid == -1, + error(sprintf('File %s cannot be opened.', nm)); +end + +body = ''; +if (fid >= 0) + while (~ feof (fid)) + ln = fgetl (fid); + if (length (ln) >= 2 && strcmp (ln(1:2), '%!')) + body = [body, sprintf('\n')]; + if (length(ln) > 2) + body = [body, ln(3:end)]; + end + end + end + fclose (fid); +end + +end % function + + +%% Tests of 'assert' blocks + +%!assert(isempty([])) % support for test assert shorthand +%!assert((1 + 1) == 2) + +%% Tests of shared variables + +% Default: variables are not shared between blocks. +%!test a=1; +%!test assert(~exist('a')); + +% 'shared' blocks allow to declare a variable shared by several blocks +%!shared a % create a shared variable +%!test a = 3; % assign to a shared variable +%!test assert(a == 3); % variable should equal 3 in this second 'test' block + +% Each 'shared' blocks deletes previously declared shared variables +%!shared b, c % replace shared variables {'a'} --> {'b', 'c'} +%!test assert(~exist('a')); % a no longer exists +%!test assert(isempty(b)); % variables start off empty + +%!shared a % recreate a shared variable that had been deleted +%!test assert (isempty(a)); % it is empty, even though it was equal to 3 before + +%!shared a, b, c % creates three shared variables +%! a = 1; b = 2; c = 3; % give values to all variables, in the same block +%!assert(isequal([a, b, c], [1, 2, 3])); % test all of them together +%!test c=6; % update a value +%!test % show that the update sticks between blocks +%! assert(isequal([a, b, c], [1, 2, 6])); +%!shared % clear all shared variables +%!assert(~exist('a')) % show that they are cleared + +%% Tests for 'error' and 'warning' blocks + +%!error test % not enough input arguments +%!error test(1, 2, 3, 4) % too many input args +%!error garbage % usage on nonexistent function should be + +% When used without a pattern <>, 'error' block succeed on any error +%!error stt_test('test', 'bogus'); % undefined function error +%!error stk_test('test', 'bogus'); % error raised by stk_test itself + +% !test lastwarn(); % clear last warning just in case +% !warning % we expect a warning msg including "worry about" +% ! warning('Don''t worry about this warning'); + +%% Tests the behaviour of stk_test() itself + +% The number of input arguments should be between one and three +%!error stk_test(); +%!error stk_test('disp', 'verbose', [], 'extra arg !!!'); + +% The first argument of stk_test() must be a non-empty string +%!error stk_test([]) +%!error stk_test(0.0) + +% The second argument of stk_test() must be a either empty, or one of the +%%! following strings: normal, quiet, verbose +%!error stk_test('stk_mindist', 0.0) +%!error stk_test('stk_mindist', 'dudule') + +%% Failure tests +% All the following should fail. These tests should be disabled unless you +% are developing stk_test() since users don't like to be presented with +% expected failures. Use % ! to disable. + +% !xtest error('This test is known to fail') % expected failure +% !test error('---------Failure tests. Use test(''test'',''verbose'',1)'); +% !test assert(1 == 2); +% !bogus % unknown block type +% !error toeplitz([1,2,3]); % correct usage +% !shared garbage in % variables must be comma separated +% !test }{ % syntax errors fail properly +% !error 'succeeds.'; % error test fails if code succeeds +% !error error('message') % error pattern must match diff --git a/inst/misc/test/stk_test_class.m b/inst/misc/test/stk_test_class.m new file mode 100644 index 0000000..61c600a --- /dev/null +++ b/inst/misc/test/stk_test_class.m @@ -0,0 +1,110 @@ +% STK_TEST_CLASS [STK internal] +% +% INTERNAL FUNCTION WARNING: +% This function is considered as internal: API-breaking changes are +% likely to happen in future releases. Please don't rely on it. + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_test_class (classname, verbose) + +if nargin < 2 + verbose = false; +end + +test_list = { ... + 'default_constructor_doesnt_crash', ... + 'default_constructor_return_type', ... + 'isequal_argin1', ... + 'isequal_2_self', ... + 'isequal_3_self', ... + 'isequal_2_zero', ... + 'isequal_3_zero' }; + +for i = 1:(length (test_list)) + fname = ['stk_test_class__' test_list{i}]; + if verbose, fprintf ('stk_test_class #1: %s... ', fname); end + + try + feval (fname, classname); + if verbose, fprintf ('OK\n'); end + catch + if verbose, fprintf ('FAILED.\n'); end + rethrow (lasterror ()); + end +end + +end % function + + +function stk_test_class__default_constructor_doesnt_crash (classname) +x = feval (classname); +end + +function stk_test_class__default_constructor_return_type (classname) +x = feval (classname); +if ~ strcmp (class (x), classname) + error (sprintf ('Returned object is not of class %s.', classname)); +end +end + +function stk_test_class__isequal_argin1 (classname) +x = feval (classname); +try + b = isequal (x); %#ok<> + error (sprintf ('isequal (x) does not fail for class %s.', classname)); +end +end + +function stk_test_class__isequal_2_self (classname) +x = feval (classname); +assert (isequal (x, x)); +end + +function stk_test_class__isequal_3_self (classname) +x = feval (classname); +assert (isequal (x, x, x)); +end + +function stk_test_class__isequal_2_zero (classname) +x = feval (classname); +assert (~ isequal (x, 0)); +assert (~ isequal (0, x)); +end + +function stk_test_class__isequal_3_zero (classname) +x = feval (classname); +assert (~ isequal (x, x, 0)); +assert (~ isequal (x, 0, x)); +assert (~ isequal (0, x, x)); +assert (~ isequal (x, 0, 0)); +assert (~ isequal (0, x, 0)); +assert (~ isequal (0, 0, x)); +end + + +%#ok<*SPERR,*DEFNU,*TRYNC,*NASGU> diff --git a/inst/misc/test/stk_test_critgrad.m b/inst/misc/test/stk_test_critgrad.m new file mode 100644 index 0000000..cbe5408 --- /dev/null +++ b/inst/misc/test/stk_test_critgrad.m @@ -0,0 +1,171 @@ +% STK_TEST_CRITGRAD [STK internal] +% +% INTERNAL FUNCTION WARNING: +% This function is considered as internal: API-breaking changes are +% likely to happen in future releases. Please don't rely on it. + +% Copyright Notice +% +% Copyright (C) 2021 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function ok = stk_test_critgrad (criterion, model, x, z, diff, delta0) + +% Tolerances +TOL_CRIT_VAL = 1e-12; +TOL_CRIT_DERIV = 1e-5; +TOL_RSQUARED = 1e-4; + +% Number evaluation points in the parameter space +q = 4; grid_size = 2 * q + 1; + +% Current vector of model parameters +v = stk_get_optimizable_model_parameters (model); + +% Current value of the parameter of interest +p0 = v(diff); + +% Evaluation grid +p = linspace (p0 - delta0, p0 + delta0, grid_size); + +% Evaluate the criterion on the grid +crit_val = zeros (grid_size, 1); +for k = 1:grid_size + v(diff) = p(k); + m = stk_set_optimizable_model_parameters (model, v); + if k == q + 1 + [crit_val(k), crit_deriv] = criterion (m, x, z); + else + crit_val(k) = criterion (m, x, z); + end +end + +% Regressors for a quadratic model +H1 = ones (2 * q + 1, 1); +H2 = (p - p0)'; +H3 = (p - p0)' .^ 2; +H = [H1 H2 H3]; + +% Ordinary least squares +beta = H \ crit_val; + +% Root-mean-square error +mse = mean ((crit_val - H * beta) .^ 2); +rmse = sqrt (mse); + +% Coefficient of determination +rsquared = 1 - mse / (mean ((crit_val - mean (crit_val)) .^ 2)); + +% Function values +crit_val1 = crit_val(q+1); +crit_val2 = beta(1); +crit_vald = crit_val1 - crit_val2; + +% Relative error on function value +if crit_vald == 0 + crit_val_err = 0.0; +else + crit_val_err = crit_vald / (max (abs (crit_val1), abs (crit_val2))); +end + +% Relative error on the partial derivative +crit_deriv1 = crit_deriv(diff); +crit_deriv2 = beta(2); +crit_derivd = crit_deriv1 - crit_deriv2; + +% Relative error on function value +if crit_derivd == 0 + crit_deriv_err = 0.0; +else + crit_deriv_err = crit_derivd / (max (abs (crit_deriv1), abs (crit_deriv2))); +end + +ok0 = rsquared > (1 - TOL_RSQUARED); +ok1 = (abs (crit_val_err) < TOL_CRIT_VAL); +ok2 = (abs (crit_deriv_err) < TOL_CRIT_DERIV); + +if nargout == 0 % Display outputs + + pp = linspace (min (p), max (p), 50); + ff = beta(1) + beta(2) * (pp - p0) + beta(3) * (pp - p0) .^ 2; + + figure; + plot (p, crit_val, 'dk--'); hold on; + plot (p0, crit_val(q + 1), 'ro', ... + 'MarkerFaceColor', 'y', 'MarkerSize', 10); + plot (pp, ff, 'r--'); + stk_labels (sprintf ('param(%d)', diff), 'ALL'); + set (gcf, 'Name', sprintf ('Check %s gradient wrt #%d', ... + func2str (criterion), diff)); + + fprintf ('~~~ Checking gradient for parameter #%d of %s ~~~\n', ... + diff, func2str (criterion)); + if stk_disp_isloose (), fprintf ('|\n'); end + + % Function values + fprintf ('| * function value:\n'); + fprintf ('| o computed: %+.6e\n', crit_val1); + fprintf ('| o regression: %+.6e\n', crit_val2); + fprintf ('| o difference: %+.6e\n', crit_vald); + fprintf ('| o relative error: %+.6e [TOL = %.1e, %s]\n', ... + crit_val_err, TOL_CRIT_VAL, ok_str (ok1)); + if stk_disp_isloose (), fprintf ('|\n'); end + + % Partial derivative + fprintf ('| * partial derivative:\n'); + fprintf ('| o computed: %+.6e\n', crit_deriv1); + fprintf ('| o regression: %+.6e\n', crit_deriv2); + fprintf ('| o difference: %+.6e\n', crit_derivd); + fprintf ('| o relative error: %+.6e [TOL = %.1e, %s]\n', ... + crit_deriv_err, TOL_CRIT_DERIV, ok_str (ok2)); + if stk_disp_isloose (), fprintf ('|\n'); end + + % Numerical noise + fprintf ('| * error (numerical noise or deviation from quadratic model ?)\n'); + fprintf ('| o RMSE: %.5e\n', rmse); + fprintf ('| o R^2: %.5f [TOL = %.1e, %s]\n', ... + rsquared, TOL_RSQUARED, ok_str (ok0)); + + if stk_disp_isloose () + fprintf ('|\n\n'); + end + +else + + ok = ok1 & ok2; + +end + +end % function + + +function s = ok_str (b) + +if b + s = 'OK'; +else + s = 'NOT OK'; +end + +end diff --git a/inst/misc/test/stk_test_dfbinaryop.m b/inst/misc/test/stk_test_dfbinaryop.m new file mode 100644 index 0000000..bd70fe8 --- /dev/null +++ b/inst/misc/test/stk_test_dfbinaryop.m @@ -0,0 +1,67 @@ +% STK_TEST_DFBINARYOP [STK internal] +% +% INTERNAL FUNCTION WARNING: +% This function is considered as internal: API-breaking changes are +% likely to happen in future releases. Please don't rely on it. + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_test_dfbinaryop (F, a1, a2) + +try + + x1 = stk_dataframe (a1); + x2 = stk_dataframe (a2); + res = feval (F, a1, a2); + + x3 = feval (F, x1, x2); + assert (isa (x3, 'stk_dataframe') && isequal (double (x3), res)); + + x3 = feval (F, x1, a2); + assert (isa (x3, 'stk_dataframe') && isequal (double (x3), res)); + + x3 = feval (F, a1, a2); + assert (isequal (x3, res)); + +catch + + err = lasterror (); + + if strcmp (err.message, ['octave_base_value::array_value(): ' ... + 'wrong type argument `class''']) + + warning (msg.message); + + else + + rethrow (err); + + end + +end % try + +end % function diff --git a/inst/misc/text/stk_disp_examplewelcome.m b/inst/misc/text/stk_disp_examplewelcome.m new file mode 100644 index 0000000..fde7ed0 --- /dev/null +++ b/inst/misc/text/stk_disp_examplewelcome.m @@ -0,0 +1,48 @@ +% STK_DISP_EXAMPLEWELCOME + +% Copyright Notice +% +% Copyright (C) 2012, 2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_disp_examplewelcome () + +stack = dbstack (); + +if length(stack) >= 2, + demo_name = stack(2).name; + display_help = true; +else + demo_name = 'This is a demo example...'; + display_help = false; +end + +fprintf ('\n%s\n', stk_sprintf_framed (demo_name)); + +if display_help + help (demo_name); +end + +end % function diff --git a/inst/misc/text/stk_disp_getformat.m b/inst/misc/text/stk_disp_getformat.m new file mode 100644 index 0000000..39e515f --- /dev/null +++ b/inst/misc/text/stk_disp_getformat.m @@ -0,0 +1,120 @@ +% STK_DISP_GETFORMAT [STK internal] +% +% CALL: [FMT, SPC] = stk_disp_getformat () +% +% NOTE +% +% This function solves a Matlab/Octave compatibility issue. See: +% +% * https://savannah.gnu.org/bugs/?51035 +% * https://savannah.gnu.org/bugs/?49951 +% * https://savannah.gnu.org/bugs/?46034 +% * https://sourceforge.net/p/kriging/tickets/73 + +% Copyright Notice +% +% Copyright (C) 2017, 2021 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [fmt, spc] = stk_disp_getformat () + +persistent method +if isempty (method) + method = choose_method (); +end + +switch method + + case 1 % Matlab and some versions of Octave (e.g., 4.0.3) + + % Note: 'Format' and 'FormatSpacing' have been removed from the public + % list of root properties since Matlab R2014b, but are still recommended + % as the proper way to obtain this information in R2017a's manual. + + fmt = get (0, 'Format'); + spc = get (0, 'FormatSpacing'); + + case 2 % Octave 4.2 for sure (when was it introduced ?) + + % In Octave 4.2.0 the 'Format' and 'FormatSpacing' root property have + % been removed, but __formattring__ and __compactformat__ are still + % available. + + fmt = feval ('__formatstring__'); + spc = feval ('__compactformat__'); + + case 3 % Octave > 4.2 + + % After Octave 4.2.0, __formattring__ and __compactformat__ have been + % removed too, and a new syntax is available. + + [fmt, spc] = format (); + + otherwise + + % If nothing works, I really don't know which version of Octave or + % Matlab you are using, but defaulting to 'short' + 'loose' in this case + % seems better than a warning or an error. + + fmt = 'short'; + spc = 'loose'; + +end % switch + +end % function + + +function method = choose_method () + +try + + spc = get (0, 'FormatSpacing'); + assert (ismember (spc, {'compact', 'loose'})); + method = 1; + +catch + + if exist ('__compactformat__', 'builtin') == 5 + + method = 2; + + else + + try + + [~, spc] = format (); + assert (ismember (spc, {'compact', 'loose'})); + method = 3; + + catch + + method = 4; + + end % try + + end % if + +end % try + +end % function diff --git a/inst/misc/text/stk_disp_isloose.m b/inst/misc/text/stk_disp_isloose.m new file mode 100644 index 0000000..8e9a1fd --- /dev/null +++ b/inst/misc/text/stk_disp_isloose.m @@ -0,0 +1,48 @@ +% STK_DISP_ISLOOSE [STK internal] +% +% CALL: ISLOOSE = stk_disp_isloose () +% +% returns true if a 'loose' display mode is used, and false otherwise. +% +% NOTE +% +% This function solves a Matlab/Octave compatibility issue. See: +% +% * https://savannah.gnu.org/bugs/?51035 +% * https://savannah.gnu.org/bugs/?49951 +% * https://savannah.gnu.org/bugs/?46034 +% * https://sourceforge.net/p/kriging/tickets/73 + +% Copyright Notice +% +% Copyright (C) 2017, 2021 CentraleSupelec +% +% Authors: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_disp_isloose () + +[~, spc] = stk_disp_getformat (); + +b = strcmp (spc, 'loose'); + +end % function diff --git a/inst/misc/text/stk_disp_progress.m b/inst/misc/text/stk_disp_progress.m new file mode 100644 index 0000000..bd10ffa --- /dev/null +++ b/inst/misc/text/stk_disp_progress.m @@ -0,0 +1,71 @@ +% STK_DISP_PROGRESS ... +% +% Example: +% +% for i = 1:1000, +% stk_disp_progress ('toto ', i, 1000); +% end +% +% See also: waitbar + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Authors: Emmanuel Vazquez +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_disp_progress (msg, n, N) + +if ~ ((n > 0) && (n <= N)) + stk_error ('n should be between 1 and N', 'InvalidArgument'); +end + +persistent revmsg + +if n == 1 + revmsg = []; +end + +% Print current progress message +msg = sprintf (msg, n, N); +fprintf ([revmsg, msg]); + +% Prepare for erasing next time +revmsg = repmat (sprintf ('\b'), 1, length (msg)); + +if n == N + fprintf ('\n'); +end + +end % function + + +%!error stk_disp_progress ('toto ', 0, 1); +%!test stk_disp_progress ('toto ', 1, 1); +%!error stk_disp_progress ('toto ', 2, 1); + +%!test +%! stk_disp_progress ('toto ', 1, 2); +%! stk_disp_progress ('toto ', 2, 2); diff --git a/inst/misc/text/stk_sprintf_colvect.m b/inst/misc/text/stk_sprintf_colvect.m new file mode 100644 index 0000000..1f3284a --- /dev/null +++ b/inst/misc/text/stk_sprintf_colvect.m @@ -0,0 +1,59 @@ +% STK_SPRINTF_COLVECT ... + +% Copyright Notice +% +% Copyright (C) 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function str = stk_sprintf_colvect (x, max_width) + +if nargin < 2, + max_width = 8; +end + +% Try fixed-point notation first. +[str, err_fp] = stk_sprintf_colvect_fixedpoint (x, max_width); + +if err_fp > 0, + % Accept fixed-point notation if the error is zero, + % try scientific notation otherwise. + [str_sc, err_sc] = stk_sprintf_colvect_scientific (x, max_width); + if err_sc < err_fp, + % Choose scientific notation if it's better than fixed-point + str = str_sc; + end +end + +end % function + + +%!shared s +%!test s = stk_sprintf_colvect ([1 1e1], 6); +%!assert (isequal (s, [' 1'; '10'])) +%!test s = stk_sprintf_colvect ([1 1e3], 6); +%!assert (isequal (s, [' 1'; '1000'])) +%!test s = stk_sprintf_colvect ([1 1e5], 6); +%!assert (isequal (s, [' 1'; '100000'])) +%!test s = stk_sprintf_colvect ([1 1e6], 6); +%!assert (isequal (s, ['1e+00'; '1e+06'])) diff --git a/inst/misc/text/stk_sprintf_colvect_fixedpoint.m b/inst/misc/text/stk_sprintf_colvect_fixedpoint.m new file mode 100644 index 0000000..2688b9c --- /dev/null +++ b/inst/misc/text/stk_sprintf_colvect_fixedpoint.m @@ -0,0 +1,147 @@ +% STK_SPRINTF_COLVECT_FIXEDPOINT ... + +% Copyright Notice +% +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [str, err] = stk_sprintf_colvect_fixedpoint(x, max_width) + +if isempty(x), + str = ''; + err = 0; + return; +end + +if nargin < 2, + max_width = 8; +end + +% turn x into a column vector +x = double(x); +x = x(:); + +% get rid of infinities +is_inf = isinf (x); +is_pos = (x > 0); +is_pinf = is_inf & is_pos; +is_minf = is_inf & (~ is_pos); +x(is_inf) = 0.0; + +% get rid of negative zeros +is_zero = (x == 0); +x(is_zero) = 0.0; + +% Is there any negative element ? +any_negative = any(x < 0); + +% Start without decimal part +ax = abs(x); +n1 = max(1, floor(log10(max(ax))) + 1); +n2 = 0; +n3 = any_negative; + +% Abort this is already too long +if (n1 + n2 + n3) > max_width + str = repmat('#', length(x), max_width); + err = +inf; + return; +end + +% Otherwise, this is our current best solution +best_err = max(abs(fix(x) - x)); +best_n2 = 0; + +% Should we add a decimal part ? +if (best_err > eps) && ((n1 + n2 + n3 + 2) <= max_width) + % We can add a decimal part, so let's do it... + while (best_err > eps) && ((n1 + n2 + n3) < max_width) + n2 = n2 + 1; % add one decimal + n3 = 1 + any_negative; % +1 for the comma + c = 10 ^ (-n2); + xx = (round (ax / c)) * c; + err = max (abs (ax - xx)); + if err < best_err, + best_err = err; + best_n2 = n2; + end + end +end +err = best_err; +n2 = best_n2; + +fmt = sprintf ('%%%d.%df', n1 + n2 + n3, n2); +str = arrayfun (@(u) sprintf (fmt, u), x, 'UniformOutput', false); +str = char (str{:}); + +% fix infinities +if any (is_pinf), + str(is_pinf, :) = [repmat(' ', 1, max_width - 3) 'Inf']; +end +if any (is_minf) + str(is_minf, :) = [repmat(' ', 1, max_width - 4) '-Inf']; +end + +end % function + +%!shared x, s +%! x = [1.2; 3.48]; +%!test s = stk_sprintf_colvect_fixedpoint(x, 1); +%!assert (isequal(s, ['1'; '3'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 2); +%!assert (isequal(s, ['1'; '3'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 3); +%!assert (isequal(s, ['1.2'; '3.5'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 4); +%!assert (isequal(s, ['1.20'; '3.48'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 5); +%!assert (isequal(s, ['1.20'; '3.48'])) + +%!shared x, s +%! x = [1.2; -3.48]; +%!test s = stk_sprintf_colvect_fixedpoint(x, 1); +%!assert (isequal(s, ['#'; '#'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 2); +%!assert (isequal(s, [' 1'; '-3'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 3); +%!assert (isequal(s, [' 1'; '-3'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 4); +%!assert (isequal(s, [' 1.2'; '-3.5'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 5); +%!assert (isequal(s, [' 1.20'; '-3.48'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 6); +%!assert (isequal(s, [' 1.20'; '-3.48'])) + +%!shared x, s +%! x = [0.2; 0.48]; +%!test s = stk_sprintf_colvect_fixedpoint(x, 1); +%!assert (isequal(s, ['0'; '0'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 2); +%!assert (isequal(s, ['0'; '0'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 3); +%!assert (isequal(s, ['0.2'; '0.5'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 4); +%!assert (isequal(s, ['0.20'; '0.48'])) +%!test s = stk_sprintf_colvect_fixedpoint(x, 5); +%!assert (isequal(s, ['0.20'; '0.48'])) diff --git a/inst/misc/text/stk_sprintf_colvect_scientific.m b/inst/misc/text/stk_sprintf_colvect_scientific.m new file mode 100644 index 0000000..3d6ac7f --- /dev/null +++ b/inst/misc/text/stk_sprintf_colvect_scientific.m @@ -0,0 +1,232 @@ +% STK_SPRINTF_COLVECT_SCIENTIFIC ... + +% Copyright Notice +% +% Copyright (C) 2015 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [str, err] = stk_sprintf_colvect_scientific (x, max_width) + +if isempty (x), + str = ''; + err = 0; + return; +end + +if nargin < 2, + max_width = 8; +end + +% Turn x into a column vector +x = double (x); +x = x(:); + +% Get rid of infinities +is_inf = isinf (x); +is_pos = (x > 0); +is_pinf = is_inf & is_pos; +is_minf = is_inf & (~ is_pos); +x(is_inf) = 0.0; + +% Get rid of negative zeros +is_zero = (x == 0); +x(is_zero) = 0.0; + +% Compute exponents +ax = abs (x); +exponent = zeros (size (x)); +exponent(~is_zero) = floor (log10 (ax(~ is_zero))); + +% Compute mantissae +mantissa = x .* 10 .^ (- exponent); + +% Is there any negative element ? +any_negative = any (x < 0); + + +%--- Start with only one digit for the mantissa -------------------------------- + +% Nb digits for the mantissa (including the leading digit) +n1 = 1; + +% Compute mantissa/exponent after rounding +[mantissa_r, exponent_r] = round_ (mantissa, exponent, n1); + +% Maximal absolute exponent +maxexp = max (abs (exponent_r)); + +% Nb digits for the exponent +n2 = max (2, 1 + floor (log10 (maxexp))); + +% Nb non-digit characters (+2 for "e+") -> no decimal separator in this case +n3 = any_negative + 2; + +% Abort this is already too long +if (n1 + n2 + n3) > max_width + str = repmat ('#', length (x), max_width); + err = +inf; + return; +end + +% Otherwise, this is our current best solution +best_err = abs (x - mantissa_r .* 10 .^ (exponent_r)); +best_n1 = 1; + + +%--- Try to add a decimal part ------------------------------------------------- + +if (any (best_err > eps * abs (x))) && ((n1 + n2 + n3 + 2) <= max_width) + + % We can add a decimal part, so let's do it... + + while (any (best_err > eps * abs (x))) && ((n1 + n2 + n3) < max_width) + + % Increase numer of digits for the mantissa (including the leading digit) + n1 = n1 + 1; + + % Compute mantissa/exponent after rounding + [mantissa_r, exponent_r] = round_ (mantissa, exponent, n1); + + % Maximal absolute exponent + maxexp = max (abs (exponent_r)); + + % Nb digits for the exponent + n2 = max (2, 1 + floor (log10 (maxexp))); + + % Nb non-digit characters (+2 for "e+") + % --> "+3" for "e", "." in the mantissa and "+" in the exponent + n3 = any_negative + 3; + + err = abs (x - mantissa_r .* 10 .^ (exponent_r)); + if (max (err) < max (best_err)) + best_err = err; + best_n1 = n1; + end + end +end + +n1 = best_n1; + + +%--- Produce formatted output ------------------------------------------------- + +% Compute mantissa/exponent after rounding +[mantissa_r, exponent_r] = round_ (mantissa, exponent, n1); + +% format specifier for the mantissa +fmt1 = sprintf ('%%%d.%df', n1 + (n1 > 1) + any_negative, n1 - 1); +str1 = arrayfun (@(u)(sprintf (fmt1, u)), mantissa_r, 'UniformOutput', false); + +% format specifier for the exponent +fmt2 = sprintf('e%%+0%dd', n2 + 1); +str2 = arrayfun (@(u)(sprintf (fmt2, u)), exponent_r, 'UniformOutput', false); + +% merge mantissa and exponent +str = [char(str1{:}) char(str2{:})]; + +% fix infinities +if any (is_pinf), + str(is_pinf, :) = [repmat(' ', 1, max_width - 3) 'Inf']; +end +if any (is_minf) + str(is_minf, :) = [repmat(' ', 1, max_width - 4) '-Inf']; +end + +% Compute the maximal error +if nargout > 1, + err = max (abs (x - mantissa_r .* 10 .^ (exponent_r))); +end + +end % function + + +function [mantissa_r, exponent_r] = round_ (mantissa, exponent, n1) + +% Round mantissa to n1 digits (including the leading digit) +y = 10 ^ (n1 - 1); +mantissa_r = round (mantissa * y) / y; +exponent_r = exponent; + +% Fix mantissa values of 10 after rounding +b = (abs (mantissa_r) == 10); +mantissa_r(b) = sign (mantissa_r(b)); +exponent_r(b) = exponent_r(b) + 1; + +end % function + + +%!shared x, s +%! x = [1.2; -34567]; +%!test s = stk_sprintf_colvect_scientific(x, 1); +%!assert (isequal(s, ['#'; '#'])) +%!test s = stk_sprintf_colvect_scientific(x, 3); +%!assert (isequal(s, ['###'; '###'])) +%!test s = stk_sprintf_colvect_scientific(x, 5); +%!assert (isequal(s, ['#####'; '#####'])) +%!test s = stk_sprintf_colvect_scientific(x, 6); +%!assert (isequal(s, [' 1e+00'; '-3e+04'])) +%!test s = stk_sprintf_colvect_scientific(x, 7); +%!assert (isequal(s, [' 1e+00'; '-3e+04'])) +%!test s = stk_sprintf_colvect_scientific(x, 8); +%!assert (isequal(s, [' 1.2e+00'; '-3.5e+04'])) +%!test s = stk_sprintf_colvect_scientific(x, 9); +%!assert (isequal(s, [' 1.20e+00'; '-3.46e+04'])) +%!test s = stk_sprintf_colvect_scientific(x, 10); +%!assert (isequal(s, [' 1.200e+00'; '-3.457e+04'])) +%!test s = stk_sprintf_colvect_scientific(x, 11); +%!assert (isequal(s, [' 1.2000e+00'; '-3.4567e+04'])) +%!test s = stk_sprintf_colvect_scientific(x, 12); +%!assert (isequal(s, [' 1.2000e+00'; '-3.4567e+04'])) + +%!shared x, s +%! x = [0.9; 0.91; 0.99; 0.999]; +%!test s = stk_sprintf_colvect_scientific (x, 4); +%!assert (isequal(s, ['####'; '####'; '####'; '####'])) +%!test s = stk_sprintf_colvect_scientific (x, 5); +%!assert (isequal(s, ['9e-01'; '9e-01'; '1e+00'; '1e+00'])) +%!test s = stk_sprintf_colvect_scientific (x, 6); +%!assert (isequal(s, ['9e-01'; '9e-01'; '1e+00'; '1e+00'])) +%!test s = stk_sprintf_colvect_scientific (x, 7); +%!assert (isequal(s, ['9.0e-01'; '9.1e-01'; '9.9e-01'; '1.0e+00'])) +%!test s = stk_sprintf_colvect_scientific (x, 8); +%!assert (isequal(s, ['9.00e-01'; '9.10e-01'; '9.90e-01'; '9.99e-01'])) + +%!shared x, s +%! x = [0.9; -0.91; 0.99; 0.999]; +%!test s = stk_sprintf_colvect_scientific (x, 4); +%!assert (isequal(s, ['####'; '####'; '####'; '####'])) +%!test s = stk_sprintf_colvect_scientific (x, 5); +%!assert (isequal(s, ['#####'; '#####'; '#####'; '#####'])) +%!test s = stk_sprintf_colvect_scientific (x, 6); +%!assert (isequal(s, [' 9e-01'; '-9e-01'; ' 1e+00'; ' 1e+00'])) +%!test s = stk_sprintf_colvect_scientific (x, 7); +%!assert (isequal(s, [' 9e-01'; '-9e-01'; ' 1e+00'; ' 1e+00'])) +%!test s = stk_sprintf_colvect_scientific (x, 8); +%!assert (isequal(s, [' 9.0e-01'; '-9.1e-01'; ' 9.9e-01'; ' 1.0e+00'])) + +%!test +%! x = [1e6; -1e10; 1e-221]; +%! s = stk_sprintf_colvect_scientific(x, 10); +%! assert(isequal(s, [' 1e+006'; '-1e+010'; ' 1e-221'])); diff --git a/inst/misc/text/stk_sprintf_framed.m b/inst/misc/text/stk_sprintf_framed.m new file mode 100644 index 0000000..7896e52 --- /dev/null +++ b/inst/misc/text/stk_sprintf_framed.m @@ -0,0 +1,35 @@ +% STK_SPRINTF_FRAMED writes formatted text into a frame. + +% Copyright Notice +% +% Copyright (C) 2012, 2013 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function s = stk_sprintf_framed(fmt, varargin) + +a = sprintf([' ' fmt ' '], varargin{:}); +b = repmat('=', 1, length(a)); +s = sprintf('#%s#\n#%s#\n#%s#\n', b, a, b); + +end % function diff --git a/inst/model/@stk_model_/cat.m b/inst/model/@stk_model_/cat.m new file mode 100644 index 0000000..f6a8d14 --- /dev/null +++ b/inst/model/@stk_model_/cat.m @@ -0,0 +1,34 @@ +% CAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = cat (dim, varargin) %#ok + +stk_error (['Arrays of model objects are not supported. ', ... + 'Use cell arrays instead.'], 'IllegalOperation'); + +end % function diff --git a/inst/model/@stk_model_/disp.m b/inst/model/@stk_model_/disp.m new file mode 100644 index 0000000..77445ca --- /dev/null +++ b/inst/model/@stk_model_/disp.m @@ -0,0 +1,47 @@ +% DISP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (gn) + +fprintf ('<%s>\n', stk_sprintf_sizetype (gn)); + +loose_spacing = stk_disp_isloose (); + +if loose_spacing + fprintf ('|\n'); +end + +fprintf ('| stk_model_ is an ''abstract'' class, which is used to\n'); +fprintf ('| create derived classes representing actual models.\n'); +fprintf ('| ==> Normal STK users should never be reading this ;-) <==\n'); + +if loose_spacing + fprintf ('|\n'); +end + +end % function diff --git a/inst/model/@stk_model_/display.m b/inst/model/@stk_model_/display.m new file mode 100644 index 0000000..d887827 --- /dev/null +++ b/inst/model/@stk_model_/display.m @@ -0,0 +1,48 @@ +% DISPLAY [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function display (x) + +name = inputname (1); +if isempty (name) + name = 'ans'; +end + +if stk_disp_isloose + fprintf ('\n'); +end + +fprintf ('%s = ', name); + +disp (x); + +if stk_disp_isloose + fprintf ('\n'); +end + +end % function diff --git a/inst/model/@stk_model_/get.m b/inst/model/@stk_model_/get.m new file mode 100644 index 0000000..6856be8 --- /dev/null +++ b/inst/model/@stk_model_/get.m @@ -0,0 +1,39 @@ +% GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (gn, propname) %#ok + +if ~ ischar (propname) + errmsg = 'Invalid property name.'; +else + errmsg = sprintf ('There is no field named %s.', propname); +end + +stk_error (errmsg, 'InvalidArgument'); + +end % function diff --git a/inst/model/@stk_model_/horzcat.m b/inst/model/@stk_model_/horzcat.m new file mode 100644 index 0000000..53cdad4 --- /dev/null +++ b/inst/model/@stk_model_/horzcat.m @@ -0,0 +1,34 @@ +% HORZCAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = horzcat (varargin) %#ok + +stk_error (['Arrays of model objects are not supported. ', ... + 'Use cell arrays instead.'], 'IllegalOperation'); + +end % function diff --git a/inst/model/@stk_model_/set.m b/inst/model/@stk_model_/set.m new file mode 100644 index 0000000..85c0c9e --- /dev/null +++ b/inst/model/@stk_model_/set.m @@ -0,0 +1,38 @@ +% SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = set (gn, propname, value) %#ok + +if ~ ischar (propname) + errmsg = 'Invalid property name.'; +else + errmsg = sprintf ('There is no field named %s.', propname); +end +stk_error (errmsg, 'InvalidArgument'); + +end % function diff --git a/inst/model/@stk_model_/stk_covmat_noise.m b/inst/model/@stk_model_/stk_covmat_noise.m new file mode 100644 index 0000000..8df0eca --- /dev/null +++ b/inst/model/@stk_model_/stk_covmat_noise.m @@ -0,0 +1,37 @@ +% STK_COVMAT_NOISE [STK internal] + +% Copyright Notice +% +% Copyright (C) 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [K, P1, P2] = stk_covmat_noise (model, x1, x2, diff, pairwise) + +stk_error (['Classes derived from stk_model_ must implement ' ... + 'stk_covmat_noise.'], 'IncompleteClassImplementation'); + + +end % function + +%#ok<*INUSD,*STOUT> diff --git a/inst/model/@stk_model_/stk_get_input_data.m b/inst/model/@stk_model_/stk_get_input_data.m new file mode 100644 index 0000000..f33e699 --- /dev/null +++ b/inst/model/@stk_model_/stk_get_input_data.m @@ -0,0 +1,37 @@ +% STK_GET_INTPUT_DATA [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function input_data = stk_get_input_data (model) %#ok + +% DESIGN NOTE: cf. stk_get_prior_model.m + +% FIXME: size should be 0 x input_dim + +input_data = []; + +end % function diff --git a/inst/model/@stk_model_/stk_get_observation_variances.m b/inst/model/@stk_model_/stk_get_observation_variances.m new file mode 100644 index 0000000..3ba4ad2 --- /dev/null +++ b/inst/model/@stk_model_/stk_get_observation_variances.m @@ -0,0 +1,35 @@ +% STK_GET_OBSERVATION_VARIANCES [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function v = stk_get_observation_variances (model) %#ok + +% DESIGN NOTE: cf. stk_get_prior_model.m + +v = []; + +end % function diff --git a/inst/model/@stk_model_/stk_get_output_data.m b/inst/model/@stk_model_/stk_get_output_data.m new file mode 100644 index 0000000..ec7aa8d --- /dev/null +++ b/inst/model/@stk_model_/stk_get_output_data.m @@ -0,0 +1,35 @@ +% STK_GET_OUTPUT_DATA [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function output_data = stk_get_output_data (model) %#ok + +% DESIGN NOTE: cf. stk_get_prior_model.m + +output_data = zeros (0, 1); + +end % function diff --git a/inst/model/@stk_model_/stk_get_prior_model.m b/inst/model/@stk_model_/stk_get_prior_model.m new file mode 100644 index 0000000..f83f784 --- /dev/null +++ b/inst/model/@stk_model_/stk_get_prior_model.m @@ -0,0 +1,37 @@ +% STK_GET_PRIOR_MODEL [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function prior_model = stk_get_prior_model (model) + +% DESIGN NOTE: all model classes derived from stk_model_ are considered +% as prior models unless they overload stk_get_prior_model, stk_get_input_data +% stk_get_output_data, stk_get_sample_size and stk_get_observation_variances. + +prior_model = model; + +end % function diff --git a/inst/model/@stk_model_/stk_get_sample_size.m b/inst/model/@stk_model_/stk_get_sample_size.m new file mode 100644 index 0000000..7d5a6b1 --- /dev/null +++ b/inst/model/@stk_model_/stk_get_sample_size.m @@ -0,0 +1,35 @@ +% STK_GET_SAMPLE_SIZE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function n = stk_get_sample_size (model) + +% DESIGN NOTE: cf. stk_get_prior_model.m + +n = 0; + +end % function diff --git a/inst/model/@stk_model_/stk_model_.m b/inst/model/@stk_model_/stk_model_.m new file mode 100644 index 0000000..dfd774c --- /dev/null +++ b/inst/model/@stk_model_/stk_model_.m @@ -0,0 +1,41 @@ +% STK_MODEL_ [internal] +% +% This is meant to become the base class for all STK models. +% +% Currently: +% * prior models are defined by model structures (structs) and thus +% do not derive from this class; +% * the stk_model_gpposterior and stk_gaussiannoise_ classes already derive +% from this class. + +% Copyright Notice +% +% Copyright (C) 2018, 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = stk_model_ () + +gn = class (struct (), 'stk_model_'); + +end % function diff --git a/inst/model/@stk_model_/stk_predict_.m b/inst/model/@stk_model_/stk_predict_.m new file mode 100644 index 0000000..5b9e175 --- /dev/null +++ b/inst/model/@stk_model_/stk_predict_.m @@ -0,0 +1,36 @@ +% STK_PREDICT_ [STK internal] +% +% See also: stk_predict + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [zp, lambda, mu, K] = stk_predict_ (model, xt) %#ok + +stk_error (sprintf (['stk_predict_ is not implemented for models of ' ... + 'class %s.'], class (model)), 'NotImplemented'); + +end % function diff --git a/inst/model/@stk_model_/subsasgn.m b/inst/model/@stk_model_/subsasgn.m new file mode 100644 index 0000000..20a887f --- /dev/null +++ b/inst/model/@stk_model_/subsasgn.m @@ -0,0 +1,48 @@ +% SUBSASGN [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = subsasgn (gn, idx, value) + +switch idx(1).type + + case '.' + + if length (idx) > 1 + value = subsasgn (get (gn, idx(1).subs), idx(2:end), value); + end + + gn = set (gn, idx(1).subs, value); + + case {'{}', '()'} + + errmsg = 'Illegal assignment'; + stk_error (errmsg, 'IllegalAssignment'); + +end + +end % function diff --git a/inst/model/@stk_model_/subsref.m b/inst/model/@stk_model_/subsref.m new file mode 100644 index 0000000..aa363a6 --- /dev/null +++ b/inst/model/@stk_model_/subsref.m @@ -0,0 +1,45 @@ +% SUBSREF [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = subsref (gn, idx) + +if strcmp (idx(1).type, '.') + + value = get (gn, idx(1).subs); + + if length (idx) > 1 + value = subsref (value, idx(2:end)); + end + +else + + stk_error ('Illegal indexing.', 'IllegalIndexing'); + +end + +end % function diff --git a/inst/model/@stk_model_/vertcat.m b/inst/model/@stk_model_/vertcat.m new file mode 100644 index 0000000..141bc17 --- /dev/null +++ b/inst/model/@stk_model_/vertcat.m @@ -0,0 +1,34 @@ +% VERTCAT [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = vertcat (varargin) %#ok + +stk_error (['Arrays of model objects are not supported. ', ... + 'Use cell arrays instead.'], 'IllegalOperation'); + +end % function diff --git a/inst/model/@stk_model_gpposterior/disp.m b/inst/model/@stk_model_gpposterior/disp.m new file mode 100644 index 0000000..7f6b1cd --- /dev/null +++ b/inst/model/@stk_model_gpposterior/disp.m @@ -0,0 +1,76 @@ +% DISP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015-2017, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (model) + +loose_spacing = stk_disp_isloose (); + +fprintf ('<%s>\n', stk_sprintf_sizetype (model)); + +if loose_spacing + fprintf ('|\n'); +end + +if ~ isscalar (model) + return +end + +if isempty (model.prior_model) + str_prior_model = '--'; +else + str_prior_model = ['<' stk_sprintf_sizetype(model.prior_model) '>']; +end + +if stk_get_sample_size (model) == 0 + str_input_data = '--'; + str_output_data = '--'; +else + str_input_data = ['<' stk_sprintf_sizetype(model.input_data) '>']; + str_output_data = ['<' stk_sprintf_sizetype(model.output_data) '>']; +end + +fprintf ('| prior_model: %s\n', str_prior_model); +fprintf ('| sample_size: %d\n', stk_get_sample_size (model)); +fprintf ('| input_data: %s\n', str_input_data); +fprintf ('| output_data: %s\n', str_output_data); + +if loose_spacing + fprintf ('|\n\n'); +end + +if ~ isempty (model.prior_model) + + fprintf ('with .prior_model =\n'); + if loose_spacing + fprintf ('\n'); + end + + disp (model.prior_model); +end + +end % function diff --git a/inst/model/@stk_model_gpposterior/fieldnames.m b/inst/model/@stk_model_gpposterior/fieldnames.m new file mode 100644 index 0000000..9fc7dca --- /dev/null +++ b/inst/model/@stk_model_gpposterior/fieldnames.m @@ -0,0 +1,37 @@ +% FIELDNAMES [overload base function] + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% Copyright (C) 2016 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function fn = fieldnames (model) + +fn = {'prior_model'; 'sample_size'; 'input_data'; 'output_data'}; + +% Note: kreq is a 'hidden' field that might change in future versions of STK, +% we don't want ordinary users to see it + +end % function diff --git a/inst/model/@stk_model_gpposterior/get.m b/inst/model/@stk_model_gpposterior/get.m new file mode 100644 index 0000000..be3e1f4 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/get.m @@ -0,0 +1,64 @@ +% GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (model, propname) + +switch propname + + case {'prior_model', 'input_data', 'output_data', 'kreq'} + % rem: kreq is a hidden property + value = model.(propname); + + case 'sample_size' + value = size (model.input_data, 1); + + otherwise + if ~ ischar (propname) + errmsg = 'Invalid property name.'; + else + errmsg = sprintf ('There is no field named %s.', propname); + end + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function + +%#ok<*CTCH,*LERR> + + +%!shared M_post +%! x_obs = (linspace (0, pi, 15))'; +%! z_obs = sin (x_obs); +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); + +%!error value = get (M_post, 1.33); +%!error value = get (M_post, 'dudule'); +%!test value = get (M_post, 'prior_model'); diff --git a/inst/model/@stk_model_gpposterior/set.m b/inst/model/@stk_model_gpposterior/set.m new file mode 100644 index 0000000..9e583d8 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/set.m @@ -0,0 +1,75 @@ +% SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function model = set (model, propname, value) + +switch propname + + case 'prior_model' + stk_error (sprintf (['Property prior_model is read-only.\n\nHINT: ' ... + 'Construct a new stk_model_gpposterior object if you need to ' ... + 'change the prior model.']), 'ReadOnlyProperty'); + + case 'kreq' + % rem: kreq is a hidden property + stk_error (sprintf (['Property kreq is a hidden, read-only ' ... + 'property.\n\nHINT: Don''t try to set kreq directly. It will ' ... + 'be updated automatically whenever it is needed.']), ... + 'ReadOnlyProperty'); + + case {'input_data', 'output_data'} + stk_error (sprintf (['Property %s is read-only.\n\nHINT: Use ' ... + 'stk_model_update to add new evaluations results ' ... + 'to an existing stk_model_gpposterior object.'], ... + propname), 'ReadOnlyProperty'); + + otherwise + if ~ ischar (propname) + errmsg = 'Invalid property name.'; + else + errmsg = sprintf ('There is no field named %s.', propname); + end + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function + +%#ok<*CTCH,*LERR> + + +%!shared M_post +%! x_obs = (linspace (0, pi, 15))'; +%! z_obs = sin (x_obs); +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); + +%!error value = get (M_post, 1.33); +%!error value = get (M_post, 'dudule'); +%!test value = get (M_post, 'prior_model'); diff --git a/inst/model/@stk_model_gpposterior/stk_covmat_noise.m b/inst/model/@stk_model_gpposterior/stk_covmat_noise.m new file mode 100644 index 0000000..fdeed75 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_covmat_noise.m @@ -0,0 +1,47 @@ +% STK_COVMAT_NOISE [STK internal] + +% Copyright Notice +% +% Copyright (C) 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [K, P1, P2] = stk_covmat_noise (model, varargin) + +if nargout <= 1 + + K = stk_covmat_noise (model.prior, varargin{:}); + +elseif nargout == 2 + + [K, P1] = stk_covmat_noise (model.prior, varargin{:}); + +else + + [K, P1, P2] = stk_covmat_noise (model.prior, varargin{:}); + +end + +end % function + +%#ok<*INUSD,*STOUT> diff --git a/inst/model/@stk_model_gpposterior/stk_generate_samplepaths.m b/inst/model/@stk_model_gpposterior/stk_generate_samplepaths.m new file mode 100644 index 0000000..1513cdd --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_generate_samplepaths.m @@ -0,0 +1,80 @@ +% STK_GENERATE_SAMPLEPATHS [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function zsim = stk_generate_samplepaths (model, varargin) + +switch nargin + + case {0, 1} + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); + + case 2 + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT) + xt = varargin{1}; + nb_paths = 1; + conditional = false; + + case 3 + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT, NB_PATHS) + xt = varargin{1}; + nb_paths = varargin{2}; + conditional = false; + + case 4 + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT) + xi = varargin{1}; + zi = varargin{2}; + xt = varargin{3}; + nb_paths = 1; + conditional = true; + + otherwise + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT, NB_PATHS) + xi = varargin{1}; + zi = varargin{2}; + xt = varargin{3}; + nb_paths = varargin{4}; + conditional = true; + +end + +if ~ isa (model, 'stk_model_gpposterior') + stk_error ('Syntax error.', 'SyntaxError'); +end + +if conditional + model = stk_model_update (model, xi, zi); +end + +xi = stk_get_input_data (model); +zi = stk_get_output_data (model); +model = stk_get_prior_model (model); + +zsim = stk_generate_samplepaths (model, xi, zi, xt, nb_paths); + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_input_data.m b/inst/model/@stk_model_gpposterior/stk_get_input_data.m new file mode 100644 index 0000000..b195cda --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_input_data.m @@ -0,0 +1,33 @@ +% STK_GET_INTPUT_DATA returns the input data of the model + +% Copyright Notice +% +% Copyright (C) 2015, 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function input_data = stk_get_input_data (model) + +input_data = model.input_data; + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_observation_variances.m b/inst/model/@stk_model_gpposterior/stk_get_observation_variances.m new file mode 100644 index 0000000..db98c5f --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_observation_variances.m @@ -0,0 +1,33 @@ +% STK_GET_OBSERVATION_VARIANCES [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function v = stk_get_observation_variances (model) + +v = stk_covmat_noise (model.prior_model, model.input_data, [], -1, true); + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m b/inst/model/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m new file mode 100644 index 0000000..16c15ee --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m @@ -0,0 +1,33 @@ +% STK_GET_OPTIMIZABLE_NOISE_PARAMETERS [STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function noiseparam = stk_get_optimizable_noise_parameters (model) + +noiseparam = stk_get_optimizable_noise_parameters (model.prior); + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_optimizable_parameters.m b/inst/model/@stk_model_gpposterior/stk_get_optimizable_parameters.m new file mode 100644 index 0000000..b47b324 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_optimizable_parameters.m @@ -0,0 +1,41 @@ +% STK_GET_OPTIMIZABLE_PARAMETERS [overload STK function, internal] +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. STK users that wish to +% experiment with parameter classes can already overload it, but should be +% aware that API-breaking changes are likely to happen in future releases. +% +% See also: stk_get_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = stk_get_optimizable_parameters (model) + +value = stk_get_optimizable_parameters (model.prior_model); + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_output_data.m b/inst/model/@stk_model_gpposterior/stk_get_output_data.m new file mode 100644 index 0000000..c7877db --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_output_data.m @@ -0,0 +1,33 @@ +% STK_GET_OUTPUT_DATA returns the output data of the model + +% Copyright Notice +% +% Copyright (C) 2015, 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function output_data = stk_get_output_data (model) + +output_data = model.output_data; + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_prior_model.m b/inst/model/@stk_model_gpposterior/stk_get_prior_model.m new file mode 100644 index 0000000..25717ab --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_prior_model.m @@ -0,0 +1,33 @@ +% STK_GET_PRIOR_MODEL returns the prior_model structure + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function prior_model = stk_get_prior_model (model) + +prior_model = model.prior_model; + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_get_sample_size.m b/inst/model/@stk_model_gpposterior/stk_get_sample_size.m new file mode 100644 index 0000000..a6d5255 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_get_sample_size.m @@ -0,0 +1,33 @@ +% STK_GET_SAMPLE_SIZE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function n = stk_get_sample_size (model) + +n = size (model.input_data, 1); + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_isnoisy.m b/inst/model/@stk_model_gpposterior/stk_isnoisy.m new file mode 100644 index 0000000..00f92a4 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_isnoisy.m @@ -0,0 +1,34 @@ +% STK_ISNOISY [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec & LNE +% +% Authors: Julien Bect +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_isnoisy (model) + +b = stk_isnoisy (model.prior_model); + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_make_kreq.m b/inst/model/@stk_model_gpposterior/stk_make_kreq.m new file mode 100644 index 0000000..5252f29 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_make_kreq.m @@ -0,0 +1,38 @@ +% STK_MAKE_KREQ [STK internal] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function kreq = stk_make_kreq (M_post, x) + +% Create prior cross-covariance matrix (and design matrix at x) +[Kti, Pt] = stk_make_matcov (M_post.prior_model, x, M_post.input_data); + +% Create full kriging equation object +kreq = stk_set_righthandside (M_post.kreq, Kti, Pt); + +end % function + diff --git a/inst/model/@stk_model_gpposterior/stk_model_gpposterior.m b/inst/model/@stk_model_gpposterior/stk_model_gpposterior.m new file mode 100644 index 0000000..1d27067 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_model_gpposterior.m @@ -0,0 +1,145 @@ +% STK_MODEL_GPPOSTERIOR constructs a posterior model + +% Copyright Notice +% +% Copyright (C) 2015-2017, 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function model = stk_model_gpposterior (prior_model, xi, zi) + +if nargin == 3 + + if iscell (xi) + % Legacy support for experimental hidden feature, to be removed + kreq = xi{2}; xi = xi{1}; + else + kreq = []; + end + + % Check the size of zi + n = size (xi, 1); + if ~ (isempty (zi) || isequal (size (zi), [n 1])) + stk_error (['zi must either be empty or have the ' ... + 'same number of rows as x_obs.'], 'IncorrectSize'); + end + + if isempty (kreq) + + % Currently, prior models are represented exclusively as structures + if ~ isstruct (prior_model) + stk_error (['Input argument ''prior_model'' must be a ' ... + 'prior model structure.'], 'InvalidArgument'); + end + + % Make sure that lognoisevariance is -inf for noiseless models + if ~ stk_isnoisy (prior_model) + prior_model.lognoisevariance = -inf; + end + + % Backward compatibility: + % accept model structures with missing 'dim' field + if (~ isfield (prior_model, 'dim')) || (isempty (prior_model.dim)) + prior_model.dim = size (xi, 2); + elseif ~ isempty (xi) && (prior_model.dim ~= size (xi, 2)) + stk_error (sprintf (['The number of columns of xi (which is %d) ' ... + 'is different from the value of prior_model.dim (which is ' ... + '%d).'], size (xi, 2), prior_model.dim), 'InvalidArgument'); + end + + % Check prior_model.lognoisevariance + if ~ isscalar (prior_model.lognoisevariance) + if (~ isvector (prior_model.lognoisevariance)) && (length ... + (prior_model.lognoisevariance) == n) + stk_error (['M_prior.lognoisevariance must be either ' ... + 'a scalar or a vector of length size (xi, 1).'], ... + 'InvalidArgument'); + end + % Make sure that lnv is a column vector + prior_model.lognoisevariance = prior_model.lognoisevariance(:); + end + + % Check if the model contains parameters that must be estimated first + % (such parameters have the value NaN) + param = stk_get_optimizable_model_parameters (prior_model); + if any (isnan (param)) + noiseparam = stk_get_optimizable_noise_parameters (prior_model); + if any (isnan (noiseparam)) + [prior_model.param, prior_model.lognoisevariance] ... + = stk_param_estim (prior_model, xi, zi); + else + prior_model.param = stk_param_estim (prior_model, xi, zi); + end + end + + % Compute QR factorization + kreq = stk_kreq_qr (prior_model, xi); + end + +elseif nargin == 0 + + prior_model = []; + xi = []; + zi = []; + kreq = []; + +else + stk_error ('Incorrect number of input arguments.', 'SyntaxError'); +end + +% Prepare object fields +model.prior_model = prior_model; +model.input_data = xi; +model.output_data = zi; +model.kreq = kreq; + +% Create object +model = class (model, 'stk_model_gpposterior', stk_model_ ()); + +end % function + + +%!test stk_test_class ('stk_model_gpposterior') + +%!shared M_prior, x_obs, z_obs +%! x_obs = (linspace (0, pi, 15))'; +%! z_obs = sin (x_obs); +%! +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); + +%!test M_post = stk_model_gpposterior (); +%!test M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); +%!error M_post = stk_model_gpposterior (M_prior, x_obs, [z_obs; z_obs]); +%!error M_post = stk_model_gpposterior (M_prior, x_obs, [z_obs; z_obs], 3.441); + +%!test % hidden feature +%! kreq = stk_kreq_qr (M_prior, x_obs); +%! M_post = stk_model_gpposterior (M_prior, {x_obs, kreq}, z_obs); + +%!test % NaNs in prior_model.param +%! DIM = 1; M = stk_model (@stk_materncov52_aniso, DIM); +%! M.param = nan (2, 1); % this is currently the default +%! x = stk_sampling_regulargrid (20, DIM, [0; 1]); +%! y = sin (double (x)); +%! zp = stk_predict (M, x, y, x); diff --git a/inst/model/@stk_model_gpposterior/stk_model_update.m b/inst/model/@stk_model_gpposterior/stk_model_update.m new file mode 100644 index 0000000..3e9c952 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_model_update.m @@ -0,0 +1,113 @@ +% STK_MODEL_UPDATE [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2016, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function M = stk_model_update (M, x_new, z_new, lnv_new) + +% FIXME: We should check in this function if prior_model.lognoisevariance +% is an object, because if it is, things will not work properly (as it is). + +lnv_current = M.prior_model.lognoisevariance; + +if nargin < 4 % lnv not provided (homoscedastic case only) + + if ~ isscalar (lnv_current) + stk_error (sprintf (['The fourth input argument is mandatory when ' ... + 'updating an heteroscedastic model.\n\nPlease use\n' ... + '\n M = stk_model_update (M, X_NEW, Z_NEW, LNV_NEW)\n\n'... + 'to provide the value LNV_NEW of the lognoisevariance at the ' ... + 'new observations points X_NEW.']), 'NotEnoughInputArguments'); + end + + oldstyle_heteroscedastic = false; + +elseif ~ isempty (lnv_new) % lnv provided (heteroscedastic case only) + + if (stk_get_sample_size (M) ~= 1) && (isscalar (lnv_current)) + if lnv_current == -inf + s1 = 'a noiseless'; + s2 = 'noiseless'; + else + s1 = 'an homoscedastic'; + s2 = 'homoscedastic'; + end + stk_error (sprintf (['The fourth input argument should not be used ' ... + 'when updating %s model.\n\nPlease use\n\n M = stk_model_' ... + 'update (M, X_NEW, Z_NEW)\nor M = stk_model_update (M, X_NEW, ' ... + 'Z_NEW, [])\n\nto update your %s model M with new data (X_NEW, ' ... + 'Z_NEW).'], s1, s2), 'NotEnoughInputArguments'); + end + + % Make sure that lnv is a column vector + lnv_new = lnv_new(:); + + oldstyle_heteroscedastic = true; +end + +M.input_data = [M.input_data; x_new]; +M.output_data = [M.output_data; z_new]; + +% In the "old style" heteroscedastic case, we have a value of the noise +% variance provided for each observation, and thus lognoisevariance is a +% vector whose length equals the sample size. +if oldstyle_heteroscedastic + M.prior_model.lognoisevariance = [lnv_current; lnv_new]; +end + +M.kreq = stk_kreq_qr (M.prior_model, M.input_data); + +end % function + + +%!shared x_obs, z_obs, ref, M_prior, x_new, z_new, lnv_new +%! [x_obs, z_obs, ref] = stk_dataset_twobumps ('noisy2'); +%! M_prior = stk_model (@stk_materncov52_iso); +%! M_prior.param = [-0.15; 0.38]; +%! M_prior.lognoisevariance = 2 * log (ref.noise_std); +%! x_new = [-0.79; -0.79]; +%! z_new = [-0.69; -0.85]; +%! lnv_new = ref.noise_std_func (x_new); + +%!test % heteroscedastic +%! M_prior.lognoisevariance = 2 * log (ref.noise_std); +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); +%! M_post = stk_model_update (M_post, x_new, z_new, lnv_new); + +%!error % using lnv_new / homoscedastic +%! M_prior.lognoisevariance = 0; +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); +%! M_post = stk_model_update (M_post, x_new, z_new, lnv_new); % NOT OK + +%!error % using lnv_new / noiseless +%! M_prior.lognoisevariance = -inf; +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs) +%! M_post = stk_model_update (M_post, x_new, z_new, lnv_new); % NOT OK + +%!error % not using lnv_new / heteroscedastic +%! M_prior.lognoisevariance = 2 * log (ref.noise_std); +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); +%! M_post = stk_model_update (M_post, x_new, z_new); diff --git a/inst/model/@stk_model_gpposterior/stk_predict_.m b/inst/model/@stk_model_gpposterior/stk_predict_.m new file mode 100644 index 0000000..25c0a33 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_predict_.m @@ -0,0 +1,255 @@ +% STK_PREDICT_ [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015-2018, 2020 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [zp, lambda, mu, K] = stk_predict_ (M_post, xt) + +% TODO: these should become options +block_size = []; + +M_prior = M_post.prior_model; + +%--- Convert and check input arguments: xt ------------------------------------- + +xt = double (xt); +% FIXME: check variable names + +if (strcmp (M_prior.covariance_type, 'stk_discretecov')) && (isempty (xt)) + % In this case, predict on all points of the underlying discrete space + nt = size (M_prior.param.K, 1); + xt = (1:nt)'; +else + nt = size (xt, 1); + if length (size (xt)) > 2 + stk_error (['The input argument xt should not have more than two ' ... + 'dimensions'], 'IncorrectSize'); + elseif ~ isequal (size (xt), [nt M_prior.dim]) + stk_error (sprintf (['The number of columns of xt (which is %d) ' ... + 'does not agree with the dimension of the model (which is ' ... + '%d).'], size (xt, 2), M_prior.dim), 'IncorrectSize'); + end +end + +%--- Prepare the output arguments ---------------------------------------------- + +zp_v = zeros (nt, 1); +compute_prediction = ~ isempty (M_post.output_data); + +% compute the kriging prediction, or just the variances ? +if compute_prediction + zp_a = zeros (nt, 1); +else + zp_a = nan (nt, 1); +end + +%--- Choose nb_blocks & block_size --------------------------------------------- + +n_obs = stk_get_sample_size (M_post); + +if isempty (block_size) + MAX_RS_SIZE = 5e6; SIZE_OF_DOUBLE = 8; % in bytes + block_size = ceil (MAX_RS_SIZE / (n_obs * SIZE_OF_DOUBLE)); +end + +if nt == 0 + % skip main loop + nb_blocks = 0; +else + % blocks of size approx. block_size + nb_blocks = max (1, ceil (nt / block_size)); + block_size = ceil (nt / nb_blocks); +end + +% The full lambda_mu matrix is only needed when nargout > 1 +if nargout > 1 + lambda_mu = zeros (n_obs + get (M_post.kreq, 'r'), nt); +end + +% The full RS matrix is only needed when nargout > 3 +if nargout > 3 + RS = zeros (size (lambda_mu)); +end + +%--- MAIN LOOP (over blocks) --------------------------------------------------- + +% TODO: this loop should be parallelized !!! + +for block_num = 1:nb_blocks + + % compute the indices for the current block + idx_beg = 1 + block_size * (block_num - 1); + idx_end = min (nt, idx_beg + block_size - 1); + idx = idx_beg:idx_end; + + % solve the kriging equation for the current block + xt_ = xt(idx, :); + kreq = stk_make_kreq (M_post, xt_); + + % compute the kriging mean + if compute_prediction + zp_a(idx) = (get (kreq, 'lambda'))' * (double (M_post.output_data)); + end + + % The full lambda_mu matrix is only needed when nargout > 1 + if nargout > 1 + lambda_mu(:, idx) = get (kreq, 'lambda_mu'); + end + + % The full RS matrix is only needed when nargout > 3 + if nargout > 3 + RS(:, idx) = get (kreq, 'RS'); + end + + % compute kriging variances (this does NOT include the noise variance) + zp_v(idx) = stk_make_matcov (M_prior, xt_, xt_, true) ... + - get (kreq, 'delta_var'); + + % note: the following modification computes prediction variances for noisy + % variance, i.e., including the noise variance also + % zp_v(idx) = stk_make_matcov (M_prior, xt_, [], true) ... + % - get (kreq, 'delta_var'); + + b = (zp_v < 0); + if any (b) + zp_v(b) = 0.0; + warning('STK:stk_predict:NegativeVariancesSetToZero', sprintf ( ... + ['Correcting numerical inaccuracies in kriging variance.\n' ... + '(%d negative variances have been set to zero)'], sum (b))); + end + +end + +%--- Ensure exact prediction at observation points for noiseless models -------- + +if ~ stk_isnoisy (M_prior) + + % FIXME: Fix the kreq object instead ? + + xi = double (M_post.input_data); + zi = double (M_post.output_data); + + [b, loc] = ismember (xt, xi, 'rows'); + if sum (b) > 0 + + if compute_prediction + zp_a(b) = zi(loc(b)); + end + + zp_v(b) = 0.0; + + if nargout > 1 + lambda_mu(:, b) = 0.0; + lambda_mu(sub2ind (size (lambda_mu), loc(b), find (b))) = 1.0; + end + end +end + + +%--- Prepare outputs ----------------------------------------------------------- + +zp = stk_dataframe ([zp_a zp_v], {'mean' 'var'}); + +if nargout > 1 % lambda requested + lambda = lambda_mu(1:n_obs, :); +end + +if nargout > 2 % mu requested + mu = lambda_mu((n_obs+1):end, :); +end + +if nargout > 3 + K0 = stk_make_matcov (M_prior, xt, xt); + deltaK = lambda_mu' * RS; + K = K0 - 0.5 * (deltaK + deltaK'); +end + +end % function + +%#ok<*SPWRN> + + +%!shared n, m, M_post, M_prior, x0, x_obs, z_obs, x_prd, y_prd, idx_obs, idx_prd +%! +%! n = 10; % number of observations +%! m = n + 1; % number of predictions +%! d = 1; % dimension of the input space +%! +%! x0 = (linspace (0, pi, n + m))'; +%! +%! idx_obs = (2:2:(n+m-1))'; +%! idx_prd = (1:2:(n+m))'; +%! +%! x_obs = x0(idx_obs); +%! z_obs = sin (x_obs); +%! x_prd = x0(idx_prd); +%! +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); +%! +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); + +%!error y_prd = stk_predict (M_post); +%!test y_prd = stk_predict (M_post, x_prd); +%!error y_prd = stk_predict (M_post, [x_prd x_prd]); + +%!test % nargout = 2 +%! [y_prd1, lambda] = stk_predict (M_post, x_prd); +%! assert (stk_isequal_tolrel (y_prd, y_prd1)); +%! assert (isequal (size (lambda), [n m])); + +%!test % nargout = 3 +%! [y_prd1, lambda, mu] = stk_predict (M_post, x_prd); +%! assert (stk_isequal_tolrel (y_prd, y_prd1)); +%! assert (isequal (size (lambda), [n m])); +%! assert (isequal (size (mu), [1 m])); % ordinary kriging + +%!test % nargout = 4 +%! [y_prd1, lambda, mu, K] = stk_predict (M_post, x_prd); +%! assert (stk_isequal_tolrel (y_prd, y_prd1)); +%! assert (isequal (size (lambda), [n m])); +%! assert (isequal (size (mu), [1 m])); % ordinary kriging +%! assert (isequal (size (K), [m m])); + +%!test % nargout = 2, compute only variances +%! M_post1 = stk_model_gpposterior (M_prior, x_obs, []); +%! [y_prd_nan, lambda] = stk_predict (M_post1, x_prd); +%! assert (isequal (size (lambda), [n m])); +%! assert (all (isnan (y_prd_nan.mean))); + +%!test % discrete model (prediction indices provided) +%! M_prior1 = stk_model (@stk_discretecov, M_prior, x0); +%! M_post1 = stk_model_gpposterior (M_prior1, idx_obs, z_obs); +%! y_prd1 = stk_predict (M_post1, idx_prd); +%! assert (stk_isequal_tolrel (y_prd, y_prd1)); + +%!test % discrete model (prediction indices *not* provided) +%! M_prior1 = stk_model (@stk_discretecov, M_prior, x0); +%! M_post1 = stk_model_gpposterior (M_prior1, idx_obs, z_obs); +%! y_prd1 = stk_predict (M_post1, []); % predict them all! +%! assert (stk_isequal_tolrel (y_prd, y_prd1(idx_prd, :))); diff --git a/inst/model/@stk_model_gpposterior/stk_predict_leaveoneout.m b/inst/model/@stk_model_gpposterior/stk_predict_leaveoneout.m new file mode 100644 index 0000000..94dbee1 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_predict_leaveoneout.m @@ -0,0 +1,122 @@ +% STK_PREDICT_LEAVEONEOUT [overload STK function] + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2017 LNE +% +% Authors: Remi Stroh +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [LOO_pred, LOO_res] = stk_predict_leaveoneout (M_post) + +prior_model = M_post.prior_model; + +% Compute the covariance matrix, and the trend matrix +% (this covariance matrix K takes the noise into account) +[K, P] = stk_make_matcov (prior_model, M_post.input_data); +simple_kriging = (size (P, 2) == 0); + +% If simple kriging, just compute the inverse covariance matrix +if simple_kriging + R = inv (K); +else + % Use a more complex formula ("virtual cross-validation") + P_K = P' / K; + R = K \ (eye (size (K)) - P * ((P_K * P) \ P_K)); + % I = inv (K); + % R = I - I * P * (inv (P' * I * P)) * P' * I; +end +dR = diag (R); % The diagonal of the LOO matrix + +% Mean +zi = M_post.output_data; +raw_res = R * zi ./ dR; % Compute "raw" residuals +zp_mean = zi - raw_res; % LOO prediction + +% Variance +noisevariance = stk_get_observation_variances (M_post); +zp_var = max (0, 1 ./ dR - noisevariance); + +LOO_pred = stk_dataframe (horzcat (zp_mean, zp_var), {'mean', 'var'}); + +% Compute residuals ? +if nargout ~= 1 + + % Compute normalized residual + % norm_res = (zi - zp_mean) ./ (sqrt (noisevariance + zp_var)); + norm_res = (sqrt (max (0, dR))) .* raw_res; + + % Pack results into a dataframe + LOO_res = stk_dataframe (horzcat (raw_res, norm_res), ... + {'residuals', 'norm_res'}); +end + +% Create LOO cross-validation plots? +if nargout == 0 + + % Plot predictions VS observations (left planel)... + stk_subplot (1, 2, 1); stk_plot_predvsobs (M_post.output_data, LOO_pred); + + % ...and normalized residuals (right panel) + stk_subplot (1, 2, 2); stk_plot_histnormres (LOO_res.norm_res); + +end + +end % function + + +%!test % Check virtual Leave-One-Out formula +%! +%! n = 20; d = 1; +%! x_obs = stk_sampling_regulargrid (n, d, [0; 2*pi]); +%! z_obs = stk_feval (@sin, x_obs); +%! +%! lm_list = {stk_lm_null, stk_lm_constant, stk_lm_affine}; +%! +%! for j = 0:2 +%! for k = 1:(length (lm_list)) +%! +%! model = stk_model (@stk_materncov32_iso, d); +%! model.lm = lm_list{k}; +%! model.param = log ([1; 5]); +%! +%! switch j % test various scenarios for lognoisevariance +%! case 0 +%! model.lognoisevariance = -inf; +%! case 1 +%! model.lognoisevariance = 0; +%! case 2 +%! model.lognoisevariance = (1 + rand (n, 1)) * 1e-3; +%! end +%! +%! M_post = stk_model_gpposterior (model, x_obs, z_obs); +%! +%! [loo_pred, loo_res] = stk_predict_leaveoneout (M_post); +%! [direct_pred, direct_res] = stk_predict_leaveoneout_direct (M_post); +%! +%! assert (stk_isequal_tolrel (loo_pred, direct_pred)); +%! assert (stk_isequal_tolrel (loo_res, direct_res)); +%! +%! end +%! end diff --git a/inst/model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m b/inst/model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m new file mode 100644 index 0000000..b994b36 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m @@ -0,0 +1,90 @@ +% STK_PREDICT_LEAVEONEOUT_DIRECT [STK internal] + +% Copyright Notice +% +% Copyright (C) 2016-2018, 2020 CentraleSupelec +% +% Author: Julien Bect +% Stefano Duhamel + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [LOO_pred, LOO_res] = stk_predict_leaveoneout_direct (M_post) + +% Heteroscedatic noise ? +heteroscedastic = ~ isscalar (M_post.prior_model.lognoisevariance); + +n = stk_get_sample_size (M_post); +zp_mean = zeros (n, 1); +zp_var = zeros (n, 1); + +prior_model = M_post.prior_model; + +for i = 1:n + + xx = M_post.input_data; xx(i, :) = []; xt = M_post.input_data(i, :); + zz = M_post.output_data; zz(i, :) = []; + + % In the heteroscedastic case, the vector of log-variances for the + % noise is stored in prior_model.lognoisevariance. This vector must be + % modified too, when performing cross-validation. + if heteroscedastic + prior_model = M_post.prior_model; + prior_model.lognoisevariance(i) = []; + end + + zp = stk_predict (prior_model, xx, zz, xt); + + zp_mean(i) = zp.mean; + zp_var(i) = zp.var; + +end + +% Prepare outputs +LOO_pred = stk_dataframe ([zp_mean zp_var], {'mean', 'var'}); + +% Compute residuals ? +if nargout ~= 1 + + % Compute "raw" residuals + raw_res = M_post.output_data - zp_mean; + + % Compute normalized residual + noisevariance = stk_get_observation_variances (M_post); + norm_res = raw_res ./ (sqrt (noisevariance + zp_var)); + + % Pack results into a dataframe + LOO_res = stk_dataframe ([raw_res norm_res], ... + {'residuals', 'norm_res'}); +end + +% Create LOO cross-validation plots? +if nargout == 0 + + % Plot predictions VS observations (left planel)... + stk_subplot (1, 2, 1); stk_plot_predvsobs (M_post.output_data, LOO_pred); + + % ...and normalized residuals (right panel) + stk_subplot (1, 2, 2); stk_plot_histnormres (LOO_res.norm_res); + +end + +end % function diff --git a/inst/model/@stk_model_gpposterior/stk_set_optimizable_parameters.m b/inst/model/@stk_model_gpposterior/stk_set_optimizable_parameters.m new file mode 100644 index 0000000..0f003f1 --- /dev/null +++ b/inst/model/@stk_model_gpposterior/stk_set_optimizable_parameters.m @@ -0,0 +1,41 @@ +% STK_SET_OPTIMIZABLE_PARAMETERS [overload STK function, internal] +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. STK users that wish to +% experiment with parameter classes can already overload it, but should be +% aware that API-breaking changes are likely to happen in future releases. +% +% See also: stk_set_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function model = stk_set_optimizable_parameters (model, value) + +model.prior_model = stk_set_optimizable_parameters (model.prior_model, value); + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_/disp.m b/inst/model/noise/@stk_gaussiannoise_/disp.m new file mode 100644 index 0000000..7a91149 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_/disp.m @@ -0,0 +1,52 @@ +% DISP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (gn) + +fprintf ('<%s>\n', stk_sprintf_sizetype (gn)); + +loose_spacing = stk_disp_isloose (); + +if loose_spacing + fprintf ('|\n'); +end + +fprintf ('| stk_gaussiannoise_ is an ''abstract'' class, which is used to\n'); +fprintf ('| create derived classes representing actual Gaussian noise models.\n'); + +if loose_spacing + fprintf ('|\n'); +end + +fprintf ('| ==> ''Normal'' STK users should never be reading this ;-) <==\n'); + +if loose_spacing + fprintf ('|\n'); +end + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_/stk_covmat.m b/inst/model/noise/@stk_gaussiannoise_/stk_covmat.m new file mode 100644 index 0000000..2326433 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_/stk_covmat.m @@ -0,0 +1,78 @@ +% STK_COVMAT [STK internal] +% +% INTERNAL FUNCTION WARNING: +% This function is currently considered as internal: API-breaking changes are +% likely to happen in future releases. Please don't rely on it directly. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [K, P1, P2] = stk_covmat (gn, x1, x2, diff, pairwise) + +% Number of evaluations points +n1 = size (x1, 1); +if (nargin > 2) && (~ isempty (x2)) + n2 = size (x2, 1); + autocov = false; % In this case the result is zero +else + n2 = n1; + autocov = true; % In this case the result is a diagonal matrix +end + +% Defaut value for 'diff' (arg #4): -1 +if nargin < 4, diff = -1; end + +% Default value for 'pairwise' (arg #5): false +pairwise = (nargin > 4) && pairwise; +assert ((n1 == n2) || (~ pairwise)); + +if autocov + + K = stk_variance_eval (gn, double (x1), diff); + + if ~ pairwise + K = diag (K); + end + +else % autocov is false: Return a null matrix + + if pairwise + K = zeros (n1, 1); + else + K = zeros (n1, n2); + end + +end + +% No linear part +if nargout > 1 + P1 = zeros (n1, 0); + if nargout > 2 + P2 = zeros (n2, 0); + end +end + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_/stk_covmat_noise.m b/inst/model/noise/@stk_gaussiannoise_/stk_covmat_noise.m new file mode 100644 index 0000000..6d341ef --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_/stk_covmat_noise.m @@ -0,0 +1,47 @@ +% STK_COVMAT_NOISE [STK internal] + +% Copyright Notice +% +% Copyright (C) 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [K, P1, P2] = stk_covmat_noise (model, varargin) + +if nargout <= 1 + + K = stk_covmat (model, varargin{:}); + +elseif nargout == 2 + + [K, P1] = stk_covmat (model, varargin{:}); + +else + + [K, P1, P2] = stk_covmat (model, varargin{:}); + +end + +end % function + +%#ok<*INUSD,*STOUT> diff --git a/inst/model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m b/inst/model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m new file mode 100644 index 0000000..e0ef768 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m @@ -0,0 +1,33 @@ +% STK_GAUSSIANNOISE_ [internal] is the base class for Gaussian noise models + +% Copyright Notice +% +% Copyright (C) 2018, 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = stk_gaussiannoise_ () + +gn = class (struct (), 'stk_gaussiannoise_', stk_model_ ()); + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_/stk_isnoisy.m b/inst/model/noise/@stk_gaussiannoise_/stk_isnoisy.m new file mode 100644 index 0000000..410afdc --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_/stk_isnoisy.m @@ -0,0 +1,33 @@ +% STK_ISNOISY [overload STK funcion] + +% Copyright Notice +% +% Copyright (C) 2019 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_isnoisy (model) %#ok + +b = true; + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_/stk_predict_.m b/inst/model/noise/@stk_gaussiannoise_/stk_predict_.m new file mode 100644 index 0000000..0d1f646 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_/stk_predict_.m @@ -0,0 +1,51 @@ +% STK_PREDICT_ [STK internal] +% +% See also: stk_predict + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [zp, lambda, mu, K] = stk_predict_ (gn, xt) + +nt = stk_get_sample_size (xt); + +zp_mean = zeros (nt, 1); +zp_var = stk_variance_eval (gn, xt); +zp = stk_dataframe ([zp_mean zp_var], {'mean' 'var'}); + +if nargout > 1 + lambda = zeros (0, nt); + + if nargout > 2 + mu = zeros (0, nt); + + if nargout > 3 + K = diag (zp_var); + end + end +end + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/disp.m b/inst/model/noise/@stk_gaussiannoise_het0/disp.m new file mode 100644 index 0000000..d1eacc2 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/disp.m @@ -0,0 +1,59 @@ +% DISP [overload base function] + +% Copyright Notice +% +% Copyright (C) 2015-2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (gn) + +loose_spacing = stk_disp_isloose (); + +fprintf ('<%s>\n', stk_sprintf_sizetype (gn)); + +if loose_spacing + fprintf ('|\n'); +end + +if isa (gn.variance_function, 'function_handle') + variance_function = func2str (gn.variance_function); +else + variance_function = gn.variance_function; +end + +fprintf ('| Heteroscedastic variance model: tau^2(x) = dispersion * variance_function(x)\n'); + +if loose_spacing + fprintf ('|\n'); +end + +fprintf ('| dispersion: %s', num2str (exp (gn.log_dispersion))); +fprintf (' [log_dispersion = %s]\n', num2str (gn.log_dispersion)); +fprintf ('| variance_function: %s\n', variance_function); + +if loose_spacing + fprintf ('|\n'); +end + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/fieldnames.m b/inst/model/noise/@stk_gaussiannoise_het0/fieldnames.m new file mode 100644 index 0000000..b753172 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/fieldnames.m @@ -0,0 +1,33 @@ +% FIELDNAMES [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function fn = fieldnames (gn) %#ok + +fn = {'log_dispersion'; 'variance_function'; 'dispersion'}; + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/get.m b/inst/model/noise/@stk_gaussiannoise_het0/get.m new file mode 100644 index 0000000..905dbf9 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/get.m @@ -0,0 +1,49 @@ +% GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (gn, propname) + +switch propname + + case {'log_dispersion', 'variance_function'} + value = gn.(propname); + + case 'dispersion' + value = exp (gn.log_dispersion); + + otherwise + if ~ ischar (propname) + errmsg = 'Invalid property name.'; + else + errmsg = sprintf ('There is no field named %s.', propname); + end + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/set.m b/inst/model/noise/@stk_gaussiannoise_het0/set.m new file mode 100644 index 0000000..ee76002 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/set.m @@ -0,0 +1,65 @@ +% SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = set (gn, propname, value) + +% FIXME: Check value before setting + +switch propname + + case {'log_dispersion', 'variance_function'} + gn.(propname) = value; + + case 'dispersion' + gn.log_dispersion = log (value); + + otherwise + if ~ ischar (propname) + errmsg = 'Invalid property name.'; + else + errmsg = sprintf ('There is no field named %s.', propname); + end + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function + +%#ok<*CTCH,*LERR> + + +%!shared M_post +%! x_obs = (linspace (0, pi, 15))'; +%! z_obs = sin (x_obs); +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); +%! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); + +%!error value = get (M_post, 1.33); +%!error value = get (M_post, 'dudule'); +%!test value = get (M_post, 'prior_model'); diff --git a/inst/model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m b/inst/model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m new file mode 100644 index 0000000..555ba51 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m @@ -0,0 +1,73 @@ +% STK_GAUSSIANNOISE_HET0 [experimental] is an example of noise model +% +% CALL: GN = stk_gaussiannoise_het0 (VF, PHI) +% +% creates an heteroscedastic Gaussian noise model with variance function VF +% and dispersion PHI. The variance at location x is given by: +% +% tau^2 (x) = PHI * VF(x). +% +% OPTIMIZABLE PARAMETER: +% +% PARAM(1) = log (PHI) +% +% REMARK: +% +% The suffix "0" in the name of the class indicates that there are no +% additional hyperparameters in the definition of the variance function +% (in other words, the only hyperparameter is the dispersion). +% +% This class can be used as an example of how to create noise model objects +% by subclassing stk_gaussiannoise_. +% +% EXPERIMENTAL CLASS WARNING: The stk_gaussiannoise_het0 class is +% currently considered experimental. STK users who wish to experiment with +% it are welcome to do so, but should be aware that API-breaking changes +% are likely to happen in future releases. We invite them to direct any +% questions, remarks or comments about this experimental class to the STK +% mailing list. + +% Copyright Notice +% +% Copyright (C) 2018-2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = stk_gaussiannoise_het0 (variance_function, dispersion) + +if (nargin < 2) || (isempty (dispersion)) + log_dispersion = nan; % must be estimated + + if nargin == 0 + variance_function = @(x) 1.0; + end +else + log_dispersion = log (dispersion); +end + +gn.log_dispersion = log_dispersion; +gn.variance_function = variance_function; + +gn = class (gn, 'stk_gaussiannoise_het0', stk_gaussiannoise_ ()); + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/stk_get_optimizable_parameters.m b/inst/model/noise/@stk_gaussiannoise_het0/stk_get_optimizable_parameters.m new file mode 100644 index 0000000..ac84730 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_get_optimizable_parameters.m @@ -0,0 +1,33 @@ +% STK_GET_OPTIMIZABLE_PARAMETERS [overload STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = stk_get_optimizable_parameters (gn) + +value = gn.log_dispersion; + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/stk_param_getdefaultbounds.m b/inst/model/noise/@stk_gaussiannoise_het0/stk_param_getdefaultbounds.m new file mode 100644 index 0000000..b2ebf18 --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_param_getdefaultbounds.m @@ -0,0 +1,55 @@ +% STK_PARAM_GETDEFAULTBOUNDS [overload STK] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [lb, ub] = stk_param_getdefaultbounds (gn0, xi, zi) + +v = feval (gn0.variance_function, xi); + +b = (v > 0); +if ~ any (b) + stk_error (['The variance function is zero at all ' ... + 'observed locations'], 'VarianceFunctionNowherePositive'); +end + +% Keep only the noisy observations +u = zi(b); + +TOL = 0.5; + +% Bounds for log-dispersion parameter +tmp = mean ((u - mean (u)) .^ 2 ./ v(b)); +lb = log (tmp) - 50; % exp(50) is an arbitrary large number +ub = log (tmp) + TOL; + +% Make sure that the initial value(s) falls within the bounds +if ~ isnan (gn0.log_dispersion) + lb = min (lb, gn0.log_dispersion - TOL); + ub = max (ub, gn0.log_dispersion + TOL); +end + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/stk_set_optimizable_parameters.m b/inst/model/noise/@stk_gaussiannoise_het0/stk_set_optimizable_parameters.m new file mode 100644 index 0000000..6c2b61b --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_set_optimizable_parameters.m @@ -0,0 +1,54 @@ +% STK_SET_OPTIMIZABLE_PARAMETERS [overload STK internal] +% +% See also: stk_get_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function gn = stk_set_optimizable_parameters (gn, value) + +if isa (gn, 'stk_gaussiannoise_het0') + + if isa (value, 'stk_gaussiannoise_het0') + + gn.variance_function = value.variance_function; + gn.log_dispersion = value.log_dispersion; + + else + + % This form of assignment preserves the size and type of gn.log_dispersion + gn.log_dispersion(:) = value; + + end + +else + + stk_error (['The first input argument was expected to be an ' ... + 'object of class stk_gaussiannoise_het0'], 'TypeMismatch'); + +end + +end % function diff --git a/inst/model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m b/inst/model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m new file mode 100644 index 0000000..ced356f --- /dev/null +++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m @@ -0,0 +1,73 @@ +% STK_VARIANCE_EVAL [experimental] +% +% CALL: V = stk_variance_eval (NOISEMODEL, X, DIFF) +% +% EXPERIMENTAL FUNCTION WARNING +% +% This function is currently considered experimental, since the whole +% 'noise model classes' thing is. +% +% Classes derived from stk_gaussiannoise_ must implement this to define the +% value of the variance at any given point x. +% +% In the future, it might be a good idea to make such a function part of +% the "standard API" of all models in STK, together with similar +% functions such as: +% +% * M = stk_mean_eval (MODEL, X, DIFF) +% * V = stk_variance_eval (NOISEMODEL, X, DIFF) +% * Q = stk_quantile_eval (NOISEMODEL, X, DIFF) +% * ... +% +% STK users that wish to experiment with this function, and more +% generally with noise model objects, are welcome to do so, but should +% be aware that the API is very likely to change in the future. +% Please send questions, comments and suggestions about this part of the +% toolbox to the STK mailing list. + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function v = stk_variance_eval (gn, x, diff) + +% Defaut value for 'diff' (arg #3): -1 +if nargin < 3, diff = -1; end + +switch diff + case {-1, 1} + % -1 means "no derivative" + % +1 means "derivative wrt log_dispersion" + if isempty (x) + v = zeros (0, 1); + else + v = exp (gn.log_dispersion) ... + * feval (gn.variance_function, double (x)); + end + otherwise + stk_error ('diff should be either -1 or +1', 'IncorrectArgument'); +end + +end % function diff --git a/inst/model/prior_struct/stk_covmat_noise.m b/inst/model/prior_struct/stk_covmat_noise.m new file mode 100644 index 0000000..dacb7ce --- /dev/null +++ b/inst/model/prior_struct/stk_covmat_noise.m @@ -0,0 +1,199 @@ +% STK_COVMAT_NOISE [STK internal] +% +% CALL: [K, P1, P2] = stk_covmat_noise (M, X1, X2, DIFF, PAIRWISE) +% +% INTERNAL FUNCTION WARNING: +% This function is currently considered as internal: API-breaking changes are +% likely to happen in future releases. Please don't rely on it directly. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [K, P1, P2] = stk_covmat_noise (model, x1, x2, diff, pairwise) + +% Number of evaluations points +n1 = size (x1, 1); +if (nargin > 2) && (~ isempty (x2)) + n2 = size (x2, 1); + autocov = false; % In this case the result is zero +else + n2 = n1; + autocov = true; % In this case the result is a diagonal matrix +end + +% Defaut value for 'diff' (arg #4): -1 +if nargin < 4, diff = -1; end + +% Default value for 'pairwise' (arg #5): false +pairwise = (nargin > 4) && pairwise; +assert ((n1 == n2) || (~ pairwise)); + +if autocov && (diff ~= 0) && (stk_isnoisy (model)) + + if ~ isnumeric (model.lognoisevariance) + + % EXPERIMENTAL: User-defined noise variance models... + K = stk_covmat (model.lognoisevariance, x1, [], diff, pairwise); + + else % Classical STK noise variance representation(s) + + if isscalar (model.lognoisevariance) % Homoscedastic case + + % Note: the value of x1 is ignored in this case, which is normal. + % Only the size of x1 actually matters. + + % Currently there is only one parameter (lognoisevariance). + % This will change when we implement parameterized variance models... + if (diff ~= -1) && (diff ~= 1) + stk_error (['diff should be either -1 or +1 in the ' ... + 'homoscedastic case'], 'IncorrectArgument'); + end + + if pairwise + if model.lognoisevariance == -inf + K = zeros (n1, 1); + else + K = repmat (exp (model.lognoisevariance), n1, 1); + end + else + if model.lognoisevariance == -inf + K = zeros (n1); + else + K = (exp (model.lognoisevariance)) * (eye (n1)); + end + end + + else % Heteroscedastic + + % Old-style STK support for heteroscedasticity: the noise variances + % corresponding to the locations x1(1,:) to x1(end,:) are assumed to + % be stored in model.lognoisevariance (ugly). + + % FIXME: Flawed design... We assume that x1 is equal to the set of + % observation points. Since we cannot check it, x1 is *also* + % ignored in this case (which is much less normal...). + + s = size (model.lognoisevariance); + if ~ ((isequal (s, [1, n1])) || (isequal (s, [n1, 1]))) + fprintf ('lognoisevariance has size:\n'); display (s); + stk_error (sprintf (['lognoisevariance was expected to be either a ' ... + 'scalar or a vector of length %d\n'], n1), 'IncorrectSize'); + end + + % There are no parameters in this case + if diff ~= -1 + error ('diff ~= -1 is not allowed in the heteroscedastic case'); + end + + K = exp (model.lognoisevariance(:)); + if ~ pairwise + K = diag (exp (model.lognoisevariance)); + end + end + end + +else % Return a null matrix + + % There are several cases where we return a null matrix: + % a) autocov is false: we are actually computing a *cross*-covariance matrix + % b) diff = 0: derivative with respect to a parameter that does not modify + % the covariance matrix of the noise + % c) we are in the noiseless case. + + if pairwise + K = zeros (n1, 1); + else + K = zeros (n1, n2); + end + +end + + +%% Compute matrices for the linear part + +% No linear part for the 'noise' output: return empty matrices if required +if nargout > 1 + P1 = zeros (n1, 0); + + if nargout > 2 + P2 = zeros (n2, 0); + end +end + +end % function + + +%!shared model, model2, x1, x2, n1, n2, d, Ka, Kb, Kc, Pa, Pb, Pc, P1, P2, P3, K1, K2, K3 +%! n1 = 20; n2 = 10; d = 4; +%! model = stk_model (@stk_materncov52_aniso, d); +%! model.lm = stk_lm_affine; +%! model.param = log ([1.0; 2.1; 2.2; 2.3; 2.4]); +%! model2 = model; model2.lognoisevariance = log(0.01); +%! x1 = stk_sampling_randunif (n1, d); +%! x2 = stk_sampling_randunif (n2, d); + +%!error [KK, PP] = stk_covmat_noise (); +%!error [KK, PP] = stk_covmat_noise (model); + +%!test [Ka, Pa] = stk_covmat_noise (model, x1); % (1) +%!test [K1, P1] = stk_covmat_noise (model, x1, []); +%!test [K2, P2] = stk_covmat_noise (model, x1, [], -1); +%!test [K3, P3] = stk_covmat_noise (model, x1, [], -1, false); +%!assert (isequal (size (Ka), [n1 n1])); +%!assert (isequal (size (Pa), [n1 0])); +%!assert (isequal (P1, Pa) && (isequal (K1, Ka))) +%!assert (isequal (P2, Pa) && (isequal (K2, Ka))) +%!assert (isequal (P3, Pa) && (isequal (K3, Ka))) + +%!test [Kb, Pb] = stk_covmat_noise (model, x1, x1); % (2) +%!test [K1, P1] = stk_covmat_noise (model, x1, x1, -1); +%!test [K2, P2] = stk_covmat_noise (model, x1, x1, -1, false); +%!assert (isequal (size (Kb), [n1 n1])); +%!assert (isequal (size (Pb), [n1 0])); +%!assert (isequal (P1, Pb) && (isequal (K1, Kb))) +%!assert (isequal (P2, Pb) && (isequal (K2, Kb))) + +%!test [Kc, Pc] = stk_covmat_noise (model, x1, x2); % (3) +%!test [K1, P1] = stk_covmat_noise (model, x1, x2, -1); +%!test [K2, P2] = stk_covmat_noise (model, x1, x2, -1, false); +%!assert (isequal (size (Kc), [n1 n2])); +%!assert (isequal (size (Pc), [n1 0])); +%!assert (isequal (P1, Pc) && (isequal (K1, Kc))) +%!assert (isequal (P2, Pc) && (isequal (K2, Kc))) + +% In the noiseless case, (1) and (2) should give the same results +%!assert (isequal (Kb, Ka)); + +% In the noisy case, however... +%!test [Ka, Pa] = stk_covmat_noise (model2, x1); % (1') +%!test [Kb, Pb] = stk_covmat_noise (model2, x1, x1); % (2') +%!error assert (isequal (Kb, Ka)); + +% The second output depends on x1 only => should be the same for (1)--(3) +%!assert (isequal (Pa, Pb)); +%!assert (isequal (Pa, Pc)); diff --git a/inst/model/prior_struct/stk_get_input_data.m b/inst/model/prior_struct/stk_get_input_data.m new file mode 100644 index 0000000..f0477eb --- /dev/null +++ b/inst/model/prior_struct/stk_get_input_data.m @@ -0,0 +1,50 @@ +% STK_GET_INTPUT_DATA returns the input data of a model +% +% CALL: INPUT_DATA = stk_get_input_data (MODEL) +% +% returns the INPUT_DATA of the MODEL (which is empty if MODEL is +% a prior model). +% +% See also: stk_get_output_data, stk_get_prior_model + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function input_data = stk_get_input_data (model) + +stk_assert_model_struct (model); + +if isfield (model, 'dim') + + input_data = zeros (0, model.dim); + +else + + input_data = []; + +end + +end % function diff --git a/inst/model/prior_struct/stk_get_observation_variances.m b/inst/model/prior_struct/stk_get_observation_variances.m new file mode 100644 index 0000000..339fc1c --- /dev/null +++ b/inst/model/prior_struct/stk_get_observation_variances.m @@ -0,0 +1,41 @@ +% STK_GET_OBSERVATION_VARIANCES returns the variance of the observations +% +% CALL: V = stk_get_observation_variances (MODEL) +% +% returns the variance of the observations that have been used to build +% the MODEL. The result is empty if MODEL is a prior model. + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function v = stk_get_observation_variances (model) + +stk_assert_model_struct (model); + +% Ok, model is a prior model structure +v = []; + +end % function diff --git a/inst/model/prior_struct/stk_get_optimizable_model_parameters.m b/inst/model/prior_struct/stk_get_optimizable_model_parameters.m new file mode 100644 index 0000000..ce77533 --- /dev/null +++ b/inst/model/prior_struct/stk_get_optimizable_model_parameters.m @@ -0,0 +1,51 @@ +% STK_GET_OPTIMIZABLE_PARAMETERS [STK internal] +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. STK users that wish to +% experiment with parameter classes can already overload it, but should be +% aware that API-breaking changes are likely to happen in future releases. +% +% See also: stk_get_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2017 LNE +% +% Authors: Remi Stroh +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = stk_get_optimizable_model_parameters (model) + +stk_assert_model_struct (model); + +% Covariance parameters +covparam = stk_get_optimizable_parameters (model.param); + +% Noise parameters +noiseparam = stk_get_optimizable_noise_parameters (model); + +value = [covparam; noiseparam]; + +end % function diff --git a/inst/model/prior_struct/stk_get_optimizable_noise_parameters.m b/inst/model/prior_struct/stk_get_optimizable_noise_parameters.m new file mode 100644 index 0000000..6074a5d --- /dev/null +++ b/inst/model/prior_struct/stk_get_optimizable_noise_parameters.m @@ -0,0 +1,60 @@ +% STK_GET_OPTIMIZABLE_NOISE_PARAMETERS [STK internal] + +% Copyright Notice +% +% Copyright (C) 2018 CentraleSupelec +% Copyright (C) 2018 LNE +% +% Authors: Remi Stroh +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [noiseparam, isnoisy] = stk_get_optimizable_noise_parameters (model) + +stk_assert_model_struct (model); + +isnoisy = stk_isnoisy (model); + +if isnoisy + + noiseparam = model.lognoisevariance; + + if isnumeric (noiseparam) + + if ~ isscalar (noiseparam) + % Old-style heteroscedastic case: don't optimize + noiseparam = []; + end + + else % model.lognoisevariance is a parameter object + + noiseparam = stk_get_optimizable_parameters (noiseparam); + + end + +else + + noiseparam = []; + +end + +end % function diff --git a/inst/model/prior_struct/stk_get_output_data.m b/inst/model/prior_struct/stk_get_output_data.m new file mode 100644 index 0000000..39e3b28 --- /dev/null +++ b/inst/model/prior_struct/stk_get_output_data.m @@ -0,0 +1,42 @@ +% STK_GET_OUTPUT_DATA returns the output data of a model +% +% CALL: OUTPUT_DATA = stk_get_output_data (MODEL) +% +% returns the OUTPUT_DATA of the MODEL (which is empty if MODEL is +% a prior model). +% +% See also: stk_get_input_data, stk_get_prior_model + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function output_data = stk_get_output_data (model) + +stk_assert_model_struct (model); + +output_data = zeros (0, 1); + +end % function diff --git a/inst/model/prior_struct/stk_get_prior_model.m b/inst/model/prior_struct/stk_get_prior_model.m new file mode 100644 index 0000000..7819a0e --- /dev/null +++ b/inst/model/prior_struct/stk_get_prior_model.m @@ -0,0 +1,42 @@ +% STK_GET_PRIOR_MODEL returns the underlying prior model of a model +% +% CALL: PRIOR_MODEL = stk_get_prior_model (MODEL) +% +% returns the underlying PRIOR_MODEL of the MODEL (which is equal to MODEL +% itself if MODEL is a prior model). +% +% See also: stk_get_input_data, stk_get_output_data + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function prior_model = stk_get_prior_model (model) + +stk_assert_model_struct (model); + +prior_model = model; + +end % function diff --git a/inst/model/prior_struct/stk_isnoisy.m b/inst/model/prior_struct/stk_isnoisy.m new file mode 100644 index 0000000..6c15ae5 --- /dev/null +++ b/inst/model/prior_struct/stk_isnoisy.m @@ -0,0 +1,73 @@ +% STK_ISNOISY returns false for noiseless models, true otherwise +% +% CALL: ISNOISY = stk_isnoisy (MODEL) +% +% returns false for a noiseless MODEL and true otherwise. +% +% MODEL is considered noiseless if: +% +% * MODEL.lognoisevariance is missing or empty (for backward compatibility +% with previous versions of STK where the lognoisevariance field was +% optional), +% +% * MODEL.lognoisevariance is equal to -inf (this is the default for a +% model created by stk_model and the currently recommended way to declare +% a noiseless model), +% +% * MODEL.lognoisevariance is a vector of -inf (heteroscedastic case with +% all variances set to zero). +% +% REMARK: Variance model objects +% +% Note that in the case where MODEL.lognoisevariance is an object, the MODEL +% is automatically considered noisy, even when the parameters of the variance +% model are set (or can be set) to values such that the noise variance +% function vanishes. +% +% See also: stk_model + +% Copyright Notice +% +% Copyright (C) 2016-2018, 2020 CentraleSupelec +% Copyright (C) 2017-2018 LNE +% +% Authors: Julien Bect +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function b = stk_isnoisy (model) + +if (~ isfield (model, 'lognoisevariance')) || (isempty (model.lognoisevariance)) + + % Backward compatiblity: accept model structures with missing + % lognoisevariance, and consider them as noiseless models + + b = false; + +else + + b = ~ (isnumeric (model.lognoisevariance) ... + && (all (model.lognoisevariance == - inf))); + +end + +end % function diff --git a/inst/model/prior_struct/stk_model.m b/inst/model/prior_struct/stk_model.m new file mode 100644 index 0000000..1437115 --- /dev/null +++ b/inst/model/prior_struct/stk_model.m @@ -0,0 +1,195 @@ +% STK_MODEL generates a model with default covariance parameters +% +% CALL: MODEL = stk_model () +% +% returns a structure MODEL (see below for a description of the fields in such +% a structure) corresponding to one-dimensional Gaussian process prior with a +% constant but unknown mean ("ordinary" kriging) and a stationary Matern +% covariance function. +% +% CALL: MODEL = stk_model (COVARIANCE_TYPE) +% +% uses the user-supplied COVARIANCE_TYPE instead of the default. +% +% CALL: MODEL = stk_model (COVARIANCE_TYPE, DIM) +% +% creates a DIM-dimensional model. Note that, for DIM > 1, anisotropic +% covariance functions are provided with default parameters that make them +% isotropic. +% +% In STK, a Gaussian process model is described by a 'model' structure, +% which has mandatory fields and optional fields. +% +% MANDATORY FIELDS: covariance_type, param, lm, lognoisevariance +% OPTIONAL FIELD: param_prior, noise_prior +% +% See also stk_materncov_iso, stk_materncov_aniso, ... + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function model = stk_model (covariance_type, varargin) + +% Extract a handle and a name from what we are given +if nargin > 0 + if isa (covariance_type, 'function_handle') + covariance_name = func2str (covariance_type); + elseif ischar (covariance_type) + covariance_name = covariance_type; + covariance_type = str2func (covariance_type); + else + stk_error (['covariance_type should be a function name '... + 'or a handle to a function.'], 'TypeMismatch'); + end +else + covariance_type = @stk_materncov_iso; + covariance_name = 'stk_materncov_iso'; +end + +if strcmp (covariance_name, 'stk_discretecov') + + % special case: build a discrete model + model = stk_model_discretecov (varargin{:}); + +else + + % general case + model = stk_model_ (covariance_type, varargin{:}); + +end + +end % function + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% stk_model_discretecov %%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function model_out = stk_model_discretecov (model_base, x) + +% Make sure that lognoisevariance is -inf for noiseless models +if ~ stk_isnoisy (model_base) + model_base.lognoisevariance = -inf; +end + +[K, P] = stk_make_matcov (model_base, x, x); + +model_out = struct ( ... + 'covariance_type', 'stk_discretecov', ... + 'param', struct ('K', K, 'P', P)); + +if ~ isscalar (model_base.lognoisevariance) + error ('This case is not supported.'); +else + model_out.lognoisevariance = model_base.lognoisevariance; +end + +end % function + + +%%%%%%%%%%%%%%%%%% +%%% stk_model_ %%% +%%%%%%%%%%%%%%%%%% + +function model = stk_model_ (covariance_type, dim) + +model = struct(); + +model.covariance_type = covariance_type; + +% use ordinary kriging as a default choice +model.lm = stk_lm_constant (); + +% default dimension is d = 1 +if nargin < 2 + model.dim = 1; +else + model.dim = dim; +end + +model.param = []; % Make it pass stk_assert_model_struct +try + model.param = stk_param_init (model); +catch + warning (lasterr ()); +end + +model.lognoisevariance = - inf; + +end % function + + +%!test model = stk_model (); + +%!test model = stk_model (@stk_expcov_iso); +%!test model = stk_model (@stk_expcov_iso, 1); +%!test model = stk_model (@stk_expcov_iso, 3); + +%!test model = stk_model (@stk_expcov_aniso); +%!test model = stk_model (@stk_expcov_aniso, 1); +%!test model = stk_model (@stk_expcov_aniso, 3); + +%!test model = stk_model (@stk_materncov_iso); +%!test model = stk_model (@stk_materncov_iso, 1); +%!test model = stk_model (@stk_materncov_iso, 3); + +%!test model = stk_model (@stk_materncov_aniso); +%!test model = stk_model (@stk_materncov_aniso, 1); +%!test model = stk_model (@stk_materncov_aniso, 3); + +%!test model = stk_model (@stk_materncov32_iso); +%!test model = stk_model (@stk_materncov32_iso, 1); +%!test model = stk_model (@stk_materncov32_iso, 3); + +%!test model = stk_model (@stk_materncov32_aniso); +%!test model = stk_model (@stk_materncov32_aniso, 1); +%!test model = stk_model (@stk_materncov32_aniso, 3); + +%!test model = stk_model (@stk_materncov52_iso); +%!test model = stk_model (@stk_materncov52_iso, 1); +%!test model = stk_model (@stk_materncov52_iso, 3); + +%!test model = stk_model (@stk_materncov52_aniso); +%!test model = stk_model (@stk_materncov52_aniso, 1); +%!test model = stk_model (@stk_materncov52_aniso, 3); + +%!test model = stk_model (@stk_gausscov_iso); +%!test model = stk_model (@stk_gausscov_iso, 1); +%!test model = stk_model (@stk_gausscov_iso, 3); + +%!test model = stk_model (@stk_gausscov_aniso); +%!test model = stk_model (@stk_gausscov_aniso, 1); +%!test model = stk_model (@stk_gausscov_aniso, 3); + +%!test model = stk_model (@stk_sphcov_iso); +%!test model = stk_model (@stk_sphcov_iso, 1); +%!test model = stk_model (@stk_sphcov_iso, 3); + +%!test model = stk_model (@stk_sphcov_aniso); +%!test model = stk_model (@stk_sphcov_aniso, 1); +%!test model = stk_model (@stk_sphcov_aniso, 3); diff --git a/inst/model/prior_struct/stk_model_fixlm.m b/inst/model/prior_struct/stk_model_fixlm.m new file mode 100644 index 0000000..f198389 --- /dev/null +++ b/inst/model/prior_struct/stk_model_fixlm.m @@ -0,0 +1,79 @@ +% STK_MODEL_FIXLM [STK internal] +% +% This internal STK function ensures backward compatiblity for model structures +% with a .order field. + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function model = stk_model_fixlm (model) + +if isfield (model, 'lm') % Modern style: .lm field + + if isfield (model, 'order') + + % If model.order is also present, it should be NaN + if ~ isnan (model.order) + + % We also tolerate the case where model.order is compatible with + % model.lm (i.e., model.lm is a polynomial trend object, with the + % appropriate degree. + if ((model.order == -1) && (isa (model.lm, 'stk_lm_null'))) ... + || ((model.order == 0) && (isa (model.lm, 'stk_lm_constant'))) ... + || ((model.order == 1) && (isa (model.lm, 'stk_lm_affine'))) ... + || ((model.order == 2) && (isa (model.lm, 'stk_lm_quadratic'))) ... + || ((model.order == 3) && (isa (model.lm, 'stk_lm_cubic'))) + + model.order = nan; + + else + + stk_error (sprintf (['Invalid model structure: both ' ... + 'model.lm and model.order are present, and their ' ... + 'values are not compatible.\nThe ''.order'' field ' ... + 'is deprecated, please consider using ''.lm'' only.']), ... + 'InvalidArgument'); + + end + + end % if ~ isnan (model.order) + + model = rmfield (model, 'order'); + + end % if isfield (model.order) + +elseif isfield (model, 'order') % Old style: .order field only + + model.lm = stk_lm_polynomial (model.order); + model = rmfield (model, 'order'); + +else % Assume constant mean when neither .order nor .lm is present + + model.lm = stk_lm_constant (); + +end + +end % function diff --git a/inst/model/prior_struct/stk_ortho_func.m b/inst/model/prior_struct/stk_ortho_func.m new file mode 100644 index 0000000..c8febeb --- /dev/null +++ b/inst/model/prior_struct/stk_ortho_func.m @@ -0,0 +1,105 @@ +% STK_ORTHO_FUNC [deprecated] +% +% CALL: P = stk_ortho_func (MODEL, X) +% +% computes the design matrix for the linear part of model MODEL at the set of +% evaluation points X. In general (see special case below), X is expected to +% be a structure, whose field 'a' contains the actual numerical data as an N +% x DIM matrix, where N is the number of evaluation points and and DIM the +% dimension of the space of factors. A matrix P of size N x L is returned, +% where L is the number of regression functions in the linear part of the +% model; e.g., L = 1 if MODEL.order is zero (ordinary kriging). +% +% DEPRECATION WARNINGS: +% +% The use of a .order field in model structures is deprecated and will be +% removed in a future release of STK. The recommended approach is now to use +% a .lm field, which contains a function handle or any object that behaves +% like one (see stk_lm_*). +% +% stk_orth_func is deprecated and will be removed from future versions of +% STK (http://sourceforge.net/p/kriging/tickets/12). +% +% See also stk_make_matcov + +% Copyright Notice +% +% Copyright (C) 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function P = stk_ortho_func (model, x) + +x = double (x); + +if strcmp (model.covariance_type, 'stk_discretecov') + + P = model.param.P(x, :); + +else % General case + + % Ensure backward compatiblity + model = stk_model_fixlm (model); + + P = feval (model.lm, x); + +end + +end % function + + +%!shared model, x, n, d +%! n = 15; d = 4; +%! model = stk_model (@stk_materncov_aniso, d); +%! x = stk_sampling_randunif (n, d); +%! model = rmfield (model, 'lm'); % Test the old .order approach + +%!error P = stk_ortho_func (); +%!error P = stk_ortho_func (model); +%!test P = stk_ortho_func (model, x); + +%!test +%! model.order = -1; P = stk_ortho_func (model, x); +%! assert (isequal (size (P), [n, 0])); + +%!test +%! model.order = 0; P = stk_ortho_func (model, x); +%! assert (isequal (size (P), [n, 1])); + +%!test +%! model.order = 1; P = stk_ortho_func (model, x); +%! assert (isequal (size (P), [n, d + 1])); + +%!test +%! model.order = 2; P = stk_ortho_func (model, x); +%! assert (isequal (size (P), [n, 1 + d * (d + 3) / 2])); + +%!test +%! model.order = 3; P = stk_ortho_func (model, x); +%! assert (isequal (size (P), [n, 1 + d * (11 + d * (6 + d)) / 6])); + +%!error +%! model.order = 4; P = stk_ortho_func (model, x); +%! % model.order > 3 is not allowed diff --git a/inst/model/prior_struct/stk_predict_.m b/inst/model/prior_struct/stk_predict_.m new file mode 100644 index 0000000..8f05133 --- /dev/null +++ b/inst/model/prior_struct/stk_predict_.m @@ -0,0 +1,76 @@ +% STK_PREDICT_ [STK internal] +% +% See also: stk_predict + +% Copyright Notice +% +% Copyright (C) 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [zp, lambda, mu, K] = stk_predict_ (model, xt) + +% If we end up here, model must be a prior model struct (as opposed to a +% model object). Better safe than sorry: +stk_assert_model_struct (model); + +nt = stk_get_sample_size (xt); + +% Is it a proper or an improper prior? +model = stk_model_fixlm (model); +if isa (model.lm, 'stk_lm_null') + % Proper prior (currently, zero-mean only) + zp_mean = zeros (nt, 1); +else + % Improper prior + zp_mean = nan (nt, 1); +end + +if nargout > 3 + K = stk_make_matcov (model, xt, xt, false); + zp_var = diag (K); +else + zp_var = stk_make_matcov (model, xt, xt, true); +end + +zp = stk_dataframe ([zp_mean zp_var], {'mean' 'var'}); + +if nargout > 1 % We want lambda + + % lambda must be n x nt, with n the sample size (here n = 0) + lambda = zeros (0, nt); + + if nargout > 2 % We want mu as well + + % UGLY: we have no cleaner way to find the dimension... + x_ = xt(1, :); + [K_ignore, P] = stk_make_matcov (model, x_, x_); %#ok + r = size (P, 2); + + % mu must be r x nt, and setting it to zero in this case makes + % sense because the posterior variance formula remains valid + mu = zeros (r, nt); + end +end + +end % function diff --git a/inst/model/prior_struct/stk_set_optimizable_model_parameters.m b/inst/model/prior_struct/stk_set_optimizable_model_parameters.m new file mode 100644 index 0000000..488b9e8 --- /dev/null +++ b/inst/model/prior_struct/stk_set_optimizable_model_parameters.m @@ -0,0 +1,72 @@ +% STK_SET_OPTIMIZABLE_PARAMETERS [STK internal] +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. STK users that wish to +% experiment with parameter classes can already overload it, but should be +% aware that API-breaking changes are likely to happen in future releases. +% +% See also: stk_set_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2017 LNE +% +% Authors: Remi Stroh +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function model = stk_set_optimizable_model_parameters (model, value) + +stk_assert_model_struct (model); + +% Covariance parameters +covparam = stk_get_optimizable_parameters (model.param); +covparam_size = length (covparam); + +% Noise parameters +noiseparam = stk_get_optimizable_noise_parameters (model); +noiseparam_size = length (noiseparam); + +total_size = covparam_size + noiseparam_size; + +% Check length of value +if numel (value) ~= total_size + stk_error (['The length of ''value'' must be equal to ' ... + 'the number of parameters.'], 'IncorrectSize'); +end + +% Change covariance parameter +if covparam_size > 0 + covparam = value(1:covparam_size); + model.param = stk_set_optimizable_parameters (model.param, covparam); +end + +% Change noise variance parameter +if noiseparam_size > 0 + noiseparam = value(covparam_size + (1:noiseparam_size)); + model.lognoisevariance = stk_set_optimizable_parameters ... + (model.lognoisevariance, noiseparam); +end + +end % function diff --git a/inst/param/classes/stk_get_optimizable_parameters.m b/inst/param/classes/stk_get_optimizable_parameters.m new file mode 100644 index 0000000..12ced2f --- /dev/null +++ b/inst/param/classes/stk_get_optimizable_parameters.m @@ -0,0 +1,88 @@ +% STK_GET_OPTIMIZABLE_PARAMETERS [STK internal] +% +% CALL: VALUE = stk_get_optimizable_parameters (PARAM) +% +% returns the value of the 'optimizable_parameters' property of PARAM. +% +% NOTE: +% +% Numerical arrays are considered as a special kind of parameter object, for +% which the 'optimizable_parameters' property is taken to be PARAM(:). +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. STK users that wish to +% experiment with parameter classes can already overload it, but should be +% aware that API-breaking changes are likely to happen in future releases. +% +% See also: stk_set_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2016-2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = stk_get_optimizable_parameters (arg1) + +% This function will catch all calls to stk_get_optimizable_parameters for which +% arg1 is not an object of a class that implements stk_get_optimizable_parameters. + +if isstruct (arg1) + + if isfield (arg1, 'K') && isfield (arg1, 'P') + + % A very special case: parameter structure of a discrete covariance model + value = []; + + else + + % Assuming that arg1 is a model structure: + value = stk_get_optimizable_model_parameters (arg1); + + end + +else + + if isnumeric (arg1) + + param = arg1; + + else + + % Extract parameter values + param = arg1(:); + + % Note: if param is an object, the previous line is actually a call to + % subsref in disguise. This way of supporting parameter objects has + % been introduced in STK 2.0.0 as an "experimental" feature. It is now + % deprecated. + + end % if + + % Make sure that the result is a column vector + value = param(:); + +end + +end % function diff --git a/inst/param/classes/stk_set_optimizable_parameters.m b/inst/param/classes/stk_set_optimizable_parameters.m new file mode 100644 index 0000000..bd3a79b --- /dev/null +++ b/inst/param/classes/stk_set_optimizable_parameters.m @@ -0,0 +1,81 @@ +% STK_SET_OPTIMIZABLE_PARAMETERS [STK internal] +% +% CALL: PARAM = stk_set_optimizable_parameters (PARAM, VALUE) +% +% sets to VALUE the 'optimizable_parameters' property of PARAM. The argument +% VALUE is expected to be a numerical vector of the appropriate length. +% +% NOTE: +% +% Numerical arrays are considered as a special kind of parameter object, for +% which the 'optimizable_parameters' property is taken to be PARAM(:). +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. STK users that wish to +% experiment with parameter classes can already overload it, but should be +% aware that API-breaking changes are likely to happen in future releases. +% +% See also: stk_get_optimizable_parameters + +% Copyright Notice +% +% Copyright (C) 2016-2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function param = stk_set_optimizable_parameters (param, value) + +% This function will catch all calls to stk_set_optimizable_parameters for which +% arg1 is not an object of a class that implements stk_set_optimizable_parameters. + +if isstruct (param) + + if isfield (param, 'K') && isfield (param, 'P') + + % A very special case: parameter structure of a discrete covariance model + if ~ isempty (value) + stk_error (['Discrete covariance structures have no ' ... + 'optimizable parameters.'], 'InvalidArgument'); + end + + else + + % Assuming that param is a model structure: + param = stk_set_optimizable_model_parameters (param, value); + + end + +else + + % If param is numeric, the following syntax preserves its size and type + param(:) = value; + + % Note: if param is an object, what we just did is actually a call to + % subsasgn in disguise. This way of supporting parameter objects has been + % introduced in STK 2.0.0 as an "experimental" feature. It is now + % deprecated; overload stk_set_optimizable_parameters () instead. + +end % if + +end % function diff --git a/inst/param/estim/stk_param_estim.m b/inst/param/estim/stk_param_estim.m new file mode 100644 index 0000000..5ba29d6 --- /dev/null +++ b/inst/param/estim/stk_param_estim.m @@ -0,0 +1,304 @@ +% STK_PARAM_ESTIM estimates the parameters of a covariance function +% +% CALL: PARAM = stk_param_estim (MODEL, XI, YI, PARAM0) +% CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI, PARAM0) +% +% estimates the parameters PARAM of the covariance function in MODEL +% from the data (XI, YI) using the restricted maximum likelihood (ReML) +% method. The value PARAM0 is used as a starting point for local +% optimization. +% +% The observations are assumed to be noisy if MODEL.lognoisevariance is +% not -inf. In this case, the variance of the noise is estimated if +% MODEL.lognoisevariance is nan, and assumed known otherwise. The +% estimated log-variance is returned as the second output argument LNV +% (equal to MODEL.lognoisevariance when it is assumed to be known). +% +% CALL: PARAM = stk_param_estim (MODEL, XI, YI) +% CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI) +% +% does the same thing but uses stk_param_init to provide a starting value +% automatically. +% +% CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI, PARAM0, LNV0) +% +% additionally provides an initial guess LNV0 for the logarithm of the +% noise variance. In this case the observations are automatically assumed +% to be noisy, and the value of MODEL.lognoisevariance is ignored. +% +% CALL: PARAM = stk_param_estim (MODEL, XI, YI, PARAM0, [], CRIT) +% CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI, PARAM0, LNV0, CRIT) +% +% uses the estimation criterion CRIT instead of the default ReML criterion. +% +% EXAMPLES: see, e.g., stk_example_kb02, stk_example_kb03, stk_example_kb04, +% stk_example_kb06, stk_example_misc02 + +% Copyright Notice +% +% Copyright (C) 2015-2018, 2020 CentraleSupelec +% Copyright (C) 2017 LNE +% Copyright (C) 2014 A. Ravisankar +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Ashwin Ravisankar +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [param_opt, lnv_opt, info] = stk_param_estim ... + (model, xi, zi, param0, lnv0, criterion) + +stk_assert_model_struct (model); +% FIXME: Implement stk_param_estim for noise priors too + +% Empty is the same as 'not provided' +if nargin < 6 + criterion = []; + if nargin < 5 + lnv0 = []; + if nargin < 4 + param0 = []; + end + end +end + +% Size checking: xi, zi +zi_data = double (zi); +if ~ isequal (size (zi_data), [stk_get_sample_size(xi) 1]) + errmsg = 'zi should be a column, with the same number of rows as xi.'; + stk_error (errmsg, 'IncorrectSize'); +end + +% Warn about special case: constant response +if (std (zi_data) == 0) + warning ('STK:stk_param_estim:ConstantResponse', ['Constant-response ' ... + 'data: the output of stk_param_estim is likely to be unreliable.']); +end + +% Make sure that lognoisevariance is -inf for noiseless models +if ~ stk_isnoisy (model) + model.lognoisevariance = -inf; +end + +% Default criterion: restricted likelihood (ReML method) +if isempty (criterion) + criterion = @stk_param_relik; +end + +% Make sure that we have a starting point in (param0, lnv0) +[param0, lnv0, do_estim_lnv] = provide_starting_point (model, xi, zi, param0, lnv0); + +% Set the starting point +model.param = param0; +model.lognoisevariance = lnv0; + +% Get selectors +select = stk_param_getblockselectors (model); +covparam_select = select{1}; +noiseparam_select = select{2} & do_estim_lnv; + +% NOTE ABOUT SELECTOrS / NaNs +% The situation is currently a little odd, with a focus on estimating +% covariance hyperparameters inherited from STK's history. More precisely: +% * the 'linear model' part is not allowed to have (nonlinear) hyperparameters; +% * the hyperparameters of the covariance function are automatically estimated +% (all of them), regardless of whether there are NaNs or not in model.param; +% * the hyperparameters of the noise variance function are estimated (all of +% them) if there are NaNs in the vector OR if lnv0 is provided. Note that +% only the case where lnv is a numerical scalar is currently documented. +% Also, note that all hyperparameters are estimated, even if only some of +% them are NaNs. +% FIXME: Clarify this confusing situation... + +% Call optimization routine +if nargout > 2 + [model_opt, info] = stk_param_estim_optim ... + (model, xi, zi, criterion, covparam_select, noiseparam_select); +else + model_opt = stk_param_estim_optim ... + (model, xi, zi, criterion, covparam_select, noiseparam_select); +end + +param_opt = model_opt.param; +lnv_opt = model_opt.lognoisevariance; + +end % function + +%#ok<*CTCH,*LERR,*SPWRN,*WNTAG> + + +function [param0, lnv0, do_estim_lnv] = provide_starting_point ... + (model, xi, zi, param0, lnv0) + +% If param0 is not empty, it means that the user has provided +% a starting point, in which case we must use it. +if ~ isempty (param0) + + % Test if param0 contains NaNs of Infs + assert_is_finite (param0, 'param0'); + % Cast to the appropriate type + if isnumeric (param0) + param0 = stk_set_optimizable_parameters (model.param, param0); + end + + % Now take care of lnv0. + % Same rule: if not empty, we have a user-provided starting point. + if isempty (lnv0) + % When lnv0 is not provided, noise variance estimation happens when lnv has NaNs. + do_estim_lnv = any (isnan (stk_get_optimizable_noise_parameters (model))); + if do_estim_lnv + % We have a user-provided starting point for param0 but not for lnv0. + model.param = param0; + lnv0 = stk_param_init_lnv (model, xi, zi); + else + lnv0 = model.lognoisevariance; + end + else + % When lnv0 is provided, noise variance *must* be estimated + do_estim_lnv = true; + % Test if lnv0 contains NaNs of Infs + assert_is_finite (lnv0, 'lnv0'); + % Cast lnv0 to a variable of the appropriate type (numeric or object) + lnv0 = stk_set_optimizable_parameters (model.lognoisevariance, lnv0); + end + +else % Otherwise, try stk_param_init to get a starting point + + if isempty (lnv0) + % If needed, stk_param_init will also provide a starting point for lnv0 + % (This is triggered by the presence of NaNs.) + do_estim_lnv = any (isnan (stk_get_optimizable_noise_parameters (model))); + else + % When lnv0 is provided, noise variance *must* be estimated + do_estim_lnv = true; + % Test if lnv0 contains NaNs of Infs + assert_is_finite (lnv0, 'lnv0'); + % Cast to the appropriate type + if isnumeric (lnv0) + lnv0 = stk_set_optimizable_parameters (model.lognoisevariance, param0); + end + % Install lnv0 in the model + model.lognoisevariance = lnv0; + end + + [param0, lnv0] = stk_param_init (model, xi, zi); + +end % if + +end % function + + +function assert_is_finite (param, param_name) + +% Check that there are no NaNs or Infs +param_ = stk_get_optimizable_parameters (param); +if ~ all (isfinite (param_)) + stk_error (sprintf (['Incorrect value for input argument %s. The components ' ... + 'of the starting point must be neither infinite nor NaN.'], param_name), ... + 'InvalidArgument'); +end + +end % function + + +function select = stk_param_getblockselectors (model) + +stk_assert_model_struct (model); + +select = cell (2, 1); + +% Covariance parameters +covparam = stk_get_optimizable_parameters (model.param); +covparam_size = length (covparam); +select{1} = true (covparam_size, 1); + +% Noise parameters +noiseparam = stk_get_optimizable_noise_parameters (model); +noiseparam_size = length (noiseparam); +select{2} = true (noiseparam_size, 1); + +end % function + + +%!shared f, xi, zi, NI, param0, param1, model +%! +%! f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x)) ); +%! DIM = 1; NI = 20; box = [-1.0; 1.0]; +%! xi = stk_sampling_regulargrid (NI, DIM, box); +%! +%! SIGMA2 = 1.0; % variance parameter +%! NU = 4.0; % regularity parameter +%! RHO1 = 0.4; % scale (range) parameter +%! param0 = log ([SIGMA2; NU; 1/RHO1]); +%! +%! model = stk_model (@stk_materncov_iso); + +%!test % noiseless +%! zi = stk_feval (f, xi); +%! param1 = stk_param_estim (model, xi, zi, param0); +%! assert (isequal (size (param1), size (param0))) + +% We cannot assume a DETERMINISTIC optimization algorithm +% (for some reason, Octave's sqp is not exactly deterministic) + +%!test % same thing, with empty lnv0 (ok) +%! param2 = stk_param_estim (model, xi, zi, param0, []); +%! assert (stk_isequal_tolrel (param2, param1, 1e-2)) + +%!error % same thing, with lnv0 == NaN (not ok as a starting point) +%! param2 = stk_param_estim (model, xi, zi, param0, nan); + +%!error % same thing, with lnv0 == -inf (not ok as a starting point) +%! param2 = stk_param_estim (model, xi, zi, param0, -inf); + +%!test % same thing, with explicit value for 'criterion' +%! param2 = stk_param_estim (model, xi, zi, param0, [], @stk_param_relik); +%! assert (stk_isequal_tolrel (param1, param2, 1e-2)) + +%!test % noiseless +%! zi = stk_feval (f, xi); +%! param1 = stk_param_estim (model, xi, zi, param0); +%! param2 = stk_param_estim (model, xi, zi, param0, [], @stk_param_relik); +%! % We cannot assume a DETERMINISTIC optimization algorithm +%! % (for some reason, Octave's sqp is not exactly deterministic) +%! assert (stk_isequal_tolrel (param1, param2, 1e-2)) + +%!test % noisy +%! NOISE_STD_TRUE = 0.1; +%! NOISE_STD_INIT = 1e-5; +%! zi = zi + NOISE_STD_TRUE * randn(NI, 1); +%! model.lognoisevariance = 2 * log(NOISE_STD_INIT); +%! [param, lnv] = stk_param_estim ... +%! (model, xi, zi, param0, model.lognoisevariance); + +% Incorrect number of input arguments +%!error param = stk_param_estim () +%!error param = stk_param_estim (model); +%!error param = stk_param_estim (model, xi); + +%!test % Constant response +%! model = stk_model (@stk_materncov52_iso); +%! n = 10; x = stk_sampling_regulargrid (n, 1, [0; 1]); z = ones (size (x)); +%! param = stk_param_estim (model, x, z); +%! assert ((all (isfinite (param))) && (length (param) == 2)); diff --git a/inst/param/estim/stk_param_estim_optim.m b/inst/param/estim/stk_param_estim_optim.m new file mode 100644 index 0000000..b3a4e8f --- /dev/null +++ b/inst/param/estim/stk_param_estim_optim.m @@ -0,0 +1,148 @@ +% STK_PARAM_ESTIM_OPTIMIZE [STK internal] +% +% INTERNAL FUNCTION WARNING: +% +% This function is currently considered as internal. API-breaking +% changes are very likely to happen in future releases. + +% Copyright Notice +% +% Copyright (C) 2015-2020 CentraleSupelec +% Copyright (C) 2014 Ashwin Ravisankar +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [model_opt, info] = stk_param_estim_optim ... + (model0, xi, zi, criterion, covparam_select, noiseparam_select) + +select = [covparam_select; noiseparam_select]; + +% Starting point +v0 = stk_get_optimizable_parameters (model0); +w0 = v0(select); + +% Bounds +% FIXME: this could (should) be implemented directly for models +[covparam_lb, covparam_ub] = stk_param_getdefaultbounds (model0.covariance_type, model0.param, xi, zi); +[covparam_lb, covparam_ub] = select_bounds (covparam_lb, covparam_ub, covparam_select); +[noiseparam_lb, noiseparam_ub] = stk_param_getdefaultbounds_lnv (model0, model0.lognoisevariance, xi, zi); +[noiseparam_lb, noiseparam_ub] = select_bounds (noiseparam_lb, noiseparam_ub, noiseparam_select); +lb = [covparam_lb; noiseparam_lb]; +ub = [covparam_ub; noiseparam_ub]; + +% Define objective function +f = @(v)(crit_wrapper (model0, v, xi, zi, criterion, covparam_select, noiseparam_select)); + +bounds_available = (~ isempty (lb)) && (~ isempty (ub)); + +% Sanity check +crit0 = f (w0); +if ~ (isscalar (crit0) && isfinite (crit0)) + errmsg = '*** PANIC: crit0 is not a finite scalar value. ***'; + stk_error (errmsg, 'OptimizationFailure'); +end + +if bounds_available + A = stk_options_get ('stk_param_estim', 'minimize_box'); + [w_opt, crit_opt] = stk_minimize_boxconstrained (A, f, w0, lb, ub); +else + A = stk_options_get ('stk_param_estim', 'minimize_unc'); + [w_opt, crit_opt] = stk_minimize_unconstrained (A, f, w0); +end + +% Create 'model_opt' output +if crit_opt < crit0 + v_opt = v0; + v_opt(select) = w_opt; + model_opt = stk_set_optimizable_parameters (model0, v_opt); +else + s1 = 'Something went wrong during the optimization'; + s2 = sprintf ('crit0 = %f, crit_opt = %f: crit0 < crit_opt', crit0, crit_opt); + warning (sprintf ('%s\n%s\n', s1, s2)); % FIXME: warning id + model_opt = model0; +end + +% Create 'info' structure, if requested +if nargout > 1 + info.criterion = criterion; + info.crit_opt = crit_opt; + info.starting_point = w0; + info.final_point = w_opt; + info.lower_bounds = lb; + info.upper_bounds = ub; + info.param_select = covparam_select; + info.noiseparam_select = noiseparam_select; +end + +end % function + +%#ok<*CTCH,*LERR,*SPWRN,*WNTAG> + + +function [C, dC] = crit_wrapper ... + (model, w, xi, zi, criterion, covparam_select, noise_select) + +v = stk_get_optimizable_parameters (model); +v([covparam_select; noise_select]) = w; +model = stk_set_optimizable_parameters (model, v); + +if nargout == 1 + + % Compute only the value of the criterion + C = criterion (model, xi, zi); + +elseif any (noise_select) + + % Compute the value of the criterion and the gradients + % FIXME: We might be computing a lot of derivatives that we don't really need... + [C, dC_param, dC_lnv] = criterion (model, xi, zi); + + dC = [dC_param(covparam_select); dC_lnv(noise_select)]; + +else + + % Compute the value of the criterion and the gradients + % FIXME: We might be computing a lot of derivatives that we don't really need... + [C, dC_param] = criterion (model, xi, zi); + + dC = dC_param(covparam_select); + +end + +end % function + + +function [lb, ub] = select_bounds (lb, ub, select) + +if ~ isempty (lb) + lb = lb(select); +end + +if ~ isempty (ub) + ub = ub(select); +end + +end % function diff --git a/inst/param/estim/stk_param_getdefaultbounds.m b/inst/param/estim/stk_param_getdefaultbounds.m new file mode 100644 index 0000000..ba66b39 --- /dev/null +++ b/inst/param/estim/stk_param_getdefaultbounds.m @@ -0,0 +1,152 @@ +% STK_PARAM_GETDEFAULTBOUNDS provides lower/upper bounds for covariance parameters +% +% CALL: [LB, UB] = stk_param_getdefaultbounds (COVARIANCE_TYPE, PARAM0, XI, ZI) +% +% returns lower bounds LB and upper bounds UB for the optimization of the +% parameters of a parameterized covariance function COVARIANCE_TYPE, given +% the starting point PARAM0 of the optimization and the data (XI, ZI). +% +% NOTE: user-defined covariance functions +% +% For user-defined covariance functions, lower/upper bounds can be provided +% using one of the following two approaches: +% +% a) if the covariance uses a dedicated class C for parameter values, +% the prefered approach is to imlement stk_param_getdefaultbounds for +% this class; +% +% b) otherwise, for a covariance function named mycov, simply provide a +% function named mycov_defaultbounds. + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2015 LNE +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [lb, ub] = stk_param_getdefaultbounds (covariance_type, param0, xi, zi) + +if isobject (param0) + + % param0 is an object from a class that does not implement + % stk_param_getdefaultbounds (otherwise we wouldn't have ended up here). + % We assume that this is a choice of the designer of the parameter class, + % and therefore return [] without a warning. + + lb = []; + ub = []; + +elseif ~ isfloat (param0) + + stk_error ('Incorrect type for param0.', 'TypeMismatch'); + +elseif isempty (param0) + + % Special case of a covariance function with no parameters + lb = []; + ub = []; + +else + + % constants + opts = stk_options_get ('stk_param_getdefaultbounds'); + tolvar = opts.tolvar; + tolscale = opts.tolscale; + + % bounds for the variance parameter + log_empirical_variance = log (var (double (zi))); + if log_empirical_variance == - Inf + logvar_lb = param0(1) - tolvar; + logvar_ub = param0(1) + tolvar; + else + logvar_lb = min (log_empirical_variance, param0(1)) - tolvar; + logvar_ub = max (log_empirical_variance, param0(1)) + tolvar; + end + + dim = size (xi, 2); + + if ~ ischar (covariance_type) + % Assume that model.covariance_type is a handle + covariance_type = func2str (covariance_type); + end + + switch covariance_type + + case {'stk_materncov_aniso', 'stk_materncov_iso'} + + nu_min = opts.nu_min_dimfun (dim); + nu_max = opts.nu_max_dimfun (dim); + + lognu_lb = min (log (nu_min), param0(2)); + lognu_ub = max (log (nu_max), param0(2)); + + range_mid = param0(3:end); + range_lb = range_mid(:) - tolscale; + range_ub = range_mid(:) + tolscale; + + lb = [logvar_lb; lognu_lb; range_lb]; + ub = [logvar_ub; lognu_ub; range_ub]; + + case { 'stk_materncov32_aniso', 'stk_materncov32_iso', ... + 'stk_materncov52_aniso', 'stk_materncov52_iso', ... + 'stk_expcov_aniso', 'stk_expcov_iso', ... + 'stk_gausscov_aniso', 'stk_gausscov_iso', ... + 'stk_sphcov_aniso', 'stk_sphcov_iso'} + + range_mid = param0(2:end); + range_lb = range_mid(:) - tolscale; + range_ub = range_mid(:) + tolscale; + + lb = [logvar_lb; range_lb]; + ub = [logvar_ub; range_ub]; + + otherwise + try + % Undocumented feature: make it possible to define a + % XXXX_getdefaultbounds function that provides parameter + % bounds during estimation for a user-defined covariance + % function called XXXX (in the case, where this covariance + % has parameters type double). + fname = [covariance_type '_getdefaultbounds']; + [lb, ub] = feval (fname, param0, xi, zi); + catch + err = lasterror (); + msg = strrep (err.message, sprintf ('\n'), sprintf ('\n|| ')); + warning(['Unable to initialize covariance parameters ' ... + 'automatically for covariance functions of type ''%s''.'... + '\n\nEmpty bounds are returned.\n\nThe original error ' ... + 'message was:\n|| %s\n'], covariance_type, msg); + lb = []; + ub = []; + end + + end % switch + +end % if + +end % function + diff --git a/inst/param/estim/stk_param_getdefaultbounds_lnv.m b/inst/param/estim/stk_param_getdefaultbounds_lnv.m new file mode 100644 index 0000000..15885d4 --- /dev/null +++ b/inst/param/estim/stk_param_getdefaultbounds_lnv.m @@ -0,0 +1,66 @@ +% STK_PARAM_GETDEFAULTBOUNDS_LNV [STK internal] + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2017 LNE +% Copyright (C) 2012 SUPELEC +% +% Authors: Emmanuel Vazquez +% Remi Stroh +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [lb_lnv, ub_lnv] = stk_param_getdefaultbounds_lnv ... + (model, lnv0, xi, zi) %#ok + +if isnumeric (lnv0) + + if isscalar (lnv0) + + TOLVAR = 0.5; + + % Bounds for the variance parameter + empirical_variance = var (zi); + lb_lnv = log (eps); + ub_lnv = log (empirical_variance) + TOLVAR; + + % Make sure that lnv0 falls within the bounds + if ~ isempty (lnv0) + lb_lnv = min (lb_lnv, lnv0 - TOLVAR); + ub_lnv = max (ub_lnv, lnv0 + TOLVAR); + end + + else + + lb_lnv = []; + ub_lnv = []; + + end + +else % parameter object + + [lb_lnv, ub_lnv] = stk_param_getdefaultbounds (lnv0, xi, zi); + +end + +end % function diff --git a/inst/param/estim/stk_param_gls.m b/inst/param/estim/stk_param_gls.m new file mode 100644 index 0000000..a7eb950 --- /dev/null +++ b/inst/param/estim/stk_param_gls.m @@ -0,0 +1,105 @@ +% STK_PARAM_GLS computes a generalised least squares estimate +% +% CALL: BETA = stk_param_gls (MODEL, XI, ZI) +% +% computes a generalised least squares estimate BETA of the vector of +% coefficients for the linear part of MODEL, where XI and ZI stand for +% the evaluation points and observed responses, respectively. +% +% CALL: [BETA, SIGMA2] = stk_param_gls (MODEL, XI, ZI) +% +% also returns the associated unbiased estimate SIGMA2 of sigma^2, assu- +% ming that the actual covariance matrix of the Gaussian process part of +% the model is sigma^2 K, with K the covariance matrix built from MODEL. +% +% SIGMA2 is actually the "best" unbiased estimate of sigma^2 : +% +% 1 +% SIGMA2 = ----- * || ZI - P BETA ||^2_{K^{-1}} +% n - r +% +% where n is the number of observations, r the length of BETA, P the +% design matrix for the linear part of the model, and || . ||_{K^{-1}} +% the norm associated to the positive definite matrix K^{-1}. It is the +% best estimate with respect to the quadratic risk, among all unbiased +% estimates which are quadratic in the residuals. + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2021 CentraleSupelec +% Copyright (C) 2014 SUPELEC & A. Ravisankar +% Copyright (C) 2011-2013 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Ashwin Ravisankar + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [beta, sigma2, L] = stk_param_gls (model, xi, zi) + +n = size (xi, 1); + +% Build the covariance matrix and the design matrix +[K, P] = stk_make_matcov (model, xi); + +% Cast zi into a double-precision array +zi = double (zi); + +% Compute the Generalized Least Squares (GLS) estimate +L = stk_cholcov (K, 'lower'); +W = linsolve (L, P, struct ('LT', true)); +u = linsolve (L, zi, struct ('LT', true)); +beta = W \ u; + +if nargin > 1 + % Assuming that the actual covariance matrice is sigma^2 K, compute the + % "best" unbiased estimate of sigma2 (best wrt the quadratic risk, among + % all unbiased estimates which are quadratic in the residuals) + r = length (beta); + sigma2 = 1 / (n - r) * sum ((u - W * beta) .^ 2); +end + +end % function + + +%!shared xi, zi, model, beta, sigma2 +%! xi = (1:10)'; zi = sin (xi); +%! model = stk_model (@stk_materncov52_iso); +%! model.param = [0.0 0.0]; + +%!test +%! model.lm = stk_lm_constant (); +%! [beta, sigma2] = stk_param_gls (model, xi, zi); +%!assert (stk_isequal_tolabs (beta, 0.1346064, 1e-6)) +%!assert (stk_isequal_tolabs (sigma2, 0.4295288, 1e-6)) + +%!test +%! model.lm = stk_lm_affine (); +%! [beta, sigma2] = stk_param_gls (model, xi, zi); +%!assert (stk_isequal_tolabs (beta, [0.4728342; -0.0614960], 1e-6)) +%!assert (stk_isequal_tolabs (sigma2, 0.4559431, 1e-6)) + +%!test +%! model.lm = stk_lm_null (); +%! [beta, sigma2] = stk_param_gls (model, xi, zi); +%!assert (isequal (beta, zeros (0, 1))) +%!assert (stk_isequal_tolabs (sigma2, 0.3977993, 1e-6)) diff --git a/inst/param/estim/stk_param_init.m b/inst/param/estim/stk_param_init.m new file mode 100644 index 0000000..0ba8fbc --- /dev/null +++ b/inst/param/estim/stk_param_init.m @@ -0,0 +1,506 @@ +% STK_PARAM_INIT provides a starting point for stk_param_estim +% +% CALL: PARAM = stk_param_init (MODEL, XI, YI) +% +% provides a quick and dirty estimate of the parameters of MODEL based on the +% data (XI, YI), that can be used as a starting point for stk_param_estim. It +% selects the maximizer of the ReML criterion out of a list of possible values +% given data (XI, YI). This syntax is appropriate for noiseless observations +% and for noisy observations with known noise variance (i.e., when the +% 'lognoisevariance' field in MODEL is either -Inf or has a finite value). +% +% CALL: [PARAM, LNV] = stk_param_init (MODEL, XI, YI) +% +% also returns a value for the 'lognoisevariance' field. In the case of +% noiseless observations or noisy observations with known noise variance, this +% is simply the value that was provided by the user in MODEL.lognoisevariance. +% In the case where MODEL.lognoisevariance is NaN (noisy observation with +% unknown noise variance), LNV is estimated by stk_param_init together with +% PARAM. +% +% CALL: [PARAM, LNV] = stk_param_init (MODEL, XI, YI, BOX) +% +% takes into account the (hyper-rectangular) domain on which the model is +% going to be used. It is used in the heuristics that determines the list of +% parameter values mentioned above. BOX should be a 2 x DIM matrix with BOX(1, +% j) and BOX(2, j) being the lower- and upper-bound of the interval on the +% j^th coordinate, with DIM being the dimension of XI, DIM = size(XI,2). If +% provided, If missing or empty, the BOX argument defaults to [min(XI); +% max(XI)]. +% +% See also stk_example_kb02, stk_example_kb03, stk_example_misc03 + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018, 2020 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Authors: Julien Bect +% Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [param, lnv] = stk_param_init (model, varargin) + +stk_assert_model_struct (model); + +cov_list = { ... + 'stk_expcov_iso', ... + 'stk_expcov_aniso', ... + 'stk_gausscov_iso', ... + 'stk_gausscov_aniso', ... + 'stk_materncov_iso', ... + 'stk_materncov_aniso', ... + 'stk_materncov32_iso', ... + 'stk_materncov32_aniso', ... + 'stk_materncov52_iso', ... + 'stk_materncov52_aniso', ... + 'stk_sphcov_iso', ... + 'stk_sphcov_aniso'}; + +if ~ ischar (model.covariance_type) + % Assume that model.covariance_type is a handle + model.covariance_type = func2str (model.covariance_type); +end + +if (ismember (model.covariance_type, cov_list)) && (isnumeric (model.param)) + + % An initialization for this covariance type is provided in STK + [param, lnv] = stk_param_init_ (model, varargin{:}); + +else + try + % Undocumented feature: make it possible to define a XXXX_param_init + % function that provides initial estimates for a user-defined + % covariance function called XXXX. + fname = [model.covariance_type '_param_init']; + if nargout == 2 + [param, lnv] = feval (fname, model, varargin{:}); + else + param = feval (fname, model, varargin{:}); + end + catch + err = lasterror (); + msg = strrep (err.message, sprintf ('\n'), sprintf ('\n|| ')); %#ok + msg = sprintf (['Unable to initialize covariance parameters ' ... + 'automatically for covariance functions of type ''%s''.\n\nThe ' ... + 'original error message was:\n|| %s\n'], model.covariance_type, msg); + stk_error (msg, 'UnableToInitialize'); + end % try_catch +end % if + +end % function + +%#ok<*CTCH,*LERR> + + +function [param, lnv] = stk_param_init_ (model, xi, zi, box, do_estim_lnv) + +% Used by stk_model +if nargin < 2 + + if isa (model.covariance_type, 'function_handle') + covariance_name = func2str (model.covariance_type); + else + covariance_name = model.covariance_type; + end + + switch covariance_name + + % Matern covariance function with unknown regularity + + case 'stk_materncov_iso' + param = nan (3, 1); + case 'stk_materncov_aniso' + param = nan (2 + model.dim, 1); + + % Other isotropic covariance functions + + case {'stk_expcov_iso', 'stk_materncov32_iso', ... + 'stk_materncov52_iso', 'stk_gausscov_iso', ... + 'stk_sphcov_iso'} + param = nan (2, 1); + + % Other anisotropic covariance functions + + case {'stk_expcov_aniso', 'stk_materncov32_aniso', ... + 'stk_materncov52_aniso', 'stk_gausscov_aniso', ... + 'stk_sphcov_aniso'} + param = nan (1 + model.dim, 1); + + otherwise + stk_error ('Unexpected covariance name', 'IncorrectArgument'); + end + + lnv = - inf; + return +end + + +%--- check dimensions ---------------------------------------------------------- + +dim = size (xi, 2); +if isfield (model, 'dim') && ~ isequal (dim, model.dim) + errmsg = 'model.dim and size (xi, 2) should be equal.'; + stk_error (errmsg, 'IncorrectSize'); +end + +if ~ isequal (size (zi), [stk_get_sample_size(xi) 1]) + errmsg = 'zi should be a column, with the same number of rows as xi.'; + stk_error (errmsg, 'IncorrectSize'); +end + + +%--- first, default values for arguments 'box' and 'noisy' --------------------- + +if nargin < 4 + box = []; +end + +if ~ isa (box, 'stk_hrect') + if isempty (box) + box = stk_boundingbox (xi); % Default: bounding box + else + box = stk_hrect (box); + end +end + + +%--- backward compatiblity ----------------------------------------------------- + +% Missing lognoisevariance field +if ~ isfield (model, 'lognoisevariance') + + if (nargin < 5) || (~ do_estim_lnv) + % Assume a noiseless model + model.lognoisevariance = - inf; + else + % Special case: assume a noisy model with constant but unknown noise variance + model.lognoisevariance = nan; + end + +elseif isequal (model.lognoisevariance, -inf) && ((nargin >= 5) && do_estim_lnv) + + % In this special case, we are flexible and consider -inf as a particular + % value of the variance in an homoscedastic noise model. + model.lognoisevariance = nan; + +end + +% Ensure backward compatiblity with respect to model.order / model.lm +model = stk_model_fixlm (model); + + +%--- lognoisevariance ? -------------------------------------------------------- + +lnv_ = stk_get_optimizable_noise_parameters (model); + +if isempty (lnv_) + + % There are no parameters to optimize in the noise model, either because we + % are in the noiseless case, ou because we have a noise model object that + % does not declare any hyperparameter. In this case: + + % Even is do_estim_lnv was set to true by the caller, we set it back + % to false in this case, since there are no parameters to optimize + do_estim_lnv = false; + + if stk_isnoisy (model) + lnv = log (stk_covmat_noise (model, xi, [], -1, true)); + else + lnv = -inf; + end + +elseif nargin < 5 + + % When do_estim_lnv is not set by the user, we set it to true if some + % of the parameters are NaNs, which is interpreted as "Estimate me !" + do_estim_lnv = any (isnan (lnv_)); + + lnv = model.lognoisevariance; + +else % do_estim_lnv set by the caller (DEPRECATED) + + % CALL: [PARAM, LNV] = stk_param_init (MODEL, XI, YI, BOX, DO_ESTIM_LNV) + % + % with DO_ESTIM_LNV = TRUE forces the estimation of the variance of the noise, + % regardless of the value of MODEL.lognoisevariance. If FALSE, it prevents + % estimation of the variance of the noise, which is only possible if the + % 'lognoisevariance' field in MODEL is either -Inf or has a finite value. + + % DEPRECATION WARNING + warning ('STK:stk_param_init:Deprecated', ... + 'This way of setting do_estim_lnv is deprecated'); + + do_estim_lnv = logical (do_estim_lnv); + + if (~ do_estim_lnv) && (any (isnan (lnv_))) + stk_error (sprintf (['do_estim_lnv is false, but some parameter ' ... + 'values are equal to NaN. If you don''t want the parameters of ' ... + 'the noise variance model to be estimated, you must provide ' ... + 'values for them!']), 'MissingParameterValue'); + end + + lnv = model.lognoisevariance; + +end + +% After this point, we only accept +% a) a scalar lnv (noiseless and homoscedastic cases), which is allowed to be nan, +% b) a vector lnv (heteroscedatic case), which cannot be nan. +% +% In other words, fancy objects are not allowed, and parameter estimation is +% only supported in the homoscedastic case. Here we go: +if ~ (isnumeric (lnv) && (isscalar (lnv) || ~ any (isnan (lnv)))) + stk_error (['Parameter estimation for the noise model is ' ... + 'not supported in this case.'], 'InvalidArgument'); +end + +if (do_estim_lnv) && (nargout < 2) + warning (['stk_param_init will be computing an estimation of the ' ... + 'variance of the noise, perhaps should you call the function ' ... + 'with two output arguments?']); +end + + +%--- then, each type of covariance is dealt with specifically ------------------ + +switch model.covariance_type + + case {'stk_expcov_iso', 'stk_materncov32_iso', 'stk_materncov52_iso', ... + 'stk_gausscov_iso', 'stk_sphcov_iso'} + model0 = model; + bbox = box; + + case {'stk_expcov_aniso', 'stk_materncov32_aniso', ... + 'stk_materncov52_aniso', 'stk_gausscov_aniso', 'stk_sphcov_aniso'} + covname_iso = [model.covariance_type(1:end-5) 'iso']; + model0 = stk_model (covname_iso, dim); + xi = stk_normalize (xi, box); + bbox = []; + + case 'stk_materncov_iso' + nu = 5/2 * dim; + model0 = stk_model (@stk_materncov_iso, dim); + model0.covariance_type = @(param, x, y, diff, pairwise) ... + stk_materncov_iso ([param(1) log(nu) param(2)], x, y, diff, pairwise); + model0.param(2) = []; + bbox = box; + + case 'stk_materncov_aniso' + nu = 5/2 * dim; + model0 = stk_model (@stk_materncov_iso, dim); + model0.covariance_type = @(param, x, y, diff, pairwise) ... + stk_materncov_iso ([param(1) log(nu) param(2)], x, y, diff, pairwise); + model0.param(2) = []; + xi = stk_normalize (xi, box); + bbox = []; + + otherwise + errmsg = 'Unsupported covariance type.'; + stk_error (errmsg, 'InvalidArgument'); +end + +model0.lognoisevariance = lnv; +[param, lnv] = paraminit_ (model0, xi, zi, bbox); + +% Back to a full vector of covariance parameters +switch model.covariance_type + + case {'stk_expcov_aniso', 'stk_materncov32_aniso', ... + 'stk_materncov52_aniso', 'stk_gausscov_aniso', 'stk_sphcov_aniso'} + param = [param(1); param(2) - log(diff(box, [], 1))']; + + case 'stk_materncov_iso' + param = [param(1); log(nu); param(2)]; + + case 'stk_materncov_aniso' + param = [param(1); log(nu); param(2) - log(diff(box, [], 1))']; +end + +% Return the original lnv if no parameter estimation was performed +if ~ do_estim_lnv + lnv = model.lognoisevariance; +end + +end % function + + +function [param, lnv] = paraminit_ (model, xi, zi, box) + +% Check for special case: constant response +if (std (double (zi)) == 0) + warning ('STK:stk_param_init:ConstantResponse', ... + 'Parameter estimation is impossible with constant-response data.'); + param = [0 0]; + if any (isnan (model.lognoisevariance)) + lnv = 0.0; + else + lnv = model.lognoisevariance; + end + return % Return some default values +end + +% List of possible values for the range parameter +if isempty (box) + % assume box = repmat([0; 1], 1, dim) + box_diameter = sqrt (size (xi, 2)); +else + box_diameter = sqrt (sum (diff (box) .^ 2)); +end +rho_max = 2 * box_diameter; +rho_min = box_diameter / 50; +rho_list = logspace (log10 (rho_min), log10 (rho_max), 5); + +other_params = - log (rho_list'); + +[param, lnv] = stk_param_init_remlgls (model, xi, zi, other_params); + +end % function + + +%!test +%! xi = (1:10)'; zi = sin (xi); +%! model = stk_model (@stk_materncov52_iso); +%! model.param = stk_param_init (model, xi, zi, [1; 10], false); +%! xt = (1:9)' + 0.5; zt = sin (xt); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (sum ((zt - zp.mean) .^ 2) < 1e-3); + +%!test % check equivariance of parameter estimates +%! f = @(x) sin (x); +%! xi = stk_sampling_regulargrid (10, 1); zi = stk_feval (f, xi); +%! shift = 1000; scale = 0.01; +%! model = stk_model (@stk_materncov32_iso); +%! p1 = stk_param_init (model, xi, zi); +%! p2 = stk_param_init (model, xi, shift + scale .* zi); +%! assert (stk_isequal_tolabs (p2(1), p1(1) + log (scale^2), 1e-10)) +%! assert (stk_isequal_tolabs (p2(2), p1(2), eps)) + +%!shared xi, zi, BOX, xt, zt +%! +%! f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); +%! DIM = 1; % Dimension of the factor space +%! BOX = [-1.0; 1.0]; % Factor space +%! +%! xi = stk_sampling_regulargrid (20, DIM, BOX); % Evaluation points +%! zi = stk_feval (f, xi); % Evaluation results +%! +%! NT = 400; % Number of points in the grid +%! xt = stk_sampling_regulargrid (NT, DIM, BOX); % Generate a regular grid +%! zt = stk_feval (f, xt); % Values of f on the grid + +%!test +%! model = stk_model (@stk_materncov_iso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_materncov_aniso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_materncov32_iso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_materncov32_aniso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_materncov52_iso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_materncov52_aniso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_gausscov_iso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test +%! model = stk_model (@stk_gausscov_aniso); +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!test % Homoscedastic case / do_estim_lnv = true +%! model = stk_model (@stk_materncov32_iso); +%! [model.param, model.lognoisevariance] = ... +%! stk_param_init (model, xi, zi, BOX, true); +%! [model.param, model.lognoisevariance] = ... +%! stk_param_estim (model, xi, zi); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (model.lognoisevariance > -inf); +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!error % Homoscedastic case / do_estim_lnv = false / model.lnv = nan +%! model = stk_model (@stk_materncov32_iso); +%! model.lognoisevariance = nan; % not compatible with do_estim_lnv == false +%! [model.param, model.lognoisevariance] = ... +%! stk_param_init (model, xi, zi, BOX, false); + +%!test % Heteroscedastic case / known noise variance +%! model = stk_model (@stk_materncov32_iso); +%! lnv = log ((100 + rand (size (zi))) / 1e6); +%! model.lognoisevariance = lnv; % here we say that lnv is known +%! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); +%! model.param = stk_param_estim (model, xi, zi, param0); +%! zp = stk_predict (model, xi, zi, xt); +%! assert (isequal (model.lognoisevariance, lnv)); % should be untouched +%! assert (max ((zp.mean - zt) .^ 2) < 1e-3) + +%!shared model, x, z +%! model = stk_model (@stk_materncov52_iso); +%! n = 10; x = stk_sampling_regulargrid (n, 1, [0; 1]); z = ones (size (x)); + +%!test % Constant response, noiseless model +%! [param, lnv] = stk_param_init (model, x, z); +%! assert ((all (isfinite (param))) && (length (param) == 2)); +%! assert (isequal (lnv, -inf)); + +%!test % Constant response, noisy model +%! model.lognoisevariance = nan; +%! [param, lnv] = stk_param_init (model, x, z); +%! assert ((all (isfinite (param))) && (length (param) == 2)); +%! assert (isscalar (lnv) && isfinite (lnv)); diff --git a/inst/param/estim/stk_param_init_lnv.m b/inst/param/estim/stk_param_init_lnv.m new file mode 100644 index 0000000..fd51a64 --- /dev/null +++ b/inst/param/estim/stk_param_init_lnv.m @@ -0,0 +1,117 @@ +% STK_PARAM_INIT_LNV provides a rough estimate of the variance of the noise +% +% CALL: LNV = stk_param_init_lnv (MODEL, XI, YI) +% +% returns a rough estimate of the log of the noise variance computed using +% the given MODEL and data (XI, YI), using the restricted maximum likelihood +% (ReML) method. It selects the maximizer of the ReML criterion out of a +% list of possible values. +% +% NOTE: assumption on the model +% +% The model is assumed to be a stationary Gaussian process, with +% model.param(1) corresponding to the log of the Gaussian process variance. +% This assumption is currently fulfilled by all the models shipped with STK. +% +% See also: stk_param_estim, stk_param_init + +% Copyright Notice +% +% Copyright (C) 2018, 2020 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function lnv = stk_param_init_lnv (model, xi, zi) + +% size checking: xi, zi +if ~ isequal (size (zi), [stk_get_sample_size(xi) 1]) + errmsg = 'zi should be a column, with the same number of rows as xi.'; + stk_error (errmsg, 'IncorrectSize'); +end + +% Warn about special case: constant response +if (std (double (zi)) == 0) + warning ('STK:stk_param_estim_lnv:ConstantResponse', ['Constant- ' ... + 'response data: the output of stk_param_estim_lnv is likely ' ... + 'to be unreliable.']); +end + +% backward compatibility: missing lognoisevariance field +if ~ isfield (model, 'lognoisevariance') + % Special case: assume a noisy model with constant but unknown noise variance + model.lognoisevariance = nan; +end + +% Make sure that we are dealing with a noisy model +if ~ stk_isnoisy (model) + stk_error ('stk_param_estim_lnv only works for noisy models', 'InvalidArgument'); +end + +% EXPERIMENTAL support for noise model objects +if ~ isnumeric (model.lognoisevariance) + lnv = stk_param_init_lnv_ (model.lognoisevariance, model, xi, zi); + return +end + +% We will work with the ratio eta = sigma2_noise / sigma2 +log_eta_min = -15; % exp(-15) = 3e-7 approx -> very small noise +log_eta_max = +15; % exp(+15) = 3e+7 approx -> very large noise +log_eta_list = linspace (log_eta_min, log_eta_max, 5); + +% Initialize parameter search +log_eta_best = nan; +aLL_best = +inf; + +% Try all values from log_eta_list +for log_eta = log_eta_list + model.lognoisevariance = model.param(1) + log_eta; + aLL = stk_param_relik (model, xi, zi); + if (~ isnan (aLL)) && (aLL < aLL_best) + log_eta_best = log_eta; + aLL_best = aLL; + end +end + +if isinf (aLL_best) + errmsg = 'Couldn''t find reasonable parameter values... ?!?'; + stk_error (errmsg, 'AlgorithmFailure'); +end + +lnv = model.param(1) + log_eta_best; + +end % function + + +%!test +%! f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); +%! ni = 20; +%! xi = (linspace (-1, 1, ni))' + 0.2 * (randn (ni, 1)); +%! zi = stk_feval (f, xi); +%! +%! model = stk_model (@stk_materncov_iso); +%! model.param = log ([1; 5/2; 1/0.4]); +%! model.lognoisevariance = nan; +%! lnv = stk_param_init_lnv (model, xi, zi); +%! +%! assert ((isscalar (lnv)) && (lnv > -30) && (lnv < 30)); diff --git a/inst/param/estim/stk_param_init_remlgls.m b/inst/param/estim/stk_param_init_remlgls.m new file mode 100644 index 0000000..977ebb9 --- /dev/null +++ b/inst/param/estim/stk_param_init_remlgls.m @@ -0,0 +1,114 @@ +% STK_PARAM_ESTIM_REMLGS [STK internal] + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018, 2019, 2021 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [param, lnv] = stk_param_init_remlgls (model, xi, zi, other_params) + +% Make sure than lnv is numeric +if ~ isfield (model, 'lognoisevariance') + lnv = -inf; + model.lognoisevariance = -inf; +else + lnv = model.lognoisevariance; + if ~ isnumeric (lnv) + stk_error ('Non-numeric lnv is not supported.', 'IncorrectArgument'); + end +end + +% Homoscedastic case ? +homoscedastic = isscalar (lnv); +noiseless = homoscedastic && (lnv == -inf); + +% List of possible values for the ratio eta = sigma2_noise / sigma2 +if ~ noiseless + eta_list = 10 .^ (-6:3:0); +else + eta_list = 0; +end + +% Initialize parameter search +eta_best = NaN; +k_best = NaN; +sigma2_best = NaN; +aLL_best = +Inf; + +% Try all possible combinations of parameters from the lists +for eta = eta_list + for k = 1:(size (other_params, 1)) + + % First use sigma2 = 1.0 + param_ = [0.0, other_params(k, :)]'; + model.param = stk_set_optimizable_parameters (model.param, param_); + + if noiseless + + [~, sigma2] = stk_param_gls (model, xi, zi); + if ~ (sigma2 > 0), continue; end + log_sigma2 = log (sigma2); + + elseif homoscedastic && (isnan (lnv)) % Unknown noise variance + + model.lognoisevariance = log (eta); + [~, sigma2] = stk_param_gls (model, xi, zi); + if ~ (sigma2 > 0), continue; end + log_sigma2 = log (sigma2); + model.lognoisevariance = log (eta * sigma2); + + else % Known variance(s) + + log_sigma2 = (mean (lnv)) - (log (eta)); + sigma2 = exp (log_sigma2); + + end + + % Now, compute the antilog-likelihood + param_(1) = log_sigma2; + model.param = stk_set_optimizable_parameters (model.param, param_); + aLL = stk_param_relik (model, xi, zi); + if ~ isnan(aLL) && (aLL < aLL_best) + eta_best = eta; + k_best = k; + aLL_best = aLL; + sigma2_best = sigma2; + end + end +end + +if isinf (aLL_best) + errmsg = 'Couldn''t find reasonable parameter values... ?!?'; + stk_error (errmsg, 'AlgorithmFailure'); +end + +param = [log(sigma2_best), other_params(k_best, :)]'; + +if (isscalar (lnv)) && (isnan (lnv)) + % Homoscedatic case with unknown variance... Here is our estimate: + lnv = log (eta_best * sigma2_best); +end + +end % function diff --git a/inst/param/estim/stk_param_relik.m b/inst/param/estim/stk_param_relik.m new file mode 100644 index 0000000..ee9f323 --- /dev/null +++ b/inst/param/estim/stk_param_relik.m @@ -0,0 +1,257 @@ +% STK_PARAM_RELIK computes the restricted likelihood of a model given data +% +% CALL: C = stk_param_relik (MODEL, XI, ZI) +% +% computes the value C of the opposite of the restricted likelihood criterion +% for the MODEL given the data (XI, ZI). +% +% CALL: [C, COVPARAM_DIFF, LNV_DIFF] = stk_param_relik (MODEL, XI, ZI) +% +% also returns the gradient COVPARAM_DIFF of C with respect to the parameters +% of the covariance function, and its derivative LNV_DIFF of C with respect to +% the logarithm of the noise variance. +% +% EXAMPLE: see paramestim/stk_param_estim.m + +% Copyright Notice +% +% Copyright (C) 2015, 2016, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [C, covparam_diff, noiseparam_diff] = stk_param_relik (model, xi, zi) + +zi = double (zi); + +% Check the size of zi +n = size (xi, 1); +if ~ isequal (size (zi), [n 1]) + stk_error (['zi must be a column vector, with the same' ... + 'same number of rows as x_obs.'], 'IncorrectSize'); +end + +% Parameters of the covariance function +covparam = stk_get_optimizable_parameters (model.param); + +PARAMPRIOR = isfield (model, 'prior'); +NOISEPRIOR = isfield (model, 'noiseprior'); + +if (nargout >= 3) || NOISEPRIOR + % Parameters of the noise variance function + [noiseparam, isnoisy] = stk_get_optimizable_noise_parameters (model); + noiseparam_size = length (noiseparam); +else + isnoisy = stk_isnoisy (model); +end + + +%% Compute the (opposite of) the restricted log-likelihood + +[K, P] = stk_make_matcov (model, xi); +q = size (P, 2); +simple_kriging = (q == 0); + +% Choleski factorization: K = U' * U, with upper-triangular U +[U, epsi] = stk_cholcov (K); +if (~ isnoisy) && (epsi > 0) + stk_assert_no_duplicates (xi); +end + +if ~ simple_kriging + + % Construct a "filtering matrix" A = W' + [Q, R_ignored] = qr (P); %#ok %the second argument *must* be here + W = Q(:, (q+1):n); + + % Compute G = W' * K * W, the covariance matrix of filtered observations + M = U * W; + G = (M') * M; + + % Check if G is (at least close to) symmetric + Delta = G - G'; s = sqrt (diag (G)); + if any (abs (Delta) > eps * (s * s')) + warning ('STK:stk_param_relik:NumericalAccuracyProblem', ... + 'The computation of G = W'' * K * W is inaccurate.'); + G = 0.5 * (G + G'); % Make it at least symmetric + end + + % Cholesky factorization: G = U' * U, with upper-triangular U + U = stk_cholcov (G); +end + +% Compute log (det (G)) using the Cholesky factor +ldetWKW = 2 * sum (log (diag (U))); + +% Compute (W' yi)' * G^(-1) * (W' yi) as v' * v, with v = U' \ (W' * yi) +if simple_kriging + yyi = zi; +else + yyi = W' * zi; +end +v = linsolve (U, yyi, struct ('UT', true, 'TRANSA', true)); +attache = sum (v .^ 2); + +C = 0.5 * ((n - q) * log(2 * pi) + ldetWKW + attache); + + +%% Add priors + +if PARAMPRIOR + C = C - stk_distrib_logpdf (model.prior, covparam); +end + +if NOISEPRIOR + C = C - stk_distrib_logpdf (model.noiseprior, noiseparam); +end + + +%% Compute gradient + +if nargout >= 2 + + covparam_size = length (covparam); + covparam_diff = zeros (covparam_size, 1); + + if exist ('OCTAVE_VERSION', 'builtin') == 5 + % Octave remembers that U is upper-triangular and automatically picks + % the appropriate algorithm. Cool. + if simple_kriging + F = inv (U'); + else + F = (U') \ (W'); + end + else + % Apparently Matlab does not automatically leverage the fact that U is + % upper-triangular. Pity. We have to call linsolve explicitely, then. + if simple_kriging + F = linsolve (U, eye (n), struct ('UT', true, 'TRANSA', true)); + else + F = linsolve (U, W', struct ('UT', true, 'TRANSA', true)); + end + end + H = F' * F; % = W * G^(-1) * W' + + z = H * zi; + + for diff = 1:covparam_size + V = feval (model.covariance_type, model.param, xi, xi, diff); + covparam_diff(diff) = 1/2 * (sum (sum (H .* V)) - z' * V * z); + end + + if PARAMPRIOR + covparam_diff = covparam_diff ... + - stk_distrib_logpdf_grad (model.prior, covparam); + end + + if nargout >= 3 + if noiseparam_size == 0 + noiseparam_diff = []; + else + noiseparam_diff = zeros (noiseparam_size, 1); + for diff = 1:noiseparam_size + V = stk_covmat_noise (model, xi, [], diff); + noiseparam_diff(diff) = 1/2 * (sum (sum (H .* V)) - z' * V * z); + end + if NOISEPRIOR + noiseparam_diff = noiseparam_diff ... + - stk_distrib_logpdf_grad (model.noiseprior, noiseparam); + end + end + end + +end + +end % function + + +%!shared f, xi, zi, NI, model, C, dC1, dC2 +%! +%! f = @(x)(- (0.8 * x(:, 1) + sin (5 * x(:, 2) + 1) ... +%! + 0.1 * sin (10 * x(:, 3)))); +%! DIM = 3; NI = 20; box = repmat ([-1.0; 1.0], 1, DIM); +%! xi = stk_sampling_halton_rr2 (NI, DIM, box); +%! zi = stk_feval (f, xi); +%! +%! SIGMA2 = 1.0; % variance parameter +%! NU = 4.0; % regularity parameter +%! RHO1 = 0.4; % scale (range) parameter +%! +%! model = stk_model (@stk_materncov_aniso); +%! model.param = log ([SIGMA2; NU; 1/RHO1 * ones(DIM, 1)]); + +%!error [C, dC1, dC2] = stk_param_relik (); +%!error [C, dC1, dC2] = stk_param_relik (model); +%!error [C, dC1, dC2] = stk_param_relik (model, xi); +%!test [C, dC1, dC2] = stk_param_relik (model, xi, zi); + +%!test +%! TOL_REL = 0.01; +%! assert (stk_isequal_tolrel (C, 21.6, TOL_REL)); +%! assert (stk_isequal_tolrel (dC1, [4.387 -0.1803 0.7917 0.1392 2.580]', TOL_REL)); +%! assert (isequal (dC2, [])); + +%!shared xi, zi, model, TOL_REL +%! xi = [-1 -.6 -.2 .2 .6 1]'; +%! zi = [-0.11 1.30 0.23 -1.14 0.36 -0.37]'; +%! model = stk_model (@stk_materncov_iso); +%! model.param = log ([1.0 4.0 2.5]); +%! model.lognoisevariance = log (0.01); +%! TOL_REL = 0.01; + +%!test % Another simple 1D check +%! [C, dC1, dC2] = stk_param_relik (model, xi, zi); +%! assert (stk_isequal_tolrel (C, 6.327, TOL_REL)); +%! assert (stk_isequal_tolrel (dC1, [0.268 0.0149 -0.636]', TOL_REL)); +%! assert (stk_isequal_tolrel (dC2, -1.581e-04, TOL_REL)); + +%!test % Same 1D test with simple kriging +%! model.lm = stk_lm_null; +%! [C, dC1, dC2] = stk_param_relik (model, xi, zi); +%! assert (stk_isequal_tolrel (C, 7.475, TOL_REL)); +%! assert (stk_isequal_tolrel (dC1, [0.765 0.0238 -1.019]', TOL_REL)); +%! assert (stk_isequal_tolrel (dC2, 3.0517e-03, TOL_REL)); + +%!test % Check the gradient on a 2D test case +%! +%! f = @stk_testfun_braninhoo; +%! DIM = 2; +%! BOX = [[-5; 10], [0; 15]]; +%! NI = 20; +%! TOL_REL = 1e-2; +%! DELTA = 1e-6; +%! +%! model = stk_model (@stk_materncov52_iso, DIM); +%! model.param = [1 1]; +%! +%! xi = stk_sampling_halton_rr2 (NI, DIM, BOX); +%! zi = stk_feval (f, xi); +%! +%! for range = [0.3 2 10] +%! model.param(2) = - log (range); +%! for diff = 1:2 +%! assert (stk_test_critgrad ... +%! (@stk_param_relik, model, xi, zi, diff, 1e-6)); +%! end +%! end diff --git a/inst/sampling/@stk_function/disp.m b/inst/sampling/@stk_function/disp.m new file mode 100644 index 0000000..47aaf6e --- /dev/null +++ b/inst/sampling/@stk_function/disp.m @@ -0,0 +1,63 @@ +% @STK_FUNCTION/DISP [overload base function] +% +% See also: disp + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (F) + +loose_spacing = stk_disp_isloose (); + +fprintf ('<%s>\n', stk_sprintf_sizetype (F)); + +if loose_spacing + fprintf ('\n'); +end + +if ~ strcmp (class (F), 'stk_function') %#ok + + fprintf ('*** WARNING: %s has no proper disp () method.\n', class (F)); + + if loose_spacing + fprintf ('***\n'); + end + + fprintf ('*** Dumping the raw content of the underlying structure...\n'); + + if loose_spacing + fprintf ('***\n\n'); + end + + disp (struct (F)); + + if loose_spacing + fprintf ('\n'); + end + +end % if + +end % function diff --git a/inst/sampling/@stk_function/display.m b/inst/sampling/@stk_function/display.m new file mode 100644 index 0000000..94c5b49 --- /dev/null +++ b/inst/sampling/@stk_function/display.m @@ -0,0 +1,48 @@ +% @STK_FUNCTION/DISPLAY [overload base function] +% +% See also: display + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function display (F) %#ok<*DISPLAY> + +loose_spacing = stk_disp_isloose (); + +name = inputname (1); +if isempty (name) + name = 'ans'; +end + +if loose_spacing + fprintf ('\n'); +end + +fprintf ('%s = ', name); + +disp (F); + +end % function diff --git a/inst/sampling/@stk_function/feval.m b/inst/sampling/@stk_function/feval.m new file mode 100644 index 0000000..488f1a0 --- /dev/null +++ b/inst/sampling/@stk_function/feval.m @@ -0,0 +1,36 @@ +% @STK_FUNCTION/FEVAL [overload base function] +% +% See also: feval + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function F_val = feval (F, x, varargin) %#ok + +stk_error (sprintf ('Method feval is missing from class %s.', ... + class (F)), 'Missing Method'); + +end % function diff --git a/inst/sampling/@stk_function/get.m b/inst/sampling/@stk_function/get.m new file mode 100644 index 0000000..b76be1a --- /dev/null +++ b/inst/sampling/@stk_function/get.m @@ -0,0 +1,33 @@ +% @STK_SAMPCRIT_EI/GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (crit, propname) + +value = crit.(propname); + +end % function diff --git a/inst/sampling/@stk_function/horzcat.m b/inst/sampling/@stk_function/horzcat.m new file mode 100644 index 0000000..7c8a5d1 --- /dev/null +++ b/inst/sampling/@stk_function/horzcat.m @@ -0,0 +1,36 @@ +% @STK_FUNCTION/HORZCAT [overload base function] +% +% See also: horzcat + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = horzcat (varargin) + +stk_error (['Arrays of sampling criterion objects are not supported. ', ... + 'Use cell arrays instead.'], 'IllegalOperation'); + +end % function diff --git a/inst/sampling/@stk_function/stk_function.m b/inst/sampling/@stk_function/stk_function.m new file mode 100644 index 0000000..a92fb4f --- /dev/null +++ b/inst/sampling/@stk_function/stk_function.m @@ -0,0 +1,66 @@ +% STK_FUNCTION [experimental] +% +% EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. +% STK users that wish to experiment with it are welcome to do so, but should +% be aware that API-breaking changes are likely to happen in future releases. +% We invite them to direct any questions, remarks or comments about this +% experimental class to the STK mailing list. +% +% CALL: F = stk_function () +% +% creates a "pure" function object. Pure function objects are useless by +% themselves, and typically constructed as parent objects for derived +% function object classes (e.g., sampling criterion objects). +% +% See also: stk_sampcrit_ei, stk_sampcrit_eqi + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function F = stk_function () + +F = class (struct (), 'stk_function'); + +end % function + + +%!shared F + +%!test F = stk_function () % ending ";" omitted on purpose, to test disp + +%!error [F F]; % arrays of sampling criterion objects are not supported +%!error [F; F]; % idem + +%!error get (F, 'toto'); % field does not exist +%!error y = feval (F, 1.0); % not implemented for "pure" function objects + +%!error dummy = F{2}; % illegal indexing +%!error dummy = F(1.0); % feval not implemented +%!error dummy = F.toto; % field does not exist + +%!error F{2} = 1.234; % illegal indexing +%!error F(5) = 1.234; % illegal indexing +%!error F.toto = 1.234; % field does not exist diff --git a/inst/sampling/@stk_function/subsasgn.m b/inst/sampling/@stk_function/subsasgn.m new file mode 100644 index 0000000..f0e201f --- /dev/null +++ b/inst/sampling/@stk_function/subsasgn.m @@ -0,0 +1,50 @@ +% @STK_FUNCTION/SUBSASGN [overload base function] +% +% See also: subsasgn + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function F = subsasgn (F, idx, value) + +switch idx(1).type + + case '.' + + if length (idx) > 1 + value = subsasgn (get (F, idx(1).subs), idx(2:end), value); + end + + F = set (F, idx(1).subs, value); + + case {'{}', '()'} + + errmsg = 'Illegal assignment'; + stk_error (errmsg, 'IllegalAssignment'); + +end + +end % function diff --git a/inst/sampling/@stk_function/subsref.m b/inst/sampling/@stk_function/subsref.m new file mode 100644 index 0000000..9199d67 --- /dev/null +++ b/inst/sampling/@stk_function/subsref.m @@ -0,0 +1,53 @@ +% @STK_FUNCTION/SUBSREF [overload base function] +% +% See also: subsref + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [value, argout2] = subsref (F, idx) + +switch idx(1).type + + case '()' + [value, argout2] = feval (F, idx(1).subs{:}); + + case '{}' + + errmsg = 'Indexing with curly braces is not allowed.'; + stk_error (errmsg, 'IllegalIndexing'); + + case '.' + + value = get (F, idx(1).subs); + +end + +if (length (idx)) > 1 + value = subsref (value, idx(2:end)); +end + +end % function diff --git a/inst/sampling/@stk_function/vertcat.m b/inst/sampling/@stk_function/vertcat.m new file mode 100644 index 0000000..011a432 --- /dev/null +++ b/inst/sampling/@stk_function/vertcat.m @@ -0,0 +1,36 @@ +% @STK_FUNCTION/VERTCAT [overload base function] +% +% See also: vertcat + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function varargout = vertcat (varargin) + +stk_error (['Arrays of sampling criterion objects are not supported. ', ... + 'Use cell arrays instead.'], 'IllegalOperation'); + +end % function diff --git a/inst/sampling/@stk_sampcrit_akg/disp.m b/inst/sampling/@stk_sampcrit_akg/disp.m new file mode 100644 index 0000000..f97856d --- /dev/null +++ b/inst/sampling/@stk_sampcrit_akg/disp.m @@ -0,0 +1,64 @@ +% @STK_SAMPCRIT_AKG/DISP [overload base function] +% +% See also: disp + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (crit) + +loose_spacing = stk_disp_isloose (); + +fprintf ('<%s>\n', stk_sprintf_sizetype (crit)); + +if loose_spacing + fprintf ('|\n'); +end + +if isempty (crit.model) + % Uninstantiated sampling criterion + model_str = '-- (not instantiated)'; +else + % Instantiated sampling criterion + model_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.model)); +end + +if isempty (crit.reference_grid) + % Uninstantiated sampling criterion + xr_str = '-- (use current evaluation points)'; +else + % Instantiated sampling criterion + xr_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.reference_grid)); +end + +fprintf ('| model: %s\n', model_str); +fprintf ('| reference_grid: %s\n', xr_str); + +if loose_spacing + fprintf ('|\n\n'); +end + +end % function diff --git a/inst/sampling/@stk_sampcrit_akg/feval.m b/inst/sampling/@stk_sampcrit_akg/feval.m new file mode 100644 index 0000000..597670b --- /dev/null +++ b/inst/sampling/@stk_sampcrit_akg/feval.m @@ -0,0 +1,57 @@ +% @STK_SAMPCRIT_AKG/FEVAL [overload base function] +% +% See also: feval + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [AKG, zp] = feval (crit, x, varargin) + +% Implementation note: stk_predict currently does not offer the possibility to +% get the right-hand side of the kriging equation, which is needed here. So, +% instead of calling stk_predict, we manipulate here the kriging equation object +% directly... + +kreq = stk_make_kreq (crit.model, x); + +prior_model = stk_get_prior_model (crit.model); + +zc_mean = (get (kreq, 'lambda'))' * (double (stk_get_output_data (crit.model))); +zc_var = stk_make_matcov (prior_model, x, x, true) - get (kreq, 'delta_var'); +zc_std = sqrt (max (0, zc_var)); +zcr_cov0 = stk_make_matcov (prior_model, x, crit.xr); +zcr_cov = zcr_cov0 - (get (kreq, 'RS'))' * crit.zr_lambdamu; + +AKG = stk_sampcrit_akg_eval ... + (zc_mean, zc_std, crit.zr_mean, crit.zr_std, zcr_cov); + +if nargout > 1 + zp = stk_dataframe ([zc_mean zc_var], {'mean' 'var'}); +end + +% FIXME: Loop over blocks, as in stk_predict ? + +end % function diff --git a/inst/sampling/@stk_sampcrit_akg/get.m b/inst/sampling/@stk_sampcrit_akg/get.m new file mode 100644 index 0000000..378b0a6 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_akg/get.m @@ -0,0 +1,33 @@ +% @STK_SAMPCRIT_AKG/GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (crit, propname) + +value = crit.(propname); + +end % function diff --git a/inst/sampling/@stk_sampcrit_akg/set.m b/inst/sampling/@stk_sampcrit_akg/set.m new file mode 100644 index 0000000..8cae7a8 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_akg/set.m @@ -0,0 +1,89 @@ +% @STK_SAMPCRIT_AKG/SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017, 2020 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crit = set (crit, propname, value) + +switch propname + + case 'model' + crit.model = value; + crit = compute_zr_data (crit); + + case 'reference_grid' + crit.reference_grid = double (value); + if ~ isempty (crit.model) + crit = compute_zr_data (crit); + end + + otherwise + + errmsg = sprintf ('There is no property named %s', propname); + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function + + +function crit = compute_zr_data (crit) + +if isempty (crit.model) + + crit.xr = []; + crit.zr_mean = []; + crit.zr_std = []; + crit.zr_lambdamu = []; + +else + + if isempty (crit.reference_grid) + crit.xr = unique (stk_get_input_data (crit.model), 'rows'); + else + crit.xr = crit.reference_grid; + end + + if isstruct (crit.model) + % Prior model described by a structure (currently considered as improper + % prior, since we have no way of distinguishing between proper and + % improper priors...) + crit.zr_mean = []; + crit.zr_std = []; + crit.zr_lambdamu = []; + else + [zp, lambda, mu] = stk_predict (crit.model, crit.xr); + crit.zr_mean = zp.mean; + crit.zr_std = sqrt (zp.var); + crit.zr_lambdamu = [lambda; mu]; + end + + % WARNING: the "mu" component of this lambdamu vector might be affected by a + % scaling introduced by the kreq object. Do not use directly. + +end + +end % function diff --git a/inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m b/inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m new file mode 100644 index 0000000..1f4813f --- /dev/null +++ b/inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m @@ -0,0 +1,186 @@ +% STK_SAMPCRIT_AKG [experimental] +% +% EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. +% STK users that wish to experiment with it are welcome to do so, but should +% be aware that API-breaking changes are likely to happen in future releases. +% We invite them to direct any questions, remarks or comments about this +% experimental class to the STK mailing list. +% +% CALL: CRIT = stk_sampcrit_akg (MODEL) +% +% creates an AKG criterion object CRIT associated to MODEL. The input +% argument MODEL can be empty, in which case CRIT is an uninstantiated +% criterion object (to be instantiated later by setting the 'model' +% property of CRIT). The reference grid is taken to be the current set of +% evaluation points as in [1]. +% +% CALL: CRIT = stk_sampcrit_akg (MODEL, XR) +% +% uses XR as reference grid. +% +% FOR MORE INFORMATION +% +% Refer to the documentation of stk_sampcrit_akg_eval for more information. +% +% REFERENCES +% +% [1] W. Scott, P. I. Frazier and W. B. Powell. The correlated knowledge +% gradient for simulation optimization of continuous parameters using +% Gaussian process regression. SIAM J. Optim, 21(3):996-1026, 2011. +% +% See also: stk_sampcrit_akg_eval + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crit = stk_sampcrit_akg (model, xr) + +% Public properties +crit.model = []; % read/write +crit.reference_grid = []; % read/write + +% Private (hidden, read-only) properties +crit.xr = []; +crit.zr_mean = []; +crit.zr_std = []; +crit.zr_lambdamu = []; + +% Create default object +crit = class (crit, 'stk_sampcrit_akg', stk_function ()); + +% Set user-defined value of reference_grid +if (nargin >= 2) && (~ isempty (xr)) + crit = set (crit, 'reference_grid', xr); +end + +% Instantiate the sampling criterion with a model +if (nargin >= 1) && (~ isempty (model)) + crit = set (crit, 'model', model); +end + +end % function + + +%% +% construct with nargin == 0 + +%!shared F, M, AKG +%! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); + +%!test F = stk_sampcrit_akg () % ending ";" omitted on purpose, to test disp + +%!assert (isempty (F.model)) +%!assert (isempty (get (F, 'model'))) +%!assert (isempty (F.reference_grid)) +%!assert (isempty (get (F, 'reference_grid'))) +%!error F.toto +%!error get (F, 'toto') + +%!error F.toto = 1.234; % field does not exist +%!error F = set (F, 'toto', 1.234); % field does not exist + +%!error AKG = feval (F, 1.0); + +%!test F = stk_sampcrit_akg (); F.model = M; +%! assert (isequal (F.model, M)); +%!test F = stk_sampcrit_akg (); F = set (F, 'model', M); +%! assert (isequal (F.model, M)); +%! assert (isequal (size (F.zr_mean), [3 1])) % n x 1 +%! assert (isequal (size (F.zr_std), [3 1])) % n x 1 +%! assert (isequal (size (F.zr_lambdamu), [4 3])) % (n+1) x n (constant mean) +%!test F.model = []; % remove model +%! assert (isempty (F.model)); +%! assert (isempty (F.zr_mean)) +%! assert (isempty (F.zr_std)) +%! assert (isempty (F.zr_lambdamu)) + +% set reference grid when model is empty +%!test xr = [1 1.5 2 2.5 3]'; +%! F.reference_grid = xr % ending ";" omitted on purpose, to test disp +%! assert (isequal (F.reference_grid, xr)) +%! assert (isempty (F.zr_mean)) +%! assert (isempty (F.zr_std)) +%! assert (isempty (F.zr_lambdamu)) +%!test F.reference_grid = []; +%! assert (isempty (F.reference_grid)) + +% set reference grid when model is not empty +%!test F = stk_sampcrit_akg (); F.model = M; +%! assert (isequal (F.model, M)); +%! xr = [1 1.5 2 2.5 3]'; +%! F.reference_grid = xr % ending ";" omitted on purpose, to test disp +%! assert (isequal (F.reference_grid, xr)) +%! assert (isequal (size (F.zr_mean), [5 1])) % nr x 1 +%! assert (isequal (size (F.zr_std), [5 1])) % nr x 1 +%! assert (isequal (size (F.zr_lambdamu), [4 5])) % (n+1) x nr (constant mean) +%!test F.reference_grid = []; +%! assert (isempty (F.reference_grid)) + +%% +% construct with nargin == 1; M is a proper (posterior) model + +%!test F = stk_sampcrit_akg (M) % ending ";" omitted on purpose, to test disp + +%!assert (isequal (F.model, M)) + +%!test AKG = feval (F, [1.0; 1.1; 1.2]); +%!assert (isequal (size (AKG), [3 1])) +%!assert (all (AKG >= 0)) + +%!test [AKG2, zp] = feval (F, [1.0; 1.1; 1.2]); +%! assert (isequal (AKG2, AKG)); +%! assert (isa (zp, 'stk_dataframe') && isequal (size (zp), [3 2])) + +%% +% construct with nargin == 1; M is an improper (prior) model + +%!shared F, xr +%! xr = [1 1.5 2 2.5 3]'; +%!test F = stk_sampcrit_akg (stk_model ()); +%!assert (isempty (F.reference_grid)) + +%!test F.reference_grid = xr; +%!assert (isequal (F.reference_grid, xr)) +%!assert (isempty (F.zr_mean)) +%!assert (isempty (F.zr_std)) +%!assert (isempty (F.zr_lambdamu)) + +%!error AKG = feval (F, 1.0); + + +%% +% construct with nargin == 2; M is a proper (posterior) model + +%!shared F, M, xr +%! xr = [1 1.5 2 2.5 3]'; +%! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); + +%!test F = stk_sampcrit_akg (M, xr); +%!assert (isequal (F.model, M)) +%!assert (isequal (F.reference_grid, xr)) +%!assert (isequal (size (F.zr_mean), [5 1])) % nr x 1 +%!assert (isequal (size (F.zr_std), [5 1])) % nr x 1 +%!assert (isequal (size (F.zr_lambdamu), [4 5])) % (n+1) x nr (constant mean) diff --git a/inst/sampling/@stk_sampcrit_ei/disp.m b/inst/sampling/@stk_sampcrit_ei/disp.m new file mode 100644 index 0000000..b6ad1b7 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_ei/disp.m @@ -0,0 +1,56 @@ +% @STK_SAMPCRIT_EI/DISP [overload base function] +% +% See also: disp + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (crit) + +loose_spacing = stk_disp_isloose (); + +fprintf ('<%s>\n', stk_sprintf_sizetype (crit)); + +if loose_spacing + fprintf ('|\n'); +end + +if isempty (crit.model) + % Uninstantiated sampling criterion + model_str = '-- (not instantiated)'; +else + % Instantiated sampling criterion + model_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.model)); +end + +fprintf ('| model: %s\n', model_str); +fprintf ('| current_minimum: %s\n', num2str (crit.current_minimum)); + +if loose_spacing + fprintf ('|\n\n'); +end + +end % function diff --git a/inst/sampling/@stk_sampcrit_ei/feval.m b/inst/sampling/@stk_sampcrit_ei/feval.m new file mode 100644 index 0000000..112f851 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_ei/feval.m @@ -0,0 +1,37 @@ +% @STK_SAMPCRIT_EI/FEVAL [overload base function] +% +% See also: feval + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [EI, zp] = feval (crit, x, varargin) + +zp = stk_predict (crit.model, x); + +EI = stk_sampcrit_ei_eval (zp.mean, sqrt (zp.var), crit.current_minimum); + +end % function diff --git a/inst/sampling/@stk_sampcrit_ei/get.m b/inst/sampling/@stk_sampcrit_ei/get.m new file mode 100644 index 0000000..b76be1a --- /dev/null +++ b/inst/sampling/@stk_sampcrit_ei/get.m @@ -0,0 +1,33 @@ +% @STK_SAMPCRIT_EI/GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (crit, propname) + +value = crit.(propname); + +end % function diff --git a/inst/sampling/@stk_sampcrit_ei/set.m b/inst/sampling/@stk_sampcrit_ei/set.m new file mode 100644 index 0000000..eaf0908 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_ei/set.m @@ -0,0 +1,69 @@ +% @STK_SAMPCRIT_EI/SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crit = set (crit, propname, value) + +switch propname + + case 'model' % Modifiable property + + if isempty (value) + + crit.model = []; + crit.current_minimum = +inf; + + else + + % Set 'model' property + crit.model = value; + + % Compute current minimum + zi = stk_get_output_data (crit.model); + if isempty (zi) + crit.current_minimum = +inf; + else + n = size (zi, 1); + crit.current_minimum = min (zi); + end + + end % if + + case 'current_min' % Read-only property + + stk_error (sprintf (['Property ''current_min'' is read-only.\n\n' ... + 'WHY: The value of ''current_min'' is computed automatically ' ... + 'from the input data of the model.']), 'ReadOnlyProperty'); + + otherwise + + errmsg = sprintf ('There is no property named %s', propname); + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function diff --git a/inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m b/inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m new file mode 100644 index 0000000..d55d33f --- /dev/null +++ b/inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m @@ -0,0 +1,109 @@ +% STK_SAMPCRIT_EI [experimental] +% +% EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. +% STK users that wish to experiment with it are welcome to do so, but should +% be aware that API-breaking changes are likely to happen in future releases. +% We invite them to direct any questions, remarks or comments about this +% experimental class to the STK mailing list. +% +% CALL: CRIT = stk_sampcrit_ei (MODEL) +% +% creates an EI criterion object CRIT associated to MODEL. The input +% argument MODEL can be empty, in which case CRIT is an uninstantiated +% criterion object (to be instantiated later by setting the 'model' +% property of CRIT). +% +% See also: stk_sampcrit_eqi + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crit = stk_sampcrit_ei (model) + +% Public properties +crit.model = []; % read/write +crit.current_minimum = inf; % read only + +% Create default object +crit = class (crit, 'stk_sampcrit_ei', stk_function ()); + +% Instantiate the sampling criterion with a model +if (nargin >= 1) && (~ isempty (model)) + crit = set (crit, 'model', model); +end + +end % function + + +%% +% construct with nargin == 0 + +%!shared F, M, EI +%! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); + +%!test F = stk_sampcrit_ei () % ending ";" omitted on purpose, to test disp + +%!assert (isempty (F.model)) +%!assert (isempty (get (F, 'model'))) +%!assert (F.current_minimum == +inf) +%!assert (get (F, 'current_minimum') == +inf) +%!error F.toto +%!error get (F, 'toto') + +%!error F.current_min = 1.234; % read-only +%!error F = set (F, 'current_min', 1.234); % read-only +%!error F.toto = 1.234; % field does not exist +%!error F = set (F, 'toto', 1.234); % field does not exist + +%!error EI = feval (F, 1.0); + +%!test F = stk_sampcrit_ei (); F.model = M; +%! assert (~ isempty (F.model)); +%!test F = stk_sampcrit_ei (); F = set (F, 'model', M); +%! assert (~ isempty (F.model)); +%!test F.model = []; % remove model +%! assert (isempty (F.model)); +%! assert (F.current_minimum == +inf); + +%% +% construct with nargin == 1; M is a proper (posterior) model + +%!test F = stk_sampcrit_ei (M) % ending ";" omitted on purpose, to test disp + +%!assert (isequal (F.model, M)) +%!assert (F.current_minimum == 1.234); + +%!test EI = feval (F, [1.0; 1.1; 1.2]); +%!assert (isequal (size (EI), [3 1])) +%!assert (all (EI >= 0)) + +%% +% construct with nargin == 1; M is an improper (prior) model + +%!shared F +%!test F = stk_sampcrit_ei (stk_model ()); +%!assert (F.current_minimum == +inf); +%!error feval (F, 1.0); diff --git a/inst/sampling/@stk_sampcrit_eqi/disp.m b/inst/sampling/@stk_sampcrit_eqi/disp.m new file mode 100644 index 0000000..4b35a7c --- /dev/null +++ b/inst/sampling/@stk_sampcrit_eqi/disp.m @@ -0,0 +1,64 @@ +% @STK_SAMPCRIT_EQI/DISP [overload base function] +% +% See also: disp + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function disp (crit) + +loose_spacing = stk_disp_isloose (); + +fprintf ('<%s>\n', stk_sprintf_sizetype (crit)); + +if loose_spacing + fprintf ('|\n'); +end + +if isempty (crit.model) + % Uninstantiated sampling criterion + model_str = '-- (not instantiated)'; +else + % Instantiated sampling criterion + model_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.model)); +end + +if isa (crit.point_batch_size, 'function_handle') + pbs_str = func2str (crit.point_batch_size); +else + pbs_str = num2str (crit.point_batch_size); +end + +fprintf ('| model: %s\n', model_str); +fprintf ('| quantile_order: %s\n', num2str (crit.quantile_order)); +fprintf ('| point_batch_size: %s\n', pbs_str); +fprintf ('| current_minimum: %s\n', num2str (crit.current_minimum)); + +if loose_spacing + fprintf ('|\n\n'); +end + +end % function diff --git a/inst/sampling/@stk_sampcrit_eqi/feval.m b/inst/sampling/@stk_sampcrit_eqi/feval.m new file mode 100644 index 0000000..57513f1 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_eqi/feval.m @@ -0,0 +1,70 @@ +% @STK_SAMPCRIT_EQI/FEVAL [overload base function] +% +% See also: feval + +% Copyright Notice +% +% Copyright (C) 2016, 2017, 2020 CentraleSupelec +% Copyright (C) 2016 EDF R&D +% +% Authors: Tom Assouline, Florent Autret & Stefano Duhamel (for EDF R&D) +% Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [EQI, zp] = feval (crit, x, tau2) + +zp = stk_predict (crit.model, x); + +zp_mean = zp.mean; +zp_std = sqrt (zp.var); + +if nargin < 3 + % If tau2 is missing, compute tau2 assuming that a batch of size + % crit.point_batch_size will be made at the selected evaluation point. + % Otherwise, use the value of tau2 provided as an input argument. Note + % that the value of crit.point_batch_size is ignored in this second case. + if stk_isnoisy (crit.model) + + if isa (crit.point_batch_size, 'function_handle') + n = stk_get_sample_size (crit.model); + pbs = feval (crit.point_batch_size, x, n); + else + pbs = crit.point_batch_size; + end + + prior_model = get (crit.model, 'prior_model'); + tau2 = (exp (prior_model.lognoisevariance)) / pbs; + + else + tau2 = 0; + end +end + +tmp = (zp_std .^ 2) ./ (tau2 + zp_std .^ 2); +tmp(zp_std == 0) = 0.0; +quantile_moy = zp_mean + crit.quantile_value * (sqrt (tau2 .* tmp)); +quantile_var = (zp_std .^ 2) .* tmp; + +EQI = stk_sampcrit_ei_eval ( ... + quantile_moy, sqrt (quantile_var), crit.current_minimum); + +end % function diff --git a/inst/sampling/@stk_sampcrit_eqi/get.m b/inst/sampling/@stk_sampcrit_eqi/get.m new file mode 100644 index 0000000..b76be1a --- /dev/null +++ b/inst/sampling/@stk_sampcrit_eqi/get.m @@ -0,0 +1,33 @@ +% @STK_SAMPCRIT_EI/GET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function value = get (crit, propname) + +value = crit.(propname); + +end % function diff --git a/inst/sampling/@stk_sampcrit_eqi/set.m b/inst/sampling/@stk_sampcrit_eqi/set.m new file mode 100644 index 0000000..9c81c75 --- /dev/null +++ b/inst/sampling/@stk_sampcrit_eqi/set.m @@ -0,0 +1,127 @@ +% @STK_SAMPCRIT_EQI/SET [overload base function] + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crit = set (crit, propname, value) + +switch propname + + case 'model' + + if isempty (value) + + crit.model = []; + crit.current_minimum = +inf; + + else + + crit.model = value; + crit.current_minimum = compute_current_minimum (crit); + + end + + case 'quantile_order' + + order = double (value); + + if (~ isscalar (order)) || (order < 0) || (order > 1) + stk_error (['The value of property ''quantile_order'' ' ... + 'must be a scalar between 0 and 1.'], 'InvalidArgument'); + else + crit.quantile_order = order; + try + crit.quantile_value = norminv (order); + catch + crit.quantile_value = - sqrt (2) * erfcinv (2 * order); % CG#09 + end + end + + if ~ isempty (crit.model) + crit.current_minimum = compute_current_minimum (crit); + end + + case 'point_batch_size' + + if ischar (value) + + crit.point_batch_size = str2func (value); + + elseif isa (value, 'function_handle') + + crit.point_batch_size = value; + + else % Last possibility: a fixed numeric value + + point_batch_size = double (value); + + if (~ isscalar (point_batch_size)) || (point_batch_size <= 0) ... + || (point_batch_size ~= floor (point_batch_size)) + stk_error ('Incorrect ''point_batch_size'' value', ... + 'InvalidArgument'); + else + crit.point_batch_size = point_batch_size; + end + + end + + case 'current_minimum' % Visible but read-only property + + stk_error (sprintf (['Property ''current_minimum'' is read-only.' ... + '\n\nWHY: The value of ''current_minimum'' is computed ' ... + 'automatically from the input data of the model.']), ... + 'ReadOnlyProperty'); + + case 'quantile_value' % Hidden, read-only property + + stk_error (sprintf (['Property ''quantile_value'' is read-only.' ... + '\n\nWHY: The value of ''quantile_value'' is computed ' ... + 'automatically from the value of ''quantile_order''.']), ... + 'ReadOnlyProperty'); + + otherwise + + errmsg = sprintf ('There is no property named %s', propname); + stk_error (errmsg, 'InvalidArgument'); + +end % switch + +end % function + + +function m = compute_current_minimum (crit) + +xi = stk_get_input_data (crit.model); + +if isempty (xi) + m = +inf; +else + zp = stk_predict (crit.model, xi); + q = zp.mean + crit.quantile_value * (sqrt (zp.var)); + m = min (q); +end + +end % function diff --git a/inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m b/inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m new file mode 100644 index 0000000..6de2fda --- /dev/null +++ b/inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m @@ -0,0 +1,203 @@ +% STK_SAMPCRIT_EQI [experimental] +% +% EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. +% STK users that wish to experiment with it are welcome to do so, but should +% be aware that API-breaking changes are likely to happen in future releases. +% We invite them to direct any questions, remarks or comments about this +% experimental class to the STK mailing list. +% +% CALL: CRIT = stk_sampcrit_eqi (MODEL) +% +% creates an EQI criterion object CRIT associated to MODEL, where the +% quantile of interest is the median of the output. The input argument +% MODEL can be empty, in which case CRIT is an uninstantiated criterion +% object (which can be instantiated later by setting the 'model' property +% of CRIT). +% +% CALL: CRIT = stk_sampcrit_eqi (MODEL, P) +% +% uses quantile order P instead of the default 0.5. +% +% See also: stk_sampcrit_ei + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function crit = stk_sampcrit_eqi (model, quantile_order, point_batch_size) + +% Public properties +crit.model = []; +crit.quantile_order = 0.5; +crit.point_batch_size = 1; +crit.current_minimum = inf; + +% Private (hidden, read-only) properties +crit.quantile_value = 0.0; + +crit = class (crit, 'stk_sampcrit_eqi', stk_function ()); + +% Set user-defined value of quantile_order +if (nargin >= 2) && (~ isempty (quantile_order)) + crit = set (crit, 'quantile_order', quantile_order); +end + +% Set user-defined value of point_batch_size +if (nargin >= 3) && (~ isempty (point_batch_size)) + crit = set (crit, 'point_batch_size', point_batch_size); +end + +% Instantiate the sampling criterion with a model (it is important to do this +% one last, to avoid re-computing current_minimum several times) +if (nargin >= 1) && (~ isempty (model)) + crit = set (crit, 'model', model); +end + +end % function + + +%% +% construct with nargin == 0 + +%!shared F, M, EQI +%! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); + +%!test F = stk_sampcrit_eqi () % ending ";" omitted on purpose, to test disp + +%!assert (isempty (F.model)) +%!assert (isempty (get (F, 'model'))) +%!assert (F.quantile_order == 0.5) +%!assert (get (F, 'quantile_order') == 0.5) +%!assert (F.current_minimum == +inf) +%!assert (get (F, 'current_minimum') == +inf) +%!error F.toto +%!error get (F, 'toto') + +%!error F.current_min = 1.234; % read-only +%!error F = set (F, 'current_min', 1.234); % read-only +%!error F.toto = 1.234; % field does not exist +%!error F = set (F, 'toto', 1.234); % field does not exist +%!test F.quantile_order = 0.9; assert (F.quantile_order == 0.9) +%!test F = set (F, 'quantile_order', 0.8); assert (F.quantile_order == 0.8) +%!error F.quantile_order = 1.1; +%!error F.quantile_order = -0.1; +%!error F.quantile_order = [1 2]; +%!error F.current_minimum = 3.333; % read-only +%!error F.quantile_value = 2.222; % read-only + +%!error EQI = feval (F, 1.0); + +%!test F = stk_sampcrit_eqi (); F.model = M; +%! assert (~ isempty (F.model)); +%!test F = stk_sampcrit_eqi (); F = set (F, 'model', M); +%! assert (~ isempty (F.model)); +%!test F.model = []; % remove model +%! assert (isempty (F.model)); +%! assert (F.current_minimum == +inf); + +%% +% construct with nargin == 1; M is a proper (posterior) model + +%!test F = stk_sampcrit_eqi (M) % ending ";" omitted on purpose, to test disp + +%!assert (isequal (F.model, M)) +%!assert (stk_isequal_tolrel (F.current_minimum, 1.234, 10 * eps)); + +%!test EQI = feval (F, [1.0; 1.1; 1.2]); +%!assert (isequal (size (EQI), [3 1])) +%!assert (all (EQI >= 0)) + +%!test F.quantile_order = 0.9; assert (F.quantile_order == 0.9) + +%% +% same as the one before, but with a noisy model + +%!shared F, M, EQI +%! prior_model = stk_model (); +%! prior_model.lognoisevariance = 0.678; +%! M = stk_model_gpposterior (prior_model, [1 2 3]', [1.234 3 2]'); + +%!test F = stk_sampcrit_eqi (M); + +%!assert (isequal (F.model, M)) +%!assert (stk_isequal_tolrel (F.current_minimum, 2.077997, 1e-5)); + +%!test EQI = feval (F, [1.0; 1.1; 1.2]); +%!assert (isequal (size (EQI), [3 1])) +%!assert (all (EQI >= 0)) + +%!test F.quantile_order = 0.9; assert (F.quantile_order == 0.9) + +%% +% construct with nargin == 1; M is an improper (prior) model + +%!shared F +%!test F = stk_sampcrit_eqi (stk_model ()); +%!assert (F.current_minimum == +inf); +%!error feval (F, 1.0); + +%% +% construct with nargin == 2 + +%!shared F, M +%! M = stk_model_gpposterior (stk_model (), [1 2 3]', [1.234 3 2]'); + +%!error F = stk_sampcrit_eqi (M, [], 0); +%!error F = stk_sampcrit_eqi (M, [], 1.5); +%!error F = stk_sampcrit_eqi (M, [], nan); +%!error F = stk_sampcrit_eqi (M, [], [10 20]); +%!test F = stk_sampcrit_eqi (M, [], 10); + +%!assert (isequal (F.quantile_order, 0.5)); +%!assert (isequal (F.point_batch_size, 10)); + +%!error F = stk_sampcrit_eqi (M, 0.8, 0); +%!error F = stk_sampcrit_eqi (M, 0.8, 1.5); +%!error F = stk_sampcrit_eqi (M, 0.8, nan); +%!error F = stk_sampcrit_eqi (M, 0.8, [10 20]); +%!test F = stk_sampcrit_eqi (M, 0.8, 5); + +%!assert (isequal (F.quantile_order, 0.8)); +%!assert (isequal (F.point_batch_size, 5)); + +%% +% test various forms for point_batch_size + +%!shared F, M, EQI +%! prior_model = stk_model (); +%! prior_model.lognoisevariance = 0.678; +%! M = stk_model_gpposterior (prior_model, [1 2 3]', [1.234 3 2]'); +%! F = stk_sampcrit_eqi (M); + +%!test F.point_batch_size = 10; % numeric +%!assert (isequal (F.point_batch_size, 10)) +%!test EQI = feval (F, [1.0; 1.1; 1.2]); + +%!test F.point_batch_size = @(x, n) 100 - n; % function handle +%!assert (isa (F.point_batch_size, 'function_handle')) +%!test EQI = feval (F, [1.0; 1.1; 1.2]); + +%!test F.point_batch_size = 'sin'; % char +%!assert (isa (F.point_batch_size, 'function_handle')) diff --git a/inst/sampling/stk_halfpintl.m b/inst/sampling/stk_halfpintl.m new file mode 100644 index 0000000..cc4a941 --- /dev/null +++ b/inst/sampling/stk_halfpintl.m @@ -0,0 +1,194 @@ +% STK_HALFPINTL computes an intersection of lower half-planes +% +% CALL: [A, B, Z] = stk_halfpintl (A, B) +% +% computes the intersection of the lower half-planes defined by the vector +% of slopes A and the vector of intercepts B. The output vectors A and B +% contain the slopes and intercept of the lines that actually contribute to +% the boundary of the intersection, sorted in such a way that the k^th +% element corresponds to the k^th piece of the piecewise affine boundary. +% The output Z contains the intersection points (shorter by one element). +% +% ALGORITHM +% +% The algorithm implemented in this function is described in [1, 2]. +% +% REFERENCE +% +% [1] P. I. Frazier, W. B. Powell, and S. Dayanik. The Knowledge-Gradient +% Policy for Correlated Normal Beliefs. INFORMS Journal on Computing +% 21(4):599-613, 2009. +% +% [2] W. Scott, P. I. Frazier and W. B. Powell. The correlated knowledge +% gradient for simulation optimization of continuous parameters using +% Gaussian process regression. SIAM J. Optim, 21(3):996-1026, 2011. + +% Copyright Notice +% +% Copyright (C) 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [a, b, z] = stk_halfpintl (a, b) + +% a: slopes +% b: intercepts + +m = length (a); +assert (isequal (size (a), [m 1])); +assert (isequal (size (b), [m 1])); + +if m == 1 + z = []; + return +end + + +% 1) Sort by decreasing slopes (and increasing intercept in case of equality) + +tmp = [a b]; +tmp = sortrows (tmp, [-1 2]); +a_in = tmp(:, 1); +b_in = tmp(:, 2); + + +% 2) Prepare output lists + +a_out = nan (m, 1); % *at most* m lines in the output list +b_out = nan (m, 1); +z_out = nan (m - 1, 1); % the maximal number of intersections in m - 1, then + +a_out(1) = a_in(1); +b_out(1) = b_in(1); + +k_in = 2; % index of the next input element to be analyzed +k_out = 1; % index of the last element stored in the output list + + +% 3) Process input list + +while k_in <= m + + if a_in(k_in) == a_out(k_out) % equality of slopes + + k_in = k_in + 1; + + else % inequality: a_in(k_in) < a_out(k_out) + + % Compute intersection + z = (b_in(k_in) - b_out(k_out)) / (a_out(k_out) - a_in(k_in)); + + if (k_out == 1) || (z > z_out(k_out-1)) + % Insert the new element at the end of the output list + z_out(k_out) = z; + k_out = k_out + 1; + a_out(k_out) = a_in(k_in); + b_out(k_out) = b_in(k_in); + k_in = k_in + 1; + else + % Remove the last element of the output list + k_out = k_out - 1; + end + + end % if + +end % while + +a = a_out(1:k_out); +b = b_out(1:k_out); +z = z_out(1:(k_out - 1)); + +end % function + + +%!test % case #1 +%! a = 1; +%! b = 1; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (a_out == 1) +%! assert (b_out == 1) +%! assert (isempty (z_out)) + +%!test % case #2: two lines, slopes not equal, already sorted +%! a = [1; -1]; +%! b = [0; 2]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (isequal (a_out, [1; -1])) +%! assert (isequal (b_out, [0; 2])) +%! assert (z_out == 1) + +%!test % case #3: same as #2, but not sorted +%! a = [-1; 1]; +%! b = [ 2; 0]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (isequal (a_out, [1; -1])) +%! assert (isequal (b_out, [0; 2])) +%! assert (z_out == 1) + +%!test % case #4: two lines, equal slopes, already sorted +%! a = [0; 0]; +%! b = [1; 2]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (a_out == 0) +%! assert (b_out == 1) +%! assert (isempty (z_out)) + +%!test % case #5: same as #4, but not sorted +%! a = [0; 0]; +%! b = [2; 1]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (a_out == 0) +%! assert (b_out == 1) +%! assert (isempty (z_out)) + +%!test % case #6: add a dominated line to #2 (the result does not change) +%! a = [1; -1; 0]; +%! b = [0; 2; 1]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (isequal (a_out, [1; -1])) +%! assert (isequal (b_out, [0; 2])) +%! assert (z_out == 1) + +%!test % case #7: permutation of #6 +%! a = [1; 0; -1]; +%! b = [0; 1; 2]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (isequal (a_out, [1; -1])) +%! assert (isequal (b_out, [0; 2])) +%! assert (z_out == 1) + +%!test % case #8: another permutation of #6 +%! a = [0; 1; -1]; +%! b = [1; 0; 2]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (isequal (a_out, [1; -1])) +%! assert (isequal (b_out, [0; 2])) +%! assert (z_out == 1) + +%!test % case #9: same as #8, with some duplicated lines added +%! a = [0; 1; 0; -1; 0; -1; 1]; +%! b = [1; 0; 1; 2; 1; 2; 0]; +%! [a_out, b_out, z_out] = stk_halfpintl (a, b); +%! assert (isequal (a_out, [1; -1])) +%! assert (isequal (b_out, [0; 2])) +%! assert (z_out == 1) diff --git a/inst/sampling/stk_sampcrit_akg_eval.m b/inst/sampling/stk_sampcrit_akg_eval.m new file mode 100644 index 0000000..6d47408 --- /dev/null +++ b/inst/sampling/stk_sampcrit_akg_eval.m @@ -0,0 +1,228 @@ +% STK_SAMPCRIT_AKG_EVAL computes the Approximate KG criterion +% +% CALL: AKG = stk_sampcrit_akg_eval (ZC_MEAN, ZC_STD, ZR_MEAN, ZR_STD, ZCR_COV) +% +% computes the value AKG of the Approximate KG criterion for a set of +% candidates points, with respect to a certain reference grid. The +% predictive distributions of the objective function (to be minimized) at +% the candidates and reference points is assumed to be jointly Gaussian, +% with mean ZC_MEAN and standard deviation ZC_STD for the candidate points, +% mean ZR_MEAN and satandard deviation ZR_STD on the reference points, and +% covariance matrix ZCR_COV between the candidate and reference points. +% The input argument must have the following sizes: +% +% * ZC_MEAN M x 1, +% * ZC_STD M x 1, +% * ZR_MEAN L x 1, +% * ZR_STD L x 1, +% * ZCR_COV M x L, +% +% where M is the number of candidate points and L the number of reference +% points. The output has size M x 1. +% +% NOTE ABOUT THE "KNOWLEDGE GRADIENT" CRITERION +% +% The "Knowlegde Gradient" (KG) criterion is the one-step look-ahead (a.k.a +% myopic) sampling criterion associated to the problem of estimating the +% minimizer of the objective function under the L^1 loss (equivalently, +% under the linear loss/utility). +% +% This sampling strategy was proposed for the first time in the work of +% Mockus and co-authors in the 70's (see [1] and refs therein), for the case +% of noiseless evaluations, but only applied to particular Brownian-like +% processes for which the minimum of the posterior mean coincides with the +% best evaluations so far (in which case the KG criterion coincides with the +% EI criterion introduced later by Jones et al [2]). +% +% It was later discussed for the case of a finite space with independent +% Gaussian priors first by Gupta and Miescke [3] and then by Frazier et al +% [4] who named it "knowledge gradient". It was extended to the case of +% correlated priors by Frazier et al [5]. +% +% NOTE ABOUT THE REFERENCE SET +% +% For the case of continuous input spaces, there is no exact expression of +% the KG criterion. The approximate KG criterion proposed in this function +% is an approximation of the KG criterion where the continuous 'min' in the +% expression of the criterion at the i^th candidate point are replaced by +% discrete mins over some reference grid *augmented* with the i^th candidate +% point. +% +% This type of approximation has been proposed by Scott et al [6] under the +% name "knowledge gradient for continuous parameters" (KGCP). In [6], the +% reference grid is composed of the current set of evaluation points. The +% implementation proposed in STK leaves this choice to the user. +% +% Note that, with the reference grid proposed in [6], the complexity of one +% evaluation of the AKG (KGCP) criterion increases as O(N log N), where N +% denotes the number of evaluation points. +% +% NOTE ABOUT THE NOISELESS CASE +% +% Simplified formulas are available for the noiseless case (see [7]) but not +% currenly implemented in STK. +% +% REFERENCES +% +% [1] J. Mockus, V. Tiesis and A. Zilinskas. The application of Bayesian +% methods for seeking the extremum. In L.C.W. Dixon and G.P. Szego, eds, +% Towards Global Optimization, 2:117-129, North Holland NY, 1978. +% +% [2] D. R. Jones, M. Schonlau and William J. Welch. Efficient global +% optimization of expensive black-box functions. Journal of Global +% Optimization, 13(4):455-492, 1998. +% +% [3] S. Gupta and K. Miescke, Bayesian look ahead one-stage sampling +% allocations for selection of the best population, J. Statist. Plann. +% Inference, 54:229-244, 1996. +% +% [4] P. I. Frazier, W. B. Powell, S. Dayanik, A knowledge gradient policy +% for sequential information collection, SIAM J. Control Optim., +% 47(5):2410-2439, 2008. +% +% [5] P. I. Frazier, W. B. Powell, and S. Dayanik. The Knowledge-Gradient +% Policy for Correlated Normal Beliefs. INFORMS Journal on Computing +% 21(4):599-613, 2009. +% +% [6] W. Scott, P. I. Frazier and W. B. Powell. The correlated knowledge +% gradient for simulation optimization of continuous parameters using +% Gaussian process regression. SIAM J. Optim, 21(3):996-1026, 2011. +% +% [7] J. van der Herten, I. Couckuyt, D. Deschrijver, T. Dhaene, Fast +% Calculation of the Knowledge Gradient for Optimization of Deterministic +% Engineering Simulations, arXiv preprint arXiv:1608.04550 +% +% See also: STK_SAMPCRIT_EI_EVAL + +% Copyright Notice +% +% Copyright (C) 2017, 2018, 2021 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std, zcr_cov) + +% zc_mean: M x 1 where M is the number of (C)andidate points +% zc_std: M x 1 +% zr_mean: L x 1 where L is the number of (R)eference points +% zr_std: L x 1 +% zcr_cov M x L covariance between (C)andidate points and (R)eference points + +% note: Scott et al.'s "KGCP" corresponds to refs points X_1, ..., X_n + +M = size (zc_mean, 1); +if ~ isequal (size (zc_mean), [M 1]) + stk_error (['zc_mean should have size M x 1, where M is the number of ' ... + 'candidate points.'], 'IncorrectSize'); +end +if ~ isequal (size (zc_std), [M 1]) + stk_error (['zc_std should have size M x 1, where M is the number of ' ... + 'candidate points.'], 'IncorrectSize'); +end + +L = size (zr_mean, 1); +if ~ isequal (size (zr_mean), [L 1]) + stk_error (['zr_mean should have size L x 1, where L is the number of ' ... + 'reference points.'], 'IncorrectSize'); +end +if ~ isequal (size (zr_std), [L 1]) + stk_error (['zr_std should have size L x 1, where L is the number of ' ... + 'reference points.'], 'IncorrectSize'); +end + +if ~ isequal (size (zcr_cov), [M L]) + stk_error (['zcr_cov should have size L x 1, where M is the number of ' ... + 'candidate points and L the number of reference points.'], ... + 'IncorrectSize'); +end + +AKG = zeros (M, 1); + +% Minimum over the reference grid +if isempty (zr_mean) + zr_min = +inf; +else + zr_min = min (zr_mean); +end + +for i = 1:M + + if zc_std(i) == 0, continue; end + + % Mitigate the effect of small inaccurate covariance values + a0 = zcr_cov(i,:)' / zc_std(i); + a0 = max (-zr_std, min (zr_std, a0)); + + a = [a0; zc_std(i)]; % slopes + b = [zr_mean; zc_mean(i)]; % intercepts + + % Intersection of lower half-planes + % (algorithm similar to the one in Scott et al, 2011, Table 4.1, + % except that cases of equal slopes are dealt with inside the loop) + [a, b, z] = stk_halfpintl (a, b); + + % Compute normal cdfs and pdfs + F = [0; stk_distrib_normal_cdf(z); 1]; + p = [0; stk_distrib_normal_pdf(z); 0]; + + % Compute the expected min (Equation 4.11 in Scott et al, 2011) + expected_min = sum (b .* diff (F)) - sum (a .* diff (p)); + + % Finally, compute the value of the AKG criterion + AKG(i) = max (0, min (zr_min, zc_mean(i)) - expected_min); + +end % for + +end % function + + +%!shared zc_mean, zc_std, zr_mean, zr_std, zcr_cov, AKG, nc +%! xi = [0; 0.2; 0.7; 0.9]; +%! zi = [1; 0.9; 0.6; 0.1] - 10; +%! ni = 4; +%! +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); +%! M_prior.lognoisevariance = 0.678; +%! +%! nc = 20; +%! xc = stk_sampling_regulargrid (nc, 1, [0; 1]); +%! [zp, ~, ~, K] = stk_predict (M_prior, xi, zi, [xi; xc]); +%! +%! ir = 1:ni; ic = ni + (1:nc); +%! +%! zc_mean = zp.mean(ic); +%! zc_std = sqrt (zp.var(ic)); +%! +%! % reference grid: current evaluation points ("KGCP") +%! zr_mean = zp.mean(ir); +%! zr_std = sqrt (zp.var(ir)); +%! +%! zcr_cov = K(ic, ir); + +%!test AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std, zcr_cov); +%!assert (isequal (size (AKG), [nc 1])) +%!assert (all (AKG >= 0)) + +% not enough or too many input args +%!error AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std); diff --git a/inst/sampling/stk_sampcrit_ehvi_eval.m b/inst/sampling/stk_sampcrit_ehvi_eval.m new file mode 100644 index 0000000..f0140fc --- /dev/null +++ b/inst/sampling/stk_sampcrit_ehvi_eval.m @@ -0,0 +1,135 @@ +% STK_SAMPCRIT_EHVI_EVAL computes the EHVI criterion +% +% CALL: EHVI = stk_sampcrit_ehvi_eval (ZP_MEAN, ZP_STD, ZI, ZR) +% +% computes the value EHVI of the Expected HyperVolume Improvement (EHVI) for +% a multi-objective minimization problem, with respect to the observed values +% ZI and the reference point ZR, assuming Gaussian predictive distributions +% with means ZP_MEAN and standard deviations ZP_STD. The input arguments +% must have the following sizes: +% +% * ZP_MEAN M x P, +% * ZP_STD M x P, +% * ZI N x P, +% * ZR 1 x P, +% +% where M is the number of points where the EHVI must be computed, P the +% number of objective functions to be minimized, and N the current number of +% Pareto optimal solutions. The output has size M x 1. +% +% NOTE +% +% 1) The result depends only on the non-dominated rows of ZI. +% +% 2) Multi-objective maximization problems, or mixed minimization/maximization +% problems, can be handled by changing the sign of the corresponding +% components of ZP_MEAN and ZI. +% +% REFERENCES +% +% [1] Emmerich, M. T., Giannakoglou, K. C., & Naujoks, B. Single- and +% multiobjective evolutionary optimization assisted by gaussian random +% field metamodels. IEEE Transactions on Evolutionary Computation, +% 10(4), 421-439, 2006. +% +% See also: stk_sampcrit_emmi_eval, stk_sampcrit_ei_eval + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr) + +% EHVI with respect to the reference +EIr = stk_distrib_normal_ei (zr, zp_mean, zp_std, 1); % m x p +EHVI = prod (EIr, 2); % m x 1 + +% Compute signed decomposition wrt to the reference zr +% (note: stk_dominatedhv removes non-dominated points and duplicates from zi) +S = stk_dominatedhv (zi, zr, 1); + +if ~ isempty (S.sign) + + % Shift rectangle number to third dimension + Rs = shiftdim (S.sign, -2); + Ra = shiftdim (S.xmin', -1); + Rb = shiftdim (S.xmax', -1); + + % Number of rectangles + R = size (Ra, 3); + + % Deal with BLOCK_SIZE rectangles at a time to avoid OOM + BLOCK_SIZE = ceil (1e7 / (numel (EIr))); + nb_blocks = ceil (R / BLOCK_SIZE); + r2 = 0; + for b = 1:nb_blocks + + r1 = r2 + 1; + r2 = min (r1 + BLOCK_SIZE - 1, R); + + % Both EIa and EIb will have size m x p x BLOCK_SIZE + EIa = stk_distrib_normal_ei (Ra(:, :, r1:r2), zp_mean, zp_std, 1); + EIb = stk_distrib_normal_ei (Rb(:, :, r1:r2), zp_mean, zp_std, 1); + + EHVI = EHVI - sum (bsxfun (@times, ... + Rs(:, :, r1:r2), prod (EIb - EIa, 2)), 3); + + end % if + +end % if + +end % function + + +%!shared zr, zi +%! zr = [1 1]; +%! zi = [0.25 0.75; 0.5 0.5; 0.75 0.25]; + +%!test % no improvement (1 computation) +%! zp_mean = [0.6 0.6]; zp_std = [0 0]; +%! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); +%! assert (stk_isequal_tolabs (EHVI, 0, 1e-12)); + +%!test % guaranteed improvement (1 computation) +%! zp_mean = [0 0]; zp_std = [0 0]; +%! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); +%! assert (stk_isequal_tolabs (EHVI, 10 * 0.25 ^ 2)); + +%!test % no improvement again (2 computations) +%! zp_mean = [0.5 0.5; 0.6 0.6]; zp_std = [0 0; 0 0]; +%! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); +%! assert (stk_isequal_tolabs (EHVI, [0; 0], 1e-12)); + +%!test % no observation -> EHVI wrt zr +%! zp_mean = [0.6 0.6]; zp_std = 0.01 * [1 1]; zi = []; +%! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); +%! assert (stk_isequal_tolabs (EHVI, (1 - 0.6)^2, 1e-12)); + +%!test % no observation below zr -> EHVI wrt zr +%! zp_mean = [0.6 0.6]; zp_std = 0.01 * [1 1]; zi = [2 2]; +%! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); +%! assert (stk_isequal_tolabs (EHVI, (1 - 0.6)^2, 1e-12)); + +% FIXME: add MORE unit tests diff --git a/inst/sampling/stk_sampcrit_ei_eval.m b/inst/sampling/stk_sampcrit_ei_eval.m new file mode 100644 index 0000000..621dce1 --- /dev/null +++ b/inst/sampling/stk_sampcrit_ei_eval.m @@ -0,0 +1,95 @@ +% STK_SAMPCRIT_EI_EVAL computes the EI criterion +% +% CALL: EI = stk_sampcrit_ei_eval (ZP_MEAN, ZP_STD, ZI) +% +% computes the value EI of the Expected Improvement (EI) criterion for a +% minimization problem, with respect to the observed values ZI, assuming +% Gaussian predictive distributions with means ZP_MEAN and standard +% deviations ZP_STD. The input argument must have the following sizes: +% +% * ZP_MEAN M x 1, +% * ZP_STD M x 1, +% * ZI N x 1, +% +% where M is the number of points where the EI must be computed, and N the +% number of observations. The output has size M x 1. +% +% REMARK +% +% Since the EI is computed for a minimization problem, the result depends +% on the minimum of the obervations only, not on the entire set of observed +% values. The above call is thus equivalent to +% +% EI = stk_sampcrit_ei_eval (ZP_MEAN, ZP_STD, min (ZI)) +% +% NOTE +% +% This function was added in STK 2.4.1, and will in the future completely +% replace stk_distrib_normal_ei. Note that, unlike the present function, +% stk_distrib_normal_ei returns as a default the EI for a *maximization* +% problem. +% +% REFERENCES +% +% [1] D. R. Jones, M. Schonlau and William J. Welch. Efficient global +% optimization of expensive black-box functions. Journal of Global +% Optimization, 13(4):455-492, 1998. +% +% [2] J. Mockus, V. Tiesis and A. Zilinskas. The application of Bayesian +% methods for seeking the extremum. In L.C.W. Dixon and G.P. Szego, +% editors, Towards Global Optimization, volume 2, pages 117-129, North +% Holland, New York, 1978. + +% Copyright Notice +% +% Copyright (C) 2016-2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function EI = stk_sampcrit_ei_eval (zp_mean, zp_std, zi) + +% Evaluate the sampling criterion +EI = stk_distrib_normal_ei (min (zi), zp_mean, zp_std, true); + +end % function + + +%!error EI = stk_sampcrit_ei_eval () % not enough args +%!error EI = stk_sampcrit_ei_eval (0) % not enough args + +%% +% Compare various ways to compute the EI + +%!shared xi, zi, M_prior, xt, zp, EIref, EI1, EI2, EI3 +%! xi = [0; 0.2; 0.7; 0.9]; +%! zi = [1; 0.9; 0.6; 0.1]; +%! M_prior = stk_model (@stk_materncov32_iso); +%! M_prior.param = log ([1.0; 2.1]); +%! xt = stk_sampling_regulargrid (20, 1, [0; 1]); +%! zp = stk_predict (M_prior, xi, zi, xt); +%! EIref = stk_distrib_normal_ei (min (zi), zp.mean, sqrt (zp.var), true); + +%!test % Current syntax (STK 2.4.1 and later) +%! EI1 = stk_sampcrit_ei_eval (zp.mean, sqrt (zp.var), min (zi)); + +%!assert (isequal (EI1, EIref)) diff --git a/inst/sampling/stk_sampcrit_emmi_eval.m b/inst/sampling/stk_sampcrit_emmi_eval.m new file mode 100644 index 0000000..8d32f9c --- /dev/null +++ b/inst/sampling/stk_sampcrit_emmi_eval.m @@ -0,0 +1,117 @@ +% STK_SAMPCRIT_EMMI_EVAL computes the EMMI criterion +% +% CALL: EMMI = stk_sampcrit_emmi_eval (ZP_MEAN, ZP_STD, ZI) +% +% computes the value EMMI of the Expected MaxiMin Improvement (EMMI) for a +% multi-objective minimization problem, with respect to the observed values +% ZI, assuming Gaussian predictive distributions with means ZP_MEAN and +% standard deviations ZP_STD. The value of the criterion is computed +% approximately, using Monte Carlo simulations. The input arguments must +% have the following sizes: +% +% * ZP_MEAN M x P, +% * ZP_STD M x P, +% * ZI N x P, +% +% where M is the number of points where the EMMI must be computed, P the +% number of objective functions to be minimized, and N the current number of +% Pareto optimal solutions. The output has size M x 1. +% +% CALL: EMMI = stk_sampcrit_emmi_eval (ZP_MEAN, ZP_STD, ZI, NSIMU) +% +% allows to change the number of simulations NSIMU used in the calculation of +% the criterion. +% +% NOTE +% +% 1) The result depends only on the non-dominated rows of ZI. +% +% 2) Multi-objective maximization problems, or mixed minimization/maximization +% problems, can be handled by changing the sign of the corresponding +% components of ZP_MEAN and ZI. +% +% 3) Objective functions should be normalized for better performances. +% +% REFERENCES +% +% [1] Svenson, J., & Santner, T. (2016). Multiobjective optimization of +% expensive-to-evaluate deterministic computer simulator models. +% Computational Statistics & Data Analysis, 94, 250-264, +% DOI: 10.1016/j.csda.2015.08.011. +% +% See also: stk_sampcrit_ehvi_eval + +% Copyright Notice +% +% Copyright (C) 2017, 2018, 2020 CentraleSupelec +% Copyright (C) 2016 IRT SystemX +% +% Author: Paul Feliot + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function EMMI = stk_sampcrit_emmi_eval (zp_mean, zp_std, zi, nsimu) + +% Handle empty zp +if isempty (zp_mean) || isempty (zp_std) + EMMI = []; + return +end + +% Handle empty zi +if isempty (zi) + stk_error ('Empty zi.', 'EmptyZi') +else + zi = double (zi); + % Keep only non-dominated points, and remove duplicates + zi = unique (zi(stk_paretofind (zi), :), 'rows'); +end + +% Size parameters +n = size (zp_mean, 1); +[np, p] = size(zi); + +% Number of simulation not provided: Defaults to nsimu = 200 x p +if nargin == 3 + nsimu = 200 * p; +end + +% The criterion is calculated using Monte Carlo simulation +EMMI = zeros (n, 1); +for i = 1:n + + % Simulate normal distribution + simu = bsxfun (@plus, zp_mean(i,1:p), ... + bsxfun (@times, zp_std(i,1:p), randn (nsimu, p))); + + % Compute maximin improvement + maximin = min (bsxfun(@minus, simu, zi(1,:)), [], 2); + for k = 2:np + maximin = max (maximin, min (bsxfun(@minus, simu, zi(k,:)), [], 2)); + end + isdom = stk_isdominated (simu, zi); + improvement = - maximin .* ~isdom; + + % Approximate expectation + EMMI(i) = 1/nsimu * sum (improvement); +end + +end % function diff --git a/inst/sampling/stk_sampling_halton_rr2.m b/inst/sampling/stk_sampling_halton_rr2.m new file mode 100644 index 0000000..0149551 --- /dev/null +++ b/inst/sampling/stk_sampling_halton_rr2.m @@ -0,0 +1,138 @@ +% STK_SAMPLING_HALTON_RR2 generates points from the Halton/RR2 sequence +% +% CALL: X = stk_sampling_halton_rr2 (N, D) +% +% computes the first N terms of the D-dimensional RR2-scrambled Halton +% sequence. +% +% REFERENCE +% +% Ladislav Kocis and William J. Whiten, "Computational investigations of low +% discrepancy sequences", ACM Transactions on Mathematical Software, +% 23(2):266-294, 1997. http://dx.doi.org/10.1145/264029.264064 +% +% SEE ALSO: __stk_sampling_vdc_rr2__ + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% Copyright (C) 2013 Alexandra Krauth, Elham Rahali & SUPELEC +% +% Authors: Julien Bect +% Alexandra Krauth +% Elham Rahali + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_sampling_halton_rr2 (n, d, box) + +% Read argument dim +if (nargin < 2) || ((nargin < 3) && (isempty (d))) + d = 1; % Default dimension +elseif (nargin > 2) && (~ isempty (box)) + d = size (box, 2); +end + +% Read argument 'box' +if (nargin < 3) || isempty (box) + colnames = {}; +else + box = stk_hrect (box); % convert input argument to a proper box + colnames = box.colnames; +end + +xdata = zeros (n, d); +for j = 1:d, + xdata(:, j) = double (__stk_sampling_vdc_rr2__ (n, j)); +end + +x = stk_dataframe (xdata, colnames); + +if nargin > 2, + x = stk_rescale (x, [], box); +end + +end % function + + +%!error stk_sampling_halton_rr2 () % nargin < 1 + +%!test +%! n = 300; d = 25; +%! x = stk_sampling_halton_rr2 (n, d); +%! assert (isequal (size (x), [n d])) + +%!test +%! x = stk_sampling_halton_rr2 (1000, 3); +%! y = double (x(end, :)); +%! yref = [0.9052734375 0.028349336991312 0.74848]; +%! assert (stk_isequal_tolrel (y, yref, 1e-13)); + +%% +% Check that column names are properly set, if available in box + +%!test +%! dim = 2; box = stk_hrect (dim); +%! x = stk_sampling_halton_rr2 (5, dim, box); +%! assert (isequal (x.colnames, {})); + +%!test +%! dim = 2; cn = {'W', 'H'}; box = stk_hrect (dim, cn); +%! x = stk_sampling_halton_rr2 (5, dim, box); +%! assert (isequal (x.colnames, cn)); + +%% +% Comparison with Scilab+lowdisc + +% % Matlab/Octave STK test script +% +% NREP = 10; +% M = 1e5; +% DIM = 20; +% +% tic; +% for i = 1:NREP +% x = stk_sampling_halton_rr2(M, DIM); +% end; +% t1 = toc/NREP; +% fprintf('time elapsed: %.2e seconds\n', t1); +% +% fprintf('%.15f\n', x(1:5, 2)) + +% // Scilab lowdisc test script +% +% NREP = 10; +% M = 1e5; +% DIM = 20; +% +% tic(); +% for i = 1:NREP, +% rng = lowdisc_new("halton"); +% rng = lowdisc_configure(rng, "-dimension", DIM); +% rng = lowdisc_configure(rng, "-scrambling", "RR2"); +% rng = lowdisc_startup(rng); +% [rng, x] = lowdisc_next(rng, M); +% rng = lowdisc_destroy(rng); +% end +% t = toc() / NREP +% +% mprintf('%.15f\n', x(1:9, 2)) diff --git a/inst/sampling/stk_sampling_maximinlhs.m b/inst/sampling/stk_sampling_maximinlhs.m new file mode 100644 index 0000000..d9b5f41 --- /dev/null +++ b/inst/sampling/stk_sampling_maximinlhs.m @@ -0,0 +1,161 @@ +% STK_SAMPLING_MAXIMINLHS generates a "maximin" LHS design +% +% CALL: X = stk_sampling_maximinlhs (N, DIM) +% +% generates a "maximin" Latin Hypercube Sample of size N in the +% DIM-dimensional hypercube [0; 1]^DIM. More precisely, NITER = 1000 +% independent random LHS are generated, and the one with the biggest +% separation distance is returned. +% +% CALL: X = stk_sampling_maximinlhs (N, DIM, BOX) +% +% does the same thing in the DIM-dimensional hyperrectangle specified by the +% argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are +% the lower- and upper-bound of the interval on the j^th coordinate. +% +% CALL: X = stk_sampling_maximinlhs (N, DIM, BOX, NITER) +% +% allows to change the number of independent random LHS that are used. +% +% See also: stk_mindist, stk_sampling_randomlhs + +% Copyright Notice +% +% Copyright (C) 2017, 2018, 2021 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_sampling_maximinlhs (n, d, box, niter) + +% Read argument dim +if (nargin < 2) || ((nargin < 3) && (isempty (d))) + d = 1; % Default dimension +elseif (nargin > 2) && (~ isempty (box)) + d = size (box, 2); +end + +% Read argument 'box' +if (nargin < 3) || isempty (box) + box = stk_hrect (d); % build a default box +else + box = stk_hrect (box); % convert input argument to a proper box +end + +if nargin < 4, + niter = 1000; +end + +if n == 0, % no input => no output + xdata = zeros (0, d); +else % at least one input point + xx = lhsdesign_ (n, d, niter); + xdata = stk_rescale (xx, [], box); +end + +x = stk_dataframe (xdata, box.colnames); + +end % function + + +%%%%%%%%%%%%%%%%%% +%%% lhsdesign_ %%% +%%%%%%%%%%%%%%%%%% + +function x = lhsdesign_ (n, d, niter) + +x = generatedesign_ (n, d); + +if niter > 1, + bestscore = stk_mindist (x); + for j = 2:niter + y = generatedesign_ (n, d); + score = stk_mindist (y); + if score > bestscore + x = y; + bestscore = score; + end + end +end + +end % function + + +%%%%%%%%%%%%%%%%%%%%%%% +%%% generatedesign_ %%% +%%%%%%%%%%%%%%%%%%%%%%% + +function x = generatedesign_ (n, d) + +x = zeros (n, d); + +for i = 1:d % for each dimension, draw a random permutation + [~, x(:,i)] = sort (rand (n,1)); +end + +x = (x - rand (size (x))) / n; + +end % function + + +%% +% Check error for incorrect number of input arguments + +%!shared x, n, dim, box, niter +%! n = 20; dim = 2; box = [0, 0; 1, 1]; niter = 1; + +%!error x = stk_sampling_maximinlhs (); +%!test x = stk_sampling_maximinlhs (n); +%!test x = stk_sampling_maximinlhs (n, dim); +%!test x = stk_sampling_maximinlhs (n, dim, box); +%!test x = stk_sampling_maximinlhs (n, dim, box, niter); + +%% +% Check that the output is a dataframe +% (all stk_sampling_* functions should behave similarly in this respect) + +%!assert (isa (x, 'stk_dataframe')); + +%% +% Check that column names are properly set, if available in box + +%!assert (isequal (x.colnames, {})); + +%!test +%! cn = {'W', 'H'}; box = stk_hrect (box, cn); +%! x = stk_sampling_maximinlhs (n, dim, box); +%! assert (isequal (x.colnames, cn)); + +%% +% Check output argument + +%!test +%! for dim = 1:5, +%! x = stk_sampling_randomlhs (n, dim); +%! assert (isequal (size (x), [n dim])); +%! u = double (x); u = u(:); +%! assert (~ any (isnan (u) | isinf (u))); +%! assert ((min (u) >= 0) && (max (u) <= 1)); +%! assert (stk_is_lhs (x, n, dim)); +%! end diff --git a/inst/sampling/stk_sampling_nesteddesign.m b/inst/sampling/stk_sampling_nesteddesign.m new file mode 100644 index 0000000..2dae720 --- /dev/null +++ b/inst/sampling/stk_sampling_nesteddesign.m @@ -0,0 +1,223 @@ +% STK_SAMPLING_NESTEDDESIGN generates a nested design +% +% CALL: X = stk_sampling_nesteddesign (N, DIM) +% +% generates a nested design with length(N) levels, with N(k) points at +% the k-th level. X has sum(N) rows and (DIM + 1) columns, the last +% column begin the levels. +% A design is nested when all points at the (k+1)-th level are also at +% the k-th level. +% +% CALL: X = stk_sampling_nesteddesign (N, DIM, BOX) +% +% does the same thing in the DIM-dimensional hyperrectangle specified by the +% argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are +% the lower- and upper-bound of the interval on the j^th coordinate. +% Default value for BOX: [0; 1]^DIM. +% If BOX is provided, DIM = size(BOX, 2). +% Warning: size(X, 2) == (DIM + 1) +% +% CALL: X = stk_sampling_nesteddesign (N, DIM, BOX, NITER) +% +% allows to change the number of independent random LHS that are used, +% when generating a maximin LHS. +% Default value for NITER: 1000. +% +% CALL: X = stk_sampling_nesteddesign (N, DIM, BOX, NITER, LEVELS) +% +% does the same thing, but the levels are indexed by the vector LEVELS. +% The length of LEVELS must be greater or equal than the length of N. +% Default value for levels: 1:length(N). +% +% EXAMPLE +% +% n = [30, 14, 5, 2]; dim = 2; +% bnd = stk_hrect([-5, 1; 7, 2]); +% levels = [100; 50; 33; 25; 20;]; +% x = stk_sampling_nesteddesign(n, dim, bnd, [], levels); +% +% REFERENCE +% +% [1] Loic Le Gratiet, "Multi-fidelity Gaussian process regression for +% computer experiments", PhD thesis, Universite Paris-Diderot - +% Paris VII, 2013. +% +% See also: stk_sampling_nestedlhs, stk_sampling_maximinlhs + +% Copyright Notice +% +% Copyright (C) 2017, 2018, 2021 CentraleSupelec +% Copyright (C) 2017 LNE +% +% Author: Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function nested_design = stk_sampling_nesteddesign(n, dim, box, niter, levels) + +if nargin < 1, + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +%% Read the input arguments + +% number of points +n = n(:); +if any(n <= 0) + stk_error('Number of points at each level must be strictly positive.',... + 'InvalidArgument'); +end +nLev = length(n); + +% Read argument dim +if (nargin > 2) && (~ isempty (box)) + dim = size (box, 2); +elseif (nargin < 2) || (isempty (dim)) + dim = 1; % Default dimension +end + +% Read argument box +if (nargin < 3) || isempty (box) + box = stk_hrect (dim); +else + % Check that box is a box + if ~ isa (box, 'stk_hrect') + box = stk_hrect (box); + end +end + +% niter, number of interation +if (nargin < 4) || isempty(niter) + niter = 1000; +end + +% Read argument levels +level_name = 'Level'; % Column name of the column level +if (nargin < 5) || isempty (levels) + levels = (1:nLev)'; +else + % Find the colnames of the levels + if isa(levels, 'stk_dataframe') + % If isa data frame with a non-empty colname, return the first + % non-empty colnames + empty_colnames = ~cellfun(@isempty, levels.colnames); + if any(empty_colnames) + level_name = levels.colnames{find(empty_colnames, 1)}; + end + end + + % Assert vector + levels = double(levels(:)); + % Assert unique values of levels + if ~isequal(unique(levels), sort(levels)) + stk_error('Levels are not unique.', 'InvalidArgument') + end + + % Check number of proposed levels + if length(levels) < nLev + stk_error('You do not have enough levels, or the array ''n'' is too long.',... + 'InvalidArgument'); + end + levels = levels(1:nLev); +end + +%% Nested design +best_design = NaN(n(1), dim); + +row_highLevels = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:0)); +row_currentLevel = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:numb(k + 1)) ); + +% k_lev = nLev +best_design(row_highLevels(1, nLev, n), :) = ... + double( stk_sampling_maximinlhs(n(nLev), dim, box, niter) ); + +for k_lev = (nLev - 1):-1:1 + % 1: Generate a LHS design + X_new_k = stk_sampling_maximinlhs(n(k_lev), dim, box, niter); + + % 2: Compute minimal distance between any proposed points, and points + % already in the design + X_prev = best_design(row_highLevels(1, k_lev + 1, n), :); + dist_new_prev = min( stk_dist(X_new_k, X_prev), [], 2); + + % 3: Keep the farthest + [~, ind_dist] = sort (dist_new_prev, 'descend'); + ind_select = ind_dist( 1:((n(k_lev) - n(k_lev + 1)) ), 1); + + best_design(row_currentLevel(1, k_lev, n), :) = double( X_new_k(ind_select, :) ); +end + +%% Create a nested design +nested_design = NaN(sum(n), dim + 1); +% The total number of points in the nested design +nCumNb = [0; cumsum(n)]; + +% Add points + the corresponding level +for knL = 1:nLev + nested_design((nCumNb(knL) + 1):(nCumNb(knL + 1)), :) = [ + best_design(row_highLevels(1, knL, n), :), repmat(levels(knL), n(knL), 1)]; +end + +% Add columns names +colnames = cell(1, dim + 1); +if ~isempty(box.colnames) + colnames(1, 1:dim) = box.colnames; +end +colnames{1, dim + 1} = level_name; + +% Return a nested design +nested_design = stk_dataframe(nested_design, colnames); +end + +% Check error for incorrect number of input arguments +%!shared x, n, dim, box, niter, levels +%! n = [23; 14; 5; 2]; dim = 2; box = [0, 0; 4, 4]; niter = 10; +%! levels = [10.1; 15.2; -9.3; 2.4; 17.5]; + +%!error x = stk_sampling_nesteddesign (); +%!test x = stk_sampling_nesteddesign (n); +%!test x = stk_sampling_nesteddesign (n, dim); +%!test x = stk_sampling_nesteddesign (n, dim, box); +%!test x = stk_sampling_nesteddesign (n, dim, box, niter); +%!test x = stk_sampling_nesteddesign (n, dim, box, niter, levels); + +% Check type of ouputs => assert is Nested Design +%!assert ( isequal(size(x), [sum(n), dim + 1]) ); +%!assert ( isa(x, 'stk_dataframe') ); +%! cn = [0; cumsum(n)]; +%! for lev = 1:length(n), +%! y = x( (cn(lev) + 1):(cn(lev + 1)), 1:dim ); +%! assert (isequal (size (y), [n(lev) dim])); +%! if lev > 1 +%! assert ( isequal(z((end - n(lev) + 1):end, :), y) ); +%! end +%! if lev == length(n) +%! assert (stk_is_lhs (y, n(lev), dim, box)); +%! end +%! z = y; +%! end + +% Check column names +%!assert (isequal (x.colnames{dim + 1}, 'Level')); +%! levels = stk_dataframe(levels, {'t'}); +%! box = stk_hrect(box, {'x1', 'x2', 'x3', 'x4'}); +%!test x = stk_sampling_nesteddesign (n, [], box, [], levels); +%!assert (isequal(x.colnames, {'x1', 'x2', 'x3', 'x4', 't'}) ); \ No newline at end of file diff --git a/inst/sampling/stk_sampling_nestedlhs.m b/inst/sampling/stk_sampling_nestedlhs.m new file mode 100644 index 0000000..307aced --- /dev/null +++ b/inst/sampling/stk_sampling_nestedlhs.m @@ -0,0 +1,278 @@ +% STK_SAMPLING_NESTEDLHS builds a Nested Latin Hypercube Sampling (NLHS) +% +% CALL: X = stk_sampling_nestedlhs (N, DIM) +% +% builds a NLHS, with length(N) levels, N(k) points at the k-th level, +% and a dimension DIM. X has sum(N) rows and (DIM + 1) columns, the last +% column begin the levels. +% A design is nested when all points observed at the (k+1)-th level are +% also observed at the k-th level. +% A nested design is a Latin Hypercube Sampling (LHS), if every +% sub-design corresponding to a specified level is a LHS. +% Remark: N(k+1) must divide N(k). +% +% CALL: X = stk_sampling_nestedlhs (N, DIM, BOX) +% +% does the same thing in the DIM-dimensional hyperrectangle specified by the +% argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are +% the lower- and upper-bound of the interval on the j^th coordinate. +% Default value for BOX: [0; 1]^DIM. +% If BOX is provided, DIM = size(BOX, 2). +% Warning: size(X, 2) == (DIM + 1) +% +% CALL: X = stk_sampling_nestedlhs (N, DIM, BOX, NITER) +% +% allows to change the number of independent random LHS that are used at +% each level to complete the design. +% Default value for NITER: 1000. +% Put NITER to 1 to generate a random NLHS. +% +% CALL: X = stk_sampling_nestedlhs (N, DIM, BOX, NITER, LEVELS) +% +% does the same thing, but the levels are indexed by the vector LEVELS. +% The length of LEVELS must be greater or equal than the length of N. +% Default value for LEVELS: 1:length(N). +% +% EXAMPLE +% +% n = [48, 12, 6, 2]; dim = 2; +% bnd = stk_hrect([-5, 1; 7, 2]); +% levels = [100; 50; 33; 25; 20]; +% x = stk_sampling_nestedlhs(n, dim, bnd, [], levels); +% +% REFERENCE +% +% [1] Peter Z. G. Qian, "Nested latin hypercube designs", Biometrika, +% 96(4):957-970, 2009. +% +% See also: stk_sampling_nesteddesign, stk_sampling_randomlhs + +% Copyright Notice +% +% Copyright (C) 2017, 2018, 2021 CentraleSupelec +% Copyright (C) 2017 LNE +% +% Author: Remi Stroh +% + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function nested_LHS = stk_sampling_nestedlhs(n, dim, box, niter, levels) + +if nargin < 1, + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +%% Read input arguments +% number of points +n = n(:); % assert vector +if any(n <= 0) + stk_error('Number of points at each level must be strictly positive.',... + 'InvalidArgument'); +end +nLev = length(n); + +% Read argument dim +if (nargin > 2) && (~ isempty (box)) + dim = size (box, 2); +elseif (nargin < 2) || (isempty (dim)) + dim = 1; % Default dimension +end + +% Read argument box +if (nargin < 3) || isempty (box) + box = stk_hrect (dim); +else + % Check that box is a box + if ~ isa (box, 'stk_hrect') + box = stk_hrect (box); + end +end + +% niter, number of interation +if (nargin < 4) || isempty(niter) + niter = 1000; +end + +% Read argument levels +level_name = 'Level'; % Column name of the column level +if (nargin < 5) || isempty (levels) + levels = (1:nLev)'; +else + % Find the colnames of the levels + if isa(levels, 'stk_dataframe') + % If isa data frame with a non-empty colname, return the first + % non-empty colnames + empty_colnames = ~cellfun(@isempty, levels.colnames); + if any(empty_colnames) + level_name = levels.colnames{find(empty_colnames, 1)}; + end + end + + % Assert vector + levels = double(levels(:)); + % Assert unique values of levels + if ~isequal(unique(levels), sort(levels)) + stk_error('Levels are not unique.', 'InvalidArgument') + end + + % Check number of proposed levels + if length(levels) < nLev + stk_error('You do not have enough levels, or the array ''n'' is too long.',... + 'InvalidArgument'); + end + levels = levels(1:nLev); +end + +%% Quotient between each level +quotient = floor(n(1:(nLev - 1))./n(2:nLev)); +remainder = n(1:(nLev - 1)) - quotient.*n(2:nLev); +if any( remainder ~= 0 ) + %assert n(2)|n(1); n(3)|n(2); n(4)|n(3); etc, ... + stk_error(['This method supposes that the number of points',... + ' at level t + 1 divides the number of points at level t.'],... + 'InvalidArgument'); +end + +%% Build the nested design +% Nested Latin hypercube designs +% BY PETER Z. G. QIAN, 2009 + +best_LHS = NaN(n(1), dim); +X_prev = NaN(0, dim); % at the beginning there is not any point +n = [n; 0]; % no point are asked at the level nLev + 1 +quotient = [1; quotient]; % no multiplication at the first level + +% Two functions to find points of a level +row_highLevels = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:0)); +row_currentLevel = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:numb(k + 1)) ); + +for k_lev = nLev:-1:1; %begin by the end + + list_nb = (1:n(k_lev))'; % list of all values we must get after this loop + n_new_k = n(k_lev) - n(k_lev + 1); % number of new value to add + + list_nb_new_k = NaN(n_new_k, dim); + for id = 1:dim + list_nb_new_k(:, id) = list_nb(~ismember(list_nb, X_prev(:, id)), 1); + % Find every element in the complete list of number, which are not + % chosen in the previous level + end + + best_score = -Inf; + for k_try = 1:niter + + X_new_kl = NaN(n_new_k, dim); %the matrix to add + + [~, random_index] = sort(rand(n_new_k, dim), 1); + for i = 1:dim + X_new_kl(:, i) = list_nb_new_k(random_index(:, i), i); + end + + LHS_cand_kl = NaN(n(k_lev), dim); + LHS_cand_kl(row_highLevels(k_lev, k_lev + 1, n), :) = X_prev; + LHS_cand_kl(row_currentLevel(k_lev, k_lev, n) , :) = X_new_kl; + % add new results (only observed at this level, and not any higher) + % to previous results (corresponding to point observed at higher levels, + % and so, at this level too) + + % Random moves + LHS_cand_kl = LHS_cand_kl - rand(n(k_lev), dim); + % Extend on a larger space for next loop + LHS_cand_kl = ceil(quotient(k_lev)*LHS_cand_kl); + + if n(k_lev) > 1 && niter > 1 + score = stk_mindist(LHS_cand_kl); + else % particular case where n(kl) == 1 (no distance) + score = 0; + end + if score > best_score + % Save the best design in the lhs. + best_score = score; + best_LHS = LHS_cand_kl; + end + end % end k_try + % For the next loop, get the points of the previous levels + X_prev = best_LHS; +end +% Remove the 0 from the end +n = n(1:nLev); + +% Random move + scaling in [0; 1] +best_LHS = (best_LHS - rand(n(1), dim))/n(1); +% Rescale in box +best_LHS = stk_rescale(best_LHS, [], box); + +%% Create a nested design +nested_LHS = NaN(sum(n), dim + 1); +% The total number of points in the LHS design +nCumNb = [0; cumsum(n)]; + +% Add points + the corresponding level +for knL = 1:nLev + nested_LHS((nCumNb(knL) + 1):(nCumNb(knL + 1)), :) = [ + best_LHS(row_highLevels(1, knL, n), :), repmat(levels(knL), n(knL), 1)]; +end + +% Add columns names +colnames = cell(1, dim + 1); +if ~isempty(box.colnames) + colnames(1, 1:dim) = box.colnames; +end +colnames{1, dim + 1} = level_name; + +% Return a nested LHS +nested_LHS = stk_dataframe(nested_LHS, colnames); + +end + +% Check error for incorrect number of input arguments +%!shared x, n, dim, box, niter, levels +%! n = [48; 12; 4; 2]; dim = 2; box = [0, 0; 4, 4]; niter = 10; +%! levels = [10.1; 15.2; -9.3; 2.4; 17.5]; + +%!error x = stk_sampling_nestedlhs (); +%!test x = stk_sampling_nestedlhs (n); +%!test x = stk_sampling_nestedlhs (n, dim); +%!test x = stk_sampling_nestedlhs (n, dim, box); +%!test x = stk_sampling_nestedlhs (n, dim, box, niter); +%!test x = stk_sampling_nestedlhs (n, dim, box, niter, levels); + +% Check type of ouputs => assert is Nested LHS +%!assert ( isequal(size(x), [sum(n), dim + 1]) ); +%!assert ( isa(x, 'stk_dataframe') ); +%! cn = [0; cumsum(n)]; +%! for lev = 1:length(n), +%! y = x( (cn(lev) + 1):(cn(lev + 1)), 1:dim ); +%! assert (isequal (size (y), [n(lev) dim])); +%! assert (stk_is_lhs (y, n(lev), dim, box)); +%! if lev > 1 +%! assert ( isequal(z((end - n(lev) + 1):end, :), y) ); +%! end +%! z = y; +%! end + +% Check column names +%!assert (isequal (x.colnames{dim + 1}, 'Level')); +%! levels = stk_dataframe(levels, {'t'}); +%! box = stk_hrect(box, {'x1', 'x2', 'x3', 'x4'}); +%!test x = stk_sampling_nestedlhs (n, [], box, [], levels); +%!assert (isequal(x.colnames, {'x1', 'x2', 'x3', 'x4', 't'}) ); \ No newline at end of file diff --git a/inst/sampling/stk_sampling_olhs.m b/inst/sampling/stk_sampling_olhs.m new file mode 100644 index 0000000..2480006 --- /dev/null +++ b/inst/sampling/stk_sampling_olhs.m @@ -0,0 +1,275 @@ +% STK_SAMPLING_OLHS generates a random Orthogonal Latin Hypercube (OLH) sample +% +% CALL: X = stk_sampling_olhs (N) +% +% generates a random Orthogonal Latin Hypercube (OLH) sample X, using the +% construction of Ye (1998). The algorithm only works for sample sizes N +% of the form 2^(R+1)+1, with R >= 1. Trying to generate an OLHS with a +% value of N that is not of this form generates an error. The number of +% factors is D = 2*R, and the OLHS is defined on [-1; 1]^D. +% +% CALL: X = stk_sampling_olhs (N, D) +% +% does exactly the same thing, provided that there exists an integer R +% such that N = 2^(R+1)+1 and D = 2*R (or D is empty). +% +% CALL: X = stk_sampling_olhs (N, D, BOX) +% +% generates an OLHS on BOX. Again, D can be empty since the number of +% factors can be deduced from N. +% +% CALL: X = stk_sampling_olhs (N, D, BOX, PERMUT) +% +% uses a given permutation PERMUT, instead of a random permutation, to +% initialize the construction of Ye (1998). As a result, the generated +% OLHS is not random anymore. PERMUT must be a permutation of 1:2^R. If +% BOX is empty, then the default domain [-1, 1]^D is used. +% +% NOTE: orthogonality +% +% The samples generated by this functions are only orthogonal, stricty- +% speaking, if BOX is a symmetric domain (e.g., [-1, 1] ^ D). Otherwise, +% the generated samples should be called "uncorrelated". +% +% REFERENCE +% +% Kenny Q. Ye, "Orthogonal Column Latin Hypercubes and Their +% Application in Computer Experiments", Journal of the American +% Statistical Association, 93(444), 1430-1439, 1998. +% http://dx.doi.org/10.1080/01621459.1998.10473803 +% +% See also: stk_sampling_randomlhs, stk_sampling_maximinlhs + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2012-2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function [x, aux] = stk_sampling_olhs (n, d, box, permut, extended) + +% Read argument dim +if (nargin < 2) || ((nargin < 3) && (isempty (d))) + d = 1; % Default dimension +elseif (nargin > 2) && (~ isempty (box)) + d = size (box, 2); +end + +if nargin < 5, extended = false; end + +%%% PROCESS INPUT ARGUMENTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% recover the "order" r from the value of n +r = floor(log2(n - 1) - 1); +n_ = 2^(r + 1) + 1; +if (r <= 0) || (abs(n - n_) > eps), + errmsg = 'n must be an integer of the form 2^(r+1) + 1 with r > 0'; + stk_error(errmsg, 'InvalidArgument'); +end +n = n_; + +if ~extended + % check that d has the correct value for a "full" Ye98-OLHS + % (other values of d can be reached by removing columns from a full OLHS) + if (nargin > 1) && ~isempty(d), + if d ~= 2 * r, + errmsg = 'Incorrect value of d, please read the documentation...'; + stk_error(errmsg, 'InvalidArgument'); + end + else + d = 2 * r; + end +else + % check that d has the correct value for a "full" Cioppa-Lucas(2007) NOLHS + % (other values of d can be reached by removing columns from a full NOLHS) + if (nargin > 1) && ~isempty(d), + if d ~= r + 1 + nchoosek(r, 2), + errmsg = 'Incorrect value of d, please read the documentation...'; + stk_error(errmsg, 'InvalidArgument'); + end + else + d = r + 1 + nchoosek(r, 2); + end +end + +% number of "positive levels" +q = 2^r; % = (n - 1)/2 + +% read argument 'box' +if (nargin < 3) || isempty (box) + box = stk_hrect (repmat ([-1; 1], 1, d)); % build a default box +else + box = stk_hrect (box); % convert input argument to a proper box +end + +% permutation +if (nargin < 4) || isempty(permut), + permut = randperm(q)'; +else + permut = permut(:); + if ~isequal(sort(permut), (1:q)'), + errmsg = sprintf('permut should be a permutation of 1:%d.', q); + stk_error(errmsg, 'InvalidArgument'); + end +end + +%%% CONSTRUCT AN "ORTHOGONAL" LHS FOLLOWING PROCESS INPUT ARGUMENTS %%%%%%%%%%% + +% Construct permutation matrices A1, A2, ..., Ar +A = cell(1, r); +for i = 1:r, + Ai = 1; + for j = 1:i, + Z = zeros(size(Ai)); + Ai = [Z Ai; Ai Z]; %#ok + end + for j = (i+1):r, + Z = zeros(size(Ai)); + Ai = [Ai Z; Z Ai]; %#ok + end + A{i} = Ai; +end + +% Construct the matrix M +M = [permut zeros(q, 2*r-1)]; +for j = 1:r, % from column 2 to column r+1 + M(:, j+1) = A{j} * permut; +end +if ~extended, % OLHS / Ye (1998) + for j = 1:(r-1), % from column r+2 to column 2*r + M(:, j+r+1) = A{j} * A{r} * permut; + end +else % NOLHS / Cioppa & Lucas(2007) + col = r + 2; + for j = 1:(r-1), + for k = (j + 1):r, + M(:, col) = A{j} * A{k} * permut; + col = col + 1; + end + end +end + +% Construct the matrix S +S = ones(q, 2*r); +for j = 1:r, % from column 2 to column r+1 + aj = 1; + for l = r:(-1):1, + if l == r - j + 1, + aj = [-aj; aj]; %#ok + else + aj = [aj; aj]; %#ok + end + end + S(:, j+1) = aj; +end +if ~extended, % OLHS / Ye (1998) + for j = 1:(r-1), % from column r+2 to column 2*r + S(:, r+1+j) = S(:, 2) .* S(:, j+2); + end +else % NOLHS / Cioppa & Lucas(2007) + col = r + 2; + for j = 1:(r - 1), + for k = (j + 1):r, + S(:, col) = S(:, j+1) .* S(:, k+1); + col = col + 1; + end + end +end + +% Construct the matrix T +T = M .* S; + +% Construct the OLHS X (with integer levels -q, ..., 0, ... +q) +x_integer_levels = [T; zeros(1, d); -T]; + +%%% CONVERT TO THE REQUESTED BOX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Convert to positive integer levels (1 ... n) +x = x_integer_levels + q + 1; + +% Convert to [0; 1]-valued levels +x = (2*x - 1) / (2*n); + +% And, finally, convert to box +x = stk_dataframe (stk_rescale (x, [], box), box.colnames); + +% Note: the results reported in Cioppa & Lucas correspond to the scaling +% x = struct('a', stk_rescale(x, [min(x); max(x)], box)); + +%%% OUTPUT SOME AUXILIARY DATA IF REQUESTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if nargout > 1, + aux = struct('M', M, 'S', S, 'X', x_integer_levels); +end + +end % function + + +%% +% Check error for incorrect number of input arguments + +%!shared x, n, d, box, permut +%! n = 5; d = 2; box = [0 0; 1, 1]; permut = 1:2; + +%!error x = stk_sampling_olhs(); +%!test x = stk_sampling_olhs(n); +%!test x = stk_sampling_olhs(n, d); +%!test x = stk_sampling_olhs(n, d, box); +%!test x = stk_sampling_olhs(n, d, box, permut); +%!error x = stk_sampling_olhs(n, d, box, permut, pi); + +%% +% Check that the output is a dataframe +% (all stk_sampling_* functions should behave similarly in this respect) + +%!assert (isa (x, 'stk_dataframe')); + +%% +% Check that column names are properly set, if available in box + +%!assert (isequal (x.colnames, {})); + +%!test +%! cn = {'W', 'H'}; box = stk_hrect (box, cn); +%! x = stk_sampling_olhs (n, d, box); +%! assert (isequal (x.colnames, cn)); + +%% +% Check output argument + +%!test +%! for r = 1:5 +%! +%! n = 2 ^ (r + 1) + 1; d = 2 * r; +%! x = stk_sampling_olhs (n, d); +%! +%! assert (isequal (size (x), [n d])); +%! +%! box = repmat ([-1; 1], 1, d); +%! assert (stk_is_lhs (x, n, d, box)); +%! +%! x = double (x); w = x' * x; +%! assert (stk_isequal_tolabs (w / w(1,1), eye (d))); +%! +%! end diff --git a/inst/sampling/stk_sampling_randomlhs.m b/inst/sampling/stk_sampling_randomlhs.m new file mode 100644 index 0000000..7cb9e56 --- /dev/null +++ b/inst/sampling/stk_sampling_randomlhs.m @@ -0,0 +1,104 @@ +% STK_SAMPLING_RANDOMLHS generates a random LHS design +% +% CALL: X = stk_sampling_randomlhs (N, DIM) +% +% generates a random Latin Hypercube Sample of size N in the DIM-dimensional +% hypercube [0; 1]^DIM. +% +% CALL: X = stk_sampling_randomlhs (N, DIM, BOX) +% +% generates a random Latin Hypercube Sample of size N in the DIM-dimensional +% hyperrectangle specified by the argument BOX, which is a 2 x DIM matrix +% where BOX(1, j) and BOX(2, j) are the lower- and upper-bound of the interval +% on the j^th coordinate. +% +% See also: stk_sampling_maximinlhs, stk_sampling_randunif + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_sampling_randomlhs (n, dim, box) + +% Read argument dim +if (nargin < 2) || ((nargin < 3) && (isempty (dim))) + dim = 1; % Default dimension +elseif (nargin > 2) && (~ isempty (box)) + dim = size (box, 2); +end + +% Read argument box +if (nargin < 3) || isempty (box) + box = stk_hrect (dim); +end + +niter = 1; + +x = stk_sampling_maximinlhs (n, dim, box, niter); + +end % function + + +%% +% Check error for incorrect number of input arguments + +%!shared x, n, dim, box +%! n = 10; dim = 2; box = [0, 0; 1, 1]; + +%!error x = stk_sampling_randomlhs (); +%!test x = stk_sampling_randomlhs (n); +%!test x = stk_sampling_randomlhs (n, dim); +%!test x = stk_sampling_randomlhs (n, dim, box); + +%% +% Check that the output is a dataframe +% (all stk_sampling_* functions should behave similarly in this respect) + +%!assert (isa(x, 'stk_dataframe')); + +%% +% Check that column names are properly set, if available in box + +%!assert (isequal (x.colnames, {})); + +%!test +%! cn = {'W', 'H'}; box = stk_hrect (box, cn); +%! x = stk_sampling_randomlhs (n, dim, box); +%! assert (isequal (x.colnames, cn)); + +%% +% Check output argument + +%!test +%! for dim = 1:5, +%! x = stk_sampling_randomlhs(n, dim); +%! assert(isequal(size(x), [n dim])); +%! u = double(x); u = u(:); +%! assert(~any(isnan(u) | isinf(u))); +%! assert((min(u) >= 0) && (max(u) <= 1)); +%! assert(stk_is_lhs(x, n, dim)); +%! end diff --git a/inst/sampling/stk_sampling_randunif.m b/inst/sampling/stk_sampling_randunif.m new file mode 100644 index 0000000..b1ca9e6 --- /dev/null +++ b/inst/sampling/stk_sampling_randunif.m @@ -0,0 +1,120 @@ +% STK_SAMPLING_RANDUNIF generates uniformly distributed points +% +% CALL: X = stk_sampling_randunif (N, DIM) +% +% generates N points, independent and uniformly distributed in the +% DIM-dimensional hypercube [0; 1]^DIM. +% +% CALL: X = stk_sampling_randunif (N, DIM, BOX) +% +% does the same thing in the DIM-dimensional hyperrectangle specified by the +% argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are +% the lower- and upper-bound of the interval on the j^th coordinate. + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_sampling_randunif (n, dim, box) + +% Read argument n +if ~ ((isscalar (n)) && (isnumeric (n))) + error ('n should be a numerical scalar.'); +end + +% Read argument dim +if (nargin < 2) || ((nargin < 3) && (isempty (dim))) + dim = 1; % Default dimension +elseif (nargin > 2) && (~ isempty (box)) + dim = size (box, 2); +end + +% Read argument box +if (nargin < 3) || isempty (box) + box = []; % default box: [0; 1] ^ dim +else + box = stk_hrect (box); % convert input argument to a proper box +end + +if isempty (box) + if n == 0 + x = stk_dataframe (zeros (0, dim)); % Empty sample + else + x = stk_dataframe (rand (n, dim)); + end +else + if n == 0 + x = stk_dataframe (box, [], {}); % Keep column names + x = set_data (x, zeros (0, dim)); % Empty sample + else + % FIXME: stk_rescale should return a df when box is a df ? + x = stk_dataframe (box, [], {}); + x = set_data (x, stk_rescale (rand (n, dim), [], box)); + end +end + +end % function + + +%% +% Check error for incorrect number of input arguments + +%!shared x, n, dim, box +%! n = 10; dim = 2; box = [0, 0; 2, 2]; + +%!error x = stk_sampling_randunif (); +%!test x = stk_sampling_randunif (n); +%!test x = stk_sampling_randunif (n, dim); +%!test x = stk_sampling_randunif (n, dim, box); + +%% +% Check that the output is a dataframe +% (all stk_sampling_* functions should behave similarly in this respect) + +%!assert (isa(x, 'stk_dataframe')); + +%% +% Check that column names are properly set, if available in box + +%!assert (isequal (x.colnames, {})); + +%!test +%! cn = {'W', 'H'}; box = stk_hrect (box, cn); +%! x = stk_sampling_randunif (n, dim, box); +%! assert (isequal (x.colnames, cn)); + +%% +% Check output argument + +%!test +%! for dim = 1:5, +%! x = stk_sampling_randunif(n, dim); +%! assert(isequal(size(x), [n dim])); +%! u = double(x); u = u(:); +%! assert(~any(isnan(u) | isinf(u))); +%! assert((min(u) >= 0) && (max(u) <= 1)); +%! end diff --git a/inst/sampling/stk_sampling_regulargrid.m b/inst/sampling/stk_sampling_regulargrid.m new file mode 100644 index 0000000..b4e3e58 --- /dev/null +++ b/inst/sampling/stk_sampling_regulargrid.m @@ -0,0 +1,144 @@ +% STK_SAMPLING_REGULARGRID builds a regular grid +% +% CALL: X = stk_sampling_regulargrid (N, DIM) +% +% builds a regular grid in the DIM-dimensional hypercube [0; 1]^DIM. If N is +% an integer, a grid of size N is built; in this case, acceptable sizes are +% such that N^(1/DIM) is an integer. If N is a vector of length N, a grid of +% size prod(N) is built, with N(j) points on coordinate j. +% +% CALL: X = stk_sampling_regulargrid (N, DIM, BOX) +% +% does the same thing in the DIM-dimensional hyperrectangle specified by the +% argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are +% the lower- and upper-bound of the interval on the j^th coordinate. +% +% See also: linspace + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_sampling_regulargrid (n, dim, box) + +% Read argument dim +if (nargin < 2) || ((nargin < 3) && (isempty (dim))) + dim = 1; % Default dimension +elseif (nargin > 2) && (~ isempty (box)) + dim = size (box, 2); +end + +% Read argument 'box' +if (nargin < 3) || isempty (box) + xmin = zeros (1, dim); + xmax = ones (1, dim); + box_colnames = {}; +else + box = stk_hrect (box); % convert input argument to a proper box + box_data = double (box); + box_colnames = get (box, 'colnames'); + xmin = box_data(1, :); + xmax = box_data(2, :); +end + +if length (n) == 1 + n_coord = round (n^(1/dim)); + if n_coord ^ dim ~= n, + stk_error ('n^(1/dim) should be an integer', 'InvalidArgument'); + end + n = n_coord * ones (1, dim); +else + if length (n) ~= dim + errmsg = 'n should either be a scalar or a vector of length d'; + stk_error (errmsg, 'IncorrectSize'); + end +end + +% levels +levels = cell (1, dim); +for j = 1:dim, + levels{j} = linspace (xmin(j), xmax(j), n(j)); +end + +x = stk_factorialdesign (levels, box_colnames); + +end % function + +%#ok<*TRYNC> + + +%% +% Check error for incorrect number of input arguments + +%!shared x, n, dim, box +%! n = 9; dim = 2; box = [0, 0; 1, 1]; + +%!error x = stk_sampling_regulargrid (); +%!test x = stk_sampling_regulargrid (n); +%!test x = stk_sampling_regulargrid (n, dim); +%!test x = stk_sampling_regulargrid (n, dim, box); + +%% +% Check that the output is an stk_dataframe +% (all stk_sampling_* functions should behave similarly in this respect) +% and an stk_factorialdesign (special kind of stk_dataframe) + +%!assert (isa (x, 'stk_dataframe')); +%!assert (isa (x, 'stk_factorialdesign')); + +%% +% Check that column names are properly set, if available in box + +%!assert (isequal (x.colnames, {})); + +%!test +%! cn = {'W', 'H'}; box = stk_hrect (box, cn); +%! x = stk_sampling_regulargrid (n, dim, box); +%! assert (isequal (x.colnames, cn)); + +%% +% Check output argument + +%!test +%! for dim = 1:3, +%! n = 3^dim; +%! x = stk_sampling_regulargrid(n, dim); +%! assert(isequal(size(x), [n dim])); +%! u = double(x); u = u(:); +%! assert(~any(isnan(u) | isinf(u))); +%! assert((min(u) >= 0) && (max(u) <= 1)); +%! end + +%!test +%! nn = [3 4 5]; +%! for dim = 1:3, +%! x = stk_sampling_regulargrid(nn(1:dim), dim); +%! assert(isequal(size(x), [prod(nn(1:dim)) dim])); +%! u = double(x); u = u(:); +%! assert(~any(isnan(u) | isinf(u))); +%! assert((min(u) >= 0) && (max(u) <= 1)); +%! end diff --git a/inst/sampling/stk_sampling_sobol.m b/inst/sampling/stk_sampling_sobol.m new file mode 100644 index 0000000..6d7ecfd --- /dev/null +++ b/inst/sampling/stk_sampling_sobol.m @@ -0,0 +1,117 @@ +% STK_SAMPLING_SOBOL generates points from a Sobol sequence +% +% CALL: X = stk_sampling_sobol (N, D) +% +% computes the first N terms of a D-dimensional Sobol sequence (with +% N < 2^32 and D <= 1111). The sequence is generated using the algorithm +% of Bratley and Fox [1], as modified by Joe and Kuo [3]. +% +% CALL: X = stk_sampling_sobol (N, DIM, BOX) +% +% does the same thing in the DIM-dimensional hyperrectangle specified by the +% argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are +% the lower- and upper-bound of the interval on the j^th coordinate. +% +% CALL: X = stk_sampling_sobol (N, D, BOX, DO_SKIP) +% +% skips an initial segment of the Sobol sequence if DO_SKIP is true. More +% precisely, according to the recommendation of [2] and [3], a number of +% points equal to the largest power of 2 smaller than n is skipped. If +% DO_SKIP is false, the beginning of the sequence is returns, as in the +% previous cases (in other words, DO_SKIP = false is the default). +% +% NOTE: Implementation +% +% The C implementation under the hood is due to Steven G. Johnson, and +% was borrowed from the NLopt toolbox [4] (version 2.4.2). +% +% REFERENCE +% +% [1] Paul Bratley and Bennett L. Fox, "Algorithm 659: Implementing Sobol's +% quasirandom sequence generator", ACM Transactions on Mathematical +% Software, 14(1):88-100, 1988. +% +% [2] Peter Acworth, Mark Broadie and Paul Glasserman, "A Comparison of Some +% Monte Carlo and Quasi Monte Carlo Techniques for Option Pricing", in +% Monte Carlo and Quasi-Monte Carlo Methods 1996, Lecture Notes in +% Statistics 27:1-18, Springer, 1998. +% +% [3] Stephen Joe and Frances Y. Kuo, "Remark on Algorithm 659: Implementing +% Sobol's Quasirandom Sequence Generator', ACM Transactions on +% Mathematical Software, 29(1):49-57, 2003. +% +% [4] Steven G. Johnson, The NLopt nonlinear-optimization package, +% http://ab-initio.mit.edu/nlopt. +% +% SEE ALSO: stk_sampling_halton_rr2 + +% Copyright Notice +% +% Copyright (C) 2016-2018 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function x = stk_sampling_sobol (n, dim, box, do_skip) + +% Default values +if nargin < 4 + do_skip = false; + if nargin < 3 + box = []; + if nargin < 2 + dim = []; + end + end +end + +% Check that either dim or box is provided +if (isempty (dim)) && (isempty (box)) + stk_error (['The dimension argument can be omitted if, and only if, a ' ... + 'valid box argument is provided instead.'], 'InvalidArgument'); +end + +% Process box argument +if isempty (box) + colnames = {}; +else + box = stk_hrect (box); % convert input argument to a proper box + colnames = box.colnames; + if isempty (dim) + dim = size (box, 2); + elseif dim ~= size (box, 2) + stk_error (['The dimension argument must be compatible with' ... + 'the box argument when both are provided.'], 'InvalidArgument'); + end +end + +% Generate a Sobol sequence in [0; 1]^dim +x = transpose (__stk_sampling_sobol_mex__ (n, dim, do_skip)); + +% Create dataframe output +x = stk_dataframe (x, colnames); + +if ~ isempty (box), + x = stk_rescale (x, [], box); +end + +end % function diff --git a/inst/sampling/stk_sampling_vdc_rr2.m b/inst/sampling/stk_sampling_vdc_rr2.m new file mode 100644 index 0000000..832502d --- /dev/null +++ b/inst/sampling/stk_sampling_vdc_rr2.m @@ -0,0 +1,59 @@ +% STK_SAMPLING_VDC_RR2 generates points from the "RR2" van der Corput sequence +% +% CALL: X = __stk_sampling_vdc_rr2__(N, J) +% +% computes the first N terms of the j^th RR2-scrambled van der Corput +% sequence. +% +% REFERENCE +% +% Ladislav Kocis and William J. Whiten, "Computational investigations of low +% discrepancy sequences", ACM Transactions on Mathematical Software, +% 23(2):266-294, 1997. +% http://dx.doi.org/10.1145/264029.264064 +% +% SEE ALSO: stk_sampling_halton_rr2 + +% Copyright Notice +% +% Copyright (C) 2013 Alexandra Krauth, Elham Rahali & SUPELEC +% +% Authors: Julien Bect +% Alexandra Krauth +% Elham Rahali + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +%!error __stk_sampling_vdc_rr2__() % two inputs required +%!error __stk_sampling_vdc_rr2__(10) % two inputs required +%!error __stk_sampling_vdc_rr2__(10, 3, -1) % two inputs required + +%!test +%! n = 300; j = 25; +%! x = __stk_sampling_vdc_rr2__(n, j); +%! assert(isequal(size(x), [n 1])) + +%!test +%! x = __stk_sampling_vdc_rr2__(2000, 7); +%! y = double (x(1998:2000, :)); +%! yref = [0.849786281294525; 0.085080398941584; 0.555668634235701]; +%! assert(stk_isequal_tolrel(y, yref, 1e-13)); + \ No newline at end of file diff --git a/inst/stk_init.m b/inst/stk_init.m new file mode 100644 index 0000000..befabf8 --- /dev/null +++ b/inst/stk_init.m @@ -0,0 +1,274 @@ +% STK_INIT initializes the STK +% +% CALL: stk_init () +% +% STK_INIT sets paths and environment variables + +% Copyright Notice +% +% Copyright (C) 2015-2018, 2019, 2022 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +%% PKG_ADD: stk_init ('pkg_load'); + +%% PKG_DEL: stk_init ('pkg_unload'); + +function output = stk_init (command) + +if nargin == 0 + command = 'pkg_load'; +end + +% Deduce the root of STK from the path to this function +root = fileparts (mfilename ('fullpath')); + +switch command + + case 'pkg_load' + stk_init__pkg_load (root); + + case 'pkg_unload' + stk_init__pkg_unload (root); + + case 'clear_persistents' + % Note: this implies munlock + stk_init__clear_persistents (); + + case 'munlock' + stk_init__munlock (); + + case 'addpath' + % Add STK subdirectories to the search path + stk_init__addpath (root); + + case 'rmpath' + % Remove STK subdirectories from the search path + stk_init__rmpath (root); + + case 'genpath' + % Return the list of all STK "public" subdirectories + output = stk_init__genpath (root); + + otherwise + error ('Unknown command.'); + +end % switch + +end % function + +%#ok<*NODEF,*WNTAG,*SPERR,*SPWRN,*LERR,*CTCH,*SPERR> + + +function stk_init__pkg_load (root) + +% Unlock all possibly mlock-ed STK files and clear all STK functions +% that contain persistent variables +stk_init__clear_persistents (); + +% Add STK subdirectories to the path +stk_init__addpath (root); + +% Set default options +stk_options_set ('default'); + +% Select default "parallelization engine" +stk_parallel_engine_set (); + +% Hide some warnings about numerical accuracy +warning ('off', 'STK:stk_predict:NegativeVariancesSetToZero'); +warning ('off', 'STK:stk_cholcov:AddingRegularizationNoise'); +warning ('off', 'STK:stk_param_relik:NumericalAccuracyProblem'); + +% Uncomment this line if you want to see a lot of details about the internals +% of stk_dataframe and stk_factorialdesign objects: +% stk_options_set ('stk_dataframe', 'disp_format', 'verbose'); + +end % function + + +function stk_init__pkg_unload (root) + +% Unlock all possibly mlock-ed STK files and clear all STK functions +% that contain persistent variables +stk_init__clear_persistents (); + +% Remove STK subdirectories from the path +stk_init__rmpath (root); + +end % function + + +function stk_init__munlock () + +filenames = { ... + 'stk_optim_fmincon', ... + 'stk_options_set', ... + 'stk_parallel_engine_set' }; + +for i = 1:(length (filenames)) + name = filenames{i}; + if mislocked (name) + munlock (name); + end +end + +end % function + + +function stk_init__clear_persistents () + +stk_init__munlock (); + +filenames = { ... + 'stk_disp_progress', ... + 'stk_disp_getformat', ... + 'stk_expcov_iso', ... + 'stk_expcov_aniso', ... + 'stk_gausscov_iso', ... + 'stk_gausscov_aniso', ... + 'stk_materncov_aniso', ... + 'stk_materncov_iso', ... + 'stk_materncov32_aniso', ... + 'stk_materncov32_iso', ... + 'stk_materncov52_aniso', ... + 'stk_materncov52_iso', ... + 'stk_sphcov_iso', ... + 'stk_sphcov_aniso', ... + 'stk_optim_fmincon', ... + 'stk_options_set', ... + 'stk_parallel_engine_set' ... + 'stk_plot_shadedci' }; + +for i = 1:(length (filenames)) + clear (filenames{i}); +end + +end % function + + +function stk_init__addpath (root) + +path = stk_init__genpath (root); + +% Check for missing directories +for i = 1:length (path) + if ~ exist (path{i}, 'dir') + error (sprintf (['Directory %s does not exist.\n' ... + 'Is there a problem in stk_init__genpath ?'], path{i})); + end +end + +% Add STK folders to the path +addpath (path{:}); + +end % function + + +function path = stk_init__genpath (root) + +path = {}; + +% main function folders +path = [path { ... + fullfile(root, 'arrays' ) ... + fullfile(root, 'arrays', 'generic' ) ... + fullfile(root, 'core' ) ... + fullfile(root, 'covfcs' ) ... + fullfile(root, 'covfcs', 'rbf' ) ... + fullfile(root, 'lm' ) ... + fullfile(root, 'model' ) ... + fullfile(root, 'model', 'noise' ) ... + fullfile(root, 'model', 'prior_struct') ... + fullfile(root, 'param', 'classes' ) ... + fullfile(root, 'param', 'estim' ) ... + fullfile(root, 'sampling' ) ... + fullfile(root, 'utils' ) }]; + +% 'misc' folder and its subfolders +misc = fullfile (root, 'misc'); +path = [path { ... + fullfile(misc, 'design' ) ... + fullfile(misc, 'dist' ) ... + fullfile(misc, 'distrib' ) ... + fullfile(misc, 'error' ) ... + fullfile(misc, 'optim' ) ... + fullfile(misc, 'options' ) ... + fullfile(misc, 'parallel') ... + fullfile(misc, 'pareto' ) ... + fullfile(misc, 'plot' ) ... + fullfile(misc, 'test' ) ... + fullfile(misc, 'text' ) }]; + +% folders that contain examples +path = [path { ... + fullfile(root, 'examples', '01_kriging_basics' ) ... + fullfile(root, 'examples', '02_design_of_experiments') ... + fullfile(root, 'examples', '03_miscellaneous' ) ... + fullfile(root, 'examples', 'datasets' ) ... + fullfile(root, 'examples', 'test_functions' ) }]; + +end % function + + +function stk_init__rmpath (root) + +s = path (); + +regex1 = strcat ('^', escape_regexp (root)); + +try + % Use the modern name (__octave_config_info__) if possible + apiver = __octave_config_info__ ('api_version'); + assert (ischar (apiver)); +catch + % Use the old name instead + apiver = octave_config_info ('api_version'); +end +regex2 = strcat (escape_regexp (apiver), '$'); + +while ~ isempty (s) + + [d, s] = strtok (s, pathsep); %#ok + + if (~ isempty (regexp (d, regex1, 'once'))) ... + && (isempty (regexp (d, regex2, 'once'))) ... + && (~ strcmp (d, root)) % Only remove subdirectories, not the root + + rmpath (d); + + end +end + +end % function + + +function s = escape_regexp (s) + +s = strrep (s, '\', '\\'); +s = strrep (s, '+', '\+'); +s = strrep (s, '.', '\.'); + +end % function diff --git a/inst/stk_version.m b/inst/stk_version.m new file mode 100644 index 0000000..f30a90a --- /dev/null +++ b/inst/stk_version.m @@ -0,0 +1,34 @@ +% STK_VERSION returns STK's version number + +% Copyright Notice +% +% Copyright (C) 2015-2019 CentraleSupelec +% Copyright (C) 2013, 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function v = stk_version () + +v = '2.7.0'; + +end % function diff --git a/inst/utils/stk_conditioning.m b/inst/utils/stk_conditioning.m new file mode 100644 index 0000000..544cb59 --- /dev/null +++ b/inst/utils/stk_conditioning.m @@ -0,0 +1,163 @@ +% STK_CONDITIONING produces conditioned sample paths +% +% CALL: ZSIMC = stk_conditioning (LAMBDA, ZI, ZSIM, XI_IND) +% +% produces conditioned sample paths ZSMIC from the unconditioned sample paths +% ZSIM, using the matrix of kriging weights LAMBDA. Conditioning is done with +% respect to a finite number NI of observations, located at the indices given +% in XI_IND (vector of length NI), with corresponding noiseless observed +% values ZI. +% +% The matrix LAMBDA must be of size NI x N, where N is the number of +% evaluation points for the sample paths; such a matrix is typically provided +% by stk_predict(). +% +% Both ZSIM and ZSIMC have size N x NB_PATHS, where NB_PATH is the number +% sample paths to be dealt with. ZI is a column of length NI. +% +% CALL: ZSIMC = stk_conditioning (LAMBDA, ZI, ZSIM) +% +% assumes that the oberved values ZI correspond to the first NI evaluation +% points. +% +% CALL: ZSIMC = stk_conditioning (LAMBDA, ZI, ZSIM, XI_IND, NOISE_SIM) +% +% produces conditioned sample paths ZSMIC from the unconditioned sample paths +% ZSIM, using the matrix of kriging weights LAMBDA. Conditioning is done with +% respect to a finite number NI of observations, located at the indices given +% in XI_IND (vector of length NI), with corresponding noisy observed values +% ZI, using a NI x N matrix NOISE_SIM of simulated noise values. +% +% NOTE: Conditioning by kriging +% +% stk_conditioning uses the technique called "conditioning by kriging" +% (see, e.g., Chiles and Delfiner, Geostatistics: Modeling Spatial +% Uncertainty, Wiley, 1999) +% +% NOTE: Output type +% +% The output argument ZSIMC will be an stk_dataframe if either LAMBDA or ZSIM +% are stk_dataframe. In case of conflicting row names (coming from +% ZSIM.rownames on the one hand and LAMBDA.colnames on the other hand), +% ZSIMC.rownames is {}. +% +% EXAMPLE: stk_example_kb05 +% +% See also stk_generate_samplepaths, stk_predict + +% Copyright Notice +% +% Copyright (C) 2015, 2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function zsimc = stk_conditioning (lambda, zi, z_sim, xi_ind, noise_sim) + +% Are we dealing with noisy observations ? +noisy = (nargin > 4) && (~ isempty (noise_sim)); + +zi = double (zi); +z_sim = double (z_sim); + +[ni, n] = size (lambda); +m = size (z_sim, 2); + +if (nargin < 4) || (isempty (xi_ind)) + xi_ind = (1:ni)'; +else + xi_ind = xi_ind(:); +end + +if ~ isequal (size (zi), [ni 1]) + stk_error (sprintf (['Considering the size of lambda (%d x %d), zi ' ... + 'should have size %d x 1'], ni, n, ni), 'IncorrectSize'); +end + +if ~ isequal (size (z_sim), [n m]) + stk_error (sprintf (['Considering the size of lambda (%d x %d), zsim ' ... + 'should have size %d x N, where N is the number of evaluation ' ... + 'points for the sample paths.'], ni, n, n), 'IncorrectSize'); +end + +if ~ isequal (size (xi_ind), [ni 1]) + stk_error (sprintf (['Considering the size of lambda (%d x %d), xi_ind ' ... + 'should have size %d x 1'], ni, n, ni), 'IncorrectSize'); +end + +if noisy && (~ isequal (size (noise_sim), [ni m])) + stk_error (sprintf (['Considering the size of lambda (%d x %d) and the ' ... + 'size of z_sim (%d x %d), noise_sim should have size %d x %d'], ni, ... + n, n, m, ni, m), 'IncorrectSize'); +end + +delta = bsxfun (@minus, zi, z_sim(xi_ind, :)); +if noisy + delta = delta - noise_sim; +end + +zsimc = z_sim + lambda' * delta; + +end % function + + +%!shared n, m, ni, xi_ind, lambda, zsim, zi +%! +%! n = 50; m = 5; ni = 10; xi_ind = 1:ni; +%! lambda = 1/ni * ones (ni, n); % prediction == averaging +%! zsim = ones (n, m); % const unconditioned samplepaths +%! zi = zeros (ni, 1); % conditioning by zeros + +%!error zsimc = stk_conditioning (); +%!error zsimc = stk_conditioning (lambda); +%!error zsimc = stk_conditioning (lambda, zi); +%!test zsimc = stk_conditioning (lambda, zi, zsim); +%!test zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); + +%!test +%! zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); +%! assert (stk_isequal_tolabs (double (zsimc), zeros (n, m))); + +%!test +%! zi = 2 * ones (ni, 1); % conditioning by twos +%! zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); +%! assert (stk_isequal_tolabs (double (zsimc), 2 * ones (n, m))); + +%!test +%! DIM = 1; nt = 400; +%! xt = stk_sampling_regulargrid (nt, DIM, [-1.0; 1.0]); +%! +%! NI = 6; xi_ind = [1 20 90 200 300 350]; +%! xi = xt(xi_ind, 1); +%! zi = (1:NI)'; % linear response ;-) +%! +%! % Carry out the kriging prediction at points xt +%! model = stk_model (@stk_materncov52_iso); +%! model.param = log ([1.0; 2.9]); +%! [ignore_zp, lambda] = stk_predict (model, xi, [], xt); +%! +%! % Generate (unconditional) sample paths according to the model +%! NB_PATHS = 10; +%! zsim = stk_generate_samplepaths (model, xt, NB_PATHS); +%! zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); diff --git a/inst/utils/stk_generate_samplepaths.m b/inst/utils/stk_generate_samplepaths.m new file mode 100644 index 0000000..d2bae08 --- /dev/null +++ b/inst/utils/stk_generate_samplepaths.m @@ -0,0 +1,234 @@ +% STK_GENERATE_SAMPLEPATHS generates sample paths of a Gaussian process +% +% CALL: ZSIM = stk_generate_samplepaths (MODEL, XT) +% +% generates one sample path ZSIM of the Gaussian process MODEL discretized on +% the evaluation points XT. The input argument XT can be either a numerical +% matrix or a dataframe. The output argument ZSIM has the same number of +% rows as XT. More precisely, on a factor space of dimension DIM, +% +% * XT must have size NS x DIM, +% * ZSIM will have size NS x 1, +% +% where NS is the number of simulation points. +% +% Note that, in the case where MODEL is a model for noisy observations, this +% function simulates sample paths of the underlying (latent) Gaussian +% process, i.e., noiseless observations. +% +% CALL: ZSIM = stk_generate_samplepaths (MODEL, XT, NB_PATHS) +% +% generates NB_PATHS sample paths at once. In this case, the output argument +% ZSIM has size NS x NB_PATHS. +% +% CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT) +% +% generates one sample path ZSIM, using the kriging model MODEL and the +% evaluation points XT, conditional on the evaluations (XI, ZI). +% +% CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT, NB_PATHS) +% +% generates NB_PATHS conditional sample paths at once. +% +% NOTE: Sample size limitation +% +% This function generates (discretized) sample paths using a Cholesky +% factorization of the covariance matrix, and is therefore restricted to +% moderate values of the number of evaluation points. +% +% NOTE: Output type +% +% The output argument ZSIM is a plain (double precision) numerical array, +% even if XT is a data frame. Row names can be added afterwards as follows: +% +% ZSIM = stk_generate_samplepaths (MODEL, XT); +% ZSIM = stk_dataframe (ZSIM, {}, XT.rownames); +% +% EXAMPLES: see stk_example_kb05, stk_example_kb07 +% +% See also stk_conditioning, stk_cholcov + +% Copyright Notice +% +% Copyright (C) 2015-2018, 2021 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function zsim = stk_generate_samplepaths (model, varargin) + +switch nargin + + case {0, 1} + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); + + case 2 + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT) + xt = varargin{1}; + nb_paths = 1; + conditional = false; + + case 3 + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT, NB_PATHS) + xt = varargin{1}; + nb_paths = varargin{2}; + conditional = false; + + case 4 + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT) + xi = varargin{1}; + zi = varargin{2}; + xt = varargin{3}; + nb_paths = 1; + conditional = true; + + otherwise + % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT, NB_PATHS) + xi = varargin{1}; + zi = varargin{2}; + xt = varargin{3}; + nb_paths = varargin{4}; + conditional = true; + +end + + +%--- Process input arguments --------------------------------------------------- + +xt = double (xt); + +% Check nb_paths argument +nb_paths = double (nb_paths); +if ~ isscalar (nb_paths) || ~ (nb_paths > 0) + stk_error ('nb_paths must be a positive scalar', 'Invalid argument'); +end + + +%--- Extend xt with the observation points, if needed -------------------------- + +if conditional + + % Keep only numerical data for xi, zi + xi = double (xi); + zi = double (zi); + + % Conditioning by kriging => we must simulate on the observation points too + xt = [xi; xt]; + xi_ind = 1:(size (xi, 1)); + +end + +% FIXME: Avoid duplicating observations points if xi is a subset of xt + + +%--- Generate unconditional sample paths -------------------------------------- + +% Pick unique simulation points +[xt_unique, ~, j] = unique (xt, 'rows'); + +% Did we actually find duplicates in xt ? +duplicates_detected = (size (xt_unique, 1) < size (xt, 1)); + +% Compute the covariance matrix +% (even if there no duplicates, it is not guaranteed +% that xt_unique and xt are equal) +if duplicates_detected + K = stk_make_matcov (model, xt_unique, xt_unique); +else + K = stk_make_matcov (model, xt, xt); +end + +% Cholesky factorization of the covariance matrix +V = stk_cholcov (K); + +% Generates samplepaths +zsim = V' * randn (size (K, 1), nb_paths); + +% Duplicate simulated values, if necessary +if duplicates_detected, zsim = zsim(j, :); end + + +%--- Generate conditional sample paths ---------------------------------------- + +if conditional + + % Carry out the kriging prediction at points xt + [~, lambda] = stk_predict (model, xi, zi, xt); + + if ~ stk_isnoisy (model) + + % Simulate sample paths conditioned on noiseless observations + zsim = stk_conditioning (lambda, zi, zsim, xi_ind); + + else % Noisy case + + % Simulate noise values + noise_sim = stk_simulate_noise (model, xi, nb_paths); + + % Simulate sample paths conditioned on noisy observations + zsim = stk_conditioning (lambda, zi, zsim, xi_ind, noise_sim); + + end + + % TEMPORARY FIX (until stk_conditioning is fixed as well) + zsim = double (zsim); + + zsim(xi_ind, :) = []; + +end + +end % function + + +%!shared model, xi, zi, xt, n, nb_paths +%! dim = 1; n = 50; nb_paths = 5; +%! model = stk_model (@stk_materncov32_iso, dim); +%! model.param = log ([1.0; 2.9]); +%! xt = stk_sampling_regulargrid (n, dim, [-1.0; 1.0]); +%! xi = [xt(1, :); xt(end, :)]; zi = [0; 0]; + +%!error zsim = stk_generate_samplepaths (); +%!error zsim = stk_generate_samplepaths (model); +%!test zsim = stk_generate_samplepaths (model, xt); +%!test zsim = stk_generate_samplepaths (model, xt, nb_paths); +%!test zsim = stk_generate_samplepaths (model, xi, zi, xt); +%!test zsim = stk_generate_samplepaths (model, xi, zi, xt, nb_paths); + +%!test +%! zsim = stk_generate_samplepaths (model, xt); +%! assert (isequal (size (zsim), [n, 1])); + +%!test +%! zsim = stk_generate_samplepaths (model, xt, nb_paths); +%! assert (isequal (size (zsim), [n, nb_paths])); + +%!test % duplicate simulation points +%! zsim = stk_generate_samplepaths (model, [xt; xt], nb_paths); +%! assert (isequal (size (zsim), [2 * n, nb_paths])); +%! assert (isequal (zsim(1:n, :), zsim((n + 1):end, :))); + +%!test % simulation points equal to observation points (noiseless model) +%! % https://sourceforge.net/p/kriging/tickets/14/ +%! zsim = stk_generate_samplepaths (model, xt, zeros (n, 1), xt); +%! assert (isequal (zsim, zeros (n, 1))); diff --git a/inst/utils/stk_plot1d.m b/inst/utils/stk_plot1d.m new file mode 100644 index 0000000..7a213a6 --- /dev/null +++ b/inst/utils/stk_plot1d.m @@ -0,0 +1,122 @@ +% STK_PLOT1D is a convenient plot function for 1D kriging predictions +% +% CALL: stk_plot1d (XI, ZI, XT, ZT, ZP) +% +% plots the evaluation points (XI, ZI), the "true function" with values +% ZT on the grid XT, and a representation of the prediction ZP on the +% same grid XT: the kriging prediction (posterior mean) surrounded by a +% shaded area corresponding to 95% pointwise confidence intervals. +% +% It is possible to omit plotting either the observations (XI, ZI) or +% the true function ZT by providing empty matrices. +% +% CALL: stk_plot1d (XI, ZI, XT, ZT, ZP, ZSIM) +% +% also plots a set ZSIM of samplepaths. +% +% CALL: stk_plot1d (H_AXES, ...) +% +% plots into existing axes with axis handle H_AXES. +% +% CALL: H_PLOT = stk_plot1d (...) +% +% returns the handles of the drawing in a structure. + +% Copyright Notice +% +% Copyright (C) 2015-2018 CentraleSupelec +% Copyright (C) 2011-2014 SUPELEC +% +% Authors: Julien Bect +% Emmanuel Vazquez +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h_plot = stk_plot1d (varargin) + +% Extract axis handle (if it is present) +[h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); + +if nargout < 1 + stk_plot1d_ (h_axes, varargin{:}); + % Do not display the handles if they are not asked (graphical option) +else + h_plot = stk_plot1d_ (h_axes, varargin{:}); +end + +end % function + + +function h = stk_plot1d_ (h_axes, xi, zi, xt, zt, zp, zsim) + +has_zt_arg = (nargin > 4) && (~ isempty (zt)); +has_zp_arg = (nargin > 5) && (~ isempty (zp)); +has_zsim_arg = (nargin > 6) && (~ isempty (zsim)); + +if (nargin > 3) && (~ isempty (xt)) + [xt, idx_sort] = sort (xt); +end + +h = struct ('truth', [], 'obs', [], 'pred', [], 'ci', [], 'sim', []); + +% Shaded area representing pointwise confidence intervals +if has_zp_arg + zp = zp(idx_sort, :); + h.ci = stk_plot_shadedci (h_axes, xt, zp); + hold on; +end + +% Plot sample paths +if has_zsim_arg + if isa (zsim, 'stk_dataframe') + % Prevents automatic creation of a legend by @stk_dataframe/plot + zsim.colnames = {}; + end + h.sim = plot (h_axes, xt, zsim(idx_sort, :), ... + '-', 'LineWidth', 1, 'Color', [0.39, 0.47, 0.64]); + set (h.sim(1), 'DisplayName', 'Samplepaths'); + hold on; +end + +% Ground truth +if has_zt_arg + h.truth = plot (h_axes, xt, zt(idx_sort, :), '--', 'LineWidth', 3, ... + 'Color', [0.39, 0.47, 0.64], 'DisplayName', 'True function'); + hold on; +end + +% Kriging predictor (posterior mean) +if has_zp_arg + h.pred = plot (h_axes, xt, zp.mean, 'LineWidth', 3, ... + 'Color', [0.95 0.25 0.3], 'DisplayName', 'Posterior mean'); + hold on; +end + +% Evaluations +if ~ isempty (zi) + h.obs = plot (h_axes, xi, zi, 'ko', 'MarkerSize', 6, ... + 'MarkerFaceColor', 'k', 'DisplayName', 'Observations'); +end + +hold off; set (gca, 'box', 'off'); + +end % function diff --git a/inst/utils/stk_plot_histnormres.m b/inst/utils/stk_plot_histnormres.m new file mode 100644 index 0000000..30b57f5 --- /dev/null +++ b/inst/utils/stk_plot_histnormres.m @@ -0,0 +1,93 @@ +% STK_PLOT_HISTNORMRES plots an histogram for normalized residuals +% +% CALL: H = stk_plot_histnormres (NORM_RES, ...) +% +% CALL: H = stk_plot_histnormres (H_AXES, NORM_RES, ...) +% +% See also stk_predict_leaveoneout, stk_example_kb10 + +% Copyright Notice +% +% Copyright (C) 2016, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h = stk_plot_histnormres (varargin) + +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +if n_argin >= 1 + norm_res = double (varargin{1}); + opts = varargin(2:end); +else + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +% Ignore infinite normalized residuals, with a warning +b = isinf (norm_res); +if any (b) + warning (sprintf ('Ignoring %d infinite normalized resiudals.', sum (b))); + norm_res = norm_res(~ b); +end + +% Choose the number of bins using the Freedman-Diaconis rule +n = length (norm_res); +q = quantile (norm_res, [0 0.25 0.75 1]); +norm_res_range = q(4) - q(1); +norm_res_iqr = q(3) - q(2); +if norm_res_iqr >= 0.1 * norm_res_range + % For reasonably large norm_res_iqr, we use teh FD rule + binsize = 2 * norm_res_iqr * (n ^ (- 1/3)); +else + % Safety net for small (possibly zero) norm_res_iqr + binsize = 0.2 * norm_res_range * (n ^ (- 1/3)); +end +nbins = ceil ((q(4) - q(1)) / binsize); + +% Use the number of bins provided by Sturges' rule as a minimum +nbins = max (nbins, 1 + log2 (n)); + +% Compute and plot histogram pdf +[count, rr] = hist (norm_res, nbins); +pdf = count / (n * (rr(2) - rr(1))); +h.hist = bar (rr, pdf, 'hist'); hold on; + +% Center view +M = max (3, max (abs (xlim ()))); xlim ([-M, M]); + +% Plot reference N(0, 1) pdf +rr = linspace (-M, M, 100); +pdf_ref = 1 / (sqrt (2 * pi)) * (exp (- 0.5 * (rr .^ 2))); +h.ref_pdf = plot (rr, pdf_ref, 'r--'); hold off; + +% Apply options +if ~ isempty (opts) + set (h.hist, opts{:}); +end + +% Create labels +h_labels = stk_labels (h_axes, 'normalized residuals', 'probability density'); +h.xlabel = h_labels(1); +h.ylabel = h_labels(2); + +end % function diff --git a/inst/utils/stk_plot_predvsobs.m b/inst/utils/stk_plot_predvsobs.m new file mode 100644 index 0000000..d06b287 --- /dev/null +++ b/inst/utils/stk_plot_predvsobs.m @@ -0,0 +1,70 @@ +% STK_PLOT_PREDVSOBS plots predictions against observations +% +% CALL: H = stk_plot_predvsobs (Z_OBS, Z_PRED, ...) +% +% CALL: H = stk_plot_predvsobs (H_AXES, Z_OBS, Z_PRED, ...) +% +% See also stk_predict_leaveoneout, stk_example_kb10 + +% Copyright Notice +% +% Copyright (C) 2016 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function h = stk_plot_predvsobs (varargin) + +[h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); + +if n_argin >= 2 + y = varargin{1}; + y_pred = varargin{2}; + opts = varargin(3:end); +else + stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); +end + +% Extract numerical predictions +try + y_pred = y_pred.mean; +catch + y_pred = double (y_pred); +end + +% Plot prediction versus truth +h.data = plot (h_axes, y, y_pred, 'kd'); hold on; + +% Plot "reference" line y_LOO = y +h.refline = plot (h_axes, xlim, xlim, 'r--'); hold off; + +% Apply options +if ~ isempty (opts) + set (h.data, opts{:}); +end + +% Create labels +h_labels = stk_labels (h_axes, 'observations', 'predictions'); +h.xlabel = h_labels(1); +h.ylabel = h_labels(2); + +end % function diff --git a/inst/utils/stk_plot_probdom2d.m b/inst/utils/stk_plot_probdom2d.m new file mode 100644 index 0000000..0370384 --- /dev/null +++ b/inst/utils/stk_plot_probdom2d.m @@ -0,0 +1,166 @@ +% STK_PLOT_PROBDOM2D represents the uncertainty about a 2D Pareto +% +% CALL: stk_plot_probdom2d (MODEL1, MODEL2, BOX) +% +% represents the uncertainty about the 2D Pareto front associated with the +% minimization of models MODEL1 and MODEL2 over the domain BOX. +% +% Use prior model structures (see stk_model) to represent prior uncertainty. +% +% Use @stk_model_gpposterior objects to represent posterior uncertainty. +% +% EXPERIMENTAL FUNCTION WARNING +% +% This function is currently considered experimental. Because of the very +% basic method used to choose the simulation points (uniform IID sampling), +% the plots produced by this function are very unreliable representations +% on the residual uncertainty on the Pareto front (except perhaps on low- +% dimensional problems of moderate difficulty). +% +% STK users that wish to experiment with it are welcome to do so, but should +% be aware of this limitation. We invite them to direct any questions, +% remarks or comments about this experimental class to the STK mailing list. +% +% REFERENCE +% +% [1] Michael Binois, David Ginsbourger and Olivier Roustant, Quantifying +% uncertainty on Pareto fronts with Gaussian Process conditional simu- +% lations, European J. of Operational Research, 2043(2):386-394, 2015. +% +% See also: stk_example_misc04, stk_model, stk_gpposterior + +% Copyright Notice +% +% Copyright (C) 2017, 2018 CentraleSupelec +% Copyright (C) 2014 SUPELEC +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function stk_plot_probdom2d (model1, model2, box) + +% FIXME: Provide a convenient way of changing these parameters + +% Number of additional random points in input space +NB_SIMULATION_POINTS = 1000; + +% Number of sample paths drawn to estimate the probabilities +NB_SAMPLEPATHS = 100; + +% Number of individual sample paths to be plotted +% (must be smaller than NB_SAMPLEPATHS) +NB_SAMPLEPATHS_PLOT = 20; + +% Number of test points in the objective space +NB_TEST_POINTS = 100 ^ 2; + + +%% Observation points (points where both objectives hae been evaluated) + +x1 = double (stk_get_input_data (model1)); +x2 = double (stk_get_input_data (model2)); + +x_obs = intersect (x1, x2, 'rows'); + + +%% Simulation points + +x_sim = stk_sampling_randunif (NB_SIMULATION_POINTS, [], box); +x_sim = [x_sim; x_obs]; + +% FIXME: Optimize the location of simulation points... (IID uniform is perhaps +% approximately OK for vague prior models, but *not* for posterior models +% obtained at the end of a long optimization procedure...) + + +%% Generate a "large" number of sample paths + +% Simulate samplepaths +y1_sim = double (stk_generate_samplepaths (model1, x_sim, NB_SAMPLEPATHS)); +y2_sim = double (stk_generate_samplepaths (model2, x_sim, NB_SAMPLEPATHS)); + +% Empirical lower/upper bounds for each response +y1_min = min (y1_sim(:)); y1_max = max (y1_sim(:)); +y2_min = min (y2_sim(:)); y2_max = max (y2_sim(:)); + +% Axis for a nice plot +y1_axis = [y1_min - 0.05 * (y1_max - y1_min), y1_max]; +y2_axis = [y2_min - 0.05 * (y2_max - y2_min), y2_max]; + + +%% Plot a few individual sample paths of the Pareto front + +stk_subplot (1, 2, 1); cm = jet (NB_SAMPLEPATHS_PLOT); + +for i = 1:NB_SAMPLEPATHS_PLOT + + % Extract Pareto front + y_sim = [y1_sim(:, i) y2_sim(:, i)]; + y_nd = y_sim(stk_paretofind (y_sim), :); + + % Add two extremities to the Pareto front + y_nd = [[y_nd(1, 1) y2_max]; y_nd; [y1_max y_nd(end, 2)]]; + + stairs (y_nd(:, 1), y_nd(:, 2), 'Color', cm(i, :)); + + stk_labels ('first objective', 'second objective'); + % FIXME: Add meaningful labels in a 'robust' way... currently, prior model + % structures do not necessarily have a 'response_name' field, and + % for posterior model object the 'response_name' field is not + % directly accessible... + + if i == 1 + axis ([y1_axis y2_axis]); hold on; + end +end + +stk_title ('simulated Pareto fronts'); + + +%% Probability of being dominated + +% Test points (a grid over the relevant subset of the objective space) +y_test = stk_sampling_regulargrid (NB_TEST_POINTS, 2, [y1_axis' y2_axis']); + +% Compute empirical probabilities +isdom = zeros (size (y_test, 1), 1); +for i = 1:NB_SAMPLEPATHS + y_sim = [y1_sim(:, i) y2_sim(:, i)]; + isdom = isdom + stk_isdominated (y_test, y_sim); +end +isdom = isdom / NB_SAMPLEPATHS; + +% Figure +stk_subplot (1, 2, 2); +colormap (hot); pcolor (y_test, isdom); +colorbar ('YTick', [0 .25 .5 .75 1], ... + 'YTickLabel', {'0%', '25%', '50%', '75%', '100%'}); +stk_labels ('first objective', 'second objective'); % FIXME: See above +stk_title ('Proba. of being dominated'); + +% FIXME: Change the aspect ratio of the figure, if it is possible to do it in +% a portable way. Figures with 1 x 2 subplots are not pretty... + +end % function + + +%#ok<*AGROW> diff --git a/inst/utils/stk_pmisclass.m b/inst/utils/stk_pmisclass.m new file mode 100644 index 0000000..24fcc73 --- /dev/null +++ b/inst/utils/stk_pmisclass.m @@ -0,0 +1,101 @@ +% STK_PMISCLASS computes the (expected) probability of misclassification +% +% CALL: P = stk_pmisclass (U, Z_PRED) +% +% computes the probability of misclassification P with respect to the +% threshold U using the posterior means and variances contained in Z_PRED, +% where Z_PRED is a dataframe with column names 'mean' and 'var' (as +% returned by stk_predict). +% +% CALL: P = stk_pmisclass (U, Z1_PRED, K12, K22) +% +% computes the expected probability of misclassification P with respect to +% the threshold U at a set of locations X1, assuming that observations are +% made at another set of location X2, where: +% +% * Z1_PRED contains, as above, the posterior means and variances at X1; +% +% * K12 is the posterior covariance matrix between the values of the process +% at X1 and the observations (at X2); +% +% * K22 is the posterior covariance matrix of the observations. +% +% See also: stk_predict, stk_example_doe04 + +% Copyright Notice +% +% Copyright (C) 2015, 2017 CentraleSupelec +% +% Author: Julien Bect + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function pmisclass = stk_pmisclass (u, z1_pred, K12, K22) + +if ~ isscalar (u) + stk_error ('u should be a scalar.', 'IncorrectSize'); +end + +% Kriging mean (reduced to the case u = 0) +m = bsxfun (@minus, get (z1_pred, 'mean'), u); + +% Kriging variances and standard deviations +v = get (z1_pred, 'var'); +s = sqrt (v); + +% Compute the probability p that the response at xt is *above* 0 and q = 1 - p +[q, p] = stk_distrib_normal_cdf (0, m, s); + +if nargin < 4, + + % Current posterior probability of misclassification + pmisclass = min (p, q); + +else + + % Variance of the future predictor + if isscalar (K22) + if K22 < 0 + stk_error ('K22 should be positive.', 'InvalidArgument'); + elseif K22 == 0 + fpv = v; + else + fpv = (K12 .^ 2) / K22; + end + else + R = stk_cholcov (K22); + M = K12 / R; + fpv = sum (M .^ 2, 2); + end + + % Standard deviation of the future predictor + fps = sqrt (min (fpv, v)); + + % Proba that the future predictor is below u + p1 = stk_distrib_normal_cdf (0, m, fps); + + % Proba that both the response and the future predictor are below u + p2 = stk_distrib_bivnorm_cdf ([0 0], m, m, fps, s, fps ./ s); + + pmisclass = q + p1 - 2 * p2; +end + +end % function diff --git a/inst/utils/stk_simulate_noise.m b/inst/utils/stk_simulate_noise.m new file mode 100644 index 0000000..b0babb6 --- /dev/null +++ b/inst/utils/stk_simulate_noise.m @@ -0,0 +1,73 @@ +% STK_SIMULATE_NOISE simulates random draws of the observation noise +% +% CALL: Z = stk_simulate_noise (MODEL, X) +% +% simulates one random draw of the observation noise in the MODEL at +% observation points X. The input argument X can be either a numerical +% matrix or a dataframe. The output Z has the same number of of rows as X. +% More precisely, on a factor space of dimension DIM, +% +% * X must have size NS x DIM, +% * Z will have size NS x 1, +% +% where NS is the number of simulation points. +% +% CALL: Z = stk_simulate_noise (MODEL, X, M) +% +% generates M random draws at once. In this case, the output argument Z has +% size NS x M. +% +% See also: stk_generate_samplepaths + +% Copyright Notice +% +% Copyright (C) 2015, 2017, 2018 CentraleSupelec +% Copyright (C) 2017 LNE +% +% Authors: Julien Bect +% Remi Stroh + +% Copying Permission Statement +% +% This file is part of +% +% STK: a Small (Matlab/Octave) Toolbox for Kriging +% (https://github.com/stk-kriging/stk/) +% +% STK is free software: you can redistribute it and/or modify it under +% the terms of the GNU General Public License as published by the Free +% Software Foundation, either version 3 of the License, or (at your +% option) any later version. +% +% STK is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +% License for more details. +% +% You should have received a copy of the GNU General Public License +% along with STK. If not, see . + +function noise_sim = stk_simulate_noise (model, x, nrep) + +if nargin < 3 + nrep = 1; +end + +ni = size (x, 1); + +if ~ stk_isnoisy (model) % Noiseless case + + noise_sim = zeros (ni, nrep); + +else % Noisy case + + % Standard deviation of the observations + s = sqrt (stk_covmat_noise (model, x, [], -1, true)); + + % Simulate noise values + s = reshape (s, ni, 1); + noise_sim = bsxfun (@times, s, randn (ni, nrep)); + +end + +end % function diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..9f6fcb5 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,37 @@ +all: \ + __stk_dist_pairwise__.mex \ + __get_column_number__.mex \ + __stk_dist_matrixy__.mex \ + __stk_filldist_discr_mex__.mex \ + __stk_gpquadform_matrixy__.mex \ + __stk_isdominated_mex__.mex \ + __stk_mindist_mex__.mex \ + __stk_dist_matrixx__.mex \ + __stk_dist_pairwise__.mex \ + __stk_gpquadform_matrixx__.mex \ + __stk_gpquadform_pairwise__.mex \ + __stk_paretofind_mex__.mex \ + __stk_sampling_vdc_rr2__.mex \ + __stk_sampling_sobol_mex__.mex \ + __stk_distrib_bivnorm0_cdf__.mex \ + __stk_dominatedhv_mex__.mex + +__%__.mex: stk_mex.h + +__stk_sampling_vdc_rr2__.mex: primes.h +__stk_paretofind_mex__.mex: pareto.h +__stk_isdominated_mex__.mex: pareto.h +__stk_dominatedhv_mex__.mex: wfg.h + +MKOCTFILE ?= mkoctfile + +__%__.mex: %.c + $(MKOCTFILE) --mex --output $@ $< + +__stk_dominatedhv_mex__.mex: stk_dominatedhv_mex.c wfg.c + $(MKOCTFILE) --mex --output $@ $< wfg.c + +.PHONY: clean + +clean: + rm -f *.o *.mex diff --git a/src/get_column_number.c b/src/get_column_number.c new file mode 100644 index 0000000..83dc40d --- /dev/null +++ b/src/get_column_number.c @@ -0,0 +1,194 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2020 CentraleSupelec * + * Copyright (C) 2013 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "string.h" +#include "stk_mex.h" + +#define ICOL_SAMPLESIZE -6 /* will be a -5 in the end */ +#define ICOL_INFO -5 /* will be a -4 in the end */ +#define ICOL_ROWNAMES -4 /* will be a -3 in the end */ +#define ICOL_COLNAMES -3 /* will be a -2 in the end */ +#define ICOL_ENTIRE_DATAFRAME -2 /* will be a -1 in the end */ + +int get_column_number(const mxArray* mxColNames, char* s) +{ + size_t ncol, cmax, c; + char** colnames; + mxArray* tmp; + int icol, found; + + if (strcmp (s, "info") == 0) + return ICOL_INFO; + + if (strcmp (s, "rownames") == 0) + return ICOL_ROWNAMES; + + if (strcmp (s, "colnames") == 0) + return ICOL_COLNAMES; + + if (strcmp (s, "sample_size") == 0) + return ICOL_SAMPLESIZE; + + ncol = mxGetNumberOfElements (mxColNames); + if (ncol == 0) { + if (strcmp(s, "data") == 0) + return ICOL_ENTIRE_DATAFRAME; + mexErrMsgTxt ("The dataframe has no column names."); + } + + icol = -1; + + /* Read colum names and compare with s. We stop when the first + match is found, assuming that we are dealing with a + well-formed dataframe without duplicated column names. */ + + colnames = (char**) mxCalloc(ncol, sizeof(char*)); + for (c = 0; c < ncol; c++) + { + tmp = mxGetCell(mxColNames, c); + if (tmp == NULL) + mexErrMsgTxt("Error while reading column names (mxGetCell)."); + + colnames[c] = mxArrayToString(tmp); + if (colnames[c] == NULL) + mexErrMsgTxt("Error while reading column names (mxArrayToString)."); + + if (strcmp(colnames[c], s) == 0) + { + icol = (int) c; + break; + } + } + + /* Maximum c such that colnames[c] must be freed */ + found = (icol != -1); + cmax = ((found) ? (c) : (ncol - 1)); + + /* Deal with special cases, in particular LEGACY cases, + if no exact match has been found */ + if (!found) + { + if (strcmp(s, "data") == 0) + { + icol = ICOL_ENTIRE_DATAFRAME; + } + else if (strcmp(s, "a") == 0) + { + for (c = 0; c < ncol; c++) + if (strcmp(colnames[c], "mean") == 0) + { + icol = (int) c; + break; + } + + if (icol == -1) + { + icol = ICOL_ENTIRE_DATAFRAME; + mexWarnMsgIdAndTxt("STK:subsref_dot:Legacy", + "There is no variable named 'a'.\n" + " => Assuming that you're an old STK user" + " trying to get the entire dataframe."); + } + else + { + mexWarnMsgIdAndTxt("STK:subsref_dot:Legacy", + "There is no variable named 'a'.\n" + " => Assuming that you're an old STK user" + " trying to get the kriging mean."); + } + } + else if (strcmp(s, "v") == 0) + { + for (c = 0; c < ncol; c++) + if (strcmp(colnames[c], "var") == 0) + { + icol = (int) c; + break; + } + + if (icol != -1) + mexWarnMsgIdAndTxt("STK:subsref_dot:Legacy", + "There is no variable named 'v'.\n" + " => Assuming that you're an old STK user" + " trying to get the kriging variance."); + } + } + + /* ERROR if no corresponding column can be found */ + if (icol == -1) + mexErrMsgIdAndTxt("STK:subsref_dot:UnknownVariable", + "There is no variable named %s.", s); + + /* Free memory used for column names. */ + for (c = 0; c <= cmax; c++) + mxFree(colnames[c]); + mxFree(colnames); + + return icol; +} + + +#define COLNAMES_IN prhs[0] +#define PROPNAME_IN prhs[1] +#define ICOL_OUT plhs[0] + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + char *s; + int icol; + + /*--- Check number of input/output arguments --------------------------------*/ + + if (nrhs != 2) + mexErrMsgTxt("Incorrect number of input arguments (should be 2)."); + + if (nlhs > 1) + mexErrMsgTxt("Incorrect number of output arguments (should be 1)."); + + /*--- Read property name ----------------------------------------------------*/ + + if (!mxIsChar(PROPNAME_IN)) + mexErrMsgTxt("PropertyName argument should be of class 'char'."); + + s = mxArrayToString(PROPNAME_IN); + + if(s == NULL) + mexErrMsgTxt("mxArrayToString failed to process PropertyName argument."); + + /*--- Which column are we trying to set ? -----------------------------------*/ + + icol = get_column_number(COLNAMES_IN, s); + ICOL_OUT = mxCreateDoubleScalar (icol + 1); + + mxFree(s); +} diff --git a/src/pareto.h b/src/pareto.h new file mode 100644 index 0000000..a57ced5 --- /dev/null +++ b/src/pareto.h @@ -0,0 +1,293 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2014 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#ifndef ___LEXICAL_SORT_H___ +#define ___LEXICAL_SORT_H___ + +/* assumes that types SCALAR and LOGICAL are defined */ + +struct T { + int pos; + int stride; + int dim; + const SCALAR *data; +}; + + +/*--------------------------------------------------------------*/ + +void lexical_sort +(SCALAR *x, int *idx, int n, int d); + +int pareto_find +(SCALAR *x, int *idx1, int* idx2, int n, int d); + +void is_dominated +(const SCALAR *xa, const SCALAR *xb, LOGICAL *isdom, + int *drank, int n, int k, int d); + +int __lexical_cmp__ +(const void *_x, const void *_y); + +int __is_dominated__ +(const struct T *x, const struct T *y); + +void __init_tab__ +(const SCALAR *x, struct T *tab, int n, int d); + + +/*--------------------------------------------------------------*/ + +int __lexical_cmp__ (const void *_x, const void *_y) +{ + int j, n, d; + const SCALAR *px, *py; + const struct T *x, *y; + + /* Cast to const struct T* */ + x = (const struct T*) _x; + y = (const struct T*) _y; + + /* Pointers to the actual data */ + px = x->data; + py = y->data; + + /* We ASSUME that x and y have the same dim and stride */ + d = x->dim; + n = x->stride; + + for (j = 0; j < d; j ++, px += n, py += n) { + if ((*px) < (*py)) + return -1; /* x < y */ + else if ((*px) > (*py)) + return +1; /* y > x */ + } + + return 0; /* x == y */ +} + +/*--------------------------------------------------------------*/ + +/* Is x dominated by y ? */ +/* note: SMALLER is better */ + +int __is_dominated__ (const struct T *x, const struct T *y) +{ + int j, nx, ny, d, any_xgty; + const SCALAR *px, *py; + + /* Pointers to the actual data */ + px = x->data; + py = y->data; + + d = x->dim; + nx = x->stride; + ny = y->stride; + + any_xgty = 0; /* flag: 1 if we have seen at least one component + in y that is strictly better (smaller) */ + + for (j = 0; j < d; j ++, px += nx, py += ny) { + if ((*px) < (*py)) + return 0; /* y does not dominate x */ + else if ((*px) > (*py)) + any_xgty = 1; + } + + return any_xgty; +} + +/*--------------------------------------------------------------*/ + +/* TODO: templated versions, to handle integer types, single, etc. */ + +void lexical_sort (SCALAR *x, int *idx, int n, int d) +{ + struct T *tab; + int i; + + /* Prepare tab for sorting */ + tab = (struct T *) malloc (n * sizeof (struct T)); + __init_tab__ (x, tab, n, d); + + /* Sort using qsort() from the standard library */ + qsort (tab, n, sizeof (struct T), __lexical_cmp__); + + /* Fill output list */ + for (i = 0; i < n; i++) + idx[i] = tab[i].pos; + + free (tab); +} + +/*--------------------------------------------------------------*/ + +/* TODO: templated versions, to handle integer types, single, etc. */ + +int pareto_find (SCALAR *x, int *ndpos, int *drank, int n, int d) +{ + /* ndpos: liste de taille n + * + * ndpos[i] = position in x of the i^th non-dominated point + * (i^th in the lexical order) 0 <= i < k + * + * ndpos[i] = -1 for all i > k + * + * drank: another list of length n + * + * drank[i] = rank (in the lexical order, between 0 and k) of + * the first dominating point if x[i, :] is dominated + * + * drank[i] = -1 if x[i, :] is not dominated + * + * Both lists are assumed to have been allocated by the caller. + * + * Note: all indices are 0-based in this function. + */ + + struct T *tab; + int i, ii, k, pos; + + /* Prepare tab for sorting */ + tab = (struct T *) malloc (n * sizeof (struct T)); + __init_tab__ (x, tab, n, d); + + /* Sort using qsort() from the standard library */ + qsort (tab, n, sizeof (struct T), __lexical_cmp__); + + /* Fill ndpos and drank with -1 */ + for (i = 0; i < n; i++) { + ndpos[i] = -1; + drank[i] = -1; + } + + /* Remove dominated points */ + /* i : rank of current point. Start at the SECOND element */ + for (i = 1; i < n; i++) + for (ii = 0; ii < i; ii++) + if ((tab[ii].pos >= 0) && + (__is_dominated__ (tab + i, tab + ii))) { + drank[tab[i].pos] = ii; + tab[i].pos = - 1; + break; + } + + /* Note: at this stage, drank contains the rank of the first + * dominating point in the FULL (sorted) list of points */ + + /* Fill ndpos */ + k = 0; + for (i = 0; i < n; i++) { + pos = tab[i].pos; + if (pos >= 0) { /* indicates a non-dominated point */ + ndpos[k] = pos; + tab[i].pos = k; + k ++; + } + } + + /* Adjust drank to the final list of non-dominated points */ + for (i = 0; i < n; i++) + if (drank[i] != -1 ) + drank[i] = tab[drank[i]].pos; + + free (tab); + + return k; +} + +/*--------------------------------------------------------------*/ + +void is_dominated (const SCALAR *xa, const SCALAR *xb, + LOGICAL *isdom, int *drank, + int n, int k, int d) +{ + int i, j, b; + struct T T1, T2; + SCALAR xa1; + + T1.pos = 0; /* unused */ + T1.stride = n; + T1.dim = d; + + T2.pos = 0; /* unused */ + T2.stride = k; + T2.dim = d; + + for (i = 0; i < n; i++) { + + b = 0; /* not dominated, until proved otherwise */ + T1.data = xa + i; /* pointer to the current row */ + xa1 = xa[i]; /* first element of the current row */ + + for (j = 0; j < k; j++) { + + /* xb is assumed to be LEXICALLY SORTED => as soon as the + first element becomes bigger than xa1, we know that + the current row is not dominated */ + if (xb[j] > xa1) + break; + + T2.data = xb + j; + if (__is_dominated__ (&T1, &T2)) { + b = 1; + break; + } + } + + if (b) { + drank[i] = j; + isdom[i] = (LOGICAL) 1; + } else { + drank[i] = -1; + isdom[i] = (LOGICAL) 0; + } + } +} + +/*--------------------------------------------------------------*/ + +void __init_tab__ (const SCALAR *x, struct T *tab, int n, int d) +{ + int i; + + /* Fill in array to be sorted */ + for (i = 0; i < n; i++) { + tab[i].pos = i; + tab[i].data = x + i; + tab[i].dim = d; + tab[i].stride = n; + } + +} + +#endif diff --git a/src/primes.h b/src/primes.h new file mode 100644 index 0000000..65867da --- /dev/null +++ b/src/primes.h @@ -0,0 +1,1013 @@ +#ifndef ___FIRST10000PRIMES_H___ +#define ___FIRST10000PRIMES_H___ + +/* The First 10,000 Primes + (the 10,000th is 104,729) + For more information on primes see http://primes.utm.edu/ */ + +#define PRIMES_TABLE_SIZE 10000 + +unsigned int primes_table[PRIMES_TABLE_SIZE] = { + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, + 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, + 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, + 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, + 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, + 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, + 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, + 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, + 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, + 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, + 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, + 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, + 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, + 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, + 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, + 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, + 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, + 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, + 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, + 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, + 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, + 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, + 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, + 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, + 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, + 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, + 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, + 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, + 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, + 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, + 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, + 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, + 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, + 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, + 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, + 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, + 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, + 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, + 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, + 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, + 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, + 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, + 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, + 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, + 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, + 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, + 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, + 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, + 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, + 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, + 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, + 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, + 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, + 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, + 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, + 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, + 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, + 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, + 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, + 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, + 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, + 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, + 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, + 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, + 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, + 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, + 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, + 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, + 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, + 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, + 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, + 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, + 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, + 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, + 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, + 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, + 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, + 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, + 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, + 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, + 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, + 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, + 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, + 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, + 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, + 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, + 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, + 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, + 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, + 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, + 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, + 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, + 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, + 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, + 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, + 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, + 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, + 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, + 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, + 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, + 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, + 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, + 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, + 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, + 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, + 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, + 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, + 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, + 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, + 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, + 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, + 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, + 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, + 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, + 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, + 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, + 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, + 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, + 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, + 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, + 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, + 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, + 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, + 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, + 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, + 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, + 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, + 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, + 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, + 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, + 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, + 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, + 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, + 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, + 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, + 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, + 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, + 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, + 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, + 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, + 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, + 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, + 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, + 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, + 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, + 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, + 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, + 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, + 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, + 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, + 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, + 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, + 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, + 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, + 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, + 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, + 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, + 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, + 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, + 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, + 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, + 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, + 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, + 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, + 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, + 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, + 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, + 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, + 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, + 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, + 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, + 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, + 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, + 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, + 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, + 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, + 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, + 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, + 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, + 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, + 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, + 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, + 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, + 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, + 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, + 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, + 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, + 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, + 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, + 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, + 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, + 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, + 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, + 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, + 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, + 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, + 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, + 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, + 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, + 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, + 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, + 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, + 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, + 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, + 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, + 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, + 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, + 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, + 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, + 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, + 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, + 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, + 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, + 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, + 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, + 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, + 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, + 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, + 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, + 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, + 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, + 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, + 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, + 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, + 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, + 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, + 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, + 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, + 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, + 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, + 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, + 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, + 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, + 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, + 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, + 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, + 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, + 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, + 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, + 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, + 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, + 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, + 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, + 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, + 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, + 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, + 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, + 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, + 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, + 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, + 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, + 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, + 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, + 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, + 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, + 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, + 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, + 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, + 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, + 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, + 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, + 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, + 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, + 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, + 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, + 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, + 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, + 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, + 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, + 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, + 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, + 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, + 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, + 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, + 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, + 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, + 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, + 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, + 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, + 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, + 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, + 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, + 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, + 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, + 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, + 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, + 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, + 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, + 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, + 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, + 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, + 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, + 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, + 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, + 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, + 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, + 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, + 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, + 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, + 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, + 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, + 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, + 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, + 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, + 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, + 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, + 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, + 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, + 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, + 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, + 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, + 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, + 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, + 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, + 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, + 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, + 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, + 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, + 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, + 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, + 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, + 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, + 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, + 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, + 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, + 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, + 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, + 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, + 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, + 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, + 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, + 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, + 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, + 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, + 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, + 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, + 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, + 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, + 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, + 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, + 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, + 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, + 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, + 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, + 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, + 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, + 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, + 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, + 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, + 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, + 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, + 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, + 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, + 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, + 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, + 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, + 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, + 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, + 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, + 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, + 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, + 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, + 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, + 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, + 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, + 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, + 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, + 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, + 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, + 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, + 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, + 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, + 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, + 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, + 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, + 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, + 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, + 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, + 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, + 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, + 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, + 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, + 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, + 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, + 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, + 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, + 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, + 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, + 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, + 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, + 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, + 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, + 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, + 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, + 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, + 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, + 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, + 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, + 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, + 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, + 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, + 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, + 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, + 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, + 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, + 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, + 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, + 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, + 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, + 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, + 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, + 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, + 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, + 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, + 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, + 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, + 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, + 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, + 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, + 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, + 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, + 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, + 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, + 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, + 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, + 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, + 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, + 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, + 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, + 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, + 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, + 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, + 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, + 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, + 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, + 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, + 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, + 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, + 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, + 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, + 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, + 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, + 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, + 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, + 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, + 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, + 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, + 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, + 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, + 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, + 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, + 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, + 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, + 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, + 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, + 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, + 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, + 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, + 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, + 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, + 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, + 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, + 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, + 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, + 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, + 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, + 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, + 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, + 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, + 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, + 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, + 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, + 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, + 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, + 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, + 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, + 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, + 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, + 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, + 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, + 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, + 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, + 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, + 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, + 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, + 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, + 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, + 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, + 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, + 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, + 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, + 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, + 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, + 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, + 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, + 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, + 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, + 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, + 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, + 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, + 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, + 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, + 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, + 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, + 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, + 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, + 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, + 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, + 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, + 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, + 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, + 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, + 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, + 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, + 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, + 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, + 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, + 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, + 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, + 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, + 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, + 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, + 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, + 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, + 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, + 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, + 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, + 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, + 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, + 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, + 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, + 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, + 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, + 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, + 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, + 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, + 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, + 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, + 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, + 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, + 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, + 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, + 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, + 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, + 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, + 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, + 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, + 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, + 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, + 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, + 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, + 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, + 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, + 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, + 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, + 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, + 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, + 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, + 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, + 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, + 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, + 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, + 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, + 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, + 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, + 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, + 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, + 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, + 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, + 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, + 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, + 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, + 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, + 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, + 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, + 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, + 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, + 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, + 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, + 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, + 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, + 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, + 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, + 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, + 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, + 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, + 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, + 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, + 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, + 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, + 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, + 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, + 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, + 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, + 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, + 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, + 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, + 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, + 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, + 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, + 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, + 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, + 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, + 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, + 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, + 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, + 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, + 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, + 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, + 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, + 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, + 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, + 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, + 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, + 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, + 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, + 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, + 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, + 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, + 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, + 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, + 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, + 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, + 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, + 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, + 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, + 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, + 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, + 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, + 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, + 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, + 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, + 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, + 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, + 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, + 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, + 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, + 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, + 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, + 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, + 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, + 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, + 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, + 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, + 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, + 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, + 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, + 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, + 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, + 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, + 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, + 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, + 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, + 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, + 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, + 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, + 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, + 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, + 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, + 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, + 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, + 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, + 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, + 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, + 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, + 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, + 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, + 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, + 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, + 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, + 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, + 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, + 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, + 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, + 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, + 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, + 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, + 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, + 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, + 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, + 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, + 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, + 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, + 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, + 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, + 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, + 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, + 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, + 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, + 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, + 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, + 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, + 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, + 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, + 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, + 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, + 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, + 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, + 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, + 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, + 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, + 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, + 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, + 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, + 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, + 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, + 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, + 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, + 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, + 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, + 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, + 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, + 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, + 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, + 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, + 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, + 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, + 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, + 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, + 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, + 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, + 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, + 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, + 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, + 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, + 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, + 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, + 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, + 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, + 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, + 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, + 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, + 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, + 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, + 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, + 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, + 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, + 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, + 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, + 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, + 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, + 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, + 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, + 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, + 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, + 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, + 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, + 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, + 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, + 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, + 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, + 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, + 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, + 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, + 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, + 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, + 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, + 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, + 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, + 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, + 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, + 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, + 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, + 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, + 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, + 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, + 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, + 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, + 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, + 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, + 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, + 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, + 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, + 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, + 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, + 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, + 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, + 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, + 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, + 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, + 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, + 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, + 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, + 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, + 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, + 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, + 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, + 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, + 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, + 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, + 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, + 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, + 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, + 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, + 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, + 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, + 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, + 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, + 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, + 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, + 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, + 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, + 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, + 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, + 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, + 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, + 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, + 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, + 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, + 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, + 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, + 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, + 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, + 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, + 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, + 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, + 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, + 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, + 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, + 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, + 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, + 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, + 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, + 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, + 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, + 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, + 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, + 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, + 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, + 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, + 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, + 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, + 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, + 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, + 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, + 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, + 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, + 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, + 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, + 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, + 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, + 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, + 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, + 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, + 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, + 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, + 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, + 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, + 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, + 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, + 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, + 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, + 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, + 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, + 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, + 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, + 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, + 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, + 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, + 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, + 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, + 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, + 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, + 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, + 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, + 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, + 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, + 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, + 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, + 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, + 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, + 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, + 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, + 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, + 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, + 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, + 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, + 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, + 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, + 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, + 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, + 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, + 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, + 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, + 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, + 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, + 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, + 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, + 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, + 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, + 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, + 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, + 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, + 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, + 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, + 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, + 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, + 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, + 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, + 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, + 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, + 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, + 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, + 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, + 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, + 100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, + 100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, + 100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, + 100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, + 100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, + 100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, + 100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, + 100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, + 101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, + 101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, + 101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, + 101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, + 101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, + 101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, + 101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, + 101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, + 101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, + 102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, + 102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, + 102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, + 102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, + 102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, + 102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, + 102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, + 102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, + 102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, + 103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, + 103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, + 103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, + 103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, + 103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, + 103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, + 103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, + 103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, + 104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, + 104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, + 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, + 104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, + 104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, + 104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, +}; + +#endif diff --git a/src/stk_dist_matrixx.c b/src/stk_dist_matrixx.c new file mode 100644 index 0000000..4db70da --- /dev/null +++ b/src/stk_dist_matrixx.c @@ -0,0 +1,97 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2011, 2012 SUPELEC * + * * + * Authors: Julien Bect * + * Emmanuel Vazquez * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + +static void distance1(double* x, double* h, size_t nx, size_t dim) +{ + size_t i, j, k1, k2; + double diff, lambda; + + for (i = 0; i < nx; i++) { + + /* put a zero on the diagonal */ + h[i*(nx+1)] = 0.0; + + for (j = i+1; j < nx; j++) { + + /* compute distance between x[i,:] and x[j,:] */ + lambda = 0.0; + for (k1 = i, k2 = j; k1 < dim * nx; k1 += nx, k2 += nx) + { + diff = x[k1] - x[k2]; + lambda += diff * diff; + } + + /* store the result in h, twice for symmetry */ + h[i+nx*j] = sqrt(lambda); + h[j+nx*i] = h[i+nx*j]; + + } + } +} + + +mxArray* compute_distance_xx(const mxArray* x) +{ + size_t d, n; + mxArray* h; + + if(!stk_is_realmatrix(x)) + mexErrMsgTxt("The input should be a real-valued double-precision array."); + + /* Read the size of the input argument */ + n = mxGetM(x); + d = mxGetN(x); + + /* Create a matrix for the return argument */ + h = mxCreateDoubleMatrix(n, n, mxREAL); + + /* Do the actual computations in a subroutine */ + distance1(mxGetPr(x), mxGetPr(h), n, d); + + return h; +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 1) /* Check number of input arguments */ + mexErrMsgTxt("Incorrect number of input arguments."); + + plhs[0] = compute_distance_xx(prhs[0]); +} diff --git a/src/stk_dist_matrixy.c b/src/stk_dist_matrixy.c new file mode 100644 index 0000000..ec23115 --- /dev/null +++ b/src/stk_dist_matrixy.c @@ -0,0 +1,97 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2011, 2012 SUPELEC * + * * + * Authors: Julien Bect * + * Emmanuel Vazquez * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + + +static void distance2(double* x, double* y, double* h, size_t nx, size_t ny, size_t dim) +{ + size_t i, j, kx, ky; + double diff, lambda; + + for (i = 0; i < nx; i++) { + for (j = 0; j < ny; j++) { + + /* compute distance between x[i,:] and y[j,:] */ + lambda = 0.0; + for (kx = i, ky = j; kx < dim * nx; kx += nx, ky += ny) + { + diff = x[kx] - y[ky]; + lambda += diff * diff; + } + + /* store the result in h */ + h[i+nx*j] = sqrt(lambda); + + } + } +} + + +mxArray* compute_distance_xy(const mxArray* x, const mxArray* y) +{ + size_t d, mx, my; + mxArray* h; + + if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y))) + mexErrMsgTxt("Input arguments should be real-valued double-precision array."); + + /* Check that the input arguments have the same number of columns */ + if (mxGetN(y) != (d = mxGetN(x))) + mexErrMsgTxt("Both input arguments should have the same number of columns."); + + /* Read the size (number of lines) of each input argument */ + mx = mxGetM(x); + my = mxGetM(y); + + /* Create a matrix for the return argument */ + h = mxCreateDoubleMatrix(mx, my, mxREAL); + + /* Do the actual computations in a subroutine */ + distance2(mxGetPr(x), mxGetPr(y), mxGetPr(h), mx, my, d); + + return h; +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 2) /* Check number of input arguments */ + mexErrMsgTxt("Incorrect number of input arguments."); + + plhs[0] = compute_distance_xy(prhs[0], prhs[1]); +} diff --git a/src/stk_dist_pairwise.c b/src/stk_dist_pairwise.c new file mode 100644 index 0000000..24a1f2f --- /dev/null +++ b/src/stk_dist_pairwise.c @@ -0,0 +1,94 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2012 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + + +static void distance3(double* x, double* y, double* h, size_t n, size_t dim) +{ + size_t i, k; + double diff, lambda; + + for (i = 0; i < n; i++) { + + /* compute distance between x[i,:] and y[j,:] */ + lambda = 0.0; + for (k = i; k < dim * n; k += n) + { + diff = x[k] - y[k]; + lambda += diff * diff; + } + + /* store the result in h */ + h[i] = sqrt(lambda); + + } +} + + +mxArray* compute_distance_xy_pairwise(const mxArray* x, const mxArray* y) +{ + size_t d, n; + mxArray* h; + + if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y))) + mexErrMsgTxt("Input arguments should be real-valued double-precision array."); + + /* Check that the input arguments have the same number of columns */ + if (mxGetN(y) != (d = mxGetN(x))) + mexErrMsgTxt("Both input arguments should have the same number of columns."); + + /* Check that the input arguments have the same number of rows */ + if (mxGetM(y) != (n = mxGetM(x))) + mexErrMsgTxt("Both input arguments should have the same number of rows."); + + /* Create a matrix for the return argument */ + h = mxCreateDoubleMatrix(n, 1, mxREAL); + + /* Do the actual computations in a subroutine */ + distance3(mxGetPr(x), mxGetPr(y), mxGetPr(h), n, d); + + return h; +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 2) /* Check number of input arguments */ + mexErrMsgTxt("Incorrect number of input arguments."); + + plhs[0] = compute_distance_xy_pairwise(prhs[0], prhs[1]); +} diff --git a/src/stk_distrib_bivnorm0_cdf.c b/src/stk_distrib_bivnorm0_cdf.c new file mode 100644 index 0000000..5f17a15 --- /dev/null +++ b/src/stk_distrib_bivnorm0_cdf.c @@ -0,0 +1,485 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2017 CentraleSupelec * + * Copyright (C) 2014 Supelec * + * * + * Author: Julien Bect * + * * + * Based on mvndstpack.f by Yihong Ge and Alan Genz * + * (see original copyright notice below) * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + +double bvu (double h, double k, double rho); +double mvnphi (double z); + +#define MAX(a,b) ((a) >= (b) ? (a) : (b)) +#define BIGNUM 40.0 /* this is BIG for a normal deviate */ + +#define ARGIN_UPPER prhs[0] /* n x 2 */ +#define ARGIN_RHO prhs[1] /* n x 1 */ +#define ARGOUT_PROBA plhs[0] /* n x 1 */ +#define ARGOUT_QROBA plhs[1] /* n x 1 */ + +void mexFunction +( + int nlhs, mxArray *plhs[], + int nrhs, const mxArray *prhs[] +) +{ + size_t n; int i; double *u1, *u2, *rho, *proba, *qroba; + double q01, q10, q11; + mxArray *mxProba, *mxQroba; + + /*--- check number of input / output arguments -------------------------*/ + + if (nrhs != 2) + { + mexErrMsgTxt ("Incorrect number of input arguments."); + } + + if (nlhs > 2) + { + mexErrMsgTxt ("Too many output arguments."); + } + + /*--- check input arguments types -------------------------------------*/ + + if ((! stk_is_realmatrix (ARGIN_UPPER)) || (mxGetN (ARGIN_UPPER) != 2)) + { + mexErrMsgTxt ("Input argument #1 (upper) should be a real " + "double-precision matrix with two columns."); + } + + if ((! stk_is_realmatrix (ARGIN_RHO)) || (mxGetN (ARGIN_RHO) != 1)) + { + mexErrMsgTxt ("Input argument #2 (rho) should be a real " + "double-precision column vector."); + } + + n = mxGetM (ARGIN_UPPER); + + if (mxGetM (ARGIN_RHO) != n) + { + mexErrMsgTxt ("Input arguments #1 (upper) and #2 (rho) should " + "have the same number of rows"); + } + + /*--- prepare the output argument --------------------------------------*/ + + mxProba = mxCreateDoubleMatrix (n, 1, mxREAL); + mxQroba = mxCreateDoubleMatrix (n, 1, mxREAL); + + /*--- get pointers to the actual data ----------------------------------*/ + + u1 = mxGetPr (ARGIN_UPPER); + u2 = u1 + n; + rho = mxGetPr (ARGIN_RHO); + proba = mxGetPr (mxProba); + qroba = mxGetPr (mxQroba); + + /*--- compute probabilities --------------------------------------------*/ + + for (i = 0; i < n; i++) + { + if ((u1[i] < - BIGNUM) || (u2[i] < - BIGNUM)) + { + proba[i] = 0.0; + qroba[i] = 1.0; + } + else if (u1[i] > BIGNUM) + { + if (u2[i] < 0) + { + proba[i] = mvnphi (u2[i]); + qroba[i] = 1 - proba[i]; + } + else + { + qroba[i] = mvnphi (- u2[i]); + proba[i] = 1 - qroba[i]; + } + } + else if (u2[i] > BIGNUM) + { + if (u1[i] < 0) + { + proba[i] = mvnphi (u1[i]); + qroba[i] = 1 - proba[i]; + } + else + { + qroba[i] = mvnphi (- u1[i]); + proba[i] = 1 - qroba[i]; + } + } + else if ((u1[i] < 0) || (u2[i] < 0)) + { + proba[i] = bvu (- u1[i], - u2[i], rho[i]); + qroba[i] = 1 - proba[i]; + } + else + { + q11 = bvu (u1[i], u2[i], rho[i]); + q10 = (mvnphi (- u1[i])) - q11; q10 = MAX(q10, 0); + q01 = (mvnphi (- u2[i])) - q11; q01 = MAX(q01, 0); + qroba[i] = q11 + q01 + q10; + proba[i] = 1 - qroba[i]; + } + } + + /*--- the end ----------------------------------------------------------*/ + + ARGOUT_PROBA = mxProba; + + if (nlhs > 1) + ARGOUT_QROBA = mxQroba; + else + mxDestroyArray (mxQroba); + +} + + +/************************************************************************** + * * + * The following code has been obtained by translating the Fortran code * + * mvndstpack.f to C using f2c (version 20100827) and then extracting and * + * manually cleaning up the relevant functions. * + * * + * mvndstpack.f was obtained by HTTP on 2014/12/09 from: * + * * + * http://www.math.wsu.edu/faculty/genz/software/fort77/mvtdstpack.f * + * * + * It is distributed under the following ("modified BSD") licence: * + * * + * Copyright (C) 2013, Alan Genz, All rights reserved. * + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided the following conditions are met: * + * 1. Redistributions of source code must retain the above copyright * + * notice, this list of conditions and the following disclaimer. * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in * + * the documentation and/or other materials provided with the * + * distribution. * + * 3. The contributor name(s) may not be used to endorse or promote * + * products derived from this software without specific prior * + * written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF USE * + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * + **************************************************************************/ + +/************************************************************************** + * * + * A function for computing bivariate normal probabilities * + * * + * Yihong Ge * + * Department of Computer Science and Electrical Engineering * + * Washington State University * + * Pullman, WA 99164-2752 * + * * + * and * + * * + * Alan Genz * + * Department of Mathematics * + * Washington State University * + * Pullman, WA 99164-3113 * + * Email : alangenz@wsu.edu * + * * + * double bvu (double h, double k, double *r__) * + * * + * Calculate the probability that X > h and Y > k for a standard * + * bivariate Gaussian vector (X, Y) with correlation coefficient *r__ * + * * + **************************************************************************/ + +double bvu (double h, double k, double rho) +{ + static struct + { + double e_1[3]; + double fill_2[7]; + double e_3[6]; + double fill_4[4]; + double e_5[10]; + } + equiv_122 = + { + {.1713244923791705, .3607615730481384, .4679139345726904}, + {0}, + {.04717533638651177, .1069393259953183, .1600783285433464, + .2031674267230659, .2334925365383547, .2491470458134029}, + {0}, + {.01761400713915212, .04060142980038694, .06267204833410906, + .08327674157670475, .1019301198172404, .1181945319615184, + .1316886384491766, .1420961093183821, .1491729864726037, + .1527533871307259} + }; + +#define w ((double *)&equiv_122) + + static struct + { + double e_1[3]; + double fill_2[7]; + double e_3[6]; + double fill_4[4]; + double e_5[10]; + } + equiv_123 = + { + {-.9324695142031522, -.6612093864662647, -.238619186083197}, + {0}, + {-.9815606342467191, -.904117256370475, -.769902674194305, + -.5873179542866171, -.3678314989981802, -.1252334085114692}, + {0}, + {-.9931285991850949, -.9639719272779138, -.9122344282513259, + -.8391169718222188, -.7463319064601508, -.636053680726515, + -.5108670019508271, -.3737060887154196, -.2277858511416451, + -.07652652113349733} + }; + +#define x ((double *)&equiv_123) + + /* System generated locals */ + int i__1; + double d__1, d__2; + + /* Local variables */ + double a, b, c__, d__; + int i__, lg, ng; + double as; + double bs, hk, hs, sn, rs, xs, bvn, asr; + + /* Gauss Legendre Points and Weights, N = 6 */ + /* Gauss Legendre Points and Weights, N = 12 */ + /* Gauss Legendre Points and Weights, N = 20 */ + + if (fabs(rho) < .3f) + { + ng = 1; + lg = 3; + } + else if (fabs(rho) < .75f) + { + ng = 2; + lg = 6; + } + else + { + ng = 3; + lg = 10; + } + + hk = h * k; + bvn = 0.; + + if (fabs(rho) < .925f) + { + hs = (h * h + k * k) / 2; + asr = asin(rho); + i__1 = lg; + for (i__ = 1; i__ <= i__1; ++i__) + { + sn = sin(asr * (x[i__ + ng * 10 - 11] + 1) / 2); + bvn += w[i__ + ng * 10 - 11] * exp((sn * hk - hs) / (1 - sn * sn)); + sn = sin(asr * (-x[i__ + ng * 10 - 11] + 1) / 2); + bvn += w[i__ + ng * 10 - 11] * exp((sn * hk - hs) / (1 - sn * sn)); + } + d__1 = -h; + d__2 = -k; + bvn = bvn * asr / 12.566370614359172 + mvnphi(d__1) * mvnphi(d__2); + } + else + { + if (rho < 0.) + { + k = -k; + hk = -hk; + } + + if (fabs(rho) < 1.) + { + as = (1 - rho) * (rho + 1); + a = sqrt(as); + + /* Computing 2nd power */ + d__1 = h - k; + bs = d__1 * d__1; + c__ = (4 - hk) / 8; + d__ = (12 - hk) / 16; + bvn = a * exp(-(bs / as + hk) / 2) + * (1 - c__ * (bs - as) + * (1 - d__ * bs / 5) / 3 + c__ * d__ * as * as / 5); + + if (hk > -160.) + { + b = sqrt(bs); + d__1 = -b / a; + bvn -= exp(-hk / 2) * sqrt(6.283185307179586) * mvnphi(d__1) + * b * (1 - c__ * bs * (1 - d__ * bs / 5) / 3); + } + + a /= 2; + i__1 = lg; + for (i__ = 1; i__ <= i__1; ++i__) + { + /* Computing 2nd power */ + d__1 = a * (x[i__ + ng * 10 - 11] + 1); + xs = d__1 * d__1; + rs = sqrt(1 - xs); + + bvn += a * w[i__ + ng * 10 - 11] + * (exp(-bs / (xs * 2) - hk / (rs + 1)) + / rs - exp(-(bs / xs + hk) / 2) + * (c__ * xs * (d__ * xs + 1) + 1)); + + /* Computing 2nd power */ + d__1 = -x[i__ + ng * 10 - 11] + 1; + xs = as * (d__1 * d__1) / 4; + rs = sqrt(1 - xs); + + /* Computing 2nd power */ + d__1 = rs + 1; + bvn += a * w[i__ + ng * 10 - 11] * exp(-(bs / xs + hk) / 2) * + (exp(-hk * xs / (d__1 * d__1 * 2)) / rs - (c__ * xs * + (d__ * xs + 1) + 1)); + } + + bvn = -bvn / 6.283185307179586; + } + + if (rho > 0.) + { + d__1 = - MAX(h,k); + bvn += mvnphi(d__1); + } + else + { + bvn = -bvn; + if (k > h) + { + if (h < 0.) + { + bvn = bvn + mvnphi(k) - mvnphi(h); + } + else + { + d__1 = - h; + d__2 = - k; + bvn = bvn + mvnphi(d__1) - mvnphi(d__2); + } + } + } + } + + return bvn; + +} /* bvu */ + + +/************************************************************************** + * * + * Normal distribution probabilities accurate to 1d-15. * + * Reference: J.L. Schonfelder, Math Comp 32(1978), pp 1232-1240. * + * * + **************************************************************************/ + +double mvnphi (double z) +{ + static double a[44] = + { + .610143081923200417926465815756, + -.434841272712577471828182820888,.176351193643605501125840298123, + -.060710795609249414860051215825,.017712068995694114486147141191, + -.004321119385567293818599864968,8.54216676887098678819832055e-4, + -1.2715509060916274262889394e-4,1.1248167243671189468847072e-5, + 3.13063885421820972630152e-7,-2.70988068537762022009086e-7, + 3.0737622701407688440959e-8,2.515620384817622937314e-9, + -1.02892992132031912759e-9,2.9944052119949939363e-11, + 2.605178968726693629e-11,-2.634839924171969386e-12, + -6.43404509890636443e-13,1.12457401801663447e-13, + 1.7281533389986098e-14,-4.264101694942375e-15, + -5.45371977880191e-16,1.58697607761671e-16,2.0899837844334e-17, + -5.900526869409e-18,-9.41893387554e-19,2.1497735647e-19, + 4.6660985008e-20,-7.243011862e-21,-2.387966824e-21,1.91177535e-22, + 1.20482568e-22,-6.72377e-25,-5.747997e-24,-4.28493e-25, + 2.44856e-25,4.3793e-26,-8.151e-27,-3.089e-27,9.3e-29,1.74e-28, + 1.6e-29,-8e-30,-2e-30 + }; + + /* Builtin functions */ + double exp(double); + + /* Local variables */ + double b; + int i__; + double p, t, bm, bp, xa; + + xa = fabs(z) / 1.414213562373095048801688724209; + + if (xa > 100.) + { + p = 0.; + } + else + { + t = (xa * 8 - 30) / (xa * 4 + 15); + bm = 0.; + b = 0.; + + for (i__ = 24; i__ >= 0; --i__) + { + bp = b; + b = bm; + bm = t * b - bp + a[i__]; + } + + p = exp(-xa * xa) * (bm - bp) / 4; + } + + if (z > 0.) + { + p = 1 - p; + } + + return p; + +} /* mvnphi */ diff --git a/src/stk_dominatedhv_mex.c b/src/stk_dominatedhv_mex.c new file mode 100644 index 0000000..55f5bf0 --- /dev/null +++ b/src/stk_dominatedhv_mex.c @@ -0,0 +1,298 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015-2017 CentraleSupelec * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" +#include "wfg.h" + + +/* We assume in this file that OBJECTIVE is the same as double */ + +double compute_hv (mxArray* f, FRONT *buffer) +{ + size_t i, j; /* loop indices */ + size_t nb_points; /* number of points */ + size_t nb_objectives; /* number of objectives */ + double *data; /* pointer to input data */ + double hv, t; /* hypervolume */ + + nb_points = mxGetM (f); + if (nb_points == 0) + return 0.0; + + nb_objectives = mxGetN (f); + data = mxGetPr (f); + + if (nb_objectives == 0) + { + return 0.0; + } + else if (nb_objectives == 1) + { + /* one objective: return the max */ + hv = 0; + for (i = 0; i < nb_points; i++) + { + t = data[i]; + if (t > hv) hv = t; + } + return hv; + } + else /* two ore more objectives */ + { + wfg_front_resize (buffer, nb_points, nb_objectives); + + for (i = 0; i < nb_points; i++) + for (j = 0; j < nb_objectives; j++) + buffer->points[i].objectives[j] = data[j * nb_points + i]; + + return wfg_compute_hv (buffer); + } +} + + +void compute_decomposition (mxArray* f, FRONT *buffer, + mxArray** sign, mxArray** xmin, mxArray** xmax) +{ + size_t i, j; /* loop indices */ + size_t nb_points; /* number of points */ + size_t nb_objectives; /* number of objectives */ + size_t rect_alloc; /* initial number of rectangles */ + double t; /* aux variables */ + double *data; /* pointer to input data */ + RLIST* Rlist; /* list of hyper-rectangles */ + double *sign_data, *xmin_data, *xmax_data; + + nb_points = mxGetM (f); + nb_objectives = mxGetN (f); + data = mxGetPr (f); + + if (nb_objectives == 0) + { + if (nb_points > 0) + mexErrMsgTxt ("nb_objectives == 0 and nb_points > 0: Undefined behaviour."); + + *sign = mxCreateDoubleMatrix (0, 0, mxREAL); + *xmin = mxCreateDoubleMatrix (0, 0, mxREAL); + *xmax = mxCreateDoubleMatrix (0, 0, mxREAL); + } + else if (nb_points == 0) + { + *sign = mxCreateDoubleMatrix (0, 1, mxREAL); + *xmin = mxCreateDoubleMatrix (0, nb_objectives, mxREAL); + *xmax = mxCreateDoubleMatrix (0, nb_objectives, mxREAL); + } + else if (nb_objectives == 1) + { + t = data[0]; + + for (i = 1; i < nb_points; i++) + t = ((data[i] > t) ? data[i] : t); + + *sign = mxCreateDoubleMatrix (1, 1, mxREAL); + *xmin = mxCreateDoubleMatrix (1, 1, mxREAL); + *xmax = mxCreateDoubleMatrix (1, 1, mxREAL); + + (mxGetPr (*sign))[0] = 1.0; + (mxGetPr (*xmin))[0] = 0.0; + (mxGetPr (*xmax))[0] = t; + } + else /* two ore more objectives */ + { + wfg_front_resize (buffer, nb_points, nb_objectives); + + for (i = 0; i < nb_points; i++) + for (j = 0; j < nb_objectives; j++) + buffer->points[i].objectives[j] = data[j * nb_points + i]; + + /* Rule of thumb: allocate initially for + ((2 ^ nb_objectives) * nb_points) rectangles */ + rect_alloc = nb_objectives; + for (i = 0; i < nb_objectives; i++) + rect_alloc *= 2; + + Rlist = Rlist_alloc (rect_alloc, nb_objectives); + + wfg_compute_decomposition (buffer, Rlist); + + *sign = mxCreateDoubleMatrix (Rlist->size, 1, mxREAL); + *xmin = mxCreateDoubleMatrix (Rlist->size, nb_objectives, mxREAL); + *xmax = mxCreateDoubleMatrix (Rlist->size, nb_objectives, mxREAL); + + sign_data = mxGetPr (*sign); + xmin_data = mxGetPr (*xmin); + xmax_data = mxGetPr (*xmax); + + /* TODO: optimize using transposed arrays for xmin, xmax + (mxArrays + internally in the Rlist structure) */ + for (i = 0; i < Rlist->size; i++) + { + sign_data[i] = (double) Rlist->sign[i]; + for (j = 0; j < nb_objectives; j++) + { + xmin_data[j * Rlist->size + i] = Rlist->xmin[i][j]; + xmax_data[j * Rlist->size + i] = Rlist->xmax[i][j]; + } + } + + Rlist_free (Rlist); + } +} + + +#define Y_IN prhs[0] +#define DO_DECOMPOSITION prhs[1] +#define HV_OUT plhs[0] + +static const char* field_names[] = {"sign", "xmin", "xmax"}; + +void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + size_t i; /* loop indices */ + mxArray **fronts; /* fronts, as mxArray objects */ + bool do_decomposition; /* do the decomposition or just return the volume ? */ + FRONT buffer; /* front structure, as expected by WFG */ + size_t nb_fronts; /* number of Pareto fronts */ + size_t nb_points; /* number of points in a given front */ + size_t nb_objectives; /* number of objectives for a given front */ + size_t maxm = 0; /* maximum number of points in a front */ + size_t maxn = 0; /* maximum number of objectives */ + double *hv; /* computed hyper-volumes */ + bool must_free_fronts; /* flag: do we need to free 'fronts' ? */ + mxArray* sign; /* temp array of signs (do_decomposition = true) */ + mxArray* xmin; /* temp array of lower bounds (do_decomposition = true) */ + mxArray* xmax; /* temp array of upper bounds (do_decomposition = true) */ + + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt ("Too many output arguments."); + + if (nrhs != 2) /* Check number of input arguments */ + mexErrMsgTxt ("Incorrect number of input arguments."); + + if (stk_is_realmatrix (Y_IN)) + { + nb_fronts = 1; + fronts = (mxArray**) prhs; + must_free_fronts = false; + } + else if (mxIsCell (Y_IN)) + { + nb_fronts = mxGetNumberOfElements (Y_IN); + fronts = (mxArray**) mxMalloc (sizeof (mxArray*) * nb_fronts); + for (i = 0; i < nb_fronts; i++) + fronts[i] = mxGetCell (Y_IN, i); + must_free_fronts = true; + } + else + { + mexErrMsgTxt ("Incorrect type for argin #1: cell or double expected."); + nb_fronts = 0; /* avoids unitialized variable warning */ + fronts = NULL; /* idem */ + must_free_fronts = false; /* idem */ + } + + if (mxIsLogicalScalar (DO_DECOMPOSITION)) + { + do_decomposition = (bool) *mxGetLogicals (DO_DECOMPOSITION); + } + else + { + mexErrMsgTxt ("Incorrect type for argin #2: logical scalar expected."); + do_decomposition = false; /* avoids unitialized variable warning */ + } + + /*--- Prepare fronts for WFG -----------------------------------------------*/ + + for (i = 0; i < nb_fronts; i++) + { + nb_points = mxGetM (fronts[i]); + if (nb_points > maxm) maxm = nb_points; + + nb_objectives = mxGetN (fronts[i]); + if (nb_objectives > maxn) maxn = nb_objectives; + } + + wfg_front_init (&buffer, maxm, maxn); + + /* Allocate memory for WFG */ + wfg_alloc (maxm, maxn); + + + /*--- Compute hyper-volumes or decomposition -------------------------------*/ + + if (do_decomposition) + { + if (nb_fronts == 1) + { + HV_OUT = mxCreateStructMatrix (1, 1, 3, field_names); + } + else + { + HV_OUT = mxCreateStructArray (mxGetNumberOfDimensions (Y_IN), + mxGetDimensions (Y_IN), 3, field_names); + } + + for (i = 0; i < nb_fronts; i++) + { + compute_decomposition (fronts[i], &buffer, &sign, &xmin, &xmax); + mxSetFieldByNumber (HV_OUT, i, 0, sign); + mxSetFieldByNumber (HV_OUT, i, 1, xmin); + mxSetFieldByNumber (HV_OUT, i, 2, xmax); + } + } + else + { + if (nb_fronts == 1) + { + HV_OUT = mxCreateDoubleScalar (1); + } + else + { + HV_OUT = mxCreateNumericArray (mxGetNumberOfDimensions (Y_IN), + mxGetDimensions (Y_IN), mxDOUBLE_CLASS, mxREAL); + } + + hv = mxGetPr (HV_OUT); + + for (i = 0; i < nb_fronts; i++) + hv[i] = compute_hv (fronts[i], &buffer); + } + + + /*--- Free memory ----------------------------------------------------------*/ + + wfg_free (maxm, maxn); + + wfg_front_destroy (&buffer); + + if (must_free_fronts) + mxFree (fronts); +} diff --git a/src/stk_filldist_discr_mex.c b/src/stk_filldist_discr_mex.c new file mode 100644 index 0000000..f06dc31 --- /dev/null +++ b/src/stk_filldist_discr_mex.c @@ -0,0 +1,121 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2012 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + +#define X_IN prhs[0] /* input argument #1 */ +#define Y_IN prhs[1] /* input argument #2 */ +#define FILLDIST_OUT plhs[0] /* output argument #1 */ +#define ARGMAX_OUT plhs[1] /* output argument #2 */ + +static double compute_filldist +( + double* x, size_t nx, + double* y, size_t ny, + size_t dim, + size_t* argmax + ) +{ + size_t i, j, k1, k2, j_max; + double diff, sqdist_max, sqdist_j, sqdist_ij; + + j_max = 0; + sqdist_max = 0.0; + + for (j = 0; j < ny; j++) { + + sqdist_j = 0; /* prevents a "may be uninitialized" warning */ + + /* Compute the sqdist from y(j, :) to the set x */ + for (i = 0; i < nx; i++) { + /* Compute the sqdist from y(j, :) to x(i, :) */ + sqdist_ij = 0.0; + for (k1 = i, k2 = j; k1 < dim * nx; k1 += nx, k2 += ny) { + diff = x[k1] - y[k2]; + sqdist_ij += diff * diff; + } + /* Update sqdist_j */ + if ((i == 0) || (sqdist_ij < sqdist_j)) + sqdist_j = sqdist_ij; + } + + /* Update sqdist_max */ + if (sqdist_j > sqdist_max) { + j_max = j; + sqdist_max = sqdist_j; + } + + } + + *argmax = j_max; + return sqrt(sqdist_max); +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + size_t mx, my, dim, argmax; + double filldist, *px, *py; + + if (nlhs > 2) + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 2) + mexErrMsgTxt("Incorrect number of input arguments (should be 2)."); + + if (mxIsComplex(X_IN) || mxIsComplex(Y_IN)) + mexErrMsgTxt("The input arguments cannot be complex."); + + if ((!mxIsDouble(X_IN)) || (!mxIsDouble(Y_IN))) + mexErrMsgTxt("The input argument must be of class 'double'."); + + /* Read the size of the input arguments */ + mx = mxGetM(X_IN); + my = mxGetM(Y_IN); + dim = mxGetN(X_IN); + + if ((mx == 0) || (my == 0) || (dim == 0)) + mexErrMsgTxt("The input arguments should not be empty."); + + if (mxGetN(Y_IN) != dim) + mexErrMsgTxt("The input arguments must have the same number of columns."); + + /* Do the actual computations in a subroutine */ + px = mxGetPr(X_IN); py = mxGetPr(Y_IN); + filldist = compute_filldist(px, mx, py, my, dim, &argmax); + + /* Return the results as Matlab objects */ + FILLDIST_OUT = mxCreateDoubleScalar(filldist); + if (nlhs == 2) + ARGMAX_OUT = mxCreateDoubleScalar(((double)argmax) + 1); +} diff --git a/src/stk_gpquadform_matrixx.c b/src/stk_gpquadform_matrixx.c new file mode 100644 index 0000000..523ee1d --- /dev/null +++ b/src/stk_gpquadform_matrixx.c @@ -0,0 +1,119 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2013 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + + +static void gpquadform_matrixx +( + double* x, double* rx2, double* h, size_t n, size_t dim + ) +{ + size_t i, j, k1, k2; + double diff, lambda; + + for (i = 0; i < (n - 1); i++) + { + /* put a zero on the diagonal */ + h[i * (n + 1)] = 0.0; + + for (j = (i + 1); j < n; j++) + { + /* compute distance between x[i,:] and x[j,:] */ + lambda = 0.0; + for (k1 = i, k2 = j; k1 < dim * n; k1 += n, k2 += n) + { + diff = x[k1] - x[k2]; + lambda += (diff * diff) / (rx2[k1] + rx2[k2]); + } + /* store the result in h */ + h[i + n * j] = lambda; + h[j + n * i] = lambda; + } + } +} + + +mxArray* compute_gpquadform_matrixx +( + const mxArray* x, + const mxArray* rx + ) +{ + size_t k, d, mx; + double u, *p, *rx2; + mxArray *h; + + if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(rx))) + mexErrMsgTxt("Input arguments should be real-valued double-precision array."); + + d = mxGetN(x); + mx = mxGetM(x); + + /* Check that the all input arguments have the same number of columns */ + if ((mxGetM(rx) != mx) || (mxGetN(rx) != d)) + mexErrMsgTxt("x and rx should have the same size."); + + /* Compute rx^2 */ + rx2 = mxCalloc(mx * d, sizeof(double)); p = mxGetPr(rx); + for(k = 0; k < mx * d; k++) + { + u = p[k]; + if(u <= 0) + mexErrMsgTxt("rx should have (strictly) positive entries."); + rx2[k] = u * u; + } + + /* Create a matrix for the return argument */ + h = mxCreateDoubleMatrix(mx, mx, mxREAL); + + /* Do the actual computations in a subroutine */ + gpquadform_matrixx(mxGetPr(x), rx2, mxGetPr(h), mx, d); + + /* Free allocated memory */ + mxFree(rx2); + + return h; +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 2) /* Check number of input arguments */ + mexErrMsgTxt("Incorrect number of input arguments."); + + plhs[0] = compute_gpquadform_matrixx(prhs[0], prhs[1]); +} diff --git a/src/stk_gpquadform_matrixy.c b/src/stk_gpquadform_matrixy.c new file mode 100644 index 0000000..d481f28 --- /dev/null +++ b/src/stk_gpquadform_matrixy.c @@ -0,0 +1,135 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2013 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + + +static void gpquadfrom_matrixy +( + double* x, double* y, double* rx2, double* ry2, + double* h, size_t nx, size_t ny, size_t dim + ) +{ + size_t i, j, kx, ky; + double diff, lambda; + + for (i = 0; i < nx; i++) { + for (j = 0; j < ny; j++) { + + /* compute distance between x[i,:] and y[j,:] */ + lambda = 0.0; + for (kx = i, ky = j; kx < dim * nx; kx += nx, ky += ny) + { + diff = x[kx] - y[ky]; + lambda += (diff * diff) / (rx2[kx] + ry2[ky]); + } + + /* store the result in h */ + h[i + nx * j] = lambda; + + } + } +} + + +mxArray* compute_gpquadfrom_matrixy +( + const mxArray* x, + const mxArray* y, + const mxArray* rx, + const mxArray* ry + ) +{ + size_t k, d, mx, my; + double u, *p, *rx2, *ry2; + mxArray *h; + + if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y)) || + (!stk_is_realmatrix(rx)) || (!stk_is_realmatrix(ry))) + mexErrMsgTxt("Input arguments should be real-valued double-precision array."); + + /* Check that the all input arguments have the same number of columns */ + d = mxGetN(x); + if ((mxGetN(y) != d) || (mxGetN(rx) != d) || (mxGetN(ry) != d)) + mexErrMsgTxt("All input arguments should have the same number of columns."); + + /* Check that rx and ry have the appropriate number of rows */ + if (mxGetM(rx) != (mx = mxGetM(x))) + mexErrMsgTxt("x and rx should have the same number of rows."); + if (mxGetM(ry) != (my = mxGetM(y))) + mexErrMsgTxt("y and ry should have the same number of rows."); + + /* Compute rx^2 */ + rx2 = mxCalloc(mx * d, sizeof(double)); p = mxGetPr(rx); + for(k = 0; k < mx * d; k++) + { + u = p[k]; + if(u <= 0) + mexErrMsgTxt("rx should have (strictly) positive entries."); + rx2[k] = u * u; + } + + /* Compute ry^2 */ + ry2 = mxCalloc(my * d, sizeof(double)); p = mxGetPr(ry); + for(k = 0; k < my * d; k++) + { + u = p[k]; + if(u <= 0) + mexErrMsgTxt("ry should have (strictly) positive entries."); + ry2[k] = u * u; + } + + /* Create a matrix for the return argument */ + h = mxCreateDoubleMatrix(mx, my, mxREAL); + + /* Do the actual computations in a subroutine */ + gpquadfrom_matrixy(mxGetPr(x), mxGetPr(y), rx2, ry2, mxGetPr(h), mx, my, d); + + /* Free allocated memory */ + mxFree(rx2); + mxFree(ry2); + + return h; +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 4) /* Check number of input arguments */ + mexErrMsgTxt("Incorrect number of input arguments."); + + plhs[0] = compute_gpquadfrom_matrixy(prhs[0], prhs[1], prhs[2], prhs[3]); +} diff --git a/src/stk_gpquadform_pairwise.c b/src/stk_gpquadform_pairwise.c new file mode 100644 index 0000000..f38f721 --- /dev/null +++ b/src/stk_gpquadform_pairwise.c @@ -0,0 +1,113 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2013 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + + +static void gpquadform_pairwise +( + double* x, double* y, double* rx, double* ry, + double* h, size_t m, size_t dim + ) +{ + size_t i, kx, ky; + double diff, lambda, rxi, ryi; + + for (i = 0; i < m; i++) + { + /* compute distance between x[i,:] and y[i,:] */ + lambda = 0.0; + for (kx = i, ky = i; kx < dim * m; kx += m, ky += m) + { + diff = x[kx] - y[ky]; + rxi = rx[kx]; + ryi = ry[ky]; + lambda += (diff * diff) / (rxi * rxi + ryi * ryi); + } + + /* store the result in h */ + h[i] = lambda; + } +} + + +mxArray* compute_qxy_matrixy +( + const mxArray* x, + const mxArray* y, + const mxArray* rx, + const mxArray* ry + ) +{ + size_t d, m; + mxArray *h; + + if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y)) || + (!stk_is_realmatrix(rx)) || (!stk_is_realmatrix(ry))) + mexErrMsgTxt("Input arguments should be real-valued double-precision array."); + + /* Check that the all input arguments have the same number of columns */ + d = mxGetN(x); + if ((mxGetN(y) != d) || (mxGetN(rx) != d) || (mxGetN(ry) != d)) + mexErrMsgTxt("All input arguments should have the same number of columns."); + + /* Read the number of rows of x and y */ + if (mxGetM(y) != (m = mxGetM(x))) + mexErrMsgTxt("x and y should have the same number of rows."); + + /* Check that rx and ry have the appropriate number of rows */ + if (mxGetM(rx) != m) + mexErrMsgTxt("x and rx should have the same number of rows."); + if (mxGetM(ry) != m) + mexErrMsgTxt("y and ry should have the same number of rows."); + + /* Create a matrix for the return argument */ + h = mxCreateDoubleMatrix(m, 1, mxREAL); + + /* Do the actual computations in a subroutine */ + gpquadform_pairwise(mxGetPr(x), mxGetPr(y), mxGetPr(rx), mxGetPr(ry), mxGetPr(h), m, d); + + return h; +} + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + if (nlhs > 1) /* Check number of output arguments */ + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 4) /* Check number of input arguments */ + mexErrMsgTxt("Incorrect number of input arguments."); + + plhs[0] = compute_qxy_matrixy(prhs[0], prhs[1], prhs[2], prhs[3]); +} diff --git a/src/stk_isdominated_mex.c b/src/stk_isdominated_mex.c new file mode 100644 index 0000000..cbcc6e7 --- /dev/null +++ b/src/stk_isdominated_mex.c @@ -0,0 +1,109 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2014 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + +typedef double SCALAR; +typedef mxLogical LOGICAL; +#include "pareto.h" + +/* mimic ismember's syntax */ +#define ARGIN_A prhs[0] /* n x d, double */ +#define ARGIN_B prhs[1] /* k x d, double */ +#define ARGOUT_ISDOM plhs[0] /* n x 1, logical */ +#define ARGOUT_DRANK plhs[1] /* n x 1, double */ + +/* IMPORTANT: the rows of B are assumed to be */ +/* SORTED in the LEXICAL ORDER */ + +void mexFunction +( + int nlhs, mxArray *plhs[], + int nrhs, const mxArray *prhs[] +) +{ + int i, n, k, d, *tmp_drank; + double *xa, *xb, *drank; + mxLogical *isdom; + + /*--- Check number of input/output arguments --------------------*/ + + if (nrhs != 2) /* Check number of input arguments */ + mexErrMsgTxt ("Incorrect number of input arguments."); + + if (nlhs > 2) /* Check number of output arguments */ + mexErrMsgTxt ("Too many output arguments."); + + /*--- Check input types -----------------------------------------*/ + + if (! stk_is_realmatrix (ARGIN_A)) + mexErrMsgTxt ("The first input argument should be a " + "real-valued double-precision array."); + xa = mxGetPr (ARGIN_A); + + if (! stk_is_realmatrix (ARGIN_B)) + mexErrMsgTxt ("The second input argument should be a " + "real-valued double-precision array."); + xb = mxGetPr (ARGIN_B); + + /*--- Read dimensions -------------------------------------------*/ + + n = (int) mxGetM (ARGIN_A); + d = (int) mxGetN (ARGIN_A); + k = (int) mxGetM (ARGIN_B); + + if (d != mxGetN (ARGIN_B)) + mexErrMsgTxt ("The two input arguments should have the " + "same number of columns"); + + /*--- Create arrays ---------------------------------------------*/ + + ARGOUT_ISDOM = mxCreateLogicalMatrix (n, 1); + isdom = mxGetLogicals (ARGOUT_ISDOM); + + tmp_drank = (int *) mxCalloc (n, sizeof (int)); + + /*--- Find dominated rows ---------------------------------------*/ + + is_dominated (xa, xb, isdom, tmp_drank, n, k, d); + + if (nlhs > 1) { + ARGOUT_DRANK = mxCreateDoubleMatrix (n, 1, mxREAL); + drank = mxGetPr (ARGOUT_DRANK); + for (i = 0; i < n; i++) + drank[i] = (double) (1 + tmp_drank[i]); + } + + /*--- Cleanup --------------------------------------------------*/ + + mxFree (tmp_drank); +} diff --git a/src/stk_mex.h b/src/stk_mex.h new file mode 100644 index 0000000..101e04d --- /dev/null +++ b/src/stk_mex.h @@ -0,0 +1,117 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2012, 2013 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#ifndef ___STK_MEX_H___ +#define ___STK_MEX_H___ + +#include +#include "mex.h" + +#if (defined __STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# include +#else +# ifndef bool +# define bool int +# endif +# ifndef true +# define true 1 +# endif +# ifndef false +# define false 0 +# endif +#endif + +int stk_is_realmatrix(const mxArray* x) +{ + if (mxIsComplex(x) || !mxIsDouble(x)) + return 0; + + if (mxGetNumberOfDimensions(x) != 2) + return 0; + + return 1; +} + +int mxIsDoubleVector (const mxArray* x) +{ + size_t m, n; + + if (! stk_is_realmatrix (x)) + return 0; + + m = mxGetM (x); + n = mxGetN (x); + + return ((m == 1) && (n > 0)) || ((n == 1) && (m > 0)); +} + +void mxReplaceField +(mxArray* S, mwIndex index, const char* fieldname, const mxArray* value) +{ + mxArray *tmp, *value_copy; + + tmp = mxGetField(S, index, fieldname); + if (tmp != NULL) + mxDestroyArray(tmp); + + value_copy = mxDuplicateArray(value); + if (value_copy == NULL) + mexErrMsgTxt("mxDuplicateArray: not enough free heap " + "space to create the mxArray"); + + mxSetField(S, index, fieldname, value_copy); +} + +#define STK_OK 0 +#define STK_ERROR -1 +#define STK_ERROR_DOMAIN 1 +#define STK_ERROR_OOM 2 +#define STK_ERROR_SANITY 3 + +int mxReadScalar_int(const mxArray* x, int* n) +{ + double t; + + if (mxGetNumberOfElements(x) != 1) + return STK_ERROR; + + if (mxIsComplex(x) || !mxIsDouble(x)) + return STK_ERROR; + + t = mxGetScalar(x); + *n = (int) t; + + return ((((double) *n) == t) ? STK_OK : STK_ERROR); +} + +#endif diff --git a/src/stk_mindist_mex.c b/src/stk_mindist_mex.c new file mode 100644 index 0000000..b161179 --- /dev/null +++ b/src/stk_mindist_mex.c @@ -0,0 +1,106 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015 CentraleSupelec * + * Copyright (C) 2012 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + +#define X_IN prhs[0] /* input argument */ +#define H_OUT plhs[0] /* output argument */ + +static double compute_mindist(double* x, size_t nx, size_t dim) +{ + size_t i, j, k1, k2; + double diff, dist_squared, mindist_squared; + + mindist_squared = -1; + + for (i = 0; i < nx; i++) { + for (j = i+1; j < nx; j++) { + + /* compute distance between x[i,:] and x[j,:] */ + dist_squared = 0.0; + for (k1 = i, k2 = j; k1 < dim * nx; k1 += nx, k2 += nx) { + diff = x[k1] - x[k2]; + dist_squared += diff * diff; + } + + /* update mindist_squared */ + if ((dist_squared < mindist_squared) || (mindist_squared < 0)) + mindist_squared = dist_squared; + } + } + + return sqrt(mindist_squared); +} + + + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) +{ + size_t dim, mx; + + if (nlhs > 1) + mexErrMsgTxt("Too many output arguments."); + + if (nrhs != 1) + mexErrMsgTxt("Incorrect number of input arguments (should be 1)."); + + if (mxIsComplex(X_IN)) + mexErrMsgTxt("The input argument cannot be complex."); + + if (!mxIsDouble(X_IN)) + mexErrMsgTxt("The input argument must be of class 'double'."); + + /* Read the size of the input argument */ + mx = mxGetM(X_IN); + dim = mxGetN(X_IN); + + if (mx < 2) + { + /* return an empty matrix if the input has less than two lines */ + H_OUT = mxCreateDoubleMatrix(0, 0, mxREAL); + } + else + { + if (dim == 0) + { + /* return zero distance if the matrix has no columns */ + H_OUT = mxCreateDoubleScalar(0.0); + } + else + { + /* otherwise, do the actual computations in a subroutine */ + H_OUT = mxCreateDoubleScalar(compute_mindist(mxGetPr(X_IN), mx, dim)); + } + } + +} diff --git a/src/stk_paretofind_mex.c b/src/stk_paretofind_mex.c new file mode 100644 index 0000000..9cc8917 --- /dev/null +++ b/src/stk_paretofind_mex.c @@ -0,0 +1,91 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2014 SUPELEC * + * * + * Author: Julien Bect * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include "stk_mex.h" + +typedef double SCALAR; +typedef mxLogical LOGICAL; +#include "pareto.h" + +#define ARGIN_X prhs[0] +#define ARGOUT_NDPOS plhs[0] +#define ARGOUT_DRANK plhs[1] + +void mexFunction +( + int nlhs, mxArray *plhs[], + int nrhs, const mxArray *prhs[] +) +{ + int i, k, n, d, *tmp_ndpos, *tmp_drank; + double *x, *ndpos, *drank; + + if (nrhs != 1) /* Check number of input arguments */ + mexErrMsgTxt ("Incorrect number of input arguments."); + + if (nlhs > 3) /* Check number of output arguments */ + mexErrMsgTxt ("Too many output arguments."); + + if (! stk_is_realmatrix (ARGIN_X)) + mexErrMsgTxt ("The input should be a real-valued " + "double-precision array."); + + /* Read input argument */ + n = mxGetM (ARGIN_X); + d = mxGetN (ARGIN_X); + x = mxGetPr (ARGIN_X); + + /* Create a temporary arrays */ + tmp_ndpos = (int *) mxCalloc (n, sizeof (int)); + tmp_drank = (int *) mxCalloc (n, sizeof (int)); + + /* PRUNE */ + k = pareto_find (x, tmp_ndpos, tmp_drank, n, d); + + /* ARGOUT #1: position of non-dominated points, in lexical order */ + ARGOUT_NDPOS = mxCreateDoubleMatrix (k, 1, mxREAL); + ndpos = mxGetPr (ARGOUT_NDPOS); + for (i = 0; i < k; i++) + ndpos[i] = (double) (1 + tmp_ndpos[i]); + + /* ARGOUT #2: rank of first dominating point */ + if (nlhs > 1) { + ARGOUT_DRANK = mxCreateDoubleMatrix (n, 1, mxREAL); + drank = mxGetPr (ARGOUT_DRANK); + for (i = 0; i < n; i++) + drank[i] = (double) (1 + tmp_drank[i]); + } + + /* Cleanup */ + mxFree (tmp_ndpos); + mxFree (tmp_drank); +} diff --git a/src/stk_sampling_sobol_mex.c b/src/stk_sampling_sobol_mex.c new file mode 100644 index 0000000..903e650 --- /dev/null +++ b/src/stk_sampling_sobol_mex.c @@ -0,0 +1,1267 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2016 CentraleSupelec * + * * + * Author: Julien Bect * + * * + * The Sobol sequence implementation contained in this file is due to * + * Steven G. Johnson and was obtained from the NLopt toolbox, v2.4.2, * + * released under the MIT licence. The original copyright notice was * + * as follows: * + * * + * Copyright (c) 2007 Massachusetts Institute of Technology * + * * + * A copy of the original (MIT) licence is included below. * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include +#include +#include +#include "stk_mex.h" + +/* Sobol' low-discrepancy-sequence generation */ +typedef struct nlopt_soboldata_s *nlopt_sobol; +static nlopt_sobol nlopt_sobol_create (unsigned int sdim); +static void nlopt_sobol_destroy (nlopt_sobol s); +static void nlopt_sobol_skip (nlopt_sobol s, unsigned int n, double *x); +static int nlopt_sobol_gen (nlopt_sobol s, double *x); + + +/***************************************************************************** + * * + * MEX entry point (mexFunction) * + * * + * CALL: X = stk_sampling_sobol_mex (N, DIM, DO_SKIP) * + * * + ****************************************************************************/ + +#define N_IN prhs[0] +#define DIM_IN prhs[1] +#define DO_SKIP_IN prhs[2] +#define X_OUT plhs[0] + +void mexFunction +(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int n_, dim_, i; + unsigned int n, dim; + double *h; + nlopt_sobol s; + bool do_skip; + + n_ = 0; dim_ = 0; + + /*--- Read input arguments -----------------------------------------------*/ + + if (nrhs < 3) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:NotEnoughInputArgs", + "Not enough input arguments (exactly two required)."); + else if (nrhs > 3) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:TooManyInputArgs", + "Too many input arguments (exactly two required)."); + + if ((mxReadScalar_int (N_IN, &n_) != 0) || (n_ <= 0)) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", + "First argument (n) must be a strictly positive " + "scalar integer."); + + n = (unsigned int) n_; + + if (n > 4294967295U) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", + "This is a 32-bits implementation of the Sobol " + "sequence: it cannot generate more than 2^32 - 1" + "terms"); + + if ((mxReadScalar_int (DIM_IN, &dim_) != 0) || (dim_ <= 0)) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", + "Second argument (dim) must be a scrictly positive " + "scalar integer."); + + dim = (unsigned int) dim_; + + if (dim > 1111) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", + "This implementation is restricted to dim <= 1111."); + + if (! mxIsLogicalScalar (DO_SKIP_IN)) + mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", + "Third argument (do_skip) must be a logical scalar."); + + do_skip = mxIsLogicalScalarTrue (DO_SKIP_IN); + + /*--- Generate a segment of the Sobol sequence ---------------------------*/ + + X_OUT = mxCreateDoubleMatrix (dim, n, mxREAL); + h = mxGetPr (X_OUT); + + s = nlopt_sobol_create (dim); + if (do_skip) + nlopt_sobol_skip (s, n, h); + for (i = 0; i < n; i++, h += dim) + nlopt_sobol_gen (s, h); + nlopt_sobol_destroy (s); + +} + + + +/* Copyright (c) 2007 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Generation of Sobol sequences in up to 1111 dimensions, based on the + algorithms described in: + P. Bratley and B. L. Fox, Algorithm 659, ACM Trans. + Math. Soft. 14 (1), 88-100 (1988), + as modified by: + S. Joe and F. Y. Kuo, ACM Trans. Math. Soft 29 (1), 49-57 (2003). + + Note that the code below was written without even looking at the + Fortran code from the TOMS paper, which is only semi-free (being + under the restrictive ACM copyright terms). Then I went to the + Fortran code and took out the table of primitive polynomials and + starting direction #'s ... since this is just a table of numbers + generated by a deterministic algorithm, it is not copyrightable. + (Obviously, the format of these tables then necessitated some + slight modifications to the code.) + + For the test integral of Joe and Kuo (see the main() program + below), I get exactly the same results for integrals up to 1111 + dimensions compared to the table of published numbers (to the 5 + published significant digits). + + This is not to say that the authors above should not be credited for + their clear description of the algorithm (and their tabulation of + the critical numbers). Please cite them. Just that I needed + a free/open-source implementation. */ + +#if UINT_MAX == 4294967295U + typedef unsigned int uint32_t; +#elif ULONG_MAX == 4294967295U + typedef unsigned long uint32_t; +#else +# error No 32-bit unsigned integer type +#endif + +typedef struct nlopt_soboldata_s { + unsigned sdim; /* dimension of sequence being generated */ + uint32_t *mdata; /* array of length 32 * sdim */ + uint32_t *m[32]; /* more convenient pointers to mdata, of direction #s */ + uint32_t *x; /* previous x = x_n, array of length sdim */ + unsigned *b; /* position of fixed point in x[i] is after bit b[i] */ + uint32_t n; /* number of x's generated so far */ +} soboldata; + +/* Return position (0, 1, ...) of rightmost (least-significant) zero bit in n. + * + * This code uses a 32-bit version of algorithm to find the rightmost + * one bit in Knuth, _The Art of Computer Programming_, volume 4A + * (draft fascicle), section 7.1.3, "Bitwise tricks and + * techniques." + * + * Assumes n has a zero bit, i.e. n < 2^32 - 1. + * + */ +static unsigned rightzero32(uint32_t n) +{ +#if defined(__GNUC__) && \ + ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ > 3) + return __builtin_ctz(~n); /* gcc builtin for version >= 3.4 */ +#else + const uint32_t a = 0x05f66a47; /* magic number, found by brute force */ + static const unsigned decode[32] = {0,1,2,26,23,3,15,27,24,21,19,4,12,16, + 28,6,31,25,22,14,20,18,11,5,30,13,17, + 10,29,9,8,7}; + n = ~n; /* change to rightmost-one problem */ + n = a * (n & (-n)); /* store in n to make sure mult. is 32 bits */ + return decode[n >> 27]; +#endif +} + +/* generate the next term x_{n+1} in the Sobol sequence, as an array + x[sdim] of numbers in (0,1). Returns 1 on success, 0 on failure + (if too many #'s generated) */ +int nlopt_sobol_gen(soboldata *sd, double *x) +{ + unsigned c, b, i, sdim; + + if (sd->n == 4294967295U) return 0; /* n == 2^32 - 1 ... we would + need to switch to a 64-bit version + to generate more terms. */ + c = rightzero32(sd->n++); + sdim = sd->sdim; + for (i = 0; i < sdim; ++i) { + b = sd->b[i]; + if (b >= c) { + sd->x[i] ^= sd->m[c][i] << (b - c); + x[i] = ((double) (sd->x[i])) / (1U << (b+1)); + } + else { + sd->x[i] = (sd->x[i] << (c - b)) ^ sd->m[c][i]; + sd->b[i] = c; + x[i] = ((double) (sd->x[i])) / (1U << (c+1)); + } + } + return 1; +} + +/* Data on the primitive binary polynomials (a) and the corresponding + starting values m, for Sobol sequences in up to 1111 dimensions, + taken from: + P. Bratley and B. L. Fox, Algorithm 659, ACM Trans. + Math. Soft. 14 (1), 88-100 (1988), + as modified by: + S. Joe and F. Y. Kuo, ACM Trans. Math. Soft 29 (1), 49-57 (2003). */ + +#define MAXDIM 1111 +#define MAXDEG 12 + +/* successive primitive binary-coefficient polynomials p(z) + = a_0 + a_1 z + a_2 z^2 + ... a_31 z^31, where a_i is the + i-th bit of sobol_a[j] for the j-th polynomial. */ +static const uint32_t sobol_a[MAXDIM-1] = { + 3,7,11,13,19,25,37,59,47,61,55,41,67,97,91, + 109,103,115,131,193,137,145,143,241,157,185,167,229,171,213, + 191,253,203,211,239,247,285,369,299,301,333,351,355,357,361, + 391,397,425,451,463,487,501,529,539,545,557,563,601,607,617, + 623,631,637,647,661,675,677,687,695,701,719,721,731,757,761, + 787,789,799,803,817,827,847,859,865,875,877,883,895,901,911, + 949,953,967,971,973,981,985,995,1001,1019,1033,1051,1063, + 1069,1125,1135,1153,1163,1221,1239,1255,1267,1279,1293,1305, + 1315,1329,1341,1347,1367,1387,1413,1423,1431,1441,1479,1509, + 1527,1531,1555,1557,1573,1591,1603,1615,1627,1657,1663,1673, + 1717,1729,1747,1759,1789,1815,1821,1825,1849,1863,1869,1877, + 1881,1891,1917,1933,1939,1969,2011,2035,2041,2053,2071,2091, + 2093,2119,2147,2149,2161,2171,2189,2197,2207,2217,2225,2255, + 2257,2273,2279,2283,2293,2317,2323,2341,2345,2363,2365,2373, + 2377,2385,2395,2419,2421,2431,2435,2447,2475,2477,2489,2503, + 2521,2533,2551,2561,2567,2579,2581,2601,2633,2657,2669, + 2681,2687,2693,2705,2717,2727,2731,2739, + 2741,2773,2783,2793,2799,2801,2811,2819,2825,2833,2867,2879, + 2881,2891,2905,2911,2917,2927,2941,2951,2955,2963,2965,2991, + 2999,3005,3017,3035,3037,3047,3053,3083,3085,3097,3103,3159, + 3169,3179,3187,3205,3209,3223,3227,3229,3251,3263,3271,3277, + 3283,3285,3299,3305,3319,3331,3343,3357,3367,3373,3393,3399, + 3413,3417,3427,3439,3441,3475,3487,3497,3515,3517,3529,3543, + 3547,3553,3559,3573,3589,3613,3617,3623,3627,3635,3641,3655, + 3659,3669,3679,3697,3707,3709,3713,3731,3743,3747,3771,3791, + 3805,3827,3833,3851,3865,3889,3895,3933,3947,3949,3957,3971, + 3985,3991,3995,4007,4013,4021,4045,4051,4069,4073,4179,4201, + 4219,4221,4249,4305,4331,4359,4383,4387,4411,4431,4439,4449, + 4459,4485,4531,4569,4575,4621,4663,4669,4711,4723,4735,4793, + 4801,4811,4879,4893,4897,4921,4927,4941,4977,5017,5027,5033, + 5127,5169,5175,5199,5213,5223,5237,5287,5293,5331,5391,5405, + 5453,5523,5573,5591,5597,5611,5641,5703,5717,5721,5797,5821, + 5909,5913, + 5955,5957,6005,6025,6061,6067,6079,6081, + 6231,6237,6289,6295,6329,6383,6427,6453,6465,6501,6523,6539, + 6577,6589,6601,6607,6631,6683,6699,6707,6761,6795,6865,6881, + 6901,6923,6931,6943,6999,7057,7079,7103,7105,7123,7173,7185, + 7191,7207,7245,7303,7327,7333,7355,7365,7369,7375,7411,7431, + 7459,7491,7505,7515,7541,7557,7561,7701,7705,7727,7749,7761, + 7783,7795,7823,7907,7953,7963,7975,8049,8089,8123,8125,8137, + 8219,8231,8245,8275,8293,8303,8331,8333,8351,8357,8367,8379, + 8381,8387,8393,8417,8435,8461,8469,8489,8495,8507,8515,8551, + 8555,8569,8585,8599,8605,8639,8641,8647,8653,8671,8675,8689, + 8699,8729,8741,8759,8765,8771,8795,8797,8825,8831,8841,8855, + 8859,8883,8895,8909,8943,8951,8955,8965,8999,9003,9031,9045, + 9049,9071,9073,9085,9095,9101,9109,9123,9129,9137,9143,9147, + 9185,9197,9209,9227,9235,9247,9253,9257,9277,9297,9303,9313, + 9325,9343,9347,9371,9373,9397,9407,9409,9415,9419,9443,9481, + 9495,9501,9505,9517,9529,9555,9557,9571,9585,9591,9607,9611, + 9621,9625, + 9631,9647,9661,9669,9679,9687,9707,9731, + 9733,9745,9773,9791,9803,9811,9817,9833,9847,9851,9863,9875, + 9881,9905,9911,9917,9923,9963,9973,10003,10025,10043,10063, + 10071,10077,10091,10099,10105,10115,10129,10145,10169,10183, + 10187,10207,10223,10225,10247,10265,10271,10275,10289,10299, + 10301,10309,10343,10357,10373,10411,10413,10431,10445,10453, + 10463,10467,10473,10491,10505,10511,10513,10523,10539,10549, + 10559,10561,10571,10581,10615,10621,10625,10643,10655,10671, + 10679,10685,10691,10711,10739,10741,10755,10767,10781,10785, + 10803,10805,10829,10857,10863,10865,10875,10877,10917,10921, + 10929,10949,10967,10971,10987,10995,11009,11029,11043,11045, + 11055,11063,11075,11081,11117,11135,11141,11159,11163,11181, + 11187,11225,11237,11261,11279,11297,11307,11309,11327,11329, + 11341,11377,11403,11405,11413,11427,11439,11453,11461,11473, + 11479,11489,11495,11499,11533,11545,11561,11567,11575,11579, + 11589,11611,11623,11637,11657,11663,11687,11691,11701,11747, + 11761,11773,11783,11795,11797,11817,11849,11855,11867,11869, + 11873,11883,11919, + 11921,11927,11933,11947,11955,11961, + 11999,12027,12029,12037,12041,12049,12055,12095,12097,12107, + 12109,12121,12127,12133,12137,12181,12197,12207,12209,12239, + 12253,12263,12269,12277,12287,12295,12309,12313,12335,12361, + 12367,12391,12409,12415,12433,12449,12469,12479,12481,12499, + 12505,12517,12527,12549,12559,12597,12615,12621,12639,12643, + 12657,12667,12707,12713,12727,12741,12745,12763,12769,12779, + 12781,12787,12799,12809,12815,12829,12839,12857,12875,12883, + 12889,12901,12929,12947,12953,12959,12969,12983,12987,12995, + 13015,13019,13031,13063,13077,13103,13137,13149,13173,13207, + 13211,13227,13241,13249,13255,13269,13283,13285,13303,13307, + 13321,13339,13351,13377,13389,13407,13417,13431,13435,13447, + 13459,13465,13477,13501,13513,13531,13543,13561,13581,13599, + 13605,13617,13623,13637,13647,13661,13677,13683,13695,13725, + 13729,13753,13773,13781,13785,13795,13801,13807,13825,13835, + 13855,13861,13871,13883,13897,13905,13915,13939,13941,13969, + 13979,13981,13997,14027,14035,14037,14051,14063,14085,14095, + 14107,14113,14125,14137,14145, + 14151,14163,14193,14199,14219,14229, + 14233,14243,14277,14287,14289,14295,14301,14305,14323,14339, + 14341,14359,14365,14375,14387,14411,14425,14441,14449,14499, + 14513,14523,14537,14543,14561,14579,14585,14593,14599,14603, + 14611,14641,14671,14695,14701,14723,14725,14743,14753,14759, + 14765,14795,14797,14803,14831,14839,14845,14855,14889,14895, + 14909,14929,14941,14945,14951,14963,14965,14985,15033,15039, + 15053,15059,15061,15071,15077,15081,15099,15121,15147,15149, + 15157,15167,15187,15193,15203,15205,15215,15217,15223,15243, + 15257,15269,15273,15287,15291,15313,15335,15347,15359,15373, + 15379,15381,15391,15395,15397,15419,15439,15453,15469,15491, + 15503,15517,15527,15531,15545,15559,15593,15611,15613,15619, + 15639,15643,15649,15661,15667,15669,15681,15693,15717,15721, + 15741,15745,15765,15793,15799,15811,15825,15835,15847,15851, + 15865,15877,15881,15887,15899,15915,15935,15937,15955,15973, + 15977,16011,16035,16061,16069,16087,16093,16097,16121,16141, + 16153,16159,16165,16183,16189,16195,16197,16201,16209,16215, + 16225,16259,16265,16273,16299, + 16309,16355,16375,16381, +}; + +/* starting direction #'s m[i] = sobol_minit[i][j] for i=0..d of the + * degree-d primitive polynomial sobol_a[j]. */ +static const uint32_t sobol_minit[MAXDEG+1][MAXDIM-1] = { + /* [0][*] */ + { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, + /* [1][*] */ + { 0, + 1,3,1,3,1,3,3,1,3,1,3,1,3,1,1,3,1,3,1,3, + 1,3,3,1,1,1,3,1,3,1,3,3,1,3,1,1,1,3,1,3,1,1,1,3,3,1,3,3,1,1, + 3,3,1,3,3,3,1,3,1,3,1,1,3,3,1,1,1,1,3,1,1,3,1,1,1,3,3,1,3,3, + 1,3,3,3,1,3,3,3,1,3,3,1,3,3,3,1,3,1,3,1,1,3,3,1,3,3,1,1,1,3, + 3,1,3,3,1,3,1,1,3,3,3,1,1,1,3,1,1,3,1,1,3,3,1,3,1,3,3,3,3,1, + 1,1,3,3,1,1,3,1,1,1,1,1,1,3,1,3,1,1,1,3,1,3,1,3,3,3,1,1,3,3, + 1,3,1,3,1,1,3,1,3,1,3,1,3,1,1,1,3,3,1,3,3,1,3,1,1,1,3,1,3,1, + 1,3,1,1,3,3,1,1,3,3,3,1,3,3,3,1,3,1,3,1,1,1,3,1,1,1,3,1,1,1, + 1,1,3,3,3,1,1,1,1,3,3,3,1,3,3,1,1,1,1,3,1,1,3,1,3,3,1,1,3,3, + 1,1,1,1,3,1,3,3,1,3,3,1,1,1,3,3,3,1,3,3,1,3,3,1,3,1,3,3,3,1, + 3,1,1,3,1,3,1,1,1,3,3,3,1,1,3,1,3,1,1,1,1,1,1,3,1,1,3,1,3,3, + 1,1,1,1,3,1,3,1,3,1,1,1,1,3,3,1,1,1,1,1,3,3,3,1,1,3,3,3,3,3, + 1,3,3,1,3,3,3,3,1,1,1,1,1,1,3,1,1,3,1,1,1,3,1,1,1,3,3,3,1,3, + 1,1,3,3,3,1,3,3,1,3,1,3,3,1,3,3,3,1,1, + 3,3,1,3,1,3,1,1,1,3,3,3,3,1,3,1,1,3,1, + 3,1,1,1,3,1,3,1,3,1,3,3,3,3,3,3,3,3,1,3,3,3,3,3,1,3,1,3,3,3, + 1,3,1,3,1,3,3,1,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,3,3,1,1,3,3,1, + 1,1,3,3,1,1,3,3,3,3,1,1,3,1,3,3,1,3,3,1,1,1,3,3,3,1,1,3,3,3, + 3,3,1,1,1,3,1,3,3,1,3,3,3,3,1,1,3,1,1,3,1,3,1,3,1,3,3,1,1,3, + 3,1,3,3,1,3,3,1,1,3,1,3,3,1,1,3,1,3,1,3,1,1,3,3,1,1,1,3,3,1, + 3,1,1,3,3,1,1,3,1,3,1,1,1,1,1,3,1,1,1,1,3,1,3,1,1,3,3,1,1,3, + 1,3,1,3,3,3,1,3,3,3,1,1,3,3,3,1,1,1,1,3,1,3,1,3,1,1,3,3,1,1, + 1,3,3,1,3,1,3,1,1,1,1,1,1,3,1,3,3,1,3,3,3,1,3,1,1,3,3,1,1,3, + 3,1,1,1,3,1,3,3,1,1,3,1,1,3,1,3,1,1,1,3,3,3,3,1,1,3,3,1,1,1, + 1,3,1,1,3,3,3,1,1,3,3,1,3,3,1,1,3,3,3,3,3,3,3,1,3,3,1,3,1,3, + 1,1,3,3,1,1,1,3,1,3,3,1,3,3,1,3,1,1,3,3,3,1,1,1,3,1,1,1,3,3, + 3,1,3,3,1,3,1,1,3,3,3,1,3,3,1,1,1,3,1,3,3,3,3,3,3,3,3,1,3,3, + 1,3,1,1,3,3,3,1,3,3,3,3,3,1,3,3,3,1,1,1, + 3,3,1,3,3,1,3,1,3,1,3,1,3,3,3,3,3,3, + 1,1,3,1,3,1,1,1,1,1,3,1,1,1,3,1,3,1,1,3,3,3,1,3,1,3,1,1,3,1, + 3,3,1,3,1,3,3,1,3,3,1,3,3,3,3,3,3,1,3,1,1,3,3,3,1,1,3,3,3,3, + 3,3,3,1,3,3,3,3,1,3,1,3,3,3,1,3,1,3,1,1,1,3,3,1,3,1,1,3,3,1, + 3,1,1,1,1,3,1,3,1,1,3,1,3,1,3,3,3,3,3,3,1,3,3,3,3,1,3,3,1,3, + 3,3,3,3,1,1,1,1,3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,3,1,1,3,1,3,3, + 3,3,3,1,3,1,1,3,3,3,3,1,3,1,1,3,3,3,3,3,3,1,1,3,1,3,1,1,3,1, + 1,1,1,3,3,1,1,3,1,1,1,3,1,3,1,1,3,3,1,3,1,1,3,3,3,3,3,1,3,1, + 1,1,3,1,1,1,3,1,1,3,1,3,3,3,3,3,1,1,1,3,3,3,3,1,3,3,3,3,1,1, + 3,3,3,1,3,1,1,3,3,1,3,3,1,1,1,1,1,3,1,1,3,3,1,1,1,3,1,1,3,3, + 1,3,3,3,3,3,3,3,3,1,1,3,3,1,1,3,1,3,3,3,3,3,1}, + /* [2][*] */ + { 0,0, + 7,5,1,3,3,7,5,5,7,7,1,3,3,7,5,1,1,5,3,7, + 1,7,5,1,3,7,7,1,1,1,5,7,7,5,1,3,3,7,5,5,5,3,3,3,1,1,5,1,1,5, + 3,3,3,3,1,3,7,5,7,3,7,1,3,3,5,1,3,5,5,7,7,7,1,1,3,3,1,1,5,1, + 5,7,5,1,7,5,3,3,1,5,7,1,7,5,1,7,3,1,7,1,7,3,3,5,7,3,3,5,1,3, + 3,1,3,5,1,3,3,3,7,1,1,7,3,1,3,7,5,5,7,5,5,3,1,3,3,3,1,3,3,7, + 3,3,1,7,5,1,7,7,5,7,5,1,3,1,7,3,7,3,5,7,3,1,3,3,3,1,5,7,3,3, + 7,7,7,5,3,1,7,1,3,7,5,3,3,3,7,1,1,3,1,5,7,1,3,5,3,5,3,3,7,5, + 5,3,3,1,3,7,7,7,1,5,7,1,3,1,1,7,1,3,1,7,1,5,3,5,3,1,1,5,5,3, + 3,5,7,1,5,3,7,7,3,5,3,3,1,7,3,1,3,5,7,1,3,7,1,5,1,3,1,5,3,1, + 7,1,5,5,5,3,7,1,1,7,3,1,1,7,5,7,5,7,7,3,7,1,3,7,7,3,5,1,1,7, + 1,5,5,5,1,5,1,7,5,5,7,1,1,7,1,7,7,1,1,3,3,3,7,7,5,3,7,3,1,3, + 7,5,3,3,5,7,1,1,5,5,7,7,1,1,1,1,5,5,5,7,5,7,1,1,3,5,1,3,3,7, + 3,7,5,3,5,3,1,7,1,7,7,1,1,7,7,7,5,5,1,1,7,5,5,7,5,1,1,5,5,5, + 5,5,5,1,3,1,5,7,3,3,5,7,3,7,1,7,7,1,3, + 5,1,5,5,3,7,3,7,7,5,7,5,7,1,1,5,3,5,1, + 5,3,7,1,5,7,7,3,5,1,3,5,1,5,3,3,3,7,3,5,1,3,7,7,3,7,5,3,3,1, + 7,5,1,1,3,7,1,7,1,7,3,7,3,5,7,3,5,3,1,1,1,5,7,7,3,3,1,1,1,5, + 5,7,3,1,1,3,3,7,3,3,5,1,3,7,3,3,7,3,5,7,5,7,7,3,3,5,1,3,5,3, + 1,3,5,1,1,3,7,7,1,5,1,3,7,3,7,3,5,1,7,1,1,3,5,3,7,1,5,5,1,1, + 3,1,3,3,7,1,7,3,1,7,3,1,7,3,5,3,5,7,3,3,3,5,1,7,7,1,3,1,3,7, + 7,1,3,7,3,1,5,3,1,1,1,5,3,3,7,1,5,3,5,1,3,1,3,1,5,7,7,1,1,5, + 3,1,5,1,1,7,7,3,5,5,1,7,1,5,1,1,3,1,5,7,5,7,7,1,5,1,1,3,5,1, + 5,5,3,1,3,1,5,5,3,3,3,3,1,1,3,1,3,5,5,7,5,5,7,5,7,1,3,7,7,3, + 5,5,7,5,5,3,3,3,1,7,1,5,5,5,3,3,5,1,3,1,3,3,3,7,1,7,7,3,7,1, + 1,5,7,1,7,1,7,7,1,3,7,5,1,3,5,5,5,1,1,7,1,7,1,7,7,3,1,1,5,1, + 5,1,5,3,5,5,5,5,5,3,3,7,3,3,5,5,3,7,1,5,7,5,1,5,5,3,5,5,7,5, + 3,5,5,5,1,5,5,5,5,1,3,5,3,1,7,5,5,7,1,5,3,3,1,5,3,7,1,7,5,1, + 1,3,1,1,7,1,5,5,3,7,3,7,5,3,1,1,3,1,3,5, + 5,7,5,3,7,7,7,3,7,3,7,1,3,1,7,7,1,7, + 3,7,3,7,3,7,3,5,1,1,7,3,1,5,5,7,1,5,5,5,7,1,5,5,1,5,5,3,1,3, + 1,7,3,1,3,5,7,7,7,1,1,7,3,1,5,5,5,1,1,1,1,1,5,3,5,1,3,5,3,1, + 1,1,1,3,7,3,7,5,7,1,5,5,7,5,3,3,7,5,3,1,1,3,1,3,1,1,3,7,1,7, + 1,1,5,1,7,5,3,7,3,5,3,1,1,5,5,1,7,7,3,7,3,7,1,5,1,5,3,7,3,5, + 7,7,7,3,3,1,1,5,5,3,7,1,1,1,3,5,3,1,1,3,3,7,5,1,1,3,7,1,5,7, + 3,7,5,5,7,3,5,3,1,5,3,1,1,7,5,1,7,3,7,5,1,7,1,7,7,1,1,7,1,5, + 5,1,1,7,5,7,1,5,3,5,3,3,7,1,5,1,1,5,5,3,3,7,5,5,1,1,1,3,1,5, + 7,7,1,7,5,7,3,7,3,1,3,7,3,1,5,5,3,5,1,3,5,5,5,1,1,7,7,1,5,5, + 1,3,5,1,5,3,5,3,3,7,5,7,3,7,3,1,3,7,7,3,3,1,1,3,3,3,3,3,5,5, + 3,3,3,1,3,5,7,7,1,5,7,3,7,1,1,3,5,7,5,3,3,3}, + /* [3][*] */ + { 0,0,0,0, + 1,7,9,13,11,1,3,7,9,5,13,13,11,3,15,5,3, + 15,7,9,13,9,1,11,7,5,15,1,15,11,5,11,1,7,9,7,7,1,15,15,15,13, + 3,3,15,5,9,7,13,3,7,5,11,9,1,9,1,5,7,13,9,9,1,7,3,5,1,11,11, + 13,7,7,9,9,1,1,3,9,15,1,5,13,1,9,9,9,9,9,13,11,3,5,11,11,13, + 5,3,15,1,11,11,7,13,15,11,13,9,11,15,15,13,3,15,7,9,11,13,11, + 9,9,5,13,9,1,13,7,7,7,7,7,5,9,7,13,11,9,11,15,3,13,11,1,11,3, + 3,9,11,1,7,1,15,15,3,1,9,1,7,13,11,3,13,11,7,3,3,5,13,11,5, + 11,1,3,9,7,15,7,5,13,7,9,13,15,13,9,7,15,7,9,5,11,11,13,13,9, + 3,5,13,9,11,15,11,7,1,7,13,3,13,3,13,9,15,7,13,13,3,13,15,15, + 11,9,13,9,15,1,1,15,11,11,7,1,11,13,9,13,3,5,11,13,9,9,13,1, + 11,15,13,3,13,7,15,1,15,3,3,11,7,13,7,7,9,7,5,15,9,5,5,7,15, + 13,15,5,15,5,3,1,11,7,1,5,7,9,3,11,1,15,1,3,15,11,13,5,13,1, + 7,1,15,7,5,1,1,15,13,11,11,13,5,11,7,9,7,1,5,3,9,5,5,11,5,1, + 7,1,11,7,9,13,15,13,3,1,11,13,15,1,1,11,9,13,3,13,11,15,13,9, + 9,9,5,5,5,5,1,15,5,9, + 11,7,15,5,3,13,5,3,11,5,1,11,13,9,11, + 3,7,13,15,1,7,11,1,13,1,15,1,9,7,3,9,11,1,9,13,13,3,11,7,9,1, + 7,15,9,1,5,13,5,11,3,9,15,11,13,5,1,7,7,5,13,7,7,9,5,11,11,1, + 1,15,3,13,9,13,9,9,11,5,5,13,15,3,9,15,3,11,11,15,15,3,11,15, + 15,3,1,3,1,3,3,1,3,13,1,11,5,15,7,15,9,1,7,1,9,11,15,1,13,9, + 13,11,7,3,7,3,13,7,9,7,7,3,3,9,9,7,5,11,13,13,7,7,15,9,5,5,3, + 3,13,3,9,3,1,11,1,3,11,15,11,11,11,9,13,7,9,15,9,11,1,3,3,9, + 7,15,13,13,7,15,9,13,9,15,13,15,9,13,1,11,7,11,3,13,5,1,7,15, + 3,13,7,13,13,11,3,5,3,13,11,9,9,3,11,11,7,9,13,11,7,15,13,7, + 5,3,1,5,15,15,3,11,1,7,3,15,11,5,5,3,5,5,1,15,5,1,5,3,7,5,11, + 3,13,9,13,15,5,3,5,9,5,3,11,1,13,9,15,3,5,11,9,1,3,15,9,9,9, + 11,7,5,13,1,15,3,13,9,13,5,1,5,1,13,13,7,7,1,9,5,11,9,11,13, + 3,15,15,13,15,7,5,7,9,7,9,9,9,11,9,3,11,15,13,13,5,9,15,1,1, + 9,5,13,3,13,15,3,1,3,11,13,1,15,9,9,3,1,9,1,9,1,13,11,15,7, + 11,15,13,15,1,9,9,7, + 3,5,11,7,3,9,5,15,7,5,3,13,7,1,1,9, + 15,15,15,11,3,5,15,13,7,15,15,11,11,9,5,15,9,7,3,13,1,1,5,1, + 3,1,7,1,1,5,1,11,11,9,9,5,13,7,7,7,1,1,9,9,11,11,15,7,5,5,3, + 11,1,3,7,13,7,7,7,3,15,15,11,9,3,9,3,15,13,5,3,3,3,5,9,15,9, + 9,1,5,9,9,15,5,15,7,9,1,9,9,5,11,5,15,15,11,7,7,7,1,1,11,11, + 13,15,3,13,5,1,7,1,11,3,13,15,3,5,3,5,7,3,9,9,5,1,7,11,9,3,5, + 11,13,13,13,9,15,5,7,1,15,11,9,15,15,13,13,13,1,11,9,15,9,5, + 15,5,7,3,11,3,15,7,13,11,7,3,7,13,5,13,15,5,13,9,1,15,11,5,5, + 1,11,3,3,7,1,9,7,15,9,9,3,11,15,7,1,3,1,1,1,9,1,5,15,15,7,5, + 5,7,9,7,15,13,13,11,1,9,11,1,13,1,7,15,15,5,5,1,11,3,9,11,9, + 9,9,1,9,3,5,15,1,1,9,7,3,3,1,9,9,11,9,9,13,13,3,13,11,13,5,1, + 5,5,9,9,3,13,13,9,15,9,11,7,11,9,13,9,1,15,9,7,7,1,7,9,9,15, + 1,11,1,13,13,15,9,13,7,15,3,9,3,1,13,7,5,9,3,1,7,1,1,13,3,3, + 11,1,7,13,15,15,5,7,13,13,15,11,13,1,13,13,3,9,15,15,11,15,9, + 15,1,13,15,1,1,5, + 11,5,1,11,11,5,3,9,1,3,5,13,9,7,7,1, + 9,9,15,7,5,5,15,13,9,7,13,3,13,11,13,7,9,13,13,13,15,9,5,5,3, + 3,3,1,3,15}, + /* [4][*] */ + { 0,0,0,0,0,0, + 9,3,27,15,29,21,23,19,11,25,7,13,17,1, + 25,29,3,31,11,5,23,27,19,21,5,1,17,13,7,15,9,31,25,3,5,23,7, + 3,17,23,3,3,21,25,25,23,11,19,3,11,31,7,9,5,17,23,17,17,25, + 13,11,31,27,19,17,23,7,5,11,19,19,7,13,21,21,7,9,11,1,5,21, + 11,13,25,9,7,7,27,15,25,15,21,17,19,19,21,5,11,3,5,29,31,29, + 5,5,1,31,27,11,13,1,3,7,11,7,3,23,13,31,17,1,27,11,25,1,23, + 29,17,25,7,25,27,17,13,17,23,5,17,5,13,11,21,5,11,5,9,31,19, + 17,9,9,27,21,15,15,1,1,29,5,31,11,17,23,19,21,25,15,11,5,5,1, + 19,19,19,7,13,21,17,17,25,23,19,23,15,13,5,19,25,9,7,3,21,17, + 25,1,27,25,27,25,9,13,3,17,25,23,9,25,9,13,17,17,3,15,7,7,29, + 3,19,29,29,19,29,13,15,25,27,1,3,9,9,13,31,29,31,5,15,29,1, + 19,5,9,19,5,15,3,5,7,15,17,17,23,11,9,23,19,3,17,1,27,9,9,17, + 13,25,29,23,29,11,31,25,21,29,19,27,31,3,5,3,3,13,21,9,29,3, + 17,11,11,9,21,19,7,17,31,25,1,27,5,15,27,29,29,29,25,27,25,3, + 21,17,25,13,15,17,13,23,9,3,11,7,9,9,7,17,7,1, + 27,1,9,5,31,21,25,25,21,11,1,23,19,27, + 15,3,5,23,9,25,7,29,11,9,13,5,11,1,3,31,27,3,17,27,11,13,15, + 29,15,1,15,23,25,13,21,15,3,29,29,5,25,17,11,7,15,5,21,7,31, + 13,11,23,5,7,23,27,21,29,15,7,27,27,19,7,15,27,27,19,19,9,15, + 1,3,29,29,5,27,31,9,1,7,3,19,19,29,9,3,21,31,29,25,1,3,9,27, + 5,27,25,21,11,29,31,27,21,29,17,9,17,13,11,25,15,21,11,19,31, + 3,19,5,3,3,9,13,13,3,29,7,5,9,23,13,21,23,21,31,11,7,7,3,23, + 1,23,5,9,17,21,1,17,29,7,5,17,13,25,17,9,19,9,5,7,21,19,13,9, + 7,3,9,3,15,31,29,29,25,13,9,21,9,31,7,15,5,31,7,15,27,25,19, + 9,9,25,25,23,1,9,7,11,15,19,15,27,17,11,11,31,13,25,25,9,7, + 13,29,19,5,19,31,25,13,25,15,5,9,29,31,9,29,27,25,27,11,17,5, + 17,3,23,15,9,9,17,17,31,11,19,25,13,23,15,25,21,31,19,3,11, + 25,7,15,19,7,5,3,13,13,1,23,5,25,11,25,15,13,21,11,23,29,5, + 17,27,9,19,15,5,29,23,19,1,27,3,23,21,19,27,11,17,13,27,11, + 31,23,5,9,21,31,29,11,21,17,15,7,15,7,9,21,27,25, + 29,11,3,21,13,23,19,27,17,29,25,17,9, + 1,19,23,5,23,1,17,17,13,27,23,7,7,11,13,17,13,11,21,13,23,1, + 27,13,9,7,1,27,29,5,13,25,21,3,31,15,13,3,19,13,1,27,15,17,1, + 3,13,13,13,31,29,27,7,7,21,29,15,17,17,21,19,17,3,15,5,27,27, + 3,31,31,7,21,3,13,11,17,27,25,1,9,7,29,27,21,23,13,25,29,15, + 17,29,9,15,3,21,15,17,17,31,9,9,23,19,25,3,1,11,27,29,1,31, + 29,25,29,1,23,29,25,13,3,31,25,5,5,11,3,21,9,23,7,11,23,11,1, + 1,3,23,25,23,1,23,3,27,9,27,3,23,25,19,29,29,13,27,5,9,29,29, + 13,17,3,23,19,7,13,3,19,23,5,29,29,13,13,5,19,5,17,9,11,11, + 29,27,23,19,17,25,13,1,13,3,11,1,17,29,1,13,17,9,17,21,1,11, + 1,1,25,5,7,29,29,19,19,1,29,13,3,1,31,15,13,3,1,11,19,5,29, + 13,29,23,3,1,31,13,19,17,5,5,1,29,23,3,19,25,19,27,9,27,13, + 15,29,23,13,25,25,17,19,17,15,27,3,25,17,27,3,27,31,23,13,31, + 11,15,7,21,19,27,19,21,29,7,31,13,9,9,7,21,13,11,9,11,29,19, + 11,19,21,5,29,13,7,19,19,27,23,31,1,27,21,7,3,7,11, + 23,13,29,11,31,19,1,5,5,11,5,3,27,5, + 7,11,31,1,27,31,31,23,5,21,27,9,25,3,15,19,1,19,9,5,25,21,15, + 25,29,15,21,11,19,15,3,7,13,11,25,17,1,5,31,13,29,23,9,5,29, + 7,17,27,7,17,31,9,31,9,9,7,21,3,3,3,9,11,21,11,31,9,25,5,1, + 31,13,29,9,29,1,11,19,7,27,13,31,7,31,7,25,23,21,29,11,11,13, + 11,27,1,23,31,21,23,21,19,31,5,31,25,25,19,17,11,25,7,13,1, + 29,17,23,15,7,29,17,13,3,17}, + /* [5][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0, + 37,33,7,5,11,39,63,59,17,15,23,29,3,21, + 13,31,25,9,49,33,19,29,11,19,27,15,25,63,55,17,63,49,19,41, + 59,3,57,33,49,53,57,57,39,21,7,53,9,55,15,59,19,49,31,3,39,5, + 5,41,9,19,9,57,25,1,15,51,11,19,61,53,29,19,11,9,21,19,43,13, + 13,41,25,31,9,11,19,5,53,37,7,51,45,7,7,61,23,45,7,59,41,1, + 29,61,37,27,47,15,31,35,31,17,51,13,25,45,5,5,33,39,5,47,29, + 35,47,63,45,37,47,59,21,59,33,51,9,27,13,25,43,3,17,21,59,61, + 27,47,57,11,17,39,1,63,21,59,17,13,31,3,31,7,9,27,37,23,31,9, + 45,43,31,63,21,39,51,27,7,53,11,1,59,39,23,49,23,7,55,59,3, + 19,35,13,9,13,15,23,9,7,43,55,3,19,9,27,33,27,49,23,47,19,7, + 11,55,27,35,5,5,55,35,37,9,33,29,47,25,11,47,53,61,59,3,53, + 47,5,19,59,5,47,23,45,53,3,49,61,47,39,29,17,57,5,17,31,23, + 41,39,5,27,7,29,29,33,31,41,31,29,17,29,29,9,9,31,27,53,35,5, + 61,1,49,13,57,29,5,21,43,25,57,49,37,27,11,61,37,49,5,63,63, + 3,45,37,63,21,21,19,27,59,21,45,23,13,15,3,43,63,39,19, + 63,31,41,41,15,43,63,53,1,63,31,7,17, + 11,61,31,51,37,29,59,25,63,59,47,15,27,19,29,45,35,55,39,19, + 43,21,19,13,17,51,37,5,33,35,49,25,45,1,63,47,9,63,15,25,25, + 15,41,13,3,19,51,49,37,25,49,13,53,47,23,35,29,33,21,35,23,3, + 43,31,63,9,1,61,43,3,11,55,11,35,1,63,35,49,19,45,9,57,51,1, + 47,41,9,11,37,19,55,23,55,55,13,7,47,37,11,43,17,3,25,19,55, + 59,37,33,43,1,5,21,5,63,49,61,21,51,15,19,43,47,17,9,53,45, + 11,51,25,11,25,47,47,1,43,29,17,31,15,59,27,63,11,41,51,29,7, + 27,63,31,43,3,29,39,3,59,59,1,53,63,23,63,47,51,23,61,39,47, + 21,39,15,3,9,57,61,39,37,21,51,1,23,43,27,25,11,13,21,43,7, + 11,33,55,1,37,35,27,61,39,5,19,61,61,57,59,21,59,61,57,25,55, + 27,31,41,33,63,19,57,35,13,63,35,17,11,11,49,41,55,5,45,17, + 35,5,31,31,37,17,45,51,1,39,49,55,19,41,13,5,51,5,49,1,21,13, + 17,59,51,11,3,61,1,33,37,33,61,25,27,59,7,49,13,63,3,33,3,15, + 9,13,35,39,11,59,59,1,57,11,5,57,13,31,13,11,55,45,9,55,55, + 19,25,41,23,45,29,63,59,27,39,21,37,7, + 61,49,35,39,9,29,7,25,23,57,5,19,15,33,49,37,25,17,45,29,15, + 25,3,3,49,11,39,15,19,57,39,15,11,3,57,31,55,61,19,5,41,35, + 59,61,39,41,53,53,63,31,9,59,13,35,55,41,49,5,41,25,27,43,5, + 5,43,5,5,17,5,15,27,29,17,9,3,55,31,1,45,45,13,57,17,3,61,15, + 49,15,47,9,37,45,9,51,61,21,33,11,21,63,63,47,57,61,49,9,59, + 19,29,21,23,55,23,43,41,57,9,39,27,41,35,61,29,57,63,21,31, + 59,35,49,3,49,47,49,33,21,19,21,35,11,17,37,23,59,13,37,35, + 55,57,1,29,45,11,1,15,9,33,19,53,43,39,23,7,13,13,1,19,41,55, + 1,13,15,59,55,15,3,57,37,31,17,1,3,21,29,25,55,9,37,33,53,41, + 51,19,57,13,63,43,19,7,13,37,33,19,15,63,51,11,49,23,57,47, + 51,15,53,41,1,15,37,61,11,35,29,33,23,55,11,59,19,61,61,45, + 13,49,13,63,5,61,5,31,17,61,63,13,27,57,1,21,5,11,39,57,51, + 53,39,25,41,39,37,23,31,25,33,17,57,29,27,23,47,41,29,19,47, + 41,25,5,51,43,39,29,7,31,45,51,49,55,17,43,49,45,9,29,3,5,47, + 9,15,19, + 51,45,57,63,9,21,59,3,9,13,45,23,15, + 31,21,15,51,35,9,11,61,23,53,29,51,45,31,29,5,35,29,53,35,17, + 59,55,27,51,59,27,47,15,29,37,7,49,55,5,19,45,29,19,57,33,53, + 45,21,9,3,35,29,43,31,39,3,45,1,41,29,5,59,41,33,35,27,19,13, + 25,27,43,33,35,17,17,23,7,35,15,61,61,53,5,15,23,11,13,43,55, + 47,25,43,15,57,45,1,49,63,57,15,31,31,7,53,27,15,47,23,7,29, + 53,47,9,53,3,25,55,45,63,21,17,23,31,27,27,43,63,55,63,45,51, + 15,27,5,37,43,11,27,5,27,59,21,7,39,27,63,35,47,55,17,17,17, + 3,19,21,13,49,61,39,15}, + /* [6][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 13,33,115,41,79,17,29,119,75,73,105,7, + 59,65,21,3,113,61,89,45,107,21,71,79,19,71,61,41,57,121,87, + 119,55,85,121,119,11,23,61,11,35,33,43,107,113,101,29,87,119, + 97,29,17,89,5,127,89,119,117,103,105,41,83,25,41,55,69,117, + 49,127,29,1,99,53,83,15,31,73,115,35,21,89,5,1,91,53,35,95, + 83,19,85,55,51,101,33,41,55,45,95,61,27,37,89,75,57,61,15, + 117,15,21,27,25,27,123,39,109,93,51,21,91,109,107,45,15,93, + 127,3,53,81,79,107,79,87,35,109,73,35,83,107,1,51,7,59,33, + 115,43,111,45,121,105,125,87,101,41,95,75,1,57,117,21,27,67, + 29,53,117,63,1,77,89,115,49,127,15,79,81,29,65,103,33,73,79, + 29,21,113,31,33,107,95,111,59,99,117,63,63,99,39,9,35,63,125, + 99,45,93,33,93,9,105,75,51,115,11,37,17,41,21,43,73,19,93,7, + 95,81,93,79,81,55,9,51,63,45,89,73,19,115,39,47,81,39,5,5,45, + 53,65,49,17,105,13,107,5,5,19,73,59,43,83,97,115,27,1,69,103, + 3,99,103,63,67,25,121,97,77,13,83,103,41,11,27,81,37,33,125, + 71,41,41,59,41,87,123, + 43,101,63,45,39,21,97,15,97,111,21,49, + 13,17,79,91,65,105,75,1,45,67,83,107,125,87,15,81,95,105,65, + 45,59,103,23,103,99,67,99,47,117,71,89,35,53,73,9,115,49,37, + 1,35,9,45,81,19,127,17,17,105,89,49,101,7,37,33,11,95,95,17, + 111,105,41,115,5,69,101,27,27,101,103,53,9,21,43,79,91,65, + 117,87,125,55,45,63,85,83,97,45,83,87,113,93,95,5,17,77,77, + 127,123,45,81,85,121,119,27,85,41,49,15,107,21,51,119,11,87, + 101,115,63,63,37,121,109,7,43,69,19,77,49,71,59,35,7,13,55, + 101,127,103,85,109,29,61,67,21,111,67,23,57,75,71,101,123,41, + 107,101,107,125,27,47,119,41,19,127,33,31,109,7,91,91,39,125, + 105,47,125,123,91,9,103,45,23,117,9,125,73,11,37,61,79,21,5, + 47,117,67,53,85,33,81,121,47,61,51,127,29,65,45,41,95,57,73, + 33,117,61,111,59,123,65,47,105,23,29,107,37,81,67,29,115,119, + 75,73,99,103,7,57,45,61,95,49,101,101,35,47,119,39,67,31,103, + 7,61,127,87,3,35,29,73,95,103,71,75,51,87,57,97,11,105,87,41, + 73,109,69,35,121,39,111,1,77, + 39,47,53,91,3,17,51,83,39,125,85,111, + 21,69,85,29,55,11,117,1,47,17,65,63,47,117,17,115,51,25,33, + 123,123,83,51,113,95,121,51,91,109,43,55,35,55,87,33,37,5,3, + 45,21,105,127,35,17,35,37,97,97,21,77,123,17,89,53,105,75,25, + 125,13,47,21,125,23,55,63,61,5,17,93,57,121,69,73,93,121,105, + 75,91,67,95,75,9,69,97,99,93,11,53,19,73,5,33,79,107,65,69, + 79,125,25,93,55,61,17,117,69,97,87,111,37,93,59,79,95,53,115, + 53,85,85,65,59,23,75,21,67,27,99,79,27,3,95,27,69,19,75,47, + 59,41,85,77,99,55,49,93,93,119,51,125,63,13,15,45,61,19,105, + 115,17,83,7,7,11,61,37,63,89,95,119,113,67,123,91,33,37,99, + 43,11,33,65,81,79,81,107,63,63,55,89,91,25,93,101,27,55,75, + 121,79,43,125,73,27,109,35,21,71,113,89,59,95,41,45,113,119, + 113,39,59,73,15,13,59,67,121,27,7,105,15,59,59,35,91,89,23, + 125,97,53,41,91,111,29,31,3,103,61,71,35,7,119,29,45,49,111, + 41,109,59,125,13,27,19,79,9,75,83,81,33,91,109,33,29,107,111, + 101,107,109,65,59,43,37, + 1,9,15,109,37,111,113,119,79,73,65, + 71,93,17,101,87,97,43,23,75,109,41,49,53,31,97,105,109,119, + 51,9,53,113,97,73,89,79,49,61,105,13,99,53,71,7,87,21,101,5, + 71,31,123,121,121,73,79,115,13,39,101,19,37,51,83,97,55,81, + 91,127,105,89,63,47,49,75,37,77,15,49,107,23,23,35,19,69,17, + 59,63,73,29,125,61,65,95,101,81,57,69,83,37,11,37,95,1,73,27, + 29,57,7,65,83,99,69,19,103,43,95,25,19,103,41,125,97,71,105, + 83,83,61,39,9,45,117,63,31,5,117,67,125,41,117,43,77,97,15, + 29,5,59,25,63,87,39,39,77,85,37,81,73,89,29,125,109,21,23, + 119,105,43,93,97,15,125,29,51,69,37,45,31,75,109,119,53,5, + 101,125,121,35,29,7,63,17,63,13,69,15,105,51,127,105,9,57,95, + 59,109,35,49,23,33,107,55,33,57,79,73,69,59,107,55,11,63,95, + 103,23,125,91,31,91,51,65,61,75,69,107,65,101,59,35,15}, + /* [7][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7,23,39,217,141,27,53,181,169,35,15, + 207,45,247,185,117,41,81,223,151,81,189,61,95,185,23,73,113, + 239,85,9,201,83,53,183,203,91,149,101,13,111,239,3,205,253, + 247,121,189,169,179,197,175,217,249,195,95,63,19,7,5,75,217, + 245,111,189,165,169,141,221,249,159,253,207,249,219,23,49, + 127,237,5,25,177,37,103,65,167,81,87,119,45,79,143,57,79,187, + 143,183,75,97,211,149,175,37,135,189,225,241,63,33,43,13,73, + 213,57,239,183,117,21,29,115,43,205,223,15,3,159,51,101,127, + 99,239,171,113,171,119,189,245,201,27,185,229,105,153,189,33, + 35,137,77,97,17,181,55,197,201,155,37,197,137,223,25,179,91, + 23,235,53,253,49,181,249,53,173,97,247,67,115,103,159,239,69, + 173,217,95,221,247,97,91,123,223,213,129,181,87,239,85,89, + 249,141,39,57,249,71,101,159,33,137,189,71,253,205,171,13, + 249,109,131,199,189,179,31,99,113,41,173,23,189,197,3,135,9, + 95,195,27,183,1,123,73,53,99,197,59,27,101,55,193,31,61,119, + 11,7,255,233,53,157,193,97,83,65,81,239,167,69,71,109, + 97,137,71,193,189,115,79,205,37,227, + 53,33,91,229,245,105,77,229,161,103,93,13,161,229,223,69,15, + 25,23,233,93,25,217,247,61,75,27,9,223,213,55,197,145,89,199, + 41,201,5,149,35,119,183,53,11,13,3,179,229,43,55,187,233,47, + 133,91,47,71,93,105,145,45,255,221,115,175,19,129,5,209,197, + 57,177,115,187,119,77,211,111,33,113,23,87,137,41,7,83,43, + 121,145,5,219,27,11,111,207,55,97,63,229,53,33,149,23,187, + 153,91,193,183,59,211,93,139,59,179,163,209,77,39,111,79,229, + 85,237,199,137,147,25,73,121,129,83,87,93,205,167,53,107,229, + 213,95,219,109,175,13,209,97,61,147,19,13,123,73,35,141,81, + 19,171,255,111,107,233,113,133,89,9,231,95,69,33,1,253,219, + 253,247,129,11,251,221,153,35,103,239,7,27,235,181,5,207,53, + 149,155,225,165,137,155,201,97,245,203,47,39,35,105,239,49, + 15,253,7,237,213,55,87,199,27,175,49,41,229,85,3,149,179,129, + 185,249,197,15,97,197,139,203,63,33,251,217,199,199,99,249, + 33,229,177,13,209,147,97,31,125,177,137, + 187,11,91,223,29,169,231,59,31,163,41, + 57,87,247,25,127,101,207,187,73,61,105,27,91,171,243,33,3,1, + 21,229,93,71,61,37,183,65,211,53,11,151,165,47,5,129,79,101, + 147,169,181,19,95,77,139,197,219,97,239,183,143,9,13,209,23, + 215,53,137,203,19,151,171,133,219,231,3,15,253,225,33,111, + 183,213,169,119,111,15,201,123,121,225,113,113,225,161,165,1, + 139,55,3,93,217,193,97,29,69,231,161,93,69,143,137,9,87,183, + 113,183,73,215,137,89,251,163,41,227,145,57,81,57,11,135,145, + 161,175,159,25,55,167,157,211,97,247,249,23,129,159,71,197, + 127,141,219,5,233,131,217,101,131,33,157,173,69,207,239,81, + 205,11,41,169,65,193,77,201,173,1,221,157,1,15,113,147,137, + 205,225,73,45,49,149,113,253,99,17,119,105,117,129,243,75, + 203,53,29,247,35,247,171,31,199,213,29,251,7,251,187,91,11, + 149,13,205,37,249,137,139,9,7,113,183,205,187,39,3,79,155, + 227,89,185,51,127,63,83,41,133,183,181,127,19,255,219,59,251, + 3,187,57,217,115,217,229,181,185,149,83,115,11, + 123,19,109,165,103,123,219,129,155, + 207,177,9,49,181,231,33,233,67,155,41,9,95,123,65,117,249,85, + 169,129,241,173,251,225,147,165,69,81,239,95,23,83,227,249, + 143,171,193,9,21,57,73,97,57,29,239,151,159,191,47,51,1,223, + 251,251,151,41,119,127,131,33,209,123,53,241,25,31,183,107, + 25,115,39,11,213,239,219,109,185,35,133,123,185,27,55,245,61, + 75,205,213,169,163,63,55,49,83,195,51,31,41,15,203,41,63,127, + 161,5,143,7,199,251,95,75,101,15,43,237,197,117,167,155,21, + 83,205,255,49,101,213,237,135,135,21,73,93,115,7,85,223,237, + 79,89,5,57,239,67,65,201,155,71,85,195,89,181,119,135,147, + 237,173,41,155,67,113,111,21,183,23,103,207,253,69,219,205, + 195,43,197,229,139,177,129,69,97,201,163,189,11,99,91,253, + 239,91,145,19,179,231,121,7,225,237,125,191,119,59,175,237, + 131,79,43,45,205,199,251,153,207,37,179,113,255,107,217,61,7, + 181,247,31,13,113,145,107,233,233,43,79,23,169,137,129,183, + 53,91,55,103,223,87,177,157,79,213,139, + 183,231,205,143,129,243,205,93,59, + 15,89,9,11,47,133,227,75,9,91,19,171,163,79,7,103,5,119,155, + 75,11,71,95,17,13,243,207,187}, + /* [8][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 235,307,495,417,57,151,19,119,375,451, + 55,449,501,53,185,317,17,21,487,13,347,393,15,391,307,189, + 381,71,163,99,467,167,433,337,257,179,47,385,23,117,369,425, + 207,433,301,147,333,85,221,423,49,3,43,229,227,201,383,281, + 229,207,21,343,251,397,173,507,421,443,399,53,345,77,385,317, + 155,187,269,501,19,169,235,415,61,247,183,5,257,401,451,95, + 455,49,489,75,459,377,87,463,155,233,115,429,211,419,143,487, + 195,209,461,193,157,193,363,181,271,445,381,231,135,327,403, + 171,197,181,343,113,313,393,311,415,267,247,425,233,289,55, + 39,247,327,141,5,189,183,27,337,341,327,87,429,357,265,251, + 437,201,29,339,257,377,17,53,327,47,375,393,369,403,125,429, + 257,157,217,85,267,117,337,447,219,501,41,41,193,509,131,207, + 505,421,149,111,177,167,223,291,91,29,305,151,177,337,183, + 361,435,307,507,77,181,507,315,145,423,71,103,493,271,469, + 339,237,437,483,31,219,61,131,391,233,219,69,57,459,225,421, + 7,461,111,451,277,185,193,125,251,199,73,71,7,409,417,149, + 193,53,437,29,467,229,31,35,75,105, + 503,75,317,401,367,131,365,441,433,93,377,405,465,259,283, + 443,143,445,3,461,329,309,77,323,155,347,45,381,315,463,207, + 321,157,109,479,313,345,167,439,307,235,473,79,101,245,19, + 381,251,35,25,107,187,115,113,321,115,445,61,77,293,405,13, + 53,17,171,299,41,79,3,485,331,13,257,59,201,497,81,451,199, + 171,81,253,365,75,451,149,483,81,453,469,485,305,163,401,15, + 91,3,129,35,239,355,211,387,101,299,67,375,405,357,267,363, + 79,83,437,457,39,97,473,289,179,57,23,49,79,71,341,287,95, + 229,271,475,49,241,261,495,353,381,13,291,37,251,105,399,81, + 89,265,507,205,145,331,129,119,503,249,1,289,463,163,443,63, + 123,361,261,49,429,137,355,175,507,59,277,391,25,185,381,197, + 39,5,429,119,247,177,329,465,421,271,467,151,45,429,137,471, + 11,17,409,347,199,463,177,11,51,361,95,497,163,351,127,395, + 511,327,353,49,105,151,321,331,329,509,107,109,303,467,287, + 161,45,385,289,363,331,265,407,37,433,315,343,63,51,185,71, + 27,267, + 503,239,293,245,281,297,75,461,371, + 129,189,189,339,287,111,111,379,93,27,185,347,337,247,507, + 161,231,43,499,73,327,263,331,249,493,37,25,115,3,167,197, + 127,357,497,103,125,191,165,55,101,95,79,351,341,43,125,135, + 173,289,373,133,421,241,281,213,177,363,151,227,145,363,239, + 431,81,397,241,67,291,255,405,421,399,75,399,105,329,41,425, + 7,283,375,475,427,277,209,411,3,137,195,289,509,121,55,147, + 275,251,19,129,285,415,487,491,193,219,403,23,97,65,285,75, + 21,373,261,339,239,495,415,333,107,435,297,213,149,463,199, + 323,45,19,301,121,499,187,229,63,425,99,281,35,125,349,87, + 101,59,195,511,355,73,263,243,101,165,141,11,389,219,187,449, + 447,393,477,305,221,51,355,209,499,479,265,377,145,411,173, + 11,433,483,135,385,341,89,209,391,33,395,319,451,119,341,227, + 375,61,331,493,411,293,47,203,375,167,395,155,5,237,361,489, + 127,21,345,101,371,233,431,109,119,277,125,263,73,135,123,83, + 123,405,69,75,287,401,23,283,393,41,379,431,11,475,505,19, + 365,265,271, + 499,489,443,165,91,83,291,319,199, + 107,245,389,143,137,89,125,281,381,215,131,299,249,375,455, + 43,73,281,217,297,229,431,357,81,357,171,451,481,13,387,491, + 489,439,385,487,177,393,33,71,375,443,129,407,395,127,65,333, + 309,119,197,435,497,373,71,379,509,387,159,265,477,463,449, + 47,353,249,335,505,89,141,55,235,187,87,363,93,363,101,67, + 215,321,331,305,261,411,491,479,65,307,469,415,131,315,487, + 83,455,19,113,163,503,99,499,251,239,81,167,391,255,317,363, + 359,395,419,307,251,267,171,461,183,465,165,163,293,477,223, + 403,389,97,335,357,297,19,469,501,249,85,213,311,265,379,297, + 283,393,449,463,289,159,289,499,407,129,137,221,43,89,403, + 271,75,83,445,453,389,149,143,423,499,317,445,157,137,453, + 163,87,23,391,119,427,323,173,89,259,377,511,249,31,363,229, + 353,329,493,427,57,205,389,91,83,13,219,439,45,35,371,441,17, + 267,501,53,25,333,17,201,475,257,417,345,381,377,55,403,77, + 389,347,363,211,413,419,5,167,219,201,285,425,11,77,269,489, + 281,403,79, + 425,125,81,331,437,271,397,299,475, + 271,249,413,233,261,495,171,69,27,409,21,421,367,81,483,255, + 15,219,365,497,181,75,431,99,325,407,229,281,63,83,493,5,113, + 15,271,37,87,451,299,83,451,311,441,47,455,47,253,13,109,369, + 347,11,409,275,63,441,15}, + /* [9][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,519,307,931,1023,517,771,151,1023, + 539,725,45,927,707,29,125,371,275,279,817,389,453,989,1015, + 29,169,743,99,923,981,181,693,309,227,111,219,897,377,425, + 609,227,19,221,143,581,147,919,127,725,793,289,411,835,921, + 957,443,349,813,5,105,457,393,539,101,197,697,27,343,515,69, + 485,383,855,693,133,87,743,747,475,87,469,763,721,345,479, + 965,527,121,271,353,467,177,245,627,113,357,7,691,725,355, + 889,635,737,429,545,925,357,873,187,351,677,999,921,477,233, + 765,495,81,953,479,89,173,473,131,961,411,291,967,65,511,13, + 805,945,369,827,295,163,835,259,207,331,29,315,999,133,967, + 41,117,677,471,717,881,755,351,723,259,879,455,721,289,149, + 199,805,987,851,423,597,129,11,733,549,153,285,451,559,377, + 109,357,143,693,615,677,701,475,767,85,229,509,547,151,389, + 711,785,657,319,509,99,1007,775,359,697,677,85,497,105,615, + 891,71,449,835,609,377,693,665,627,215,911,503,729,131,19, + 895,199,161,239,633,1013,537,255,23,149,679,1021,595,199,557, + 659,251,829,727,439,495,647,223, + 949,625,87,481,85,799,917,769,949, + 739,115,499,945,547,225,1015,469,737,495,353,103,17,665,639, + 525,75,447,185,43,729,577,863,735,317,99,17,477,893,537,519, + 1017,375,297,325,999,353,343,729,135,489,859,267,141,831,141, + 893,249,807,53,613,131,547,977,131,999,175,31,341,739,467, + 675,241,645,247,391,583,183,973,433,367,131,467,571,309,385, + 977,111,917,935,473,345,411,313,97,149,959,841,839,669,431, + 51,41,301,247,1015,377,329,945,269,67,979,581,643,823,557,91, + 405,117,801,509,347,893,303,227,783,555,867,99,703,111,797, + 873,541,919,513,343,319,517,135,871,917,285,663,301,15,763, + 89,323,757,317,807,309,1013,345,499,279,711,915,411,281,193, + 739,365,315,375,809,469,487,621,857,975,537,939,585,129,625, + 447,129,1017,133,83,3,415,661,53,115,903,49,79,55,385,261, + 345,297,199,385,617,25,515,275,849,401,471,377,661,535,505, + 939,465,225,929,219,955,659,441,117,527,427,515,287,191,33, + 389,197,825,63,417,949,35,571,9,131,609,439,95,19,569,893, + 451,397,971,801, + 125,471,187,257,67,949,621,453,411, + 621,955,309,783,893,597,377,753,145,637,941,593,317,555,375, + 575,175,403,571,555,109,377,931,499,649,653,329,279,271,647, + 721,665,429,957,803,767,425,477,995,105,495,575,687,385,227, + 923,563,723,481,717,111,633,113,369,955,253,321,409,909,367, + 33,967,453,863,449,539,781,911,113,7,219,725,1015,971,1021, + 525,785,873,191,893,297,507,215,21,153,645,913,755,371,881, + 113,903,225,49,587,201,927,429,599,513,97,319,331,833,325, + 887,139,927,399,163,307,803,169,1019,869,537,907,479,335,697, + 479,353,769,787,1023,855,493,883,521,735,297,1011,991,879, + 855,591,415,917,375,453,553,189,841,339,211,601,57,765,745, + 621,209,875,639,7,595,971,263,1009,201,23,77,621,33,535,963, + 661,523,263,917,103,623,231,47,301,549,337,675,189,357,1005, + 789,189,319,721,1005,525,675,539,191,813,917,51,167,415,579, + 755,605,721,837,529,31,327,799,961,279,409,847,649,241,285, + 545,407,161,591,73,313,811,17,663,269,261,37,783,127,917,231, + 577,975,793, + 921,343,751,139,221,79,817,393,545, + 11,781,71,1,699,767,917,9,107,341,587,903,965,599,507,843, + 739,579,397,397,325,775,565,925,75,55,979,931,93,957,857,753, + 965,795,67,5,87,909,97,995,271,875,671,613,33,351,69,811,669, + 729,401,647,241,435,447,721,271,745,53,775,99,343,451,427, + 593,339,845,243,345,17,573,421,517,971,499,435,769,75,203, + 793,985,343,955,735,523,659,703,303,421,951,405,631,825,735, + 433,841,485,49,749,107,669,211,497,143,99,57,277,969,107,397, + 563,551,447,381,187,57,405,731,769,923,955,915,737,595,341, + 253,823,197,321,315,181,885,497,159,571,981,899,785,947,217, + 217,135,753,623,565,717,903,581,955,621,361,869,87,943,907, + 853,353,335,197,771,433,743,195,91,1023,63,301,647,205,485, + 927,1003,987,359,577,147,141,1017,701,273,89,589,487,859,343, + 91,847,341,173,287,1003,289,639,983,685,697,35,701,645,911, + 501,705,873,763,745,657,559,699,315,347,429,197,165,955,859, + 167,303,833,531,473,635,641,195,589,821,205,3,635,371,891, + 249,123, + 77,623,993,401,525,427,71,655,951, + 357,851,899,535,493,323,1003,343,515,859,1017,5,423,315,1011, + 703,41,777,163,95,831,79,975,235,633,723,297,589,317,679,981, + 195,399,1003,121,501,155}, + /* [10][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,7,2011,1001,49,825,415,1441,383,1581, + 623,1621,1319,1387,619,839,217,75,1955,505,281,1629,1379,53, + 1111,1399,301,209,49,155,1647,631,129,1569,335,67,1955,1611, + 2021,1305,121,37,877,835,1457,669,1405,935,1735,665,551,789, + 1543,1267,1027,1,1911,163,1929,67,1975,1681,1413,191,1711, + 1307,401,725,1229,1403,1609,2035,917,921,1789,41,2003,187,67, + 1635,717,1449,277,1903,1179,363,1211,1231,647,1261,1029,1485, + 1309,1149,317,1335,171,243,271,1055,1601,1129,1653,205,1463, + 1681,1621,197,951,573,1697,1265,1321,1805,1235,1853,1307,945, + 1197,1411,833,273,1517,1747,1095,1345,869,57,1383,221,1713, + 335,1751,1141,839,523,1861,1105,389,1177,1877,805,93,1591, + 423,1835,99,1781,1515,1909,1011,303,385,1635,357,973,1781, + 1707,1363,1053,649,1469,623,1429,1241,1151,1055,503,921,3, + 349,1149,293,45,303,877,1565,1583,1001,663,1535,395,1141, + 1481,1797,643,1507,465,2027,1695,367,937,719,545,1991,83,819, + 239,1791,1461,1647,1501,1161,1629,139,1595,1921,1267,1415, + 509,347,777,1083,363,269,1015, + 1809,1105,1429,1471,2019,381,2025, + 1223,827,1733,887,1321,803,1951,1297,1995,833,1107,1135,1181, + 1251,983,1389,1565,273,137,71,735,1005,933,67,1471,551,457, + 1667,1729,919,285,1629,1815,653,1919,1039,531,393,1411,359, + 221,699,1485,471,1357,1715,595,1677,153,1903,1281,215,781, + 543,293,1807,965,1695,443,1985,321,879,1227,1915,839,1945, + 1993,1165,51,557,723,1491,817,1237,947,1215,1911,1225,1965, + 1889,1503,1177,73,1767,303,177,1897,1401,321,921,217,1779, + 327,1889,333,615,1665,1825,1639,237,1205,361,129,1655,983, + 1089,1171,401,677,643,749,303,1407,1873,1579,1491,1393,1247, + 789,763,49,5,1607,1891,735,1557,1909,1765,1777,1127,813,695, + 97,731,1503,1751,333,769,865,693,377,1919,957,1359,1627,1039, + 1783,1065,1665,1917,1947,991,1997,841,459,221,327,1595,1881, + 1269,1007,129,1413,475,1105,791,1983,1359,503,691,659,691, + 343,1375,1919,263,1373,603,1383,297,781,145,285,767,1739, + 1715,715,317,1333,85,831,1615,81,1667,1467,1457,1453,1825, + 109,387,1207,2039,213,1351,1329,1173, + 57,1769,951,183,23,451,1155,1551, + 2037,811,635,1671,1451,863,1499,1673,363,1029,1077,1525,277, + 1023,655,665,1869,1255,965,277,1601,329,1603,1901,395,65, + 1307,2029,21,1321,543,1569,1185,1905,1701,413,2041,1697,725, + 1417,1847,411,211,915,1891,17,1877,1699,687,1089,1973,1809, + 851,1495,1257,63,1323,1307,609,881,1543,177,617,1505,1747, + 1537,925,183,77,1723,1877,1703,397,459,521,257,1177,389,1947, + 1553,1583,1831,261,485,289,1281,1543,1591,1123,573,821,1065, + 1933,1373,2005,905,207,173,1573,1597,573,1883,1795,1499,1743, + 553,335,333,1645,791,871,1157,969,557,141,223,1129,1685,423, + 1069,391,99,95,1847,531,1859,1833,1833,341,237,1997,1799,409, + 431,1917,363,335,1039,1085,1657,1975,1527,1111,659,389,899, + 595,1439,1861,1979,1569,1087,1009,165,1895,1481,1583,29,1193, + 1673,1075,301,1081,1377,1747,1497,1103,1789,887,739,1577,313, + 1367,1299,1801,1131,1837,73,1865,1065,843,635,55,1655,913, + 1037,223,1871,1161,461,479,511,1721,1107,389,151,35,375,1099, + 937,1185,1701,769,639,1633, + 1609,379,1613,2031,685,289,975,671, + 1599,1447,871,647,99,139,1427,959,89,117,841,891,1959,223, + 1697,1145,499,1435,1809,1413,1445,1675,171,1073,1349,1545, + 2039,1027,1563,859,215,1673,1919,1633,779,411,1845,1477,1489, + 447,1545,351,1989,495,183,1639,1385,1805,1097,1249,1431,1571, + 591,697,1509,709,31,1563,165,513,1425,1299,1081,145,1841, + 1211,941,609,845,1169,1865,1593,347,293,1277,157,211,93,1679, + 1799,527,41,473,563,187,1525,575,1579,857,703,1211,647,709, + 981,285,697,163,981,153,1515,47,1553,599,225,1147,381,135, + 821,1965,609,1033,983,503,1117,327,453,2005,1257,343,1649, + 1199,599,1877,569,695,1587,1475,187,973,233,511,51,1083,665, + 1321,531,1875,1939,859,1507,1979,1203,1965,737,921,1565,1943, + 819,223,365,167,1705,413,1577,745,1573,655,1633,1003,91,1123, + 477,1741,1663,35,715,37,1513,815,941,1379,263,1831,1735,1111, + 1449,353,1941,1655,1349,877,285,1723,125,1753,985,723,175, + 439,791,1051,1261,717,1555,1757,1777,577,1583,1957,873,331, + 1163,313,1,1963,963,1905,821, + 1677,185,709,545,1723,215,1885, + 1249,583,1803,839,885,485,413,1767,425,129,1035,329,1263, + 1881,1779,1565,359,367,453,707,1419,831,1889,887,1871,1869, + 747,223,1547,1799,433,1441,553,2021,1303,1505,1735,1619,1065, + 1161,2047,347,867,881,1447,329,781,1065,219,589,645,1257, + 1833,749,1841,1733,1179,1191,1025,1639,1955,1423,1685,1711, + 493,549,783,1653,397,895,233,759,1505,677,1449,1573,1297, + 1821,1691,791,289,1187,867,1535,575,183}, + /* [11][*] */ + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3915,97,3047,937,2897,953,127,1201, + 3819,193,2053,3061,3759,1553,2007,2493,603,3343,3751,1059, + 783,1789,1589,283,1093,3919,2747,277,2605,2169,2905,721,4069, + 233,261,1137,3993,3619,2881,1275,3865,1299,3757,1193,733,993, + 1153,2945,3163,3179,437,271,3493,3971,1005,2615,2253,1131, + 585,2775,2171,2383,2937,2447,1745,663,1515,3767,2709,1767, + 3185,3017,2815,1829,87,3341,793,2627,2169,1875,3745,367,3783, + 783,827,3253,2639,2955,3539,1579,2109,379,2939,3019,1999, + 2253,2911,3733,481,1767,1055,4019,4085,105,1829,2097,2379, + 1567,2713,737,3423,3941,2659,3961,1755,3613,1937,1559,2287, + 2743,67,2859,325,2601,1149,3259,2403,3947,2011,175,3389,3915, + 1315,2447,141,359,3609,3933,729,2051,1755,2149,2107,1741, + 1051,3681,471,1055,845,257,1559,1061,2803,2219,1315,1369, + 3211,4027,105,11,1077,2857,337,3553,3503,3917,2665,3823,3403, + 3711,2085,1103,1641,701,4095,2883,1435,653,2363,1597,767,869, + 1825,1117,1297,501,505,149,873,2673,551,1499,2793,3277,2143, + 3663,533,3991,575,1877,1009,3929,473,3009,2595,3249,675,3593, + 2453,1567,973,595,1335,1715,589,85, + 2265,3069,461,1659,2627,1307,1731,1501,1699,3545,3803,2157, + 453,2813,2047,2999,3841,2361,1079,573,69,1363,1597,3427,2899, + 2771,1327,1117,1523,3521,2393,2537,1979,3179,683,2453,453, + 1227,779,671,3483,2135,3139,3381,3945,57,1541,3405,3381,2371, + 2879,1985,987,3017,3031,3839,1401,3749,2977,681,1175,1519, + 3355,907,117,771,3741,3337,1743,1227,3335,2755,1909,3603, + 2397,653,87,2025,2617,3257,287,3051,3809,897,2215,63,2043, + 1757,3671,297,3131,1305,293,3865,3173,3397,2269,3673,717, + 3041,3341,3595,3819,2871,3973,1129,513,871,1485,3977,2473, + 1171,1143,3063,3547,2183,3993,133,2529,2699,233,2355,231, + 3241,611,1309,3829,1839,1495,301,1169,1613,2673,243,3601, + 3669,2813,2671,2679,3463,2477,1795,617,2317,1855,1057,1703, + 1761,2515,801,1205,1311,473,3963,697,1221,251,381,3887,1761, + 3093,3721,2079,4085,379,3601,3845,433,1781,29,1897,1599,2163, + 75,3475,3957,1641,3911,2959,2833,1279,1099,403,799,2183,2699, + 1711,2037,727,289,1785,1575,3633,2367,1261,3953,1735,171, + 1959, + 2867,859,2951,3211,15,1279,1323,599, + 1651,3951,1011,315,3513,3351,1725,3793,2399,287,4017,3571, + 1007,541,3115,429,1585,1285,755,1211,3047,915,3611,2697,2129, + 3669,81,3939,2437,915,779,3567,3701,2479,3807,1893,3927,2619, + 2543,3633,2007,3857,3837,487,1769,3759,3105,2727,3155,2479, + 1341,1657,2767,2541,577,2105,799,17,2871,3637,953,65,69,2897, + 3841,3559,4067,2335,3409,1087,425,2813,1705,1701,1237,821, + 1375,3673,2693,3925,1541,1871,2285,847,4035,1101,2029,855, + 2733,2503,121,2855,1069,3463,3505,1539,607,1349,575,2301, + 2321,1101,333,291,2171,4085,2173,2541,1195,925,4039,1379,699, + 1979,275,953,1755,1643,325,101,2263,3329,3673,3413,1977,2727, + 2313,1419,887,609,2475,591,2613,2081,3805,3435,2409,111,3557, + 3607,903,231,3059,473,2959,2925,3861,2043,3887,351,2865,369, + 1377,2639,1261,3625,3279,2201,2949,3049,449,1297,897,1891, + 411,2773,749,2753,1825,853,2775,3547,3923,3923,987,3723,2189, + 3877,3577,297,2763,1845,3083,2951,483,2169,3985,245,3655, + 3441,1023,235,835,3693,3585,327,1003,543,3059,2637, + 2923,87,3617,1031,1043,903,2913, + 2177,2641,3279,389,2009,525,4085,3299,987,2409,813,2683,373, + 2695,3775,2375,1119,2791,223,325,587,1379,2877,2867,3793,655, + 831,3425,1663,1681,2657,1865,3943,2977,1979,2271,3247,1267, + 1747,811,159,429,2001,1195,3065,553,1499,3529,1081,2877,3077, + 845,1793,2409,3995,2559,4081,1195,2955,1117,1409,785,287, + 1521,1607,85,3055,3123,2533,2329,3477,799,3683,3715,337,3139, + 3311,431,3511,2299,365,2941,3067,1331,1081,1097,2853,2299, + 495,1745,749,3819,619,1059,3559,183,3743,723,949,3501,733, + 2599,3983,3961,911,1899,985,2493,1795,653,157,433,2361,3093, + 3119,3679,2367,1701,1445,1321,2397,1241,3305,3985,2349,4067, + 3805,3073,2837,1567,3783,451,2441,1181,487,543,1201,3735, + 2517,733,1535,2175,3613,3019}, + /* [12][*] */ + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2319,653,1379,1675,1951,7075,2087, + 7147,1427,893,171,2019,7235,5697,3615,1961,7517,6849,2893, + 1883,2863,2173,4543,73,381,3893,6045,1643,7669,1027,1549, + 3983,1985,6589,7497,2745,2375,7047,1117,1171,1975,5199,3915, + 3695,8113,4303,3773,7705,6855,1675,2245,2817,1719,569,1021, + 2077,5945,1833,2631,4851,6371,833,7987,331,1899,8093,6719, + 6903,5903,5657,5007,2689,6637,2675,1645,1819,689,6709,7717, + 6295,7013,7695,3705,7069,2621,3631,6571,6259,7261,3397,7645, + 1115,4753,2047,7579,2271,5403,4911,7629,4225,1209,6955,6951, + 1829,5579,5231,1783,4285,7425,599,5785,3275,5643,2263,657, + 6769,6261,1251,3249,4447,4111,3991,1215,131,4397,3487,7585, + 5565,7199,3573,7105,7409,1671,949,3889,5971,3333,225,3647, + 5403,3409,7459,6879,5789,6567,5581,4919,1927,4407,8085,4691, + 611,3005,591,753,589,171,5729,5891,1033,3049,6567,5257,8003, + 1757,4489,4923,6379,5171,1757,689,3081,1389,4113,455,2761, + 847,7575,5829,633,6629,1103,7635,803,6175,6587,2711,3879,67, + 1179,4761,7281,1557,3379,2459,4273,4127,7147,35, + 3549,395,3735,5787,4179,5889,5057, + 7473,4713,2133,2897,1841,2125,1029,1695,6523,1143,5105,7133, + 3351,2775,3971,4503,7589,5155,4305,1641,4717,2427,5617,1267, + 399,5831,4305,4241,3395,3045,4899,1713,171,411,7099,5473, + 5209,1195,1077,1309,2953,7343,4887,3229,6759,6721,6775,675, + 4039,2493,7511,3269,4199,6625,7943,2013,4145,667,513,2303, + 4591,7941,2741,987,8061,3161,5951,1431,831,5559,7405,1357, + 4319,4235,5421,2559,4415,2439,823,1725,6219,4903,6699,5451, + 349,7703,2927,7809,6179,1417,5987,3017,4983,3479,4525,4643, + 4911,227,5475,2287,5581,6817,1937,1421,4415,7977,1789,3907, + 6815,6789,6003,5609,4507,337,7427,7943,3075,6427,1019,7121, + 4763,81,3587,2929,1795,8067,2415,1265,4025,5599,4771,3025, + 2313,6129,7611,6881,5253,4413,7869,105,3173,1629,2537,1023, + 4409,7209,4413,7107,7469,33,1955,2881,5167,6451,4211,179, + 5573,7879,3387,7759,5455,7157,1891,5683,5689,6535,3109,6555, + 6873,1249,4251,6437,49,2745,1201,7327,4179,6783,623,2779, + 5963,2585,6927,5333,4033,285,7467,4443,4917,3, + 4319,5517,3449,813,5499,2515,5771, + 3357,2073,4395,4925,2643,7215,5817,1199,1597,1619,7535,4833, + 609,4797,8171,6847,793,6757,8165,3371,2431,5235,4739,7703, + 7223,6525,5891,5605,4433,3533,5267,5125,5037,225,6717,1121, + 5741,2013,4327,4839,569,5227,7677,4315,2391,5551,859,3627, + 6377,3903,4311,6527,7573,4905,7731,1909,1555,3279,1949,1887, + 6675,5509,2033,5473,3539,5033,5935,6095,4761,1771,1271,1717, + 4415,5083,6277,3147,7695,2461,4783,4539,5833,5583,651,1419, + 2605,5511,3913,5795,2333,2329,4431,3725,6069,2699,7055,6879, + 1017,3121,2547,4603,2385,6915,6103,5669,7833,2001,4287,6619, + 955,2761,5711,6291,3415,3909,2841,5627,4939,7671,6059,6275, + 6517,1931,4583,7301,1267,7509,1435,2169,6939,3515,2985,2787, + 2123,1969,3307,353,4359,7059,5273,5873,6657,6765,6229,3179, + 1583,6237,2155,371,273,7491,3309,6805,3015,6831,7819,713, + 4747,3935,4109,1311,709,3089,7059,4247,2989,1509,4919,1841, + 3045,3821,6929,4655,1333,6429,6649,2131,5265,1051,261,8057, + 3379,2179,1993,5655,3063,6381, + 3587,7417,1579,1541,2107,5085,2873, + 6141,955,3537,2157,841,1999,1465,5171,5651,1535,7235,4349, + 1263,1453,1005,6893,2919,1947,1635,3963,397,969,4569,655, + 6737,2995,7235,7713,973,4821,2377,1673,1,6541} +}; + +static int sobol_init(soboldata *sd, unsigned sdim) +{ + unsigned i,j; + + if (!sdim || sdim > MAXDIM) return 0; + + sd->mdata = (uint32_t *) malloc(sizeof(uint32_t) * (sdim * 32)); + if (!sd->mdata) return 0; + + for (j = 0; j < 32; ++j) { + sd->m[j] = sd->mdata + j * sdim; + sd->m[j][0] = 1; /* special-case Sobol sequence */ + } + for (i = 1; i < sdim; ++i) { + uint32_t a = sobol_a[i-1]; + unsigned d = 0, k; + + while (a) { + ++d; + a >>= 1; + } + d--; /* d is now degree of poly */ + + /* set initial values of m from table */ + for (j = 0; j < d; ++j) + sd->m[j][i] = sobol_minit[j][i-1]; + + /* fill in remaining values using recurrence */ + for (j = d; j < 32; ++j) { + a = sobol_a[i-1]; + sd->m[j][i] = sd->m[j - d][i]; + for (k = 0; k < d; ++k) { + sd->m[j][i] ^= ((a & 1) * sd->m[j-d+k][i]) << (d-k); + a >>= 1; + } + } + } + + sd->x = (uint32_t *) malloc(sizeof(uint32_t) * sdim); + if (!sd->x) { free(sd->mdata); return 0; } + + sd->b = (unsigned *) malloc(sizeof(unsigned) * sdim); + if (!sd->b) { free(sd->x); free(sd->mdata); return 0; } + + for (i = 0; i < sdim; ++i) { + sd->x[i] = 0; + sd->b[i] = 0; + } + + sd->n = 0; + sd->sdim = sdim; + + return 1; +} + +static void sobol_destroy(soboldata *sd) +{ + free(sd->mdata); + free(sd->x); + free(sd->b); +} + +/************************************************************************/ +/* NLopt API to Sobol sequence creation, which hides soboldata structure + behind an opaque pointer */ + +nlopt_sobol nlopt_sobol_create(unsigned sdim) +{ + nlopt_sobol s = (nlopt_sobol) malloc(sizeof(soboldata)); + if (!s) return NULL; + if (!sobol_init(s, sdim)) { free(s); return NULL; } + return s; +} + +extern void nlopt_sobol_destroy(nlopt_sobol s) +{ + if (s) { + sobol_destroy(s); + free(s); + } +} + +/* if we know in advance how many points (n) we want to compute, then + adopt the suggestion of the Joe and Kuo paper, which in turn + is taken from Acworth et al (1998), of skipping a number of + points equal to the largest power of 2 smaller than n */ +void nlopt_sobol_skip(nlopt_sobol s, unsigned n, double *x) +{ + if (s) { + unsigned k = 1; + while (k*2 < n) k *= 2; + while (k-- > 0) nlopt_sobol_gen(s, x); + } +} diff --git a/src/stk_sampling_vdc_rr2.c b/src/stk_sampling_vdc_rr2.c new file mode 100644 index 0000000..99a393d --- /dev/null +++ b/src/stk_sampling_vdc_rr2.c @@ -0,0 +1,372 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2013 Alexandra Krauth, Elham Rahali & SUPELEC * + * * + * Authors: Julien Bect * + * Alexandra Krauth * + * Elham Rahali * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#include +#include +#include +#include "stk_mex.h" +#include "primes.h" + + +/***************************************************************************** + * * + * Subfunctions * + * * + ****************************************************************************/ + +int vanDerCorput_RR2(unsigned int b, unsigned int n, double *h); +int compute_nb_digits(unsigned int n, unsigned int b); +double radical_inverse(int *digits, unsigned int nb_digits, unsigned int b); +int next_Mersenne_number(unsigned int b); +int construct_permutRR(unsigned int b, int* permut); +int construct_permutRR_Mersenne(unsigned int b, int* permut); + + +/***************************************************************************** + * * + * MEX entry point (mexFunction) * + * * + * STK_SAMPLING_VDC_RR2 computes the first N terms of the J^th * + * RR2-scrambled van der Corput sequence * + * * + * CALL: X = stk_sampling_vdc_rr2(N, J) * + * * + * Reference: Ladislav Kocis and William J. Whiten (1997) * + * Computational investigations of lowdiscrepancy sequences. * + * ACM Transactions on Mathematical Software, 23(2):266-294. * + * * + ****************************************************************************/ + +#define N_IN prhs[0] +#define J_IN prhs[1] +#define X_OUT plhs[0] + +void mexFunction +(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + int n_, j_, r; + unsigned int n, j; + double *h; + mxArray* xdata; + + n_ = 0; j_ = 0; + + /*--- Read input arguments -----------------------------------------------*/ + + if(nrhs != 2) + mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:nrhs", "Two inputs required."); + + if ((mxReadScalar_int(N_IN, &n_) != 0) || (n_ <= 0)) + mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:IncorrectArgument", + "First argument (n) must be a strictly positive " + "scalar integer."); + + n = (unsigned int) n_; + + if ((mxReadScalar_int(J_IN, &j_) != 0) || (j_ <= 0)) + mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:IncorrectArgument", + "Second argument (j) must be a scrictly positive " + "scalar integer."); + + j = (unsigned int) j_; + + if (j > PRIMES_TABLE_SIZE) + mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:IncorrectArgument", + "Second argument (d) must be smaller than %d.", + PRIMES_TABLE_SIZE); + + /*--- Do the actual computations in a subroutine -------------------------*/ + + xdata = mxCreateDoubleMatrix(n, 1, mxREAL); + h = mxGetPr(xdata); + + if ((r = vanDerCorput_RR2(primes_table[j - 1], n, h)) != STK_OK) + mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:Sanity", + "vanDerCorput_RR2() failed with error code %d.", r); + + /*--- Create output dataframe --------------------------------------------*/ + + if ((r = mexCallMATLAB(1, &X_OUT, 1, &xdata, "stk_dataframe")) != 0) + mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:Sanity", + "mexCallMATLAB() failed with error code %d.", r); + +} + + +/***************************************************************************** + * * + * void vanDerCorput_RR2(unsigned int b, unsigned int N, double *result) * + * * + * Compute N terms of the RR2-scrambled van der Corput sequence in base b. * + * * + ****************************************************************************/ + +int vanDerCorput_RR2 +(unsigned int b, unsigned int N, double *result) +{ + int i, j, c, nb_digits_max, nb_digits, quotient; + int *permut, *digits, *s_digits; + + /*--- Check input arguments ----------------------------------------------*/ + + if (N == 0) + return STK_OK; /* we successfully did... nothing... */ + + if (b == 0) /* 0 is not a prime */ + return STK_ERROR_DOMAIN; + + /*--- Allocate temporary arrays ------------------------------------------*/ + + /* Create arrays to store base-b representations + (note: N is the biggest integer that we'll have to represent) */ + if ((nb_digits_max = compute_nb_digits(N, b)) == -1) + return STK_ERROR_SANITY; + if ((digits = (int*) mxCalloc(nb_digits_max, sizeof(int))) == NULL) + return STK_ERROR_OOM; + if ((s_digits = (int*) mxCalloc(nb_digits_max, sizeof(int))) == NULL) + return STK_ERROR_OOM; + + /* Create the permutation array */ + if ((permut = (int*) mxCalloc(b, sizeof(int))) == NULL) + return STK_ERROR_OOM; + construct_permutRR(b, permut); + + /*--- Compute N terms in the base-b of the sequence ----------------------*/ + + nb_digits = 1; /* number of digits required to represent 1 in base b */ + c = b; /* number of iterations before we increment nb_digits */ + + /* note: the first term is always zero, that's why we start at i = 1 */ + + for (i = 1; i < N; i++) + { + + if ((--c) == 0) /* we need to increase the number of digits */ + { + nb_digits++; + c = i * (b - 1); + } + + /* Compute the representation of i in base b + (no need to fill with zeros at the end) */ + quotient = i; + j = 0; + while (quotient > 0) + { + digits[j] = quotient % b; + quotient = quotient / b; + j++; + } + + /* Scramble the digits */ + for(j = 0; j < nb_digits; j++) + s_digits[j] = permut[digits[j]]; + + /* Compute the i^th term using the radical inverse function */ + result[i] = radical_inverse(s_digits, nb_digits, b); + + } + + /*--- Free temporary arrays ----------------------------------------------*/ + + mxFree(digits); + mxFree(s_digits); + mxFree(permut); + + return STK_OK; +} + + +/***************************************************************************** + * * + * void construct_permutRR(unsigned int b, int* pi_b) * + * * + * Compute N terms of the RR2-scrambled van der Corput sequence in base b. * + * * + ****************************************************************************/ + +int construct_permutRR +(unsigned int b, int* pi_b) +{ + int i, j, b_max, *pi_b_max; + + /* Find the smallest number of the form 2^k - 1 (Mersenne number) that is + greater than or equal to b. This number is not necessarily prime. */ + + b_max = next_Mersenne_number(b); + + /* Create an auxiliary permutation of {0, 1, ..., b_max - 1} */ + + if ((pi_b_max = mxCalloc(b_max, sizeof(int))) == NULL) + return STK_ERROR_OOM; + + construct_permutRR_Mersenne(b_max, pi_b_max); + + /* Trim pi_b_max to get pi_b (note: the first element is always 0) */ + + j = 1; + for (i = 1; i < b; i++) + { + while (pi_b_max[j] > (b - 1)) + j++; + pi_b[i] = pi_b_max[j++]; + } + + mxFree(pi_b_max); + + return STK_OK; +} + + +/***************************************************************************** + * * + * int construct_permutRR_Mersenne(unsigned int b, int *permut) * + * * + * Construct the "reverse radix" permutation in the case where b is a * + * Mersenne number. * + * * + * Note: careful, we do not actually check that b is a Mersenne number * + * * + ****************************************************************************/ + +int construct_permutRR_Mersenne +(unsigned int b, int *permut) +{ + int i, j, direct, reversed, digits; + + if ((digits = compute_nb_digits(b - 1, 2)) == -1) + return STK_ERROR_SANITY; + + permut[0] = 0; + + for (i = 1; i < b; i++) + { + direct = i; + reversed = 0; + for(j = 0; j < digits; j++) + { + reversed <<= 1; + reversed += (direct & 01); + direct >>= 1; + } + permut[i] = reversed; + } + + return STK_OK; +} + + +/***************************************************************************** + * * + * int compute_nb_digits(unsigned int n, unsigned int b) * + * * + * Compute the number of digits required to represent n in base b. * + * * + ****************************************************************************/ + +int compute_nb_digits +(unsigned int n, unsigned int b) +{ + int nb_digits, quotient; + + if ((b <= 0) || (n <= 0)) + return -1; + + nb_digits = 0; + quotient = n; + + while (quotient > 0) + { + nb_digits++; + quotient = quotient / b; + } + + return nb_digits; +} + + +/***************************************************************************** + * * + * double radical_inverse * + * (int *digits, unsigned int nb_digits, unsigned int b) * + * * + * Apply the base-b radical inverse transform to a number given through its * + * base-b representation * + * * + ****************************************************************************/ + +double radical_inverse +(int *digits, unsigned int nb_digits, unsigned int b) +{ + int i, b_pow_inv; + double sum; + + b_pow_inv = 1; + sum = 0; + + for (i = 0; i < nb_digits; i++) + { + b_pow_inv *= b; + sum += ((double) digits[i]) / ((double)b_pow_inv); + } + + return sum; +} + + +/***************************************************************************** + * * + * int next_Mersenne_number(unsigned int b) * + * * + * Compute the first integer bigger than b that is of the form * + * * + * 2^k - 1, with k an integer * + * * + ****************************************************************************/ + +int next_Mersenne_number +(unsigned int b) +{ + int m = 0; + + while (m < b) + { + m <<= 1; + m += 1; + } + + return m; +} + + diff --git a/src/wfg.c b/src/wfg.c new file mode 100644 index 0000000..d6dcfcf --- /dev/null +++ b/src/wfg.c @@ -0,0 +1,1095 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015-2017 CentraleSupelec * + * * + * Author: Julien Bect * + * * + * Based on the file wfg.c from WFG 1.10 by Lyndon While, Lucas * + * Bradstreet, Luigi Barone, released under the GPLv2+ licence. The * + * original copyright notice is: * + * * + * Copyright (C) 2010 Lyndon While, Lucas Bradstreet * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +/* TODO: find out which of these includes are *REALLY* necessary */ + +#include +#include +#include +#include +#include "mex.h" +#include "wfg.h" + +double hv (FRONT*); +/* and the RLIST-variant of hv: */ +void Rlist_hv (FRONT* ps, RLIST* Rlist, int sign); + +#define BEATS(x,y) (x > y) +#define WORSE(x,y) (BEATS(y,x) ? (x) : (y)) + +FRONT *fs = NULL; /* memory management stuff */ +int fr = 0; /* current depth */ +int safe = 0; /* the number of points that don't need sorting */ + + +int greater (const void *v1, const void *v2) +/* this sorts points worsening in the last objective */ +{ + int i; + POINT p = *(POINT*)v1; + POINT q = *(POINT*)v2; + int n = p.n; /* assume that p and q have the same size */ + + for (i = n - 1; i >= 0; i--) + if BEATS(p.objectives[i],q.objectives[i]) return -1; + else if BEATS(q.objectives[i],p.objectives[i]) return 1; + + return 0; +} + + +int greaterabbrev (const void *v1, const void *v2) +/* this sorts points worsening in the penultimate objective */ +{ + int i; + POINT p = *(POINT*)v1; + POINT q = *(POINT*)v2; + int n = p.n; /* assume that p and q have the same size */ + + for (i = n - 2; i >= 0; i--) + if BEATS(p.objectives[i],q.objectives[i]) return -1; + else if BEATS(q.objectives[i],p.objectives[i]) return 1; + + return 0; +} + + +int dominates2way(POINT p, POINT q, int k) +/* returns -1 if p dominates q, 1 if q dominates p, 2 if p == q, 0 otherwise + k is the highest index inspected */ +{ + int i, j; + + for (i = k; i >= 0; i--) + if BEATS(p.objectives[i],q.objectives[i]) + { for (j = i - 1; j >= 0; j--) + if BEATS(q.objectives[j],p.objectives[j]) return 0; + return -1; + } + else if BEATS(q.objectives[i],p.objectives[i]) + { for (j = i - 1; j >= 0; j--) + if BEATS(p.objectives[j],q.objectives[j]) return 0; + return 1; + } + return 2; +} + + +int dominates1way(POINT p, POINT q, int k) +/* returns true if p dominates q or p == q, false otherwise + the assumption is that q doesn't dominate p + k is the highest index inspected */ +{ + int i; + + for (i = k; i >= 0; i--) + if BEATS(q.objectives[i],p.objectives[i]) + return 0; + + return 1; +} + + +void makeDominatedBit (FRONT* ps, int p) +/* creates the front ps[0 .. p-1] in fs[fr], with each point bounded by ps[p] and dominated points removed */ +{ + int i, j, k; + int l = 0; + int u = p - 1; + int n = ps->n; + POINT t; + + for (i = p - 1; i >= 0; i--) + if (BEATS(ps->points[p].objectives[n - 1],ps->points[i].objectives[n - 1])) + { fs[fr].points[u].objectives[n - 1] = ps->points[i].objectives[n - 1]; + for (j = 0; j < n - 1; j++) + fs[fr].points[u].objectives[j] = WORSE(ps->points[p].objectives[j],ps->points[i].objectives[j]); + u--; + } + else + { fs[fr].points[l].objectives[n - 1] = ps->points[p].objectives[n - 1]; + for (j = 0; j < n - 1; j++) + fs[fr].points[l].objectives[j] = WORSE(ps->points[p].objectives[j],ps->points[i].objectives[j]); + l++; + } + + /* points below l are all equal in the last objective; points above l are all worse + points below l can dominate each other, and we don't need to compare the last objective + points above l cannot dominate points that start below l, and we don't need to compare the last objective */ + fs[fr].nPoints = 1; + for (i = 1; i < l; i++) + { + j = 0; + while (j < fs[fr].nPoints) + switch (dominates2way(fs[fr].points[i], fs[fr].points[j], n-2)) + { + case 0: + j++; + break; + case -1: /* AT THIS POINT WE KNOW THAT i CANNOT BE DOMINATED BY ANY OTHER PROMOTED POINT j + SWAP i INTO j, AND 1-WAY DOM FOR THE REST OF THE js */ + t = fs[fr].points[j]; + fs[fr].points[j] = fs[fr].points[i]; + fs[fr].points[i] = t; + while(j < fs[fr].nPoints - 1 && dominates1way(fs[fr].points[j], fs[fr].points[fs[fr].nPoints - 1], n-1)) + fs[fr].nPoints--; + k = j+1; + while (k < fs[fr].nPoints) + if(dominates1way(fs[fr].points[j], fs[fr].points[k], n-2)) + { t = fs[fr].points[k]; + fs[fr].nPoints--; + fs[fr].points[k] = fs[fr].points[fs[fr].nPoints]; + fs[fr].points[fs[fr].nPoints] = t; + } + else + k++; + default: + j = fs[fr].nPoints + 1; + } + if (j == fs[fr].nPoints) + { t = fs[fr].points[fs[fr].nPoints]; + fs[fr].points[fs[fr].nPoints] = fs[fr].points[i]; + fs[fr].points[i] = t; + fs[fr].nPoints++; + } + } + safe = WORSE(l,fs[fr].nPoints); + for (i = l; i < p; i++) + { + j = 0; + while (j < safe) + if(dominates1way(fs[fr].points[j], fs[fr].points[i], n-2)) + j = fs[fr].nPoints + 1; + else + j++; + while (j < fs[fr].nPoints) + switch (dominates2way(fs[fr].points[i], fs[fr].points[j], n-1)) + { + case 0: + j++; + break; + case -1: /* AT THIS POINT WE KNOW THAT i CANNOT BE DOMINATED BY ANY OTHER PROMOTED POINT j + SWAP i INTO j, AND 1-WAY DOM FOR THE REST OF THE js */ + t = fs[fr].points[j]; + fs[fr].points[j] = fs[fr].points[i]; + fs[fr].points[i] = t; + while(j < fs[fr].nPoints - 1 && dominates1way(fs[fr].points[j], fs[fr].points[fs[fr].nPoints - 1], n-1)) + fs[fr].nPoints--; + k = j+1; + while (k < fs[fr].nPoints) + if(dominates1way(fs[fr].points[j], fs[fr].points[k], n-1)) + { t = fs[fr].points[k]; + fs[fr].nPoints--; + fs[fr].points[k] = fs[fr].points[fs[fr].nPoints]; + fs[fr].points[fs[fr].nPoints] = t; + } + else + k++; + default: + j = fs[fr].nPoints + 1; + } + if (j == fs[fr].nPoints) + { t = fs[fr].points[fs[fr].nPoints]; + fs[fr].points[fs[fr].nPoints] = fs[fr].points[i]; + fs[fr].points[i] = t; + fs[fr].nPoints++; + } + } + + /* Set the number of objectives for all points */ + wfg_front_resize (&fs[fr], fs[fr].nPoints, n); + + fr++; +} + + +double hv_2dim (FRONT* ps, int k) +/* returns the hypervolume of ps[0 .. k-1] in 2D + assumes that ps is sorted improving */ +{ + int i; + + double volume = ps->points[0].objectives[0] * ps->points[0].objectives[1]; + for (i = 1; i < k; i++) + volume += ps->points[i].objectives[1] * + (ps->points[i].objectives[0] - ps->points[i - 1].objectives[0]); + + return volume; +} + +/* RLIST-variant of hv_2dim */ +void Rlist_hv_2dim (FRONT* ps, int k, RLIST* Rlist, int sign) +{ + int i, Ridx; + double xmax0 = 0; + + Rlist_extend (Rlist, k, &Ridx); + + for (i = 0; i < k; i++, Ridx++) + { + Rlist->xmin[Ridx][0] = xmax0; + xmax0 = ps->points[i].objectives[0]; + Rlist->xmax[Ridx][0] = xmax0; + Rlist->xmax[Ridx][1] = ps->points[i].objectives[1]; + Rlist->sign[Ridx] = sign; + } +} + + +double inclhv (POINT p) +/* returns the inclusive hypervolume of p */ +{ + int i; + + double volume = 1; + for (i = 0; i < p.n; i++) + volume *= p.objectives[i]; + + return volume; +} + +/* RLIST-variant of inclhv */ +void Rlist_inclhv (POINT p, RLIST* Rlist, int sign) +{ + int Ridx; + + Rlist_extend (Rlist, 1, &Ridx); + + memcpy (Rlist->xmax[Ridx], p.objectives, p.n * sizeof (double)); + Rlist->sign[Ridx] = sign; +} + + +double inclhv2 (POINT p, POINT q) +/* returns the hypervolume of {p, q} */ +{ + int i; + int n = p.n; /* assume that p and q have the same size */ + double vp = 1; + double vq = 1; + double vpq = 1; + + for (i = 0; i < n; i++) + { + vp *= p.objectives[i]; + vq *= q.objectives[i]; + vpq *= WORSE(p.objectives[i],q.objectives[i]); + } + + return vp + vq - vpq; +} + +/* RLIST-variant of inclhv2 */ +void Rlist_inclhv2 (POINT p, POINT q, RLIST* Rlist, int sign) +{ + int i, Ridx; + int n = p.n; /* assume that p and q have the same size */ + + Rlist_extend (Rlist, 3, &Ridx); + + memcpy (Rlist->xmax[Ridx], p.objectives, n * sizeof (double)); Rlist->sign[Ridx++] = sign; + memcpy (Rlist->xmax[Ridx], q.objectives, n * sizeof (double)); Rlist->sign[Ridx++] = sign; + + for (i = 0; i < n; i++) + Rlist->xmax[Ridx][i] = WORSE(p.objectives[i], q.objectives[i]); + Rlist->sign[Ridx] = -sign; +} + + +double inclhv3 (POINT p, POINT q, POINT r) +/* returns the hypervolume of {p, q, r} */ +{ + int i; + int n = p.n; /* assume that p, q and r have the same size */ + double vp = 1; + double vq = 1; + double vr = 1; + double vpq = 1; + double vpr = 1; + double vqr = 1; + double vpqr = 1; + + for (i = 0; i < n; i++) + { + vp *= p.objectives[i]; + vq *= q.objectives[i]; + vr *= r.objectives[i]; + if (BEATS(p.objectives[i],q.objectives[i])) + if (BEATS(q.objectives[i],r.objectives[i])) + { + vpq *= q.objectives[i]; + vpr *= r.objectives[i]; + vqr *= r.objectives[i]; + vpqr *= r.objectives[i]; + } + else + { + vpq *= q.objectives[i]; + vpr *= WORSE(p.objectives[i],r.objectives[i]); + vqr *= q.objectives[i]; + vpqr *= q.objectives[i]; + } + else if (BEATS(p.objectives[i],r.objectives[i])) + { + vpq *= p.objectives[i]; + vpr *= r.objectives[i]; + vqr *= r.objectives[i]; + vpqr *= r.objectives[i]; + } + else + { + vpq *= p.objectives[i]; + vpr *= p.objectives[i]; + vqr *= WORSE(q.objectives[i],r.objectives[i]); + vpqr *= p.objectives[i]; + } + } + return vp + vq + vr - vpq - vpr - vqr + vpqr; +} + +/* RLIST-variant of inclhv3 */ +void Rlist_inclhv3 (POINT p, POINT q, POINT r, RLIST* Rlist, int sign) +{ + int i, Ridx, Ridx_pq, Ridx_pr, Ridx_qr, Ridx_pqr; + int n = p.n; /* assume that p, q and r have the same size */ + + Rlist_extend (Rlist, 7, &Ridx); + + memcpy (Rlist->xmax[Ridx], p.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + memcpy (Rlist->xmax[Ridx], q.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + memcpy (Rlist->xmax[Ridx], r.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + + Ridx_pq = Ridx ++; Rlist->sign[Ridx_pq] = -sign; + Ridx_pr = Ridx ++; Rlist->sign[Ridx_pr] = -sign; + Ridx_qr = Ridx ++; Rlist->sign[Ridx_qr] = -sign; + Ridx_pqr = Ridx; Rlist->sign[Ridx_pqr] = sign; + + for (i = 0; i < n; i++) + { + if (BEATS(p.objectives[i], q.objectives[i])) + if (BEATS(q.objectives[i], r.objectives[i])) + { + Rlist->xmax[Ridx_pq][i] = q.objectives[i]; + Rlist->xmax[Ridx_pr][i] = r.objectives[i]; + Rlist->xmax[Ridx_qr][i] = r.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; + } + else + { + Rlist->xmax[Ridx_pq][i] = q.objectives[i]; + Rlist->xmax[Ridx_pr][i] = WORSE(p.objectives[i], r.objectives[i]); + Rlist->xmax[Ridx_qr][i] = q.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = q.objectives[i]; + } + else if (BEATS(p.objectives[i],r.objectives[i])) + { + Rlist->xmax[Ridx_pq][i] = p.objectives[i]; + Rlist->xmax[Ridx_pr][i] = r.objectives[i]; + Rlist->xmax[Ridx_qr][i] = r.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; + } + else + { + Rlist->xmax[Ridx_pq][i] = p.objectives[i]; + Rlist->xmax[Ridx_pr][i] = p.objectives[i]; + Rlist->xmax[Ridx_qr][i] = WORSE(q.objectives[i], r.objectives[i]); + Rlist->xmax[Ridx_pqr][i] = p.objectives[i]; + } + } +} + + +double inclhv4 (POINT p, POINT q, POINT r, POINT s) +/* returns the hypervolume of {p, q, r, s} */ +{ + int i; + int n = p.n; /* assume that p, q, r and s have the same size */ + double vp = 1; + double vq = 1; + double vr = 1; + double vs = 1; + double vpq = 1; + double vpr = 1; + double vps = 1; + double vqr = 1; + double vqs = 1; + double vrs = 1; + double vpqr = 1; + double vpqs = 1; + double vprs = 1; + double vqrs = 1; + double vpqrs = 1; + OBJECTIVE z1, z2; + + for (i = 0; i < n; i++) + { + vp *= p.objectives[i]; + vq *= q.objectives[i]; + vr *= r.objectives[i]; + vs *= s.objectives[i]; + if (BEATS(p.objectives[i],q.objectives[i])) + if (BEATS(q.objectives[i],r.objectives[i])) + if (BEATS(r.objectives[i],s.objectives[i])) + { + vpq *= q.objectives[i]; + vpr *= r.objectives[i]; + vps *= s.objectives[i]; + vqr *= r.objectives[i]; + vqs *= s.objectives[i]; + vrs *= s.objectives[i]; + vpqr *= r.objectives[i]; + vpqs *= s.objectives[i]; + vprs *= s.objectives[i]; + vqrs *= s.objectives[i]; + vpqrs *= s.objectives[i]; + } + else + { + z1 = WORSE(q.objectives[i],s.objectives[i]); + vpq *= q.objectives[i]; + vpr *= r.objectives[i]; + vps *= WORSE(p.objectives[i],s.objectives[i]); + vqr *= r.objectives[i]; + vqs *= z1; + vrs *= r.objectives[i]; + vpqr *= r.objectives[i]; + vpqs *= z1; + vprs *= r.objectives[i]; + vqrs *= r.objectives[i]; + vpqrs *= r.objectives[i]; + } + else if (BEATS(q.objectives[i],s.objectives[i])) + { + vpq *= q.objectives[i]; + vpr *= WORSE(p.objectives[i],r.objectives[i]); + vps *= s.objectives[i]; + vqr *= q.objectives[i]; + vqs *= s.objectives[i]; + vrs *= s.objectives[i]; + vpqr *= q.objectives[i]; + vpqs *= s.objectives[i]; + vprs *= s.objectives[i]; + vqrs *= s.objectives[i]; + vpqrs *= s.objectives[i]; + } + else + { + z1 = WORSE(p.objectives[i],r.objectives[i]); + vpq *= q.objectives[i]; + vpr *= z1; + vps *= WORSE(p.objectives[i],s.objectives[i]); + vqr *= q.objectives[i]; + vqs *= q.objectives[i]; + vrs *= WORSE(r.objectives[i],s.objectives[i]); + vpqr *= q.objectives[i]; + vpqs *= q.objectives[i]; + vprs *= WORSE(z1,s.objectives[i]); + vqrs *= q.objectives[i]; + vpqrs *= q.objectives[i]; + } + else if (BEATS(q.objectives[i],r.objectives[i])) + if (BEATS(p.objectives[i],s.objectives[i])) + { + z1 = WORSE(p.objectives[i],r.objectives[i]); + z2 = WORSE(r.objectives[i],s.objectives[i]); + vpq *= p.objectives[i]; + vpr *= z1; + vps *= s.objectives[i]; + vqr *= r.objectives[i]; + vqs *= s.objectives[i]; + vrs *= z2; + vpqr *= z1; + vpqs *= s.objectives[i]; + vprs *= z2; + vqrs *= z2; + vpqrs *= z2; + } + else + { + z1 = WORSE(p.objectives[i],r.objectives[i]); + z2 = WORSE(r.objectives[i],s.objectives[i]); + vpq *= p.objectives[i]; + vpr *= z1; + vps *= p.objectives[i]; + vqr *= r.objectives[i]; + vqs *= WORSE(q.objectives[i],s.objectives[i]); + vrs *= z2; + vpqr *= z1; + vpqs *= p.objectives[i]; + vprs *= z1; + vqrs *= z2; + vpqrs *= z1; + } + else if (BEATS(p.objectives[i],s.objectives[i])) + { + vpq *= p.objectives[i]; + vpr *= p.objectives[i]; + vps *= s.objectives[i]; + vqr *= q.objectives[i]; + vqs *= s.objectives[i]; + vrs *= s.objectives[i]; + vpqr *= p.objectives[i]; + vpqs *= s.objectives[i]; + vprs *= s.objectives[i]; + vqrs *= s.objectives[i]; + vpqrs *= s.objectives[i]; + } + else + { + z1 = WORSE(q.objectives[i],s.objectives[i]); + vpq *= p.objectives[i]; + vpr *= p.objectives[i]; + vps *= p.objectives[i]; + vqr *= q.objectives[i]; + vqs *= z1; + vrs *= WORSE(r.objectives[i],s.objectives[i]); + vpqr *= p.objectives[i]; + vpqs *= p.objectives[i]; + vprs *= p.objectives[i]; + vqrs *= z1; + vpqrs *= p.objectives[i]; + } + } + return vp + vq + vr + vs - vpq - vpr - vps - vqr - vqs - vrs + vpqr + vpqs + vprs + vqrs - vpqrs; +} + +void Rlist_inclhv4 (POINT p, POINT q, POINT r, POINT s, RLIST* Rlist, int sign) +/* returns the hypervolume of {p, q, r, s} */ +{ + int i, Ridx; + int Ridx_pq, Ridx_pr, Ridx_ps, Ridx_qr, Ridx_qs, Ridx_rs; + int Ridx_pqr, Ridx_pqs, Ridx_prs, Ridx_qrs, Ridx_pqrs; + + int n = p.n; /* assume that p, q, r and s have the same size */ + OBJECTIVE z1, z2; + + Rlist_extend (Rlist, 15, &Ridx); /* 15 = 2^4 - 1 */ + + memcpy (Rlist->xmax[Ridx], p.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + memcpy (Rlist->xmax[Ridx], q.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + memcpy (Rlist->xmax[Ridx], r.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + memcpy (Rlist->xmax[Ridx], s.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; + + Ridx_pq = Ridx ++; Rlist->sign[Ridx_pq] = -sign; + Ridx_pr = Ridx ++; Rlist->sign[Ridx_pr] = -sign; + Ridx_ps = Ridx ++; Rlist->sign[Ridx_ps] = -sign; + Ridx_qr = Ridx ++; Rlist->sign[Ridx_qr] = -sign; + Ridx_qs = Ridx ++; Rlist->sign[Ridx_qs] = -sign; + Ridx_rs = Ridx ++; Rlist->sign[Ridx_rs] = -sign; + Ridx_pqr = Ridx ++; Rlist->sign[Ridx_pqr] = sign; + Ridx_pqs = Ridx ++; Rlist->sign[Ridx_pqs] = sign; + Ridx_prs = Ridx ++; Rlist->sign[Ridx_prs] = sign; + Ridx_qrs = Ridx ++; Rlist->sign[Ridx_qrs] = sign; + Ridx_pqrs = Ridx; Rlist->sign[Ridx_pqrs] = -sign; + + for (i = 0; i < n; i++) + { + if (BEATS(p.objectives[i], q.objectives[i])) + if (BEATS(q.objectives[i], r.objectives[i])) + if (BEATS(r.objectives[i], s.objectives[i])) + { + Rlist->xmax[Ridx_pq][i] = q.objectives[i]; + Rlist->xmax[Ridx_pr][i] = r.objectives[i]; + Rlist->xmax[Ridx_ps][i] = s.objectives[i]; + Rlist->xmax[Ridx_qr][i] = r.objectives[i]; + Rlist->xmax[Ridx_qs][i] = s.objectives[i]; + Rlist->xmax[Ridx_rs][i] = s.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; + Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; + Rlist->xmax[Ridx_prs][i] = s.objectives[i]; + Rlist->xmax[Ridx_qrs][i] = s.objectives[i]; + Rlist->xmax[Ridx_pqrs][i] = s.objectives[i]; + } + else + { + z1 = WORSE(q.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_pq][i] = q.objectives[i]; + Rlist->xmax[Ridx_pr][i] = r.objectives[i]; + Rlist->xmax[Ridx_ps][i] = WORSE(p.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_qr][i] = r.objectives[i]; + Rlist->xmax[Ridx_qs][i] = z1; + Rlist->xmax[Ridx_rs][i] = r.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; + Rlist->xmax[Ridx_pqs][i] = z1; + Rlist->xmax[Ridx_prs][i] = r.objectives[i]; + Rlist->xmax[Ridx_qrs][i] = r.objectives[i]; + Rlist->xmax[Ridx_pqrs][i] = r.objectives[i]; + } + else if (BEATS(q.objectives[i], s.objectives[i])) + { + Rlist->xmax[Ridx_pq][i] = q.objectives[i]; + Rlist->xmax[Ridx_pr][i] = WORSE(p.objectives[i], r.objectives[i]); + Rlist->xmax[Ridx_ps][i] = s.objectives[i]; + Rlist->xmax[Ridx_qr][i] = q.objectives[i]; + Rlist->xmax[Ridx_qs][i] = s.objectives[i]; + Rlist->xmax[Ridx_rs][i] = s.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = q.objectives[i]; + Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; + Rlist->xmax[Ridx_prs][i] = s.objectives[i]; + Rlist->xmax[Ridx_qrs][i] = s.objectives[i]; + Rlist->xmax[Ridx_pqrs][i] = s.objectives[i]; + } + else + { + z1 = WORSE(p.objectives[i], r.objectives[i]); + Rlist->xmax[Ridx_pq][i] = q.objectives[i]; + Rlist->xmax[Ridx_pr][i] = z1; + Rlist->xmax[Ridx_ps][i] = WORSE(p.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_qr][i] = q.objectives[i]; + Rlist->xmax[Ridx_qs][i] = q.objectives[i]; + Rlist->xmax[Ridx_rs][i] = WORSE(r.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_pqr][i] = q.objectives[i]; + Rlist->xmax[Ridx_pqs][i] = q.objectives[i]; + Rlist->xmax[Ridx_prs][i] = WORSE(z1, s.objectives[i]); + Rlist->xmax[Ridx_qrs][i] = q.objectives[i]; + Rlist->xmax[Ridx_pqrs][i] = q.objectives[i]; + } + else if (BEATS(q.objectives[i], r.objectives[i])) + if (BEATS(p.objectives[i], s.objectives[i])) + { + z1 = WORSE(p.objectives[i], r.objectives[i]); + z2 = WORSE(r.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_pq][i] = p.objectives[i]; + Rlist->xmax[Ridx_pr][i] = z1; + Rlist->xmax[Ridx_ps][i] = s.objectives[i]; + Rlist->xmax[Ridx_qr][i] = r.objectives[i]; + Rlist->xmax[Ridx_qs][i] = s.objectives[i]; + Rlist->xmax[Ridx_rs][i] = z2; + Rlist->xmax[Ridx_pqr][i] = z1; + Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; + Rlist->xmax[Ridx_prs][i] = z2; + Rlist->xmax[Ridx_qrs][i] = z2; + Rlist->xmax[Ridx_pqrs][i] = z2; + } + else + { + z1 = WORSE(p.objectives[i], r.objectives[i]); + z2 = WORSE(r.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_pq][i] = p.objectives[i]; + Rlist->xmax[Ridx_pr][i] = z1; + Rlist->xmax[Ridx_ps][i] = p.objectives[i]; + Rlist->xmax[Ridx_qr][i] = r.objectives[i]; + Rlist->xmax[Ridx_qs][i] = WORSE(q.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_rs][i] = z2; + Rlist->xmax[Ridx_pqr][i] = z1; + Rlist->xmax[Ridx_pqs][i] = p.objectives[i]; + Rlist->xmax[Ridx_prs][i] = z1; + Rlist->xmax[Ridx_qrs][i] = z2; + Rlist->xmax[Ridx_pqrs][i] = z1; + } + else if (BEATS(p.objectives[i], s.objectives[i])) + { + Rlist->xmax[Ridx_pq][i] = p.objectives[i]; + Rlist->xmax[Ridx_pr][i] = p.objectives[i]; + Rlist->xmax[Ridx_ps][i] = s.objectives[i]; + Rlist->xmax[Ridx_qr][i] = q.objectives[i]; + Rlist->xmax[Ridx_qs][i] = s.objectives[i]; + Rlist->xmax[Ridx_rs][i] = s.objectives[i]; + Rlist->xmax[Ridx_pqr][i] = p.objectives[i]; + Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; + Rlist->xmax[Ridx_prs][i] = s.objectives[i]; + Rlist->xmax[Ridx_qrs][i] = s.objectives[i]; + Rlist->xmax[Ridx_pqrs][i] = s.objectives[i]; + } + else + { + z1 = WORSE(q.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_pq][i] = p.objectives[i]; + Rlist->xmax[Ridx_pr][i] = p.objectives[i]; + Rlist->xmax[Ridx_ps][i] = p.objectives[i]; + Rlist->xmax[Ridx_qr][i] = q.objectives[i]; + Rlist->xmax[Ridx_qs][i] = z1; + Rlist->xmax[Ridx_rs][i] = WORSE(r.objectives[i], s.objectives[i]); + Rlist->xmax[Ridx_pqr][i] = p.objectives[i]; + Rlist->xmax[Ridx_pqs][i] = p.objectives[i]; + Rlist->xmax[Ridx_prs][i] = p.objectives[i]; + Rlist->xmax[Ridx_qrs][i] = z1; + Rlist->xmax[Ridx_pqrs][i] = p.objectives[i]; + } + } +} + + +double exclhv (FRONT* ps, int p) +/* returns the exclusive hypervolume of ps[p] relative to ps[0 .. p-1] */ +{ + double volume; + + makeDominatedBit (ps, p); + volume = inclhv (ps->points[p]) - hv (&fs[fr - 1]); + fr--; + + return volume; +} + +/* RLIST-variant of exclhv */ +void Rlist_exclhv (FRONT* ps, int p, RLIST* Rlist, int sign) +{ + makeDominatedBit (ps, p); + Rlist_inclhv (ps->points[p], Rlist, sign); + Rlist_hv (&fs[fr - 1], Rlist, -sign); + + fr --; +} + + +double hv (FRONT* ps) +/* returns the hypervolume of ps[0 ..] */ +{ + int i; + int n = ps->n; + double volume; + + /* process small fronts with the IEA */ + switch (ps->nPoints) + { + case 1: + return inclhv (ps->points[0]); + case 2: + return inclhv2 (ps->points[0], ps->points[1]); + case 3: + return inclhv3 (ps->points[0], ps->points[1], ps->points[2]); + case 4: + return inclhv4 (ps->points[0], ps->points[1], ps->points[2], ps->points[3]); + } + + /* these points need sorting */ + qsort(&ps->points[safe], ps->nPoints - safe, sizeof(POINT), greater); + + /* n = 2 implies that safe = 0 */ + if (n == 2) return hv_2dim (ps, ps->nPoints); + + /* these points don't NEED sorting, but it helps */ + qsort(ps->points, safe, sizeof(POINT), greaterabbrev); + + if (n == 3 && safe > 0) + { + volume = ps->points[0].objectives[2] * (hv_2dim (ps, safe)); + i = safe; + } + else + { + volume = inclhv4 (ps->points[0], ps->points[1], + ps->points[2], ps->points[3]); + i = 4; + } + + wfg_front_resize (ps, ps->nPoints, n - 1); + + for (; i < ps->nPoints; i++) + /* we can ditch dominated points here, + but they will be ditched anyway in makeDominatedBit */ + volume += ps->points[i].objectives[n - 1] * (exclhv (ps, i)); + + wfg_front_resize (ps, ps->nPoints, n); + + return volume; +} + +/* RLIST-variant of hv */ +void Rlist_hv (FRONT* ps, RLIST* Rlist, int sign) +{ + int i, j, Ridx; + int n = ps->n; + + /* process small fronts with the IEA */ + switch (ps->nPoints) + { + case 1: + Rlist_inclhv (ps->points[0], Rlist, sign); + return; + case 2: + Rlist_inclhv2 (ps->points[0], ps->points[1], Rlist, sign); + return; + case 3: + Rlist_inclhv3 (ps->points[0], ps->points[1], ps->points[2], + Rlist, sign); + return; + case 4: + Rlist_inclhv4 (ps->points[0], ps->points[1], ps->points[2], + ps->points[3], Rlist, sign); + return; + } + + /* these points need sorting */ + qsort (&ps->points[safe], ps->nPoints - safe, sizeof(POINT), greater); + + /* n = 2 implies that safe = 0 */ + if (n == 2) + { + Rlist_hv_2dim (ps, ps->nPoints, Rlist, sign); + return; + } + + /* these points don't NEED sorting, but it helps */ + qsort (ps->points, safe, sizeof(POINT), greaterabbrev); + + if ((n == 3) && (safe > 0)) + { + /* Take note of the number of rectangles before calling Rlist_hv_2dim */ + Ridx = Rlist->size; + + Rlist_hv_2dim (ps, safe, Rlist, sign); + + /* Add last coordinate to all new rectangles */ + for (j = Ridx; j < Rlist->size; j++) + Rlist->xmax[j][2] = ps->points[0].objectives[2]; + + i = safe; + } + else + { + Rlist_inclhv4 (ps->points[0], ps->points[1], ps->points[2], + ps->points[3], Rlist, sign); + i = 4; + } + + wfg_front_resize (ps, ps->nPoints, n - 1); + + for (; i < ps->nPoints; i++) + { + /* Take note of the number of rectangles before calling Rlist_exclhv */ + Ridx = Rlist->size; + + Rlist_exclhv (ps, i, Rlist, sign); + + /* Add last coordinate to all new rectangles */ + for (j = Ridx; j < Rlist->size; j++) + Rlist->xmax[j][n - 1] = ps->points[i].objectives[n - 1]; + } + + wfg_front_resize (ps, ps->nPoints, n); +} + + +/**************************/ +/***** MAIN FUNCTIONS *****/ +/**************************/ + +double wfg_compute_hv (FRONT* ps) +{ + /* Set global variables */ + safe = 0; + fr = 0; + + return hv (ps); +} + +void wfg_compute_decomposition (FRONT* ps, RLIST* Rlist) +{ + /* Set global variables */ + safe = 0; + fr = 0; + + Rlist_hv (ps, Rlist, 1); +} + + +/********************************************/ +/***** ALLOC/FREE GLOBAL LIST OF FRONTS *****/ +/********************************************/ + +void wfg_alloc (int maxm, int maxn) +/* Allocate memory for several auxiliary fronts */ +{ + int i, max_depth; + + if (maxn > 2) + { + max_depth = maxn - 2; + fs = (FRONT*) mxMalloc (sizeof (FRONT) * max_depth); + for (i = 0; i < max_depth; i++) + wfg_front_init (&fs[i], maxm, maxn - i - 1); + } +} + + +void wfg_free (int maxm, int maxn) +{ + int i, max_depth; + + if (maxn > 2) + { + max_depth = maxn - 2; + for (i = 0; i < max_depth; i++) + wfg_front_destroy (&fs[i]); + mxFree (fs); + } +} + + +/**************************************/ +/***** BASIC OPERATIONS ON FRONTS *****/ +/**************************************/ + +void wfg_front_init (FRONT* front, int nb_points, int nb_objectives) +{ + int j; + + front->nPoints_alloc = nb_points; /* must *not* be changed */ + front->n_alloc = nb_objectives; /* must *not* be changed */ + + front->nPoints = nb_points; + front->n = nb_objectives; + + front->points = (POINT*) mxMalloc (sizeof (POINT) * nb_points); + + for (j = 0; j < nb_points; j++) + { + front->points[j].n = nb_objectives; + front->points[j].objectives = (OBJECTIVE*) + mxMalloc (sizeof (OBJECTIVE) * nb_objectives); + } +} + + +void wfg_front_destroy (FRONT* front) +{ + int j; + + for (j = 0; j < front->nPoints_alloc; j++) + mxFree (front->points[j].objectives); + + mxFree (front->points); +} + + +void wfg_front_resize (FRONT* f, int nb_points, int nb_objectives) +{ + int j; + + if (nb_points > f->nPoints_alloc) + mexErrMsgTxt ("Cannot set nPoints > nPoints_alloc."); + + if (nb_objectives > f->n_alloc) + mexErrMsgTxt ("Cannot set n > n_alloc."); + + f->nPoints = nb_points; + f->n = nb_objectives; + + for (j = 0; j < nb_points; j++) + f->points[j].n = nb_objectives; +} + + +/***************************************/ +/***** BASIC OPERATIONS ON RLIST's *****/ +/***************************************/ + +RLIST* Rlist_alloc (int alloc_size, int n) +{ + int block_size = n * alloc_size; + + RLIST* Rlist = (RLIST*) mxMalloc (sizeof (RLIST)); + + Rlist->size = 0; + Rlist->allocated_size = alloc_size; + Rlist->n = n; + + Rlist->xmin = (double**) mxMalloc (alloc_size * sizeof (double*)); + Rlist->xmax = (double**) mxMalloc (alloc_size * sizeof (double*)); + Rlist->sign = (int*) mxMalloc (alloc_size * sizeof (int)); + + Rlist->xmin_data = (double*) mxMalloc (block_size * sizeof (double)); + Rlist->xmax_data = (double*) mxMalloc (block_size * sizeof (double)); + + return Rlist; +} + +void Rlist_extend (RLIST* Rlist, int k, int* p_Ridx) +{ + int i, j; + int n = Rlist->n; + int old_size = Rlist->size; + int new_size = old_size + k; + int block_size; + + if (new_size > Rlist->allocated_size) + { + while (new_size > Rlist->allocated_size) + Rlist->allocated_size *= 2; + block_size = n * Rlist->allocated_size; + + Rlist->xmin = (double**) mxRealloc + (Rlist->xmin, Rlist->allocated_size * sizeof (double*)); + Rlist->xmax = (double**) mxRealloc + (Rlist->xmax, Rlist->allocated_size * sizeof (double*)); + Rlist->sign = (int*) mxRealloc + (Rlist->sign, Rlist->allocated_size * sizeof (int)); + + Rlist->xmin_data = (double*) mxRealloc + (Rlist->xmin_data, block_size * sizeof (double)); + Rlist->xmax_data = (double*) mxRealloc + (Rlist->xmax_data, block_size * sizeof (double)); + + /* We have to fill xmin and xmax entirely again + (since xmin_data and xmax_data might have been moved during realloc */ + for (i = 0, j = 0; i < new_size; i++, j += n) + { + Rlist->xmin[i] = &(Rlist->xmin_data[j]); + Rlist->xmax[i] = &(Rlist->xmax_data[j]); + } + } + else + { + /* No realloc: we just have to fill up from old_size */ + for (i = old_size, j = n * old_size; i < new_size; i++, j += n) + { + Rlist->xmin[i] = &(Rlist->xmin_data[j]); + Rlist->xmax[i] = &(Rlist->xmax_data[j]); + } + } + + Rlist->size = new_size; + + /* Set all components of xmin to 0 (the reference) */ + for (j = n * old_size; j < n * new_size; j++) + Rlist->xmin_data[j] = 0.0; + + *p_Ridx = old_size; +} + +void Rlist_free (RLIST* Rlist) +{ + mxFree (Rlist->xmin); + mxFree (Rlist->xmin_data); + mxFree (Rlist->xmax); + mxFree (Rlist->xmax_data); + mxFree (Rlist->sign); + mxFree (Rlist); +} diff --git a/src/wfg.h b/src/wfg.h new file mode 100644 index 0000000..890dbdb --- /dev/null +++ b/src/wfg.h @@ -0,0 +1,99 @@ +/***************************************************************************** + * * + * Small (Matlab/Octave) Toolbox for Kriging * + * * + * Copyright Notice * + * * + * Copyright (C) 2015, 2016 CentraleSupelec * + * * + * Author: Julien Bect * + * * + * Based on the file wfg.h from WFG 1.10 by Lyndon While, Lucas * + * Bradstreet, Luigi Barone, released under the GPLv2+ licence. The * + * original copyright notice is: * + * * + * Copyright (C) 2010 Lyndon While, Lucas Bradstreet * + * * + * Copying Permission Statement * + * * + * This file is part of * + * * + * STK: a Small (Matlab/Octave) Toolbox for Kriging * + * (https://github.com/stk-kriging/stk/) * + * * + * STK is free software: you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free * + * Software Foundation, either version 3 of the License, or (at your * + * option) any later version. * + * * + * STK is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * + * License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with STK. If not, see . * + * * + ****************************************************************************/ + +#ifndef ___WFG_H___ +#define ___WFG_H___ + +typedef double OBJECTIVE; + +typedef struct +{ + int n; + OBJECTIVE *objectives; +} +POINT; + +typedef struct +{ + int nPoints; + int nPoints_alloc; /* must *not* be changed */ + int n; + int n_alloc; /* must *not* be changed */ + POINT *points; +} +FRONT; + +double wfg_compute_hv (FRONT* ps); + +void wfg_alloc (int maxm, int maxn); +void wfg_free (int maxm, int maxn); + +void wfg_front_init (FRONT* front, int nb_points, int nb_objectives); +void wfg_front_destroy (FRONT* front); +void wfg_front_resize (FRONT* f, int nb_points, int nb_objectives); + + +/*****************************************/ +/* RLIST structure & associated funtions */ +/*****************************************/ + +typedef struct +{ + int allocated_size; /* maximal number of rectangles */ + int size; /* current number of rectangles */ + int n; /* dimension (number of objectives) */ + double **xmin; /* lower bounds */ + double *xmin_data; /* lower bounds (one block) */ + double **xmax; /* upper bounds */ + double *xmax_data; /* upper bounds (one block) */ + int *sign; /* inclusion/exclusion */ +} +RLIST; + +/* wfg_compute_decomposition: similar to wfg_compute_hv, but */ +/* returns a decomposition of the dominated region into */ +/* hyper-rectangles (instead of its hyper-volume) */ +void wfg_compute_decomposition (FRONT* ps, RLIST* Rlist); + +/* Memory management */ +RLIST* Rlist_alloc (int alloc_size, int n); +void Rlist_extend (RLIST* Rlist, int k, int* p_Ridx); +void Rlist_free (RLIST* Rlist); + + +#endif -- cgit v1.2.3 From 8a4fcd88df3feb0aa7bead09aadab75d15c36a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 19 Apr 2022 10:10:14 -0300 Subject: Import octave-stk_2.7.0-2.debian.tar.xz [dgit import tarball octave-stk 2.7.0-2 octave-stk_2.7.0-2.debian.tar.xz] --- changelog | 234 +++++++++++++++++++++++++++++++ control | 23 +++ copyright | 49 +++++++ gbp.conf | 4 + octave-stk.lintian-overrides | 8 ++ patches/0003-Mark-expected-failure.patch | 21 +++ patches/octave7.patch | 19 +++ patches/series | 2 + rules | 5 + source/format | 1 + upstream/metadata | 11 ++ watch | 2 + 12 files changed, 379 insertions(+) create mode 100644 changelog create mode 100644 control create mode 100644 copyright create mode 100644 gbp.conf create mode 100644 octave-stk.lintian-overrides create mode 100644 patches/0003-Mark-expected-failure.patch create mode 100644 patches/octave7.patch create mode 100644 patches/series create mode 100755 rules create mode 100644 source/format create mode 100644 upstream/metadata create mode 100644 watch diff --git a/changelog b/changelog new file mode 100644 index 0000000..5358564 --- /dev/null +++ b/changelog @@ -0,0 +1,234 @@ +octave-stk (2.7.0-2) unstable; urgency=medium + + * Team upload + + [ Debian Janitor ] + * Set upstream metadata fields: Repository. + + [ Sébastien Villemot ] + * octave7.patch: new patch, fixes FTBFS against Octave 7 (Closes: #1009136) + + -- Sébastien Villemot Tue, 19 Apr 2022 15:10:14 +0200 + +octave-stk (2.7.0-1) unstable; urgency=medium + + * Team upload + + * New upstream version 2.7.0 + * d/p/0002-Remove-the-MOLE.patch: Drop patch (applied upstream) + * d/p/0003-Mark-expected-failure.patch: Refresh for new upstream version + * d/copyright: Reflect upstream changes + * d/control: Bump Standards-Version to 4.6.0 (no changes needed) + * Set upstream metadata fields: Archive. + + -- Rafael Laboissière Wed, 02 Mar 2022 03:37:21 -0300 + +octave-stk (2.6.1-5) unstable; urgency=medium + + * Team upload + * This version builds correctly against Octave 6 (Closes: #976206) + * d/control: Bump Standards-Version to 4.5.1 (no changes needed) + + -- Rafael Laboissière Wed, 30 Dec 2020 13:40:56 -0300 + +octave-stk (2.6.1-4) unstable; urgency=medium + + * Team upload + + * d/octave-secs2d.lintian-overrides: New file. + Add override for Lintian false positive warning + debian-changelog-file-is-a-symlink. + * d/control: Build-depend on dh-octave >= 1.0.2. + This ensures that the upstream ChangeLog.gz file has maximum + compression level. + + -- Rafael Laboissière Tue, 10 Nov 2020 17:20:14 -0300 + +octave-stk (2.6.1-3) unstable; urgency=medium + + * Team upload + + * d/control: + + Bump Standards-Version to 4.5.0 (no changes needed) + + Bump debhelper compatibility level to 13 + * d/u/metadata: + + Add Bug-{Database,Submit} and Repository-Browse fields + + Drop Name and Contact fields + * d/p/0003-Mark-expected-failure.patch: Set Forwarded:not-needed + * d/octave-stk.lintian-overrides: Rename tag + shared-library-lacks-prerequisites + + -- Rafael Laboissière Sun, 02 Aug 2020 13:07:37 -0300 + +octave-stk (2.6.1-2) unstable; urgency=medium + + * Team upload + + * d/control: Bump dependency on dh-octave to >= 0.7.1 + This allows the injection of the virtual package octave-abi-N into + the package's list of dependencies. + * d/octave-stk.lintian-overrides: Ignore Lintian warning + shared-lib-without-dependency-information. + + -- Rafael Laboissiere Sat, 09 Nov 2019 03:41:25 -0300 + +octave-stk (2.6.1-1) unstable; urgency=medium + + * Team upload + + * New upstream version 2.6.1 + * d/p/0002-Remove-the-MOLE.patch: Refresh for new upstream version + * d/p/0003-Mark-expected-failure.patch: Refresh for new upstream version + * d/control: Bump Standards-Version to 4.4.1 (no changes needed) + + -- Rafael Laboissiere Thu, 24 Oct 2019 13:33:11 -0300 + +octave-stk (2.6.0-1) unstable; urgency=medium + + * Team upload + + * New upstream version 2.6.0 + * d/copyright: Reflect upstream changes + * d/control: Bump Standards-Version to 4.4.0 (no changes needed) + * d/u/metadata: Update for new upstream version + + -- Rafael Laboissiere Sun, 22 Sep 2019 13:51:35 -0300 + +octave-stk (2.5.1-2) unstable; urgency=medium + + * Team upload + + * d/control: + + Add Rules-Requires-Root: no + + Bump Standards-Version to 4.3.0 + + Bump to debhelper compat level 12 + * Build-depend on debhelper-compat instead of using d/compat + + -- Rafael Laboissiere Wed, 02 Jan 2019 22:57:53 -0200 + +octave-stk (2.5.1-1) unstable; urgency=medium + + * Team upload. + * New upstream version 2.5.1 + + -- Rafael Laboissiere Tue, 03 Jul 2018 05:05:58 -0300 + +octave-stk (2.5.0-2) unstable; urgency=medium + + * Team upload. + + * d/control: + + Bump Standards-Version to 4.1.4 (no changes needed) + + Bump build-dependency on dh-octave to >= 0.5.3. + This avoids FTBFS when unit tests need to output plot commands. + * d/p/init-vars-in-compute-decomposition.patch: New patch. + This is a workaround for avoinding FTBFS against Octave 4.4. + * d/octave-stk.lintian-overrides: Remove unused overrides + + -- Rafael Laboissiere Sat, 16 Jun 2018 16:41:42 -0300 + +octave-stk (2.5.0-1) unstable; urgency=medium + + [ Mike Miller ] + * d/control, d/copyright: Use secure URL for upstream source. + + [ Julien Bect ] + * New upstream version 2.5.0 + * d/copyright: Update copyright info + * d/patches: Remove patch 0001, no longer needed + * d/patches/0002: update patch + * d/patches/0003: update patch + + -- Julien Bect Mon, 26 Feb 2018 09:08:11 +0100 + +octave-stk (2.4.2-5) unstable; urgency=medium + + * Use dh-octave for building the package + * d/control: + + Use Debian's GitLab URLs in Vcs-* headers + + Change Maintainer to team+pkg-octave-team@tracker.debian.org + + -- Rafael Laboissiere Sat, 10 Feb 2018 07:39:09 -0200 + +octave-stk (2.4.2-4) unstable; urgency=medium + + * Team upload. + + * Use the dh-based version of octave-pkg-dev + * Set debhelper compatibility level to >= 11 + * d/control: Bump Standards-Version to 4.1.3 (no changes needed) + + -- Rafael Laboissiere Fri, 29 Dec 2017 22:14:50 -0200 + +octave-stk (2.4.2-3) unstable; urgency=medium + + * Team upload. + + * d/control: Build-depend on octave-pkg-dev > 1.5.2. + This version of octave-pkg-dev pulls gnuplot-nox. This later is no + more needed in the build-dependency list. + + -- Rafael Laboissiere Sat, 21 Oct 2017 08:47:02 -0200 + +octave-stk (2.4.2-2) unstable; urgency=medium + + * Team upload. + + [ Rafael Laboissiere ] + * d/control: Add Testsuite field + * d/control: Bump Standards-Version to 4.1.1 (no changes needed) + + [ Julien Bect ] + * d/patches/0003-Mark-expected-failure.patch: New patch. + (Closes: #876777) + + -- Sébastien Villemot Fri, 13 Oct 2017 19:38:10 +0200 + +octave-stk (2.4.2-1) unstable; urgency=medium + + [ Rafael Laboissiere ] + * d/u/metadata: Add citation + * Bump debhelper compat level to 10 + * d/control: Build-depends on octave-pkg-dev >= 1.4.4 + * d/u/metadata: Fix Homepage + * d/u/metadata: Fix URL + * d/u/metadata: Quote text in Title. + Thanks to Adreas Tille for the patch + * Closes: #854448 + * d/control: Use cgit instead of gitweb in Vcs-Browser URL + + [ Sébastien Villemot ] + * d/copyright: use secure URL for format. + * d/watch: bump to format version 4. + * New upstream version 2.4.2 + * d/copyright: reflect upstream changes. + * d/control: bump Standards-Version to 4.0.0. + + [ Julien Bect ] + * d/octave-stk.lintian-overrides: Fix typo + * d/patches/0001: Refresh patch + * d/patches/0002: Refresh patch + * d/patches/0004: Remove patch (no longer needed, applied upstream) + + -- Julien Bect Fri, 07 Jul 2017 17:21:00 +0200 + +octave-stk (2.3.4-1) unstable; urgency=low + + [ Rafael Laboissiere ] + * d/control: Use secure URIs in the Vcs-* fields + * d/control: Bump Standards-Version to 3.9.7 (no changes needed) + + [ Julien Bect ] + * Imported Upstream version 2.3.4 + * d/patches/0002: Refresh patch + * d/patches/0003: Remove patch (no longer needed, applied upstream) + * d/patches/0004: Remove patch (no longer needed, applied upstream) + * d/control: Bump Standards-Version to 3.9.8 (no changes needed) + + -- Julien Bect Tue, 21 Jun 2016 08:25:13 +0200 + +octave-stk (2.3.3-1) unstable; urgency=low + + * Initial release (closes: #799173) + + -- Julien Bect Fri, 20 Nov 2015 11:19:50 +0100 diff --git a/control b/control new file mode 100644 index 0000000..a281050 --- /dev/null +++ b/control @@ -0,0 +1,23 @@ +Source: octave-stk +Section: math +Priority: optional +Maintainer: Debian Octave Group +Uploaders: Julien Bect , +Build-Depends: debhelper-compat (= 13), + dh-octave (>= 1.0.2) +Standards-Version: 4.6.0 +Homepage: https://octave.sourceforge.io/stk/ +Vcs-Git: https://salsa.debian.org/pkg-octave-team/octave-stk.git +Vcs-Browser: https://salsa.debian.org/pkg-octave-team/octave-stk +Testsuite: autopkgtest-pkg-octave +Rules-Requires-Root: no + +Package: octave-stk +Architecture: any +Depends: ${misc:Depends}, + ${octave:Depends}, + ${shlibs:Depends} +Description: (not so) Small Toolbox for Kriging + ${octave:Upstream-Description} + . + This Octave add-on package is part of the Octave-Forge project. diff --git a/copyright b/copyright new file mode 100644 index 0000000..6961494 --- /dev/null +++ b/copyright @@ -0,0 +1,49 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: stk package for Octave +Upstream-Contact: The Octave Community +Source: https://octave.sourceforge.io/stk/ + +Files: * +Copyright: 2015-2017, 2019-2022 CentraleSupelec + 2011-2014, SUPELEC + 2014, Ashwin Ravisankar + 2013, Guillaume Carlier + 2013, Florian Pasanisi + 2013, Valentin Resseguier + 2013, Alexandra Krauth + 2013, Elham Rahali + 2013, Derek Bingham, Simon Fraser University + 2012, Rik Wehbring + 1995-2012, Kurt Hornik + 2015-2017, LNE + 2005-2015, John W. Eaton + 2013-2015, Arun Giridhar + 2016, IRT SystemX + 2016, EDF R&D + 2007, Massachusetts Institute of Technology + 2010, Lyndon While, Lucas Bradstreet +License: GPL-3+ + +Files: debian/* +Copyright: 2015-2018 Julien Bect + 2017 Sébastien Villemot + 2016-2020, 2022 Rafael Laboissière +License: GPL-3+ + +License: GPL-3+ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License along + with this program. If not, see . + . + On Debian systems, the complete text of the GNU General Public + License, version 3, can be found in the file + `/usr/share/common-licenses/GPL-3'. diff --git a/gbp.conf b/gbp.conf new file mode 100644 index 0000000..6b65fe0 --- /dev/null +++ b/gbp.conf @@ -0,0 +1,4 @@ +[DEFAULT] +debian-branch = debian/latest +upstream-branch = upstream/latest +pristine-tar = True diff --git a/octave-stk.lintian-overrides b/octave-stk.lintian-overrides new file mode 100644 index 0000000..8069aef --- /dev/null +++ b/octave-stk.lintian-overrides @@ -0,0 +1,8 @@ +# The *.mex produced by the octave-stk package behave as plugin +# modules which are loaded at running time by Octave. There is no +# need to provide dependency information for them. +octave-stk: shared-library-lacks-prerequisites usr/lib/* + +# This is a false positive. The file +# usr/share/doc/octave-stk/changelog.gz is not the Debian changelog. +octave-stk: debian-changelog-file-is-a-symlink usr/share/doc/octave-stk/changelog.gz diff --git a/patches/0003-Mark-expected-failure.patch b/patches/0003-Mark-expected-failure.patch new file mode 100644 index 0000000..3bda6eb --- /dev/null +++ b/patches/0003-Mark-expected-failure.patch @@ -0,0 +1,21 @@ +Description: Mark one unit test as expected failure +Author: Julien Bect +Bug-Debian: https://bugs.debian.org/876777 +Forwarded: not-needed +Reviewed-By: Sébastien Villemot +Last-Update: 2019-10-24 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- a/inst/param/estim/stk_param_init.m ++++ b/inst/param/estim/stk_param_init.m +@@ -408,7 +408,9 @@ + %! xt = stk_sampling_regulargrid (NT, DIM, BOX); % Generate a regular grid + %! zt = stk_feval (f, xt); % Values of f on the grid + +-%!test ++%!xtest % This test is known to fail in Debian buster i386 ++%! % because of a known problem in Octave's sqp/qp functions ++%! % http://savannah.gnu.org/bugs/?38875 + %! model = stk_model (@stk_materncov_iso); + %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); + %! model.param = stk_param_estim (model, xi, zi, param0); diff --git a/patches/octave7.patch b/patches/octave7.patch new file mode 100644 index 0000000..1467f78 --- /dev/null +++ b/patches/octave7.patch @@ -0,0 +1,19 @@ +Description: Disable test that fails under Octave 7 + The test failure comes from a regression in Octave 7, see: + https://lists.debian.org/debian-octave/2022/04/msg00002.html +Author: Sébastien Villemot +Bug: https://savannah.gnu.org/bugs/index.php?62329 +Bug-Debian: https://bugs.debian.org/1009136 +Last-Update: 2022-04-19 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- a/inst/misc/distrib/stk_distrib_student_cdf.m ++++ b/inst/misc/distrib/stk_distrib_student_cdf.m +@@ -90,7 +90,6 @@ end % function + %!test + %! [p, q] = stk_distrib_student_cdf (1e10, 2); + %! assert (isequal (p, 1.0)); +-%! assert (stk_isequal_tolrel (q, 4.999999999999999999925e-21, 10 * eps)); + + %!assert (isequal (stk_distrib_student_cdf (0.0, 1), 0.5)); + %!assert (isequal (stk_distrib_student_cdf (inf, 1), 1.0)); diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..6eaa6ac --- /dev/null +++ b/patches/series @@ -0,0 +1,2 @@ +0003-Mark-expected-failure.patch +octave7.patch diff --git a/rules b/rules new file mode 100755 index 0000000..121f3c8 --- /dev/null +++ b/rules @@ -0,0 +1,5 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +%: + dh $@ --buildsystem=octave --with=octave diff --git a/source/format b/source/format new file mode 100644 index 0000000..46ebe02 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) \ No newline at end of file diff --git a/upstream/metadata b/upstream/metadata new file mode 100644 index 0000000..e00a6ff --- /dev/null +++ b/upstream/metadata @@ -0,0 +1,11 @@ +Archive: SourceForge +Reference: + Author: Bect, Julien and Vazquez, Emmanuel and others + Title: "STK: a Small (Matlab/Octave) Toolbox for Kriging. Release 2.6" + Year: 2019 + Type: misc + URL: http://kriging.sourceforge.net +Bug-Database: https://savannah.gnu.org/bugs/?group=octave +Bug-Submit: https://savannah.gnu.org/bugs/?func=additem&group=octave +Repository: https://github.com/stk-kriging/stk.git +Repository-Browse: https://octave.sourceforge.io/pkg-repository/stk/ diff --git a/watch b/watch new file mode 100644 index 0000000..348c1a6 --- /dev/null +++ b/watch @@ -0,0 +1,2 @@ +version=4 +http://sf.net/octave/stk-(.+)\.tar\.gz -- cgit v1.2.3 From e917be84142d673457211a9b59ed65ce89e2c8ca Mon Sep 17 00:00:00 2001 From: Julien Bect Date: Tue, 19 Apr 2022 10:10:14 -0300 Subject: Mark one unit test as expected failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug-Debian: https://bugs.debian.org/876777 Forwarded: not-needed Reviewed-By: Sébastien Villemot Last-Update: 2019-10-24 Last-Update: 2019-10-24 Gbp-Pq: Name 0003-Mark-expected-failure.patch --- inst/param/estim/stk_param_init.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inst/param/estim/stk_param_init.m b/inst/param/estim/stk_param_init.m index 0ba8fbc..a4ce106 100644 --- a/inst/param/estim/stk_param_init.m +++ b/inst/param/estim/stk_param_init.m @@ -408,7 +408,9 @@ end % function %! xt = stk_sampling_regulargrid (NT, DIM, BOX); % Generate a regular grid %! zt = stk_feval (f, xt); % Values of f on the grid -%!test +%!xtest % This test is known to fail in Debian buster i386 +%! % because of a known problem in Octave's sqp/qp functions +%! % http://savannah.gnu.org/bugs/?38875 %! model = stk_model (@stk_materncov_iso); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); -- cgit v1.2.3 From 44ba5dbbc6fddf0350b1f49d75d8f5c6766d9c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 19 Apr 2022 10:10:14 -0300 Subject: Disable test that fails under Octave 7 Bug: https://savannah.gnu.org/bugs/index.php?62329 Bug-Debian: https://bugs.debian.org/1009136 Last-Update: 2022-04-19 The test failure comes from a regression in Octave 7, see: https://lists.debian.org/debian-octave/2022/04/msg00002.html Last-Update: 2022-04-19 Gbp-Pq: Name octave7.patch --- inst/misc/distrib/stk_distrib_student_cdf.m | 1 - 1 file changed, 1 deletion(-) diff --git a/inst/misc/distrib/stk_distrib_student_cdf.m b/inst/misc/distrib/stk_distrib_student_cdf.m index 560afa1..e7a8ae5 100644 --- a/inst/misc/distrib/stk_distrib_student_cdf.m +++ b/inst/misc/distrib/stk_distrib_student_cdf.m @@ -90,7 +90,6 @@ end % function %!test %! [p, q] = stk_distrib_student_cdf (1e10, 2); %! assert (isequal (p, 1.0)); -%! assert (stk_isequal_tolrel (q, 4.999999999999999999925e-21, 10 * eps)); %!assert (isequal (stk_distrib_student_cdf (0.0, 1), 0.5)); %!assert (isequal (stk_distrib_student_cdf (inf, 1), 1.0)); -- cgit v1.2.3