summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CITATION23
-rw-r--r--COPYING674
-rw-r--r--ChangeLog8151
-rw-r--r--DESCRIPTION30
-rw-r--r--INDEX565
-rw-r--r--NEWS1175
-rw-r--r--debian/changelog (renamed from changelog)0
-rw-r--r--debian/control (renamed from control)0
-rw-r--r--debian/copyright (renamed from copyright)0
-rw-r--r--debian/octave-stk.lintian-overrides (renamed from octave-stk.lintian-overrides)0
-rw-r--r--debian/patches/0002-Remove-the-MOLE.patch (renamed from patches/0002-Remove-the-MOLE.patch)0
-rw-r--r--debian/patches/0003-Mark-expected-failure.patch (renamed from patches/0003-Mark-expected-failure.patch)0
-rw-r--r--debian/patches/series (renamed from patches/series)0
-rwxr-xr-xdebian/rules (renamed from rules)0
-rw-r--r--debian/source/format (renamed from source/format)0
-rw-r--r--debian/upstream/metadata (renamed from upstream/metadata)0
-rw-r--r--debian/watch (renamed from watch)0
-rw-r--r--doc/AUTHORS.md32
-rw-r--r--doc/README.md185
-rw-r--r--inst/arrays/@stk_dataframe/abs.m38
-rw-r--r--inst/arrays/@stk_dataframe/acos.m38
-rw-r--r--inst/arrays/@stk_dataframe/acosd.m38
-rw-r--r--inst/arrays/@stk_dataframe/acosh.m38
-rw-r--r--inst/arrays/@stk_dataframe/and.m33
-rw-r--r--inst/arrays/@stk_dataframe/apply.m74
-rw-r--r--inst/arrays/@stk_dataframe/asin.m38
-rw-r--r--inst/arrays/@stk_dataframe/asind.m38
-rw-r--r--inst/arrays/@stk_dataframe/asinh.m38
-rw-r--r--inst/arrays/@stk_dataframe/atan.m38
-rw-r--r--inst/arrays/@stk_dataframe/atand.m38
-rw-r--r--inst/arrays/@stk_dataframe/atanh.m38
-rw-r--r--inst/arrays/@stk_dataframe/bsxfun.m126
-rw-r--r--inst/arrays/@stk_dataframe/cat.m69
-rw-r--r--inst/arrays/@stk_dataframe/cos.m38
-rw-r--r--inst/arrays/@stk_dataframe/cosd.m38
-rw-r--r--inst/arrays/@stk_dataframe/cosh.m38
-rw-r--r--inst/arrays/@stk_dataframe/ctranspose.m47
-rw-r--r--inst/arrays/@stk_dataframe/diff.m33
-rw-r--r--inst/arrays/@stk_dataframe/disp.m65
-rw-r--r--inst/arrays/@stk_dataframe/display.m50
-rw-r--r--inst/arrays/@stk_dataframe/double.m52
-rw-r--r--inst/arrays/@stk_dataframe/end.m63
-rw-r--r--inst/arrays/@stk_dataframe/eq.m33
-rw-r--r--inst/arrays/@stk_dataframe/exp.m38
-rw-r--r--inst/arrays/@stk_dataframe/expm1.m38
-rw-r--r--inst/arrays/@stk_dataframe/fieldnames.m56
-rw-r--r--inst/arrays/@stk_dataframe/find.m45
-rw-r--r--inst/arrays/@stk_dataframe/ge.m33
-rw-r--r--inst/arrays/@stk_dataframe/get.m51
-rw-r--r--inst/arrays/@stk_dataframe/gt.m33
-rw-r--r--inst/arrays/@stk_dataframe/horzcat.m178
-rw-r--r--inst/arrays/@stk_dataframe/isempty.m33
-rw-r--r--inst/arrays/@stk_dataframe/isfinite.m38
-rw-r--r--inst/arrays/@stk_dataframe/isinf.m38
-rw-r--r--inst/arrays/@stk_dataframe/ismember.m70
-rw-r--r--inst/arrays/@stk_dataframe/isnan.m38
-rw-r--r--inst/arrays/@stk_dataframe/ldivide.m37
-rw-r--r--inst/arrays/@stk_dataframe/le.m33
-rw-r--r--inst/arrays/@stk_dataframe/length.m37
-rw-r--r--inst/arrays/@stk_dataframe/log.m38
-rw-r--r--inst/arrays/@stk_dataframe/log10.m38
-rw-r--r--inst/arrays/@stk_dataframe/log1p.m38
-rw-r--r--inst/arrays/@stk_dataframe/log2.m38
-rw-r--r--inst/arrays/@stk_dataframe/logical.m52
-rw-r--r--inst/arrays/@stk_dataframe/lt.m33
-rw-r--r--inst/arrays/@stk_dataframe/max.m69
-rw-r--r--inst/arrays/@stk_dataframe/mean.m43
-rw-r--r--inst/arrays/@stk_dataframe/median.m43
-rw-r--r--inst/arrays/@stk_dataframe/min.m69
-rw-r--r--inst/arrays/@stk_dataframe/minus.m37
-rw-r--r--inst/arrays/@stk_dataframe/mldivide.m88
-rw-r--r--inst/arrays/@stk_dataframe/mode.m43
-rw-r--r--inst/arrays/@stk_dataframe/mrdivide.m88
-rw-r--r--inst/arrays/@stk_dataframe/mtimes.m98
-rw-r--r--inst/arrays/@stk_dataframe/ne.m33
-rw-r--r--inst/arrays/@stk_dataframe/not.m33
-rw-r--r--inst/arrays/@stk_dataframe/openvar.m65
-rw-r--r--inst/arrays/@stk_dataframe/or.m33
-rw-r--r--inst/arrays/@stk_dataframe/plot.m284
-rw-r--r--inst/arrays/@stk_dataframe/plotmatrix.m125
-rw-r--r--inst/arrays/@stk_dataframe/plus.m38
-rw-r--r--inst/arrays/@stk_dataframe/power.m37
-rw-r--r--inst/arrays/@stk_dataframe/private/get_column_number.m30
-rw-r--r--inst/arrays/@stk_dataframe/private/names_errmsg.m44
-rw-r--r--inst/arrays/@stk_dataframe/private/process_cell_indices.m42
-rw-r--r--inst/arrays/@stk_dataframe/private/process_char_indices.m42
-rw-r--r--inst/arrays/@stk_dataframe/private/reserved_field_names.m33
-rw-r--r--inst/arrays/@stk_dataframe/prod.m43
-rw-r--r--inst/arrays/@stk_dataframe/quantile.m45
-rw-r--r--inst/arrays/@stk_dataframe/rdivide.m37
-rw-r--r--inst/arrays/@stk_dataframe/realpow.m37
-rw-r--r--inst/arrays/@stk_dataframe/reshape.m45
-rw-r--r--inst/arrays/@stk_dataframe/set.m110
-rw-r--r--inst/arrays/@stk_dataframe/set_data.m58
-rw-r--r--inst/arrays/@stk_dataframe/sin.m38
-rw-r--r--inst/arrays/@stk_dataframe/sind.m38
-rw-r--r--inst/arrays/@stk_dataframe/sinh.m38
-rw-r--r--inst/arrays/@stk_dataframe/size.m45
-rw-r--r--inst/arrays/@stk_dataframe/sort.m98
-rw-r--r--inst/arrays/@stk_dataframe/sqrt.m38
-rw-r--r--inst/arrays/@stk_dataframe/std.m47
-rw-r--r--inst/arrays/@stk_dataframe/stk_boundingbox.m45
-rw-r--r--inst/arrays/@stk_dataframe/stk_conditioning.m99
-rw-r--r--inst/arrays/@stk_dataframe/stk_dataframe.m366
-rw-r--r--inst/arrays/@stk_dataframe/stk_length.m39
-rw-r--r--inst/arrays/@stk_dataframe/stk_normalize.m64
-rw-r--r--inst/arrays/@stk_dataframe/stk_rescale.m53
-rw-r--r--inst/arrays/@stk_dataframe/stk_sprintf.m181
-rw-r--r--inst/arrays/@stk_dataframe/stk_sprintf_colnames.m45
-rw-r--r--inst/arrays/@stk_dataframe/stk_sprintf_rownames.m45
-rw-r--r--inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m36
-rw-r--r--inst/arrays/@stk_dataframe/subsasgn.m424
-rw-r--r--inst/arrays/@stk_dataframe/subsref.m170
-rw-r--r--inst/arrays/@stk_dataframe/sum.m43
-rw-r--r--inst/arrays/@stk_dataframe/tan.m38
-rw-r--r--inst/arrays/@stk_dataframe/tand.m38
-rw-r--r--inst/arrays/@stk_dataframe/tanh.m38
-rw-r--r--inst/arrays/@stk_dataframe/times.m37
-rw-r--r--inst/arrays/@stk_dataframe/transpose.m44
-rw-r--r--inst/arrays/@stk_dataframe/uminus.m33
-rw-r--r--inst/arrays/@stk_dataframe/unique.m55
-rw-r--r--inst/arrays/@stk_dataframe/uplus.m31
-rw-r--r--inst/arrays/@stk_dataframe/var.m47
-rw-r--r--inst/arrays/@stk_dataframe/vertcat.m207
-rw-r--r--inst/arrays/@stk_dataframe/xlim.m43
-rw-r--r--inst/arrays/@stk_dataframe/xor.m33
-rw-r--r--inst/arrays/@stk_dataframe/ylim.m43
-rw-r--r--inst/arrays/@stk_factorialdesign/contour.m36
-rw-r--r--inst/arrays/@stk_factorialdesign/fieldnames.m42
-rw-r--r--inst/arrays/@stk_factorialdesign/get.m44
-rw-r--r--inst/arrays/@stk_factorialdesign/ismember.m108
-rw-r--r--inst/arrays/@stk_factorialdesign/mesh.m36
-rw-r--r--inst/arrays/@stk_factorialdesign/meshc.m36
-rw-r--r--inst/arrays/@stk_factorialdesign/meshz.m36
-rw-r--r--inst/arrays/@stk_factorialdesign/ndgrid.m100
-rw-r--r--inst/arrays/@stk_factorialdesign/pcolor.m36
-rw-r--r--inst/arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m170
-rw-r--r--inst/arrays/@stk_factorialdesign/set.m61
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_boundingbox.m52
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_dataframe.m90
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_factorialdesign.m282
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_normalize.m49
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_rescale.m51
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_sprintf.m71
-rw-r--r--inst/arrays/@stk_factorialdesign/stk_sprintf_levels.m57
-rw-r--r--inst/arrays/@stk_factorialdesign/subsasgn.m60
-rw-r--r--inst/arrays/@stk_factorialdesign/surf.m36
-rw-r--r--inst/arrays/@stk_factorialdesign/uminus.m40
-rw-r--r--inst/arrays/@stk_hrect/axis.m70
-rw-r--r--inst/arrays/@stk_hrect/disp.m33
-rw-r--r--inst/arrays/@stk_hrect/display.m39
-rw-r--r--inst/arrays/@stk_hrect/get.m53
-rw-r--r--inst/arrays/@stk_hrect/horzcat.m90
-rw-r--r--inst/arrays/@stk_hrect/ismember.m96
-rw-r--r--inst/arrays/@stk_hrect/stk_boundingbox.m46
-rw-r--r--inst/arrays/@stk_hrect/stk_dataframe.m91
-rw-r--r--inst/arrays/@stk_hrect/stk_hrect.m118
-rw-r--r--inst/arrays/@stk_hrect/stk_normalize.m76
-rw-r--r--inst/arrays/@stk_hrect/stk_rescale.m125
-rw-r--r--inst/arrays/@stk_hrect/subsasgn.m48
-rw-r--r--inst/arrays/@stk_hrect/subsref.m71
-rw-r--r--inst/arrays/@stk_hrect/vertcat.m60
-rw-r--r--inst/arrays/generic/stk_boundingbox.m64
-rw-r--r--inst/arrays/generic/stk_commonsize.m82
-rw-r--r--inst/arrays/generic/stk_feval.m370
-rw-r--r--inst/arrays/generic/stk_length.m47
-rw-r--r--inst/arrays/generic/stk_normalize.m59
-rw-r--r--inst/arrays/generic/stk_rescale.m65
-rw-r--r--inst/arrays/generic/stk_sprintf.m83
-rw-r--r--inst/arrays/generic/stk_sprintf_colnames.m48
-rw-r--r--inst/arrays/generic/stk_sprintf_rownames.m48
-rw-r--r--inst/arrays/generic/stk_sprintf_sizetype.m49
-rw-r--r--inst/core/@stk_kreq_qr/disp.m33
-rw-r--r--inst/core/@stk_kreq_qr/display.m37
-rw-r--r--inst/core/@stk_kreq_qr/get.m109
-rw-r--r--inst/core/@stk_kreq_qr/linsolve.m44
-rw-r--r--inst/core/@stk_kreq_qr/private/compute_P_scaling.m36
-rw-r--r--inst/core/@stk_kreq_qr/stk_kreq_qr.m78
-rw-r--r--inst/core/@stk_kreq_qr/stk_set_righthandside.m46
-rw-r--r--inst/core/@stk_kreq_qr/stk_squared_seminorm.m52
-rw-r--r--inst/core/@stk_kreq_qr/stk_update.m87
-rw-r--r--inst/core/@stk_kreq_qr/subsref.m51
-rw-r--r--inst/core/stk_cholcov.m114
-rw-r--r--inst/core/stk_make_matcov.m127
-rw-r--r--inst/core/stk_model_update.m58
-rw-r--r--inst/core/stk_predict.m136
-rw-r--r--inst/core/stk_predict_leaveoneout.m118
-rw-r--r--inst/covfcs/rbf/stk_rbf_exponential.m116
-rw-r--r--inst/covfcs/rbf/stk_rbf_gauss.m86
-rw-r--r--inst/covfcs/rbf/stk_rbf_matern.m160
-rw-r--r--inst/covfcs/rbf/stk_rbf_matern32.m102
-rw-r--r--inst/covfcs/rbf/stk_rbf_matern52.m102
-rw-r--r--inst/covfcs/rbf/stk_rbf_spherical.m93
-rw-r--r--inst/covfcs/rbf/stk_sf_gausscorr.m35
-rw-r--r--inst/covfcs/rbf/stk_sf_matern.m35
-rw-r--r--inst/covfcs/rbf/stk_sf_matern32.m35
-rw-r--r--inst/covfcs/rbf/stk_sf_matern52.m35
-rw-r--r--inst/covfcs/stk_discretecov.m106
-rw-r--r--inst/covfcs/stk_expcov_aniso.m201
-rw-r--r--inst/covfcs/stk_expcov_iso.m165
-rw-r--r--inst/covfcs/stk_gausscov_aniso.m201
-rw-r--r--inst/covfcs/stk_gausscov_iso.m164
-rw-r--r--inst/covfcs/stk_materncov32_aniso.m203
-rw-r--r--inst/covfcs/stk_materncov32_iso.m165
-rw-r--r--inst/covfcs/stk_materncov52_aniso.m195
-rw-r--r--inst/covfcs/stk_materncov52_iso.m165
-rw-r--r--inst/covfcs/stk_materncov_aniso.m201
-rw-r--r--inst/covfcs/stk_materncov_iso.m172
-rw-r--r--inst/covfcs/stk_noisecov.m91
-rw-r--r--inst/covfcs/stk_sphcov_aniso.m202
-rw-r--r--inst/covfcs/stk_sphcov_iso.m165
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb01.m110
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb01n.m111
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb02.m89
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb02n.m95
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb03.m154
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb04.m33
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb05.m124
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb06.m101
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb07.m72
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb08.m97
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb09.m85
-rw-r--r--inst/examples/01_kriging_basics/stk_example_kb10.m70
-rw-r--r--inst/examples/02_design_of_experiments/stk_example_doe01.m77
-rw-r--r--inst/examples/02_design_of_experiments/stk_example_doe02.m87
-rw-r--r--inst/examples/02_design_of_experiments/stk_example_doe03.m178
-rw-r--r--inst/examples/02_design_of_experiments/stk_example_doe04.m103
-rw-r--r--inst/examples/02_design_of_experiments/stk_example_doe05.m186
-rw-r--r--inst/examples/03_miscellaneous/stk_example_misc01.m76
-rw-r--r--inst/examples/03_miscellaneous/stk_example_misc02.m136
-rw-r--r--inst/examples/03_miscellaneous/stk_example_misc03.m95
-rw-r--r--inst/examples/03_miscellaneous/stk_example_misc04.m102
-rw-r--r--inst/examples/03_miscellaneous/stk_example_misc05.m106
-rw-r--r--inst/examples/datasets/stk_dataset_twobumps.m152
-rw-r--r--inst/examples/test_functions/stk_testcase_truss3.m242
-rw-r--r--inst/examples/test_functions/stk_testfun_borehole.m95
-rw-r--r--inst/examples/test_functions/stk_testfun_braninhoo.m57
-rw-r--r--inst/examples/test_functions/stk_testfun_goldsteinprice.m97
-rw-r--r--inst/examples/test_functions/stk_testfun_truss3_bb.m129
-rw-r--r--inst/examples/test_functions/stk_testfun_truss3_vol.m71
-rw-r--r--inst/examples/test_functions/stk_testfun_twobumps.m57
-rw-r--r--inst/lm/@stk_lm_affine/feval.m41
-rw-r--r--inst/lm/@stk_lm_affine/stk_lm_affine.m41
-rw-r--r--inst/lm/@stk_lm_constant/feval.m41
-rw-r--r--inst/lm/@stk_lm_constant/stk_lm_constant.m41
-rw-r--r--inst/lm/@stk_lm_cubic/feval.m62
-rw-r--r--inst/lm/@stk_lm_cubic/stk_lm_cubic.m41
-rw-r--r--inst/lm/@stk_lm_matrix/feval.m40
-rw-r--r--inst/lm/@stk_lm_matrix/stk_lm_matrix.m61
-rw-r--r--inst/lm/@stk_lm_null/feval.m40
-rw-r--r--inst/lm/@stk_lm_null/stk_lm_null.m41
-rw-r--r--inst/lm/@stk_lm_quadratic/feval.m51
-rw-r--r--inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m41
-rw-r--r--inst/lm/stk_lm_polynomial.m85
-rw-r--r--inst/misc/benchmarks/stk_benchmark_.m63
-rw-r--r--inst/misc/benchmarks/stk_benchmark_bivnorm.m69
-rw-r--r--inst/misc/benchmarks/stk_benchmark_cov1.m49
-rw-r--r--inst/misc/benchmarks/stk_benchmark_cov2.m127
-rw-r--r--inst/misc/benchmarks/stk_benchmark_examples.m93
-rw-r--r--inst/misc/benchmarks/stk_benchmark_init.m43
-rw-r--r--inst/misc/benchmarks/stk_benchmark_logdet.m62
-rw-r--r--inst/misc/benchmarks/stk_benchmark_loocv.m85
-rw-r--r--inst/misc/benchmarks/stk_benchmark_paramestim.m94
-rw-r--r--inst/misc/benchmarks/stk_benchmark_predict.m92
-rw-r--r--inst/misc/benchmarks/stk_benchmark_uppertriangular.m92
-rw-r--r--inst/misc/design/stk_maxabscorr.m76
-rw-r--r--inst/misc/design/stk_phipcrit.m124
-rw-r--r--inst/misc/dist/stk_dist.m136
-rw-r--r--inst/misc/dist/stk_filldist.m201
-rw-r--r--inst/misc/dist/stk_filldist_discretized.m138
-rw-r--r--inst/misc/dist/stk_filldist_exact.m200
-rw-r--r--inst/misc/dist/stk_gpquadform.m183
-rw-r--r--inst/misc/dist/stk_mindist.m117
-rw-r--r--inst/misc/distrib/stk_distrib_bivnorm_cdf.m187
-rw-r--r--inst/misc/distrib/stk_distrib_logpdf.m55
-rw-r--r--inst/misc/distrib/stk_distrib_logpdf_grad.m55
-rw-r--r--inst/misc/distrib/stk_distrib_normal_cdf.m117
-rw-r--r--inst/misc/distrib/stk_distrib_normal_crps.m142
-rw-r--r--inst/misc/distrib/stk_distrib_normal_ei.m145
-rw-r--r--inst/misc/distrib/stk_distrib_normal_pdf.m74
-rw-r--r--inst/misc/distrib/stk_distrib_student_cdf.m98
-rw-r--r--inst/misc/distrib/stk_distrib_student_ei.m139
-rw-r--r--inst/misc/distrib/stk_distrib_student_pdf.m82
-rw-r--r--inst/misc/error/stk_assert_box.m74
-rw-r--r--inst/misc/error/stk_assert_model_struct.m45
-rw-r--r--inst/misc/error/stk_assert_no_duplicates.m51
-rw-r--r--inst/misc/error/stk_error.m95
-rw-r--r--inst/misc/mole/graphics_toolkit/graphics_toolkit.m69
-rw-r--r--inst/misc/mole/isrow/isrow.m34
-rw-r--r--inst/misc/mole/linsolve/linsolve.m141
-rw-r--r--inst/misc/mole/quantile/quantile.m463
-rw-r--r--inst/misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m49
-rw-r--r--inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m75
-rw-r--r--inst/misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m62
-rw-r--r--inst/misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m48
-rw-r--r--inst/misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m62
-rw-r--r--inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m830
-rw-r--r--inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m5
-rw-r--r--inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m7
-rw-r--r--inst/misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m62
-rw-r--r--inst/misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m48
-rw-r--r--inst/misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m99
-rw-r--r--inst/misc/optim/@stk_optim_optimizer_/stk_optim_isavailable.m43
-rw-r--r--inst/misc/optim/@stk_optim_optimizer_/stk_optim_optimizer_.m58
-rw-r--r--inst/misc/optim/stk_minimize_boxconstrained.m87
-rw-r--r--inst/misc/optim/stk_minimize_unconstrained.m87
-rw-r--r--inst/misc/optim/stk_optim_isavailable.m59
-rw-r--r--inst/misc/optim/stk_optim_testmin_box.m79
-rw-r--r--inst/misc/optim/stk_optim_testmin_unc.m72
-rw-r--r--inst/misc/optim/stk_select_optimizer.m106
-rw-r--r--inst/misc/options/stk_options_get.m88
-rw-r--r--inst/misc/options/stk_options_set.m192
-rw-r--r--inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m37
-rw-r--r--inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_feval.m48
-rw-r--r--inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_stop.m33
-rw-r--r--inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m65
-rw-r--r--inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_feval.m60
-rw-r--r--inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_stop.m39
-rw-r--r--inst/misc/parallel/stk_parallel_cutblocks.m56
-rw-r--r--inst/misc/parallel/stk_parallel_engine_get.m33
-rw-r--r--inst/misc/parallel/stk_parallel_engine_set.m51
-rw-r--r--inst/misc/parallel/stk_parallel_feval.m42
-rw-r--r--inst/misc/parallel/stk_parallel_start.m50
-rw-r--r--inst/misc/parallel/stk_parallel_stop.m33
-rw-r--r--inst/misc/pareto/stk_dominatedhv.m370
-rw-r--r--inst/misc/pareto/stk_isdominated.m117
-rw-r--r--inst/misc/pareto/stk_paretofind.m102
-rw-r--r--inst/misc/plot/stk_axes.m45
-rw-r--r--inst/misc/plot/stk_figure.m61
-rw-r--r--inst/misc/plot/stk_labels.m49
-rw-r--r--inst/misc/plot/stk_legend.m64
-rw-r--r--inst/misc/plot/stk_plot_getaxesarg.m60
-rw-r--r--inst/misc/plot/stk_plot_shadedci.m111
-rw-r--r--inst/misc/plot/stk_subplot.m50
-rw-r--r--inst/misc/plot/stk_title.m53
-rw-r--r--inst/misc/plot/stk_xlabel.m49
-rw-r--r--inst/misc/plot/stk_ylabel.m49
-rw-r--r--inst/misc/plot/stk_zlabel.m49
-rw-r--r--inst/misc/test/stk_is_lhs.m96
-rw-r--r--inst/misc/test/stk_isequal_tolabs.m129
-rw-r--r--inst/misc/test/stk_isequal_tolrel.m139
-rw-r--r--inst/misc/test/stk_runtests.m307
-rw-r--r--inst/misc/test/stk_test.m704
-rw-r--r--inst/misc/test/stk_test_class.m106
-rw-r--r--inst/misc/test/stk_test_dfbinaryop.m63
-rw-r--r--inst/misc/text/stk_disp_examplewelcome.m48
-rw-r--r--inst/misc/text/stk_disp_getformat.m120
-rw-r--r--inst/misc/text/stk_disp_isloose.m48
-rw-r--r--inst/misc/text/stk_disp_progress.m71
-rw-r--r--inst/misc/text/stk_sprintf_colvect.m59
-rw-r--r--inst/misc/text/stk_sprintf_colvect_fixedpoint.m147
-rw-r--r--inst/misc/text/stk_sprintf_colvect_scientific.m232
-rw-r--r--inst/misc/text/stk_sprintf_framed.m35
-rw-r--r--inst/model/@stk_model_/cat.m34
-rw-r--r--inst/model/@stk_model_/disp.m47
-rw-r--r--inst/model/@stk_model_/display.m48
-rw-r--r--inst/model/@stk_model_/get.m39
-rw-r--r--inst/model/@stk_model_/horzcat.m34
-rw-r--r--inst/model/@stk_model_/set.m38
-rw-r--r--inst/model/@stk_model_/stk_covmat_noise.m37
-rw-r--r--inst/model/@stk_model_/stk_get_input_data.m39
-rw-r--r--inst/model/@stk_model_/stk_get_observation_variances.m37
-rw-r--r--inst/model/@stk_model_/stk_get_output_data.m37
-rw-r--r--inst/model/@stk_model_/stk_get_prior_model.m37
-rw-r--r--inst/model/@stk_model_/stk_model_.m41
-rw-r--r--inst/model/@stk_model_/subsasgn.m48
-rw-r--r--inst/model/@stk_model_/subsref.m45
-rw-r--r--inst/model/@stk_model_/vertcat.m34
-rw-r--r--inst/model/@stk_model_gpposterior/disp.m79
-rw-r--r--inst/model/@stk_model_gpposterior/fieldnames.m36
-rw-r--r--inst/model/@stk_model_gpposterior/get.m61
-rw-r--r--inst/model/@stk_model_gpposterior/get_input_data.m33
-rw-r--r--inst/model/@stk_model_gpposterior/get_output_data.m33
-rw-r--r--inst/model/@stk_model_gpposterior/get_prior_model.m33
-rw-r--r--inst/model/@stk_model_gpposterior/set.m75
-rw-r--r--inst/model/@stk_model_gpposterior/stk_covmat_noise.m47
-rw-r--r--inst/model/@stk_model_gpposterior/stk_generate_samplepaths.m80
-rw-r--r--inst/model/@stk_model_gpposterior/stk_get_input_data.m33
-rw-r--r--inst/model/@stk_model_gpposterior/stk_get_observation_variances.m33
-rw-r--r--inst/model/@stk_model_gpposterior/stk_get_optimizable_noise_parameters.m33
-rw-r--r--inst/model/@stk_model_gpposterior/stk_get_optimizable_parameters.m41
-rw-r--r--inst/model/@stk_model_gpposterior/stk_get_output_data.m33
-rw-r--r--inst/model/@stk_model_gpposterior/stk_get_prior_model.m33
-rw-r--r--inst/model/@stk_model_gpposterior/stk_isnoisy.m34
-rw-r--r--inst/model/@stk_model_gpposterior/stk_make_kreq.m38
-rw-r--r--inst/model/@stk_model_gpposterior/stk_model_gpposterior.m145
-rw-r--r--inst/model/@stk_model_gpposterior/stk_model_update.m108
-rw-r--r--inst/model/@stk_model_gpposterior/stk_predict.m255
-rw-r--r--inst/model/@stk_model_gpposterior/stk_predict_leaveoneout.m122
-rw-r--r--inst/model/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m90
-rw-r--r--inst/model/@stk_model_gpposterior/stk_set_optimizable_parameters.m41
-rw-r--r--inst/model/noise/@stk_gaussiannoise_/disp.m52
-rw-r--r--inst/model/noise/@stk_gaussiannoise_/stk_covmat.m78
-rw-r--r--inst/model/noise/@stk_gaussiannoise_/stk_covmat_noise.m47
-rw-r--r--inst/model/noise/@stk_gaussiannoise_/stk_gaussiannoise_.m33
-rw-r--r--inst/model/noise/@stk_gaussiannoise_/stk_isnoisy.m33
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/disp.m59
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/fieldnames.m33
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/get.m49
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/set.m65
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m69
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/stk_get_optimizable_parameters.m33
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/stk_param_getdefaultbounds.m55
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/stk_set_optimizable_parameters.m54
-rw-r--r--inst/model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m68
-rw-r--r--inst/model/prior_struct/@struct/get_input_data.m33
-rw-r--r--inst/model/prior_struct/@struct/get_output_data.m33
-rw-r--r--inst/model/prior_struct/@struct/get_prior_model.m33
-rw-r--r--inst/model/prior_struct/stk_covmat_noise.m199
-rw-r--r--inst/model/prior_struct/stk_get_input_data.m50
-rw-r--r--inst/model/prior_struct/stk_get_observation_variances.m41
-rw-r--r--inst/model/prior_struct/stk_get_optimizable_model_parameters.m51
-rw-r--r--inst/model/prior_struct/stk_get_optimizable_noise_parameters.m60
-rw-r--r--inst/model/prior_struct/stk_get_output_data.m42
-rw-r--r--inst/model/prior_struct/stk_get_prior_model.m42
-rw-r--r--inst/model/prior_struct/stk_isnoisy.m73
-rw-r--r--inst/model/prior_struct/stk_model.m195
-rw-r--r--inst/model/prior_struct/stk_model_fixlm.m79
-rw-r--r--inst/model/prior_struct/stk_ortho_func.m105
-rw-r--r--inst/model/prior_struct/stk_set_optimizable_model_parameters.m72
-rw-r--r--inst/param/classes/stk_get_optimizable_parameters.m88
-rw-r--r--inst/param/classes/stk_set_optimizable_parameters.m81
-rw-r--r--inst/param/estim/stk_param_estim.m304
-rw-r--r--inst/param/estim/stk_param_estim_optim.m148
-rw-r--r--inst/param/estim/stk_param_getdefaultbounds.m152
-rw-r--r--inst/param/estim/stk_param_getdefaultbounds_lnv.m66
-rw-r--r--inst/param/estim/stk_param_gls.m105
-rw-r--r--inst/param/estim/stk_param_init.m506
-rw-r--r--inst/param/estim/stk_param_init_lnv.m117
-rw-r--r--inst/param/estim/stk_param_init_remlgls.m114
-rw-r--r--inst/param/estim/stk_param_relik.m255
-rw-r--r--inst/sampling/@stk_function/disp.m63
-rw-r--r--inst/sampling/@stk_function/display.m48
-rw-r--r--inst/sampling/@stk_function/feval.m36
-rw-r--r--inst/sampling/@stk_function/get.m33
-rw-r--r--inst/sampling/@stk_function/horzcat.m36
-rw-r--r--inst/sampling/@stk_function/stk_function.m66
-rw-r--r--inst/sampling/@stk_function/subsasgn.m50
-rw-r--r--inst/sampling/@stk_function/subsref.m53
-rw-r--r--inst/sampling/@stk_function/vertcat.m36
-rw-r--r--inst/sampling/@stk_sampcrit_akg/disp.m64
-rw-r--r--inst/sampling/@stk_sampcrit_akg/feval.m57
-rw-r--r--inst/sampling/@stk_sampcrit_akg/get.m33
-rw-r--r--inst/sampling/@stk_sampcrit_akg/set.m89
-rw-r--r--inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m186
-rw-r--r--inst/sampling/@stk_sampcrit_ei/disp.m56
-rw-r--r--inst/sampling/@stk_sampcrit_ei/feval.m37
-rw-r--r--inst/sampling/@stk_sampcrit_ei/get.m33
-rw-r--r--inst/sampling/@stk_sampcrit_ei/set.m69
-rw-r--r--inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m109
-rw-r--r--inst/sampling/@stk_sampcrit_eqi/disp.m64
-rw-r--r--inst/sampling/@stk_sampcrit_eqi/feval.m70
-rw-r--r--inst/sampling/@stk_sampcrit_eqi/get.m33
-rw-r--r--inst/sampling/@stk_sampcrit_eqi/set.m127
-rw-r--r--inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m203
-rw-r--r--inst/sampling/stk_halfpintl.m194
-rw-r--r--inst/sampling/stk_sampcrit_akg_eval.m228
-rw-r--r--inst/sampling/stk_sampcrit_ehvi_eval.m135
-rw-r--r--inst/sampling/stk_sampcrit_ei_eval.m95
-rw-r--r--inst/sampling/stk_sampcrit_emmi_eval.m117
-rw-r--r--inst/sampling/stk_sampling_halton_rr2.m138
-rw-r--r--inst/sampling/stk_sampling_maximinlhs.m161
-rw-r--r--inst/sampling/stk_sampling_nesteddesign.m223
-rw-r--r--inst/sampling/stk_sampling_nestedlhs.m277
-rw-r--r--inst/sampling/stk_sampling_olhs.m275
-rw-r--r--inst/sampling/stk_sampling_randomlhs.m104
-rw-r--r--inst/sampling/stk_sampling_randunif.m120
-rw-r--r--inst/sampling/stk_sampling_regulargrid.m144
-rw-r--r--inst/sampling/stk_sampling_sobol.m117
-rw-r--r--inst/sampling/stk_sampling_vdc_rr2.m59
-rw-r--r--inst/stk_init.m360
-rw-r--r--inst/stk_version.m34
-rw-r--r--inst/utils/stk_conditioning.m163
-rw-r--r--inst/utils/stk_generate_samplepaths.m238
-rw-r--r--inst/utils/stk_plot1d.m122
-rw-r--r--inst/utils/stk_plot_histnormres.m82
-rw-r--r--inst/utils/stk_plot_predvsobs.m70
-rw-r--r--inst/utils/stk_plot_probdom2d.m166
-rw-r--r--inst/utils/stk_pmisclass.m101
-rw-r--r--inst/utils/stk_simulate_noise.m73
-rw-r--r--post_install.m42
-rw-r--r--src/Makefile37
-rw-r--r--src/get_column_number.c189
-rw-r--r--src/pareto.h293
-rw-r--r--src/primes.h1013
-rw-r--r--src/stk_dist_matrixx.c97
-rw-r--r--src/stk_dist_matrixy.c97
-rw-r--r--src/stk_dist_pairwise.c94
-rw-r--r--src/stk_distrib_bivnorm0_cdf.c485
-rw-r--r--src/stk_dominatedhv_mex.c298
-rw-r--r--src/stk_filldist_discr_mex.c121
-rw-r--r--src/stk_gpquadform_matrixx.c119
-rw-r--r--src/stk_gpquadform_matrixy.c135
-rw-r--r--src/stk_gpquadform_pairwise.c113
-rw-r--r--src/stk_isdominated_mex.c109
-rw-r--r--src/stk_mex.h117
-rw-r--r--src/stk_mindist_mex.c106
-rw-r--r--src/stk_paretofind_mex.c91
-rw-r--r--src/stk_sampling_sobol_mex.c1267
-rw-r--r--src/stk_sampling_vdc_rr2.c372
-rw-r--r--src/wfg.c1095
-rw-r--r--src/wfg.h99
502 files changed, 57123 insertions, 0 deletions
diff --git a/CITATION b/CITATION
new file mode 100644
index 0000000..d3b03a0
--- /dev/null
+++ b/CITATION
@@ -0,0 +1,23 @@
+--------------------------------------------------------------------
+
+To cite this release of STK in publications use:
+
+ Julien Bect, Emmanuel Vazquez and others (2019).
+ STK: a Small (Matlab/Octave) Toolbox for Kriging. Release 2.6.
+ URL http://kriging.sourceforge.net
+
+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.6},
+ year = {2019},
+ url = {http://kriging.sourceforge.net}
+ }
+
+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. <http://fsf.org/>
+ 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 <http://www.gnu.org/licenses/>.
+
+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:
+
+ <program> Copyright (C) <year> <name of author>
+ 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
+<http://www.gnu.org/licenses/>.
+
+ 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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..447fa26
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,8151 @@
+2019-10-12 Julien Bect <julien.bect@centralesupelec.fr>
+
+ stk_factorialdesign.m: Provide missing help text (ticket #91)
+
+ * arrays/@stk_factorialdesign/stk_factorialdesign.m: Provide
+ missing help text.
+
+2019-09-06 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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.
+
+2019-09-03 Julien Bect <julien.bect@centralesupelec.fr>
+
+ Makefile: Use ${OCTAVE} from environment if defined
+
+ * Makefile: Use ${OCTAVE} from environment if defined.
+
+2019-08-14 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_options_set: Add help text.
+
+ * misc/options/stk_options_set.m: Add help text.
+
+2019-08-07 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_example_misc04.m: Fix a typo
+
+ * examples/03_miscellaneous/stk_example_misc04.m: Fix a typo.
+
+2019-02-15 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_runtests.m: Return a struct of results
+
+ * misc/test/stk_runtests.m: Return a struct of results.
+
+2019-02-04 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_plot_shadedci.m: Fix CI legend
+
+ * misc/plot/stk_plot_shadedci.m: Fix CI legend.
+
+2019-01-23 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_param_estim.m: Fix a corner case
+
+ * param/estim/stk_param_estim.m: Fix a corner case.
+
+2018-09-07 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_make_matcov.m: Remove some recent experimental code
+
+ * core/stk_make_matcov.m: Remove some recent experimental code.
+
+2018-07-18 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @stk_model_gpposterior/stk_model_gpposterior.m: Minor change
+
+ * core/@stk_model_gpposterior/stk_model_gpposterior.m: Minor change.
+
+2018-06-03 Julien Bect <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ Overload ismember for stk_factorialdesign objects (ticket #29)
+
+ * arrays/@stk_factorialdesign/ismember.m: New function
+
+2017-08-29 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @stk_dataframe/bsxfun.m: Fix colnames/rownames selection
+
+ * arrays/@stk_dataframe/bsxfun.m: Fix colnames/rownames selection.
+
+2017-07-24 Julien Bect <julien.bect@centralesupelec.fr>
+
+ @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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_dominatedhv_mex.c: Remove unused variable
+
+ * misc/pareto/private/stk_dominatedhv_mex.c: Remove unused variable.
+
+2017-01-27 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ core/stk_model_fixlm.m: Fix error message
+
+ * core/stk_model_fixlm.m: Fix error message.
+
+2016-07-21 Rémi Stroh <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <tom.assouline@supelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <tom.assouline@supelec.fr>
+
+ stk_sampcrit_thresholdbasedoptim.m: Fix nargin check
+
+ * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m:
+ Fix nargin check.
+
+2016-02-18 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <stefano.duhamel@supelec.fr>
+
+ 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 <stefano.duhamel@supelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_isequal_tolrel.m: Bugfix and unit test.
+
+ * misc/test/stk_isequal_tolrel.m: Bugfix and unit test.
+
+2015-11-27 Julien Bect <julien.bect@centralesupelec.fr>
+
+ @stk_dataframe/stk_sprintf.m: Fix header
+
+ * arrays/@stk_dataframe/stk_sprintf.m: Fix header.
+
+2015-11-25 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ Makefile: Fix 'clean' target (tab instead of spaces)
+
+ * admin/octpkg/Makefile: Fix 'clean' target (tabs instead of
+ spaces)
+
+2015-10-30 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ mole/matlab/file_in_path.m: Fix two bugs
+
+ * misc/mole/matlab/file_in_path.m: Fix two bugs.
+
+2015-10-10 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ README: Fix a typo
+
+ * README: Fix a typo
+
+2015-09-13 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <emmanuel.vazquez@centralesupelec.fr>
+
+ @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 <remi.stroh@lne.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ stk_commonsize.m: Avoid unnecessary calls to repmat.
+
+ * arrays/generic/stk_commonsize.m: Avoid unnecessary calls to
+ repmat.
+
+2015-06-11 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ @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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ wfg.c: Remove C99-specific code (stdbool.h).
+
+ * misc/pareto/private/wfg.c: Remove C99-specific code (stdbool.h).
+
+2015-05-27 Julien Bect <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@centralesupelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ @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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_hrect.m: Add help text
+
+ * arrays/@stk_hrect/stk_hrect.m: Add help text (closes ticket #27).
+
+2015-04-20 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_feval.m: Update documentation.
+
+ * stk_feval.m: Update documentation.
+
+2015-03-11 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_hrect.m: Provide default constructor
+
+ * arrays/@stk_hrect/stk_hrect.m: Provide default constructor
+
+2015-02-04 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ @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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_param_init.m: Fix a bug.
+
+ * paramestim/stk_param_init.m (paraminit_): Fix a bug.
+
+2015-01-25 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <emmanuel.vazquez@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Add the Goldstein-Price test function.
+
+ * examples/test_functions/stk_testfun_goldsteinprice.m:
+ Goldstein-Price test function.
+
+2014-09-29 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ @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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <paul.feliot@irt-systemx.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Add CITATION file.
+
+ * CITATION: Explain how to cite STK in publications.
+
+2014-08-18 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ @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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Add missing documentations.
+
+ * arrays/@stk_factorialdesign/ndgrid.m: Add doc.
+ * covfcs/stk_discretecov.m: Add doc.
+
+2014-08-13 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_param_estim.m: Warn about constant-response data.
+
+ * paramestim/stk_param_estim.m: Warn about constant-response data.
+
+2014-07-22 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ New example script illustrating random Pareto fronts.
+
+ * examples/03_miscellaneous/stk_example_misc04.m: New script.
+
+2014-07-18 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <ashwinr1993@gmail.com>
+
+ 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 <ashwinr1993@gmail.com>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_model.m: Accept function handles for covariance_type.
+
+ * core/stk_model.m: Accept function handles for covariance_type.
+
+2014-05-13 Emmanuel Vazquez <emmanuel.vazquez@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_generate_samplepaths.m: Deal with duplicates in xt.
+
+ * utils/stk_generate_samplepaths.m: Deal with duplicates in xt.
+
+2014-05-08 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ @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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Fix a bug in stk_predict ().
+
+ * core/stk_predict.m: Fix a bug
+
+2014-04-03 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ stk_param_relik: Fix help text.
+
+ * paramestim/stk_param_relik.m: Fix help text.
+
+2014-03-18 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Fix a bug in stk_param_init.
+
+ * paramestim/stk_param_init.m: modified
+
+2014-01-16 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Warn Octave users about the problem with MEX-files in privates folders.
+
+ * stk_build.m: modified
+
+2014-01-10 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Add a new example.
+
+ * examples/01_kriging_basics/stk_example_kb07.m: new script
+
+2013-11-19 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Rewrite the description of example 'misc02'.
+
+ * examples/03_miscellaneous/stk_example_misc02.m: modified
+
+2013-11-11 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Rewrite the description of example 'kb03'.
+
+ * examples/01_kriging_basics/stk_example_kb03.m: modified
+
+2013-10-20 Julien Bect <julien.bect@supelec.fr>
+
+ Fix a bug in stk_predict and add a test.
+
+ * core/stk_predict.m: modified
+
+2013-10-16 Julien Bect <julien.bect@supelec.fr>
+
+ Rewrite the description of example 'kb02'.
+
+ * examples/01_kriging_basics/stk_example_kb02.m: modified
+
+2013-10-15 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Make commonsize work directly on cell arrays when nargin == 1.
+
+ * misc/mole/common/commonsize.m: modified
+
+2013-09-27 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Fix a bug in stk_predict.
+
+ * core/stk_predict.m: modified
+
+2013-09-18 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <emmanuel.vazquez@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ @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 <emmanuel.vazquez@supelec.fr>
+
+ @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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Plot dataframes with two columns or more.
+
+ * utils/@stk_dataframe/plot.m: modified
+
+2013-09-04 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Fix a test.
+
+ * core/stk_predict.m: fix a test.
+
+2013-08-22 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Send a warning when negative variances are set to zero.
+
+ * core/stk_predict.m: modified.
+
+2013-06-18 Julien Bect <julien.bect@supelec.fr>
+
+ Overloaded quantile() function for dataframe objects.
+
+ * utils/@stk_dataframe/quantile.m: New function.
+
+2013-06-16 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <benoit.jan@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Fixing a bug affecting stk_predict() in the 'blocked' case.
+
+ * core/stk_predict.m: modified
+
+2012-12-07 Julien Bect <julien.bect@supelec.fr>
+
+ Minor improvement in stk_runexamples.
+
+ * misc/test/stk_runexamples.m: modified
+
+2012-12-06 Julien Bect <julien.bect@supelec.fr>
+
+ Removed some internal ".a" fields.
+
+ * core/stk_ortho_func.m: modified
+ * core/stk_make_matcov.m: modified
+
+2012-12-05 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Added a "pairwise" option to all covariance functions.
+
+ * covfcs/stk_materncov*.m: modified
+
+2012-12-02 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Modified stk_predict() to return the posterior covariance matrix
+ as a fourth output argument.
+
+ * core/stk_predict.m: modified
+
+2012-11-26 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Added a new function to generate OLHSs, following Ye (1998).
+
+ * sampling/stk_sampling_olhs.m: new function
+
+2012-11-21 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Adding default bounds for Matérn 3/2 covariances.
+
+ * paramestim/stk_param_estim.m: modified
+
+
+=====================
+=== Release 1.1 ===
+=====================
+
+2012-08-28 Emmanuel Vazquez <emmanuel.vazquez@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Fixed a warning generated by stk_compile_all under Octave.
+
+ * misc/config/stk_compile_all.m: modified
+
+2012-07-08 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <emmanuel.vazquez@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <emmanuel.vazquez@supelec.fr>
+
+ * 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Docs fixing.
+
+ * core/stk_make_matcov.m: Fixed doc.
+ * core/stk_predict.m: Fixed doc.
+
+2012-02-21 Julien Bect <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ Miscellaneous changes.
+
+ * tests/test_Kx_cache.m: New script.
+ * core/stk_make_matcov.m: Simplified syntax guessing.
+
+2012-02-17 Emmanuel Vazquez <emmanuel.vazquez@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <julien.bect@supelec.fr>
+
+ 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 <emmanuel.vazquez@supelec.fr>
+
+ Initial commit of STK.
diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..39168e9
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,30 @@
+Name: STK
+#
+Version: 2.6.1
+#
+Date: 2019-10-12
+#
+Title: STK: A Small Toolbox for Kriging
+#
+Author: See AUTHORS.md file
+#
+Maintainer: Julien BECT <julien.bect@centralesupelec.fr>
+ and Emmanuel VAZQUEZ <emmanuel.vazquez@centralesupelec.fr>
+#
+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://sourceforge.net/projects/kriging/
+#
+Depends: octave (>= 3.8.0)
+#
+Autoload: no
diff --git a/INDEX b/INDEX
new file mode 100644
index 0000000..e775f61
--- /dev/null
+++ b/INDEX
@@ -0,0 +1,565 @@
+stk >> STK, a Small Toolbox for Kriging
+
+## Copyright Notice
+##
+## Copyright (C) 2015-2019 CentraleSupelec
+## Copyright (C) 2014 SUPELEC
+##
+## Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+## Copying Permission Statement
+##
+## This file is part of
+##
+## STK: a Small (Matlab/Octave) Toolbox for Kriging
+## (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+## 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_conditioning
+ stk_generate_samplepaths
+ stk_simulate_noise
+ stk_isnoisy
+#stk_ortho_func [deprecated]
+#stk_cholcov [internal]
+#stk_model_fixlm [internal]
+#stk_covmat_noise [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]
+
+## Base class for model objects
+#@stk_model_/stk_model_ [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_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
+#@struct/get_input_data [deprecated]
+#@struct/get_output_data [deprecated]
+#@struct/get_prior_model [deprecated]
+#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
+ @stk_model_gpposterior/stk_predict_leaveoneout
+ @stk_model_gpposterior/stk_model_update
+#@stk_model_gpposterior/get_input_data [deprecated]
+#@stk_model_gpposterior/get_output_data [deprecated]
+#@stk_model_gpposterior/get_prior_model [deprecated]
+#@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_make_kreq [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]
+#@stk_kreq_qr/stk_update [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_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): criterions
+## note: some are in misc/design, others in misc/dist...
+## Shouldn't they all be in sampling/criterions ?
+ 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
+
+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_length
+ stk_normalize
+ stk_rescale
+ @stk_dataframe/stk_dataframe
+ @stk_factorialdesign/stk_factorialdesign
+ @stk_factorialdesign/ndgrid
+ @stk_hrect/stk_hrect
+
+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_length [overload STK]
+#@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_select_optimizer [deprecated]
+#@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]
+
+## 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..60ac2d4
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,1175 @@
+# 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
+ <http://kriging.sourceforge.net/htmldoc>.
+
+* 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/changelog b/debian/changelog
index 23ef585..23ef585 100644
--- a/changelog
+++ b/debian/changelog
diff --git a/control b/debian/control
index b90687e..b90687e 100644
--- a/control
+++ b/debian/control
diff --git a/copyright b/debian/copyright
index 020f727..020f727 100644
--- a/copyright
+++ b/debian/copyright
diff --git a/octave-stk.lintian-overrides b/debian/octave-stk.lintian-overrides
index 8069aef..8069aef 100644
--- a/octave-stk.lintian-overrides
+++ b/debian/octave-stk.lintian-overrides
diff --git a/patches/0002-Remove-the-MOLE.patch b/debian/patches/0002-Remove-the-MOLE.patch
index 9dda690..9dda690 100644
--- a/patches/0002-Remove-the-MOLE.patch
+++ b/debian/patches/0002-Remove-the-MOLE.patch
diff --git a/patches/0003-Mark-expected-failure.patch b/debian/patches/0003-Mark-expected-failure.patch
index f213e1e..f213e1e 100644
--- a/patches/0003-Mark-expected-failure.patch
+++ b/debian/patches/0003-Mark-expected-failure.patch
diff --git a/patches/series b/debian/patches/series
index e030d52..e030d52 100644
--- a/patches/series
+++ b/debian/patches/series
diff --git a/rules b/debian/rules
index 121f3c8..121f3c8 100755
--- a/rules
+++ b/debian/rules
diff --git a/source/format b/debian/source/format
index 46ebe02..46ebe02 100644
--- a/source/format
+++ b/debian/source/format
diff --git a/upstream/metadata b/debian/upstream/metadata
index 8a2989c..8a2989c 100644
--- a/upstream/metadata
+++ b/debian/upstream/metadata
diff --git a/watch b/debian/watch
index 348c1a6..348c1a6 100644
--- a/watch
+++ b/debian/watch
diff --git a/doc/AUTHORS.md b/doc/AUTHORS.md
new file mode 100644
index 0000000..f1fd4d5
--- /dev/null
+++ b/doc/AUTHORS.md
@@ -0,0 +1,32 @@
+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
+ * 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..551b591
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,185 @@
+
+# STK: a Small (Matlab/Octave) Toolbox for Kriging
+
+This README file is part of
+
+*STK: a Small (Matlab/Octave) Toolbox for Kriging*
+<http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+
+## General information
+
+ Version: 2.6.1 (2019-10-12)
+
+ Authors: See AUTHORS.md file
+
+ Maintainers: Julien Bect <julien.bect@centralesupelec.fr>
+ and Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+ 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-2019 CentraleSupelec.
+ See individual copyright notices for more details.
+
+ License: GNU General Public License, version 3 (GPLv3).
+ See COPYING for the full license.
+
+ URL: <http://sourceforge.net/projects/kriging>
+
+
+## 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](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 from the
+[STK project](https://sourceforge.net/projects/kriging/)
+[file release system](https://sourceforge.net/projects/kriging/files/)
+on SourceForge.
+
+Run `stk_init.m` in either Octave or Matlab.
+
+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.
+
+### 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/stk/index.html)
+[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 3.8.2 or newer, but
+ should probably also work with Octave 3.8.0 and 3.8.1.
+
+ Older versions of Octave (<= 3.6.2) are no longer supported, and
+ are known to contain bugs that prevent some STK functions from
+ working properly.
+
+
+### Requirements and recommendations for use with Matlab
+
+ The STK works with Matlab R2007a or newer.
+
+ 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:
+
+ <kriging-help@lists.sourceforge.net>
+ <https://sourceforge.net/p/kriging/mailman>
+
+ to ask for help on STK, and the ticket manager:
+
+ <https://sourceforge.net/p/kriging/tickets>
+
+ to report bugs or ask for new features.
diff --git a/inst/arrays/@stk_dataframe/abs.m b/inst/arrays/@stk_dataframe/abs.m
new file mode 100644
index 0000000..5a76b7c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5047cdf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..46b4cbc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..84d7e51
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..28dfacf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..fbb3b44
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..bc11204
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cc5ad7d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..de7c66d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..efbf6a1
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..91406b8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8da129b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..37a3a02
--- /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 <julien.bect@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8f2a367
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a85340b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ce2150f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b376a1f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6f8a98e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..41a9846
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..36080a0
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..adeb7d0
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d6e1e7b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d9143b2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..22fde62
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f0e572b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..48e3018
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0bf8a12
--- /dev/null
+++ b/inst/arrays/@stk_dataframe/fieldnames.m
@@ -0,0 +1,56 @@
+% FIELDNAMES [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2017 CentraleSupelec
+% Copyright (C) 2013 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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'});
+%! s1 = sort (fieldnames (x));
+%! s2 = {'colnames' 'data' 'info' 'rownames' 'u' 'v'};
+%! assert (all (strcmp (s1, s2)));
+
+%!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'}));
diff --git a/inst/arrays/@stk_dataframe/find.m b/inst/arrays/@stk_dataframe/find.m
new file mode 100644
index 0000000..67277fb
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f660005
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cb76750
--- /dev/null
+++ b/inst/arrays/@stk_dataframe/get.m
@@ -0,0 +1,51 @@
+% GET [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2013 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function value = get (x, propname)
+
+icol = __get_column_number__ (x.colnames, propname);
+
+switch icol
+ 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..146e751
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ccb2187
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<STISA>
+ % 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..0510618
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..56e1004
--- /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 <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d094fbf
--- /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 <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ad6af44
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f1b4e7c
--- /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 <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..85796c0
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..965c459
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..12ae6fe
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+
+function N = length (x) %#ok<STOUT>
+
+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..0b31b1e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..4d4b4ce
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..866ffb5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b0817dc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e19b8fd
--- /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 <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f532d92
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..780ee76
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9094acb
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5557a5c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6b84602
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c0024bc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b9cdb43
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..50f2e6a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cce9738
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b584e09
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..24c376c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..72c178b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0017151
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..497fe11
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d976dc0
--- /dev/null
+++ b/inst/arrays/@stk_dataframe/plot.m
@@ -0,0 +1,284 @@
+% PLOT [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2015-2017 CentraleSupelec
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<AGROW>
+ 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
+
+ % Tolerate row vector for z
+ if isrow (z), z = z'; end
+
+ % Create a default x
+ x = (1:(size (z, 1)))';
+
+else % General case
+
+ % Tolerate row vector for x
+ if isrow (x), x = x'; end
+
+ % Number of points
+ n = size (x, 1);
+
+ % Tolerate row vector for z
+ if isequal (size (z), [1 n]), 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
+%
+% <arg_list> ::= <arg_list_0> | h <arg_list_0>
+% <arg_list_0> ::= <plot_elem_list> <keyval_pairs>
+% <keyval_pairs> ::= k v | <keyval_pairs> k v
+% <plot_elem_list> ::= <plot_elem_single> | <plot_elem_several>
+% <plot_elem_several> ::= <plot_elem> | <plot_elem_several> <plot_elem>
+% <plot_elem_single> ::= <plot_elem> | <special_plot_elem>
+% <plot_elem> ::= x z | x z S
+% <special_plot_elem> ::= 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 ischar (varargin{2}) % S, key, val, ...
+
+ plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1));
+ keyval_pairs = parse_keyval_ (varargin{2:end});
+
+elseif length (varargin) == 2 % key, val
+
+ plot_elem = struct ('x', {x}, 'z', {z}, 'S', []);
+ keyval_pairs = varargin;
+
+elseif ~ ischar (varargin{3}) % S, x, z, ...
+
+ 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
+
+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..c397acd
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..2a41e85
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f9fc615
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9acf805
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+% 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..b7caa09
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8578082
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e09b8c4
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..4660232
--- /dev/null
+++ b/inst/arrays/@stk_dataframe/private/reserved_field_names.m
@@ -0,0 +1,33 @@
+% RESERVED_FIELD_NAMES [STK internal]
+
+% Copyright Notice
+%
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function c = reserved_field_names ()
+
+c = {'data', 'info', 'rownames', 'colnames'};
+
+end % function
diff --git a/inst/arrays/@stk_dataframe/prod.m b/inst/arrays/@stk_dataframe/prod.m
new file mode 100644
index 0000000..b38e813
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8085061
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ec9a45c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f18a39e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9f70286
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8104b03
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0f64270
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e3cdc3f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..08d0c3a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1e2f782
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..685b9c6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..934776a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..108b444
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5caf4d4
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..56e938c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..806e3e4
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b5b51dd
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<STISA>
+
+ 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_length.m b/inst/arrays/@stk_dataframe/stk_length.m
new file mode 100644
index 0000000..ed5a13d
--- /dev/null
+++ b/inst/arrays/@stk_dataframe/stk_length.m
@@ -0,0 +1,39 @@
+% STK_LENGTH [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function l = stk_length (x)
+
+l = 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..58a6782
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6c8cd18
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..29a035c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..408b568
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<AGROW>
+ 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..bc43af2
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<AGROW>
+ 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..882e4a0
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..eee72ab
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6575d21
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3f07c55
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..47f084a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8b008ea
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..34e1ff9
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5504819
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1adbc68
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d8d1eb3
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cf9143f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a31ea67
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..206caaf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..4e53b46
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<STISA>
+ % 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..6ee6353
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e935f7f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..66c5c15
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6c5f501
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8136bcf
--- /dev/null
+++ b/inst/arrays/@stk_factorialdesign/fieldnames.m
@@ -0,0 +1,42 @@
+% FIELDNAMES [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2015 CentraleSupelec
+% Copyright (C) 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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', '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..e0164c8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3b3a693
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..831ab6e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..eb66c9c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..85fae2f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f731f3a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..320472a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..755916d
--- /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 CentraleSupelec
+% Copyright (C) 2013 Valentin Resseguier
+% Copyright (C) 2012-2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+% Valentin Resseguier <valentin.resseguier@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+%
+% <arg_list> ::= <arg_list_0> | h <arg_list_0>
+% <arg_list_0> ::= x z <optional_arguments>
+
+% 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')
+ [ignd, h_plot] = contour ...
+ (h_axes, x, y, z, varargin{:}); %#ok<ASGLU> CG#07
+ else
+ h_plot = plotfun (h_axes, x, y, z, varargin{:});
+ end
+
+catch %#ok<CTCH>
+
+ % 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')
+ [ignd, h_plot] = contour (x, y, z, numarg{:}); %#ok<ASGLU> CG#07
+ else
+ h_plot = plotfun (x, y, z, numarg{:});
+ end
+
+ if ~ isempty (opts)
+ set (h_plot, opts{:});
+ end
+
+ axes (h1);
+
+ catch %#ok<CTCH>
+ axes (h1);
+ rethrow (lasterror ()); %#ok<LERR>
+ 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..6fae3ce
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8137b8f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..2111342
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..7a39f84
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f0705ef
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c454e7b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..553c0b8
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3fdf0f5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..4271973
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..68c8ba7
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..655f52d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6fcd918
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..97c06ac
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..08904e6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f94e427
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..02cf21e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..420f9b3
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0a26901
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..440a475
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..700d1e4
--- /dev/null
+++ b/inst/arrays/@stk_hrect/stk_hrect.m
@@ -0,0 +1,118 @@
+% 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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+ % NOTE: the following test uses (prod (size (arg1)) == 1) instead of
+ % isscalar because isscalar (x) means (numel (x) == 1) in Octave 3.8.2
+ % and therefore always returns true for stk_dataframe objects.
+
+ if (prod (size (arg1)) == 1) % 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..dae3f5b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..7ada8e6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<NASGU>
+ 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<NASGU>
+ 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..3bf191c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d921a4b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5e053d1
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..19dd251
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function box = stk_boundingbox (x)
+
+if ~ isnumeric (x)
+ stk_error (['The input argument should be a ' ...
+ 'numeric array.'], 'TypeMismatch');
+elseif ndims (x) ~= 2 %#ok<ISMAT> 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..4a40927
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a57d7bb
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<AGROW>
+ 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_length.m b/inst/arrays/generic/stk_length.m
new file mode 100644
index 0000000..e895d4d
--- /dev/null
+++ b/inst/arrays/generic/stk_length.m
@@ -0,0 +1,47 @@
+% STK_LENGTH return the "length" of an array
+%
+% CALL: L = stk_length (X)
+%
+% returns the "length" of the data array X.
+%
+% NOTE:
+%
+% Currently, the length of a data array (numeric array or stk_dataframe
+% object) is defined as SIZE (X, 1) but this might change in future
+% versions of STK. Note that this is not the same as length (X).
+
+% Copyright Notice
+%
+% Copyright (C) 2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function l = stk_length (x)
+
+l = 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..a3b34ae
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ea02190
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..39f1b5f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..118d425
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c98a39f
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..27966cd
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<AGROW>
+ 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..d412a50
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..59782cc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..13825c8
--- /dev/null
+++ b/inst/core/@stk_kreq_qr/get.m
@@ -0,0 +1,109 @@
+% GET [STK internal]
+%
+% 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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e01ca60
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ffefbcc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..43243c0
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d103c45
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0b71fbe
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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/stk_update.m b/inst/core/@stk_kreq_qr/stk_update.m
new file mode 100644
index 0000000..346ed41
--- /dev/null
+++ b/inst/core/@stk_kreq_qr/stk_update.m
@@ -0,0 +1,87 @@
+% STK_UPDATE [STK internal]
+%
+% CALL: kreq = stk_update (kreq, Kjj, Kji, Pj, Ktj)
+%
+% Experimental...
+
+% Copyright Notice
+%
+% Copyright (C) 2015 CentraleSupelec
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function kreq = stk_update (kreq, Kjj, Kji, Pj, Ktj)
+
+% Poor man's update...
+% TODO: implement efficient update equations (use qrinsert)
+
+LS = kreq.LS_Q * kreq.LS_R;
+Kii = LS(1:kreq.n, 1:kreq.n);
+Pi = bsxfun (@rdivide, LS(1:kreq.n, (kreq.n + 1):end), kreq.P_scaling);
+
+Kii = [[Kii Kji']; [Kji Kjj]];
+Pi = [Pi; Pj];
+
+old_scaling = kreq.P_scaling;
+kreq.P_scaling = compute_P_scaling (Kii, Pi);
+Pi = bsxfun (@times, Pi, kreq.P_scaling);
+
+LS = [[Kii Pi]; [Pi' zeros(kreq.r)]];
+[kreq.LS_Q, kreq.LS_R] = qr (LS);
+
+if ~ isempty (kreq.RS)
+ Kti = kreq.RS(1:kreq.n, :)';
+ Pt = bsxfun (@rdivide, kreq.RS((kreq.n + 1):end, :)', old_scaling);
+ kreq = stk_set_righthandside (kreq, [Kti Ktj], Pt);
+elseif nargin > 4
+ stk_error ('Too many input arguments: no RS to update', 'TooManyInputArgs');
+end
+
+kreq.n = kreq.n + size (Kjj, 1);
+
+end % function
+
+
+%!shared model, x, y
+%! model = stk_model ('stk_materncov32_iso', 1);
+%! model.param = log ([1.0; 2.8]);
+%! x = [1.2; 0.3; -1.9];
+%! y = 0.0;
+
+%!test
+%! kreqA = stk_kreq_qr (model, x);
+%! [Kii, Pi] = stk_make_matcov (model, x);
+%! kreqB = stk_kreq_qr (model, x(1));
+%! kreqB = stk_update (kreqB, Kii(2, 2), Kii(2, 1), Pi(2));
+%! kreqB = stk_update (kreqB, Kii(3, 3), Kii(3, [1 2]), Pi(3));
+%! assert (stk_isequal_tolabs (kreqA, kreqB, 3 * eps))
+
+%!test
+%! kreqA = stk_kreq_qr (model, x, y);
+%! [Kii, Pi] = stk_make_matcov (model, x);
+%! [Kti, Pt] = stk_make_matcov (model, y, x);
+%! kreqB = stk_kreq_qr (model, x(1), y);
+%! kreqB = stk_update (kreqB, Kii(2, 2), Kii(2, 1), Pi(2), Kti(2));
+%! kreqB = stk_update (kreqB, Kii(3, 3), Kii(3, [1 2]), Pi(3), Kti(3));
+%! assert (stk_isequal_tolabs (kreqA, kreqB, 3 * eps))
diff --git a/inst/core/@stk_kreq_qr/subsref.m b/inst/core/@stk_kreq_qr/subsref.m
new file mode 100644
index 0000000..78376ba
--- /dev/null
+++ b/inst/core/@stk_kreq_qr/subsref.m
@@ -0,0 +1,51 @@
+% SUBSREF [STK internal]
+%
+% 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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f752629
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..00ba38b
--- /dev/null
+++ b/inst/core/stk_make_matcov.m
@@ -0,0 +1,127 @@
+% 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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+x0 = double (x0);
+
+if (nargin > 2) && (~ isempty (x1))
+ x1 = double (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..2ea3597
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e91aff7
--- /dev/null
+++ b/inst/core/stk_predict.m
@@ -0,0 +1,136 @@
+% STK_PREDICT performs a kriging prediction from data
+%
+% CALL: ZP = stk_predict (MODEL, XI, ZI, XP)
+%
+% performs a kriging prediction at the points XP, given the observations
+% (XI, ZI) and the prior MODEL. The input arguments XI, ZI, and XP can be
+% either numerical matrices or dataframes. More precisely, on a factor 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 kriging predictor in the first column (ZP.mean), and
+% * the kriging 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, XI, ZI, XP)
+%
+% also returns the matrix of kriging weights LAMBDA and the matrix of
+% Lagrange multipliers MU.
+%
+% CALL: [ZP, LAMBDA, MU, K] = stk_predict (MODEL, XI, ZI, XP)
+%
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function varargout = stk_predict (M_prior, x_obs, z_obs, x_prd)
+
+M_post = stk_model_gpposterior (M_prior, x_obs, z_obs);
+
+varargout = cell (1, max (1, nargout));
+[varargout{:}] = stk_predict (M_post, 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);
+%!error y_prd1 = stk_predict (model, x_obs);
+%!error y_prd1 = stk_predict (model, x_obs, z_obs);
+%!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..0dcffcf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a7c5425
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..735d5ba
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..64356cf
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ba91564
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c12c0ba
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1062d81
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a8584cd
--- /dev/null
+++ b/inst/covfcs/rbf/stk_sf_gausscorr.m
@@ -0,0 +1,35 @@
+% STK_SF_GAUSSCORR is deprecated, use stk_rbf_gauss instead
+%
+% See also: stk_rbf_gauss
+
+% Copyright Notice
+%
+% Copyright (C) 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0627fef
--- /dev/null
+++ b/inst/covfcs/rbf/stk_sf_matern.m
@@ -0,0 +1,35 @@
+% STK_SF_MATERN is deprecated, use stk_rbf_matern instead
+%
+% See also: stk_rbf_matern
+
+% Copyright Notice
+%
+% Copyright (C) 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..43a6e80
--- /dev/null
+++ b/inst/covfcs/rbf/stk_sf_matern32.m
@@ -0,0 +1,35 @@
+% STK_SF_MATERN32 is deprecated, use stk_rbf_matern32 instead
+%
+% See also: stk_rbf_matern32
+
+% Copyright Notice
+%
+% Copyright (C) 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d59e639
--- /dev/null
+++ b/inst/covfcs/rbf/stk_sf_matern52.m
@@ -0,0 +1,35 @@
+% STK_SF_MATERN52 is deprecated, use stk_rbf_matern52 instead
+%
+% See also: stk_rbf_matern52
+
+% Copyright Notice
+%
+% Copyright (C) 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0789109
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9bae597
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9f00faf
--- /dev/null
+++ b/inst/covfcs/stk_expcov_iso.m
@@ -0,0 +1,165 @@
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% 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 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..f68d602
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..90c005b
--- /dev/null
+++ b/inst/covfcs/stk_gausscov_iso.m
@@ -0,0 +1,164 @@
+% 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 CentraleSupelec
+% Copyright (C) 2013 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% 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 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..bc22cb6
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5e5a389
--- /dev/null
+++ b/inst/covfcs/stk_materncov32_iso.m
@@ -0,0 +1,165 @@
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% 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 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..bf1523d
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..65a7e0f
--- /dev/null
+++ b/inst/covfcs/stk_materncov52_iso.m
@@ -0,0 +1,165 @@
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% 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 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..ed1859c
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ee4bdde
--- /dev/null
+++ b/inst/covfcs/stk_materncov_iso.m
@@ -0,0 +1,172 @@
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% 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 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..cb89c5a
--- /dev/null
+++ b/inst/covfcs/stk_noisecov.m
@@ -0,0 +1,91 @@
+% STK_NOISECOV [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..92bb4d9
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ea3c8c5
--- /dev/null
+++ b/inst/covfcs/stk_sphcov_iso.m
@@ -0,0 +1,165 @@
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% 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 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..5255cbc
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9ce53d5
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b4e723f
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b0d2407
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3236f4f
--- /dev/null
+++ b/inst/examples/01_kriging_basics/stk_example_kb03.m
@@ -0,0 +1,154 @@
+% 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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% Compute an initial guess for the parameters of the Matern covariance (param0)
+% and a reasonable log-variance for a small "regularization noise"
+[param0, model.lognoisevariance] = 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..46708d8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a79c368
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..569fdfa
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6ca6f16
--- /dev/null
+++ b/inst/examples/01_kriging_basics/stk_example_kb07.m
@@ -0,0 +1,72 @@
+% STK_EXAMPLE_KB07 Simulation of sample paths from a Matern process
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+stk_disp_examplewelcome; stk_figure ('stk_example_kb07');
+
+
+%% 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);
+
+% Model
+model = stk_model ('stk_materncov_iso');
+SIGMA2 = 1.0; % variance parameter
+NU = NaN; % regularity parameter
+RHO1 = 0.4; % scale (range) parameter
+model.param = log ([SIGMA2; NU; 1/RHO1]);
+
+% Several values for nu
+nu_list = [0.5 1.5 2.5 10.0];
+
+
+%% Generate (unconditional) sample paths
+
+NB_PATHS = 10;
+
+for k = 1:4
+
+ model.param(2) = log (nu_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, nu = %.1f', nu_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..72f2fb4
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e766eea
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..bd7a4f6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+% Compye 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..a08f098
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f111c2a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..73f1e0e
--- /dev/null
+++ b/inst/examples/02_design_of_experiments/stk_example_doe03.m
@@ -0,0 +1,178 @@
+% 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 CentraleSupelec
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 names 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 names 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).
+%
+
+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
+RHO1 = 2.0; % scale (range) parameter
+model.param = log ([SIGMA2; 1/RHO1]);
+
+% 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); hold off; % CG#12
+ 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<AGROW>
+ 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..87434ab
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3ea5500
--- /dev/null
+++ b/inst/examples/02_design_of_experiments/stk_example_doe05.m
@@ -0,0 +1,186 @@
+% 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 CentraleSupelec
+% Copyright (C) 2016 EDF R&D
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+stk_disp_examplewelcome;
+stk_figure ('stk_example_eqi_test');
+
+
+%% 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
+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 names 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 two 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'
+ sampcrit = stk_sampcrit_akg ();
+end
+
+
+%% Initial design of experiments
+
+% Construction of the initial design
+x0 = stk_sampling_regulargrid (N0, DIM, BOX);
+
+% Give names 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 EQI criterion on the grid
+ [crit_val, z_pred] = sampcrit (xg);
+
+ if mod (iter, PLOT_PERIOD) == 1
+ % Figure: upper panel
+ stk_subplot (2, 1, 1); hold off; % CG#12
+ stk_plot1d ([],[], xg, zg, z_pred);
+ hold on; plot (x, z, 'k.');
+ % Figure: lower panel
+ stk_subplot (2, 1, 2); cla;
+ plot (xg, crit_val); xlim (BOX); ylabel (SAMPCRIT_NAME);
+ end
+
+ if all (crit_val == 0), break, end
+
+ % Pick the point where the EQI 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);
+
+% Total number of evaluations ?
+fprintf ('\nNumber of evaluations: %d + %d = %d.\n\n', N0, BUDGET - N0, BUDGET);
+
+
+%#ok<*AGROW>
+
+%!test stk_example_doe05; 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..75bf608
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8e12cba
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a1b9bd4
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3a950af
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..46e848c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..17cf02d
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement (STK toolbox)
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+% 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 <http://creativecommons.org/publicdomain/zero/1.0/>
+
+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..e1bb58c
--- /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 <julien.bect@centralesupelec.fr>.
+%
+% 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
+% <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+% Copying Permission Statement (STK toolbox as a whole)
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..47c088a
--- /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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0626b1c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e653389
--- /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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8d94687
--- /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 <julien.bect@centralesupelec.fr>.
+%
+% 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
+% <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+% Copying Permission Statement (STK toolbox as a whole)
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..59ff087
--- /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 <julien.bect@centralesupelec.fr>.
+%
+% 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
+% <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+% Copying Permission Statement (STK toolbox as a whole)
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1f30841
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+% 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 <http://creativecommons.org/publicdomain/zero/1.0/>
+
+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..a320e8a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function z = feval (lm, x) %#ok<INUSL>
+
+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..82bb3ae
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ebfd201
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function z = feval (lm, x) %#ok<INUSL>
+
+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..9fe8ae5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e7206e0
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function z = feval (lm, x) %#ok<INUSL>
+
+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..19afec5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1b87f62
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..93699c0
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..604477b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function z = feval (lm, x) %#ok<INUSL>
+
+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..41cfeaf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a22751b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function z = feval (lm, x) %#ok<INUSL>
+
+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..c102878
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6f466c2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..fe11ee3
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..496fce6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b997769
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+%% 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..6beb775
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+%% 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..43f2b3f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6a6370b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..93aad4b
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+% 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..974d04f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..879d7f7
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cb118f8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f05555d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+
+%% 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..90de6b2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ed38c4d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b9406c4
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0499281
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..952395f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..158e36f
--- /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 <julien.bect@centralesupelec.fr>
+% Florian Pasanisi <florian.pasanisi@gmail.com>
+% and Guillaume Carlier
+%
+% Maintainer: Julien Bect <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..610ac37
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0594a6e
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..54f5cca
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9e72a52
--- /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 <julien.bect@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..dfe7695
--- /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 <julien.bect@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..02c06e8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a5c7c77
--- /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 <remi.stroh@lne.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a7a8b44
--- /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 <julien.bect@centralesupelec.fr>
+% Romain Benassi <romain.benassi@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..70bcacf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..46fb85c
--- /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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..64aa4bb
--- /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 <julien.bect@centralesupelec.fr>
+% Romain Benassi <romain.benassi@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..03b7bd7
--- /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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b6f9709
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<ISMAT> 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..7f11847
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6f0c706
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6755f0e
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 <make my day> stk_error(errmsg, mnemonic);
+
+% Use of an incorrect stack structure
+%!error <stack structure> stk_error (errmsg, mnemonic, badstack);
+%!error id=STK:stk_error:InvalidArgument stk_error (errmsg, mnemonic, badstack);
diff --git a/inst/misc/mole/graphics_toolkit/graphics_toolkit.m b/inst/misc/mole/graphics_toolkit/graphics_toolkit.m
new file mode 100644
index 0000000..6e43015
--- /dev/null
+++ b/inst/misc/mole/graphics_toolkit/graphics_toolkit.m
@@ -0,0 +1,69 @@
+% GRAPHICS_TOOLKIT indicates which toolkit is assigned to new figures.
+%
+% This is a (partial) replacement for the graphics_toolkit function that is missing both
+% from Matlab and from some old version f Octave.
+%
+% CALL: NAME = graphics_toolkit ()
+%
+% returns:
+%
+% * the result of get (0, 'defaultfigure__backend__') if you're running an old version
+% of Octave that does not have graphics_toolkit,
+%
+% * 'matlab-nojvm' if running Matlab without the Java Virtual Machine,
+%
+% * 'matlab-jvm' if running Matlab with the Java Virtual Machine.
+
+% Copyright Notice
+%
+% Copyright (C) 2013, 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function name = graphics_toolkit ()
+
+if exist ('OCTAVE_VERSION', 'builtin') == 5 % Octave
+
+ try
+ % This should work on older versions of Octave, e.g., 3.2.4
+ % (there was no notion of a 'toolkit' at the time, but if gnuplot
+ % is reported as the backend, then it is also the toolkit)
+ name = get (0, 'defaultfigure__backend__');
+ catch
+ error ('Unable to determine which toolkit is being used.');
+ end
+
+else % Matlab
+
+ try
+ assert (usejava ('jvm'));
+ name = 'matlab-jvm';
+ catch
+ name = 'matlab-nojvm';
+ end
+
+end
+
+end % function
+
+%#ok<*CTCH>
diff --git a/inst/misc/mole/isrow/isrow.m b/inst/misc/mole/isrow/isrow.m
new file mode 100644
index 0000000..2b1b1b5
--- /dev/null
+++ b/inst/misc/mole/isrow/isrow.m
@@ -0,0 +1,34 @@
+% ISROW returns true for row vectors and false otherwise
+
+% Copyright Notice
+%
+% Copyright (C) 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function b = isrow (x)
+
+n = length (x);
+b = isequal (size (x), [1 n]);
+
+end % function
diff --git a/inst/misc/mole/linsolve/linsolve.m b/inst/misc/mole/linsolve/linsolve.m
new file mode 100644
index 0000000..078de06
--- /dev/null
+++ b/inst/misc/mole/linsolve/linsolve.m
@@ -0,0 +1,141 @@
+## Copyright (C) 2013 Nir Krakauer
+##
+## 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 <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{x} =} linsolve (@var{A}, @var{b})
+## @deftypefnx {Function File} {@var{x} =} linsolve (@var{A}, @var{b}, @var{opts})
+## @deftypefnx {Function File} {[@var{x}, @var{R}] =} linsolve (@dots{})
+## Solve the linear system @code{A*x = b}.
+##
+## With no options, this function is equivalent to the left division operator
+## @w{(@code{x = A \ b})} or the matrix-left-divide function
+## @w{(@code{x = mldivide (A, b)})}.
+##
+## Octave ordinarily examines the properties of the matrix @var{A} and chooses
+## a solver that best matches the matrix. By passing a structure @var{opts}
+## to @code{linsolve} you can inform Octave directly about the matrix @var{A}.
+## In this case Octave will skip the matrix examination and proceed directly
+## to solving the linear system.
+##
+## @strong{Warning:} If the matrix @var{A} does not have the properties
+## listed in the @var{opts} structure then the result will not be accurate
+## AND no warning will be given. When in doubt, let Octave examine the matrix
+## and choose the appropriate solver as this step takes little time and the
+## result is cached so that it is only done once per linear system.
+##
+## Possible @var{opts} fields (set value to true/false):
+##
+## @table @asis
+## @item LT
+## @var{A} is lower triangular
+##
+## @item UT
+## @var{A} is upper triangular
+##
+## @item UHESS
+## @var{A} is upper Hessenberg (currently makes no difference)
+##
+## @item SYM
+## @var{A} is symmetric or complex Hermitian (currently makes no difference)
+##
+## @item POSDEF
+## @var{A} is positive definite
+##
+## @item RECT
+## @var{A} is general rectangular (currently makes no difference)
+##
+## @item TRANSA
+## Solve @code{A'*x = b} by @code{transpose (A) \ b}
+## @end table
+##
+## The optional second output @var{R} is the inverse condition number of
+## @var{A} (zero if matrix is singular).
+## @seealso{mldivide, matrix_type, rcond}
+## @end deftypefn
+
+## Author: Nir Krakauer <nkrakauer@ccny.cuny.edu>
+
+## STK notes:
+## * This version of linsolve.m comes from revision b66f068e4468 of Octave's
+## hg repository (changeset by Nir Krakauer on 2013-09-26, 09:38:51)
+## * The only change that has been made is the introduction of a tolerance
+## in the first assert of the first unit test, that's all !
+
+function [x, R] = linsolve (A, b, opts)
+
+ if (nargin < 2 || nargin > 3)
+ print_usage ();
+ endif
+
+ if (! (isnumeric (A) && isnumeric (b)))
+ error ("linsolve: A and B must be numeric");
+ endif
+
+ ## Process any opts
+ if (nargin > 2)
+ if (! isstruct (opts))
+ error ("linsolve: OPTS must be a structure");
+ endif
+ trans_A = false;
+ if (isfield (opts, "TRANSA") && opts.TRANSA)
+ trans_A = true;
+ A = A';
+ endif
+ if (isfield (opts, "POSDEF") && opts.POSDEF)
+ A = matrix_type (A, "positive definite");
+ endif
+ if (isfield (opts, "LT") && opts.LT)
+ if (trans_A)
+ A = matrix_type (A, "upper");
+ else
+ A = matrix_type (A, "lower");
+ endif
+ endif
+ if (isfield (opts, "UT") && opts.UT)
+ if (trans_A)
+ A = matrix_type (A, "lower");
+ else
+ A = matrix_type (A, "upper");
+ endif
+ endif
+ endif
+
+ x = A \ b;
+
+ if (nargout > 1)
+ if (issquare (A))
+ R = rcond (A);
+ else
+ R = 0;
+ endif
+ endif
+endfunction # linsolve
+
+
+%!test
+%! n = 4;
+%! A = triu (rand (n));
+%! x = rand (n, 1);
+%! b = A' * x;
+%! opts.UT = true;
+%! opts.TRANSA = true;
+%! assert (linsolve (A, b, opts), A' \ b, 1e-12);
+
+%!error linsolve ()
+%!error linsolve (1)
+%!error linsolve (1,2,3)
+%!error <A and B must be numeric> linsolve ({1},2)
+%!error <A and B must be numeric> linsolve (1,{2})
+%!error <OPTS must be a structure> linsolve (1,2,3)
diff --git a/inst/misc/mole/quantile/quantile.m b/inst/misc/mole/quantile/quantile.m
new file mode 100644
index 0000000..1d21751
--- /dev/null
+++ b/inst/misc/mole/quantile/quantile.m
@@ -0,0 +1,463 @@
+% QUANTILE ...
+
+% Copyright Notice
+%
+% Copyright (C) 2013 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+%
+% The function comes from Octave 3.7.6+'s quantile.m, with minor
+% modifications. The original copyright notice was:
+%
+% Copyright (C) 2008-2012 Ben Abbott and Jaroslav Hajek
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+% ## Copyright (C) 2008-2012 Ben Abbott and Jaroslav Hajek
+% ##
+% ## 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
+% ## <http://www.gnu.org/licenses/>.
+%
+% ## -*- texinfo -*-
+% ## @deftypefn {Function File} {@var{q} =} quantile (@var{x})
+% ## @deftypefnx {Function File} {@var{q} =} quantile (@var{x}, @var{p})
+% ## @deftypefnx {Function File} {@var{q} =} quantile (@var{x}, @var{p}, @var{dim})
+% ## @deftypefnx {Function File} {@var{q} =} quantile (@var{x}, @var{p}, @var{dim}, @var{method})
+% ## For a sample, @var{x}, calculate the quantiles, @var{q}, corresponding to
+% ## the cumulative probability values in @var{p}. All non-numeric values (NaNs)
+% ## of @var{x} are ignored.
+% ##
+% ## If @var{x} is a matrix, compute the quantiles for each column and
+% ## return them in a matrix, such that the i-th row of @var{q} contains
+% ## the @var{p}(i)th quantiles of each column of @var{x}.
+% ##
+% ## If @var{p} is unspecified, return the quantiles for
+% ## @code{[0.00 0.25 0.50 0.75 1.00]}.
+% ## The optional argument @var{dim} determines the dimension along which
+% ## the quantiles are calculated. If @var{dim} is omitted, and @var{x} is
+% ## a vector or matrix, it defaults to 1 (column-wise quantiles). If
+% ## @var{x} is an N-D array, @var{dim} defaults to the first non-singleton
+% ## dimension.
+% ##
+% ## The methods available to calculate sample quantiles are the nine methods
+% ## used by R (@url{http://www.r-project.org/}). The default value is
+% ## @w{METHOD = 5}.
+% ##
+% ## Discontinuous sample quantile methods 1, 2, and 3
+% ##
+% ## @enumerate 1
+% ## @item Method 1: Inverse of empirical distribution function.
+% ##
+% ## @item Method 2: Similar to method 1 but with averaging at discontinuities.
+% ##
+% ## @item Method 3: SAS definition: nearest even order statistic.
+% ## @end enumerate
+% ##
+% ## Continuous sample quantile methods 4 through 9, where p(k) is the linear
+% ## interpolation function respecting each methods' representative cdf.
+% ##
+% ## @enumerate 4
+% ## @item Method 4: p(k) = k / n. That is, linear interpolation of the
+% ## empirical cdf.
+% ##
+% ## @item Method 5: p(k) = (k - 0.5) / n. That is a piecewise linear function
+% ## where the knots are the values midway through the steps of the empirical
+% ## cdf.
+% ##
+% ## @item Method 6: p(k) = k / (n + 1).
+% ##
+% ## @item Method 7: p(k) = (k - 1) / (n - 1).
+% ##
+% ## @item Method 8: p(k) = (k - 1/3) / (n + 1/3). The resulting quantile
+% ## estimates are approximately median-unbiased regardless of the distribution
+% ## of @var{x}.
+% ##
+% ## @item Method 9: p(k) = (k - 3/8) / (n + 1/4). The resulting quantile
+% ## estimates are approximately unbiased for the expected order statistics if
+% ## @var{x} is normally distributed.
+% ## @end enumerate
+% ##
+% ## Hyndman and Fan (1996) recommend method 8. Maxima, S, and R
+% ## (versions prior to 2.0.0) use 7 as their default. Minitab and SPSS
+% ## use method 6. @sc{matlab} uses method 5.
+% ##
+% ## References:
+% ##
+% ## @itemize @bullet
+% ## @item Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New
+% ## S Language. Wadsworth & Brooks/Cole.
+% ##
+% ## @item Hyndman, R. J. and Fan, Y. (1996) Sample quantiles in
+% ## statistical packages, American Statistician, 50, 361--365.
+% ##
+% ## @item R: A Language and Environment for Statistical Computing;
+% ## @url{http://cran.r-project.org/doc/manuals/fullrefman.pdf}.
+% ## @end itemize
+% ##
+% ## Examples:
+% ## @c Set example in small font to prevent overfull line
+% ##
+% ## @smallexample
+% ## @group
+% ## x = randi (1000, [10, 1]); # Create empirical data in range 1-1000
+% ## q = quantile (x, [0, 1]); # Return minimum, maximum of distribution
+% ## q = quantile (x, [0.25 0.5 0.75]); # Return quartiles of distribution
+% ## @end group
+% ## @end smallexample
+% ## @seealso{prctile}
+% ## @end deftypefn
+%
+% ## Author: Ben Abbott <bpabbott@mac.com>
+% ## Description: Matlab style quantile function of a discrete/continuous distribution
+
+function q = quantile (x, p, dim, method)
+
+if nargin < 2,
+ p = [];
+end
+
+if nargin < 3,
+ dim = 1;
+end
+
+if nargin < 4,
+ % Use Matlab compatiblity mode
+ method = 5;
+end
+
+if (~ (isnumeric (x) || islogical (x)))
+ error ('quantile: X must be a numeric vector or matrix');
+end
+
+if (isempty (p))
+ p = [0.00 0.25, 0.50, 0.75, 1.00];
+end
+
+if (~ (isnumeric (p) && isvector (p)))
+ error ('quantile: P must be a numeric vector');
+end
+
+if (~ (isscalar (dim) && dim == fix (dim)) ...
+ || ~(1 <= dim && dim <= ndims (x)))
+ error ('quantile: DIM must be an integer and a valid dimension');
+end
+
+% Set the permutation vector.
+perm = 1:ndims (x);
+perm(1) = dim;
+perm(dim) = 1;
+
+% Permute dim to the 1st index.
+x = permute (x, perm);
+
+% Save the size of the permuted x N-d array.
+sx = size (x);
+
+% Reshape to a 2-d array.
+x = reshape (x, [sx(1), prod(sx(2:end))]);
+
+% Calculate the quantiles.
+q = octave__quantile__ (x, p, method);
+
+% Return the shape to the original N-d array.
+q = reshape (q, [numel(p), sx(2:end)]);
+
+% Permute the 1st index back to dim.
+q = ipermute (q, perm);
+
+end % function
+
+%!test
+%! p = 0.5;
+%! x = sort (rand (11));
+%! q = quantile (x, p);
+%! assert (isequal (q, x(6,:)));
+%! x = x.';
+%! q = quantile (x, p, 2);
+%! assert (isequal (q, x(:,6)));
+
+% Note: method 3 not available yet because Matlab doesn't have roundb()
+
+%!test
+%! p = [0.00, 0.25, 0.50, 0.75, 1.00];
+%! x = [1; 2; 3; 4];
+%! a = [1.0000 1.0000 2.0000 3.0000 4.0000
+%! 1.0000 1.5000 2.5000 3.5000 4.0000
+%! 1.0000 1.0000 2.0000 3.0000 4.0000
+%! 1.0000 1.0000 2.0000 3.0000 4.0000
+%! 1.0000 1.5000 2.5000 3.5000 4.0000
+%! 1.0000 1.2500 2.5000 3.7500 4.0000
+%! 1.0000 1.7500 2.5000 3.2500 4.0000
+%! 1.0000 1.4167 2.5000 3.5833 4.0000
+%! 1.0000 1.4375 2.5000 3.5625 4.0000];
+%! for m = [1:2 4:9]
+%! q = quantile (x, p, 1, m).';
+%! assert (stk_isequal_tolabs (q, a(m,:), 0.0001));
+%! end
+
+%!test
+%! p = [0.00, 0.25, 0.50, 0.75, 1.00];
+%! x = [1; 2; 3; 4; 5];
+%! a = [1.0000 2.0000 3.0000 4.0000 5.0000
+%! 1.0000 2.0000 3.0000 4.0000 5.0000
+%! 1.0000 1.0000 2.0000 4.0000 5.0000
+%! 1.0000 1.2500 2.5000 3.7500 5.0000
+%! 1.0000 1.7500 3.0000 4.2500 5.0000
+%! 1.0000 1.5000 3.0000 4.5000 5.0000
+%! 1.0000 2.0000 3.0000 4.0000 5.0000
+%! 1.0000 1.6667 3.0000 4.3333 5.0000
+%! 1.0000 1.6875 3.0000 4.3125 5.0000];
+%! for m = [1:2 4:9]
+%! q = quantile (x, p, 1, m).';
+%! assert (stk_isequal_tolabs (q, a(m,:), 0.0001));
+%! end
+
+%!test
+%! p = [0.00, 0.25, 0.50, 0.75, 1.00];
+%! x = [1; 2; 5; 9];
+%! a = [1.0000 1.0000 2.0000 5.0000 9.0000
+%! 1.0000 1.5000 3.5000 7.0000 9.0000
+%! 1.0000 1.0000 2.0000 5.0000 9.0000
+%! 1.0000 1.0000 2.0000 5.0000 9.0000
+%! 1.0000 1.5000 3.5000 7.0000 9.0000
+%! 1.0000 1.2500 3.5000 8.0000 9.0000
+%! 1.0000 1.7500 3.5000 6.0000 9.0000
+%! 1.0000 1.4167 3.5000 7.3333 9.0000
+%! 1.0000 1.4375 3.5000 7.2500 9.0000];
+%! for m = [1:2 4:9]
+%! q = quantile (x, p, 1, m).';
+%! assert (stk_isequal_tolabs (q, a(m,:), 0.0001));
+%! end
+
+%!test
+%! p = [0.00, 0.25, 0.50, 0.75, 1.00];
+%! x = [1; 2; 5; 9; 11];
+%! a = [1.0000 2.0000 5.0000 9.0000 11.0000
+%! 1.0000 2.0000 5.0000 9.0000 11.0000
+%! 1.0000 1.0000 2.0000 9.0000 11.0000
+%! 1.0000 1.2500 3.5000 8.0000 11.0000
+%! 1.0000 1.7500 5.0000 9.5000 11.0000
+%! 1.0000 1.5000 5.0000 10.0000 11.0000
+%! 1.0000 2.0000 5.0000 9.0000 11.0000
+%! 1.0000 1.6667 5.0000 9.6667 11.0000
+%! 1.0000 1.6875 5.0000 9.6250 11.0000];
+%! for m = [1:2 4:9]
+%! q = quantile (x, p, 1, m).';
+%! assert (stk_isequal_tolabs (q, a(m,:), 0.0001));
+%! end
+
+%!test
+%! p = [0.00, 0.25, 0.50, 0.75, 1.00];
+%! x = [16; 11; 15; 12; 15; 8; 11; 12; 6; 10];
+%! a = [6.0000 10.0000 11.0000 15.0000 16.0000
+%! 6.0000 10.0000 11.5000 15.0000 16.0000
+%! 6.0000 8.0000 11.0000 15.0000 16.0000
+%! 6.0000 9.0000 11.0000 13.5000 16.0000
+%! 6.0000 10.0000 11.5000 15.0000 16.0000
+%! 6.0000 9.5000 11.5000 15.0000 16.0000
+%! 6.0000 10.2500 11.5000 14.2500 16.0000
+%! 6.0000 9.8333 11.5000 15.0000 16.0000
+%! 6.0000 9.8750 11.5000 15.0000 16.0000];
+%! for m = [1:2 4:9]
+%! q = quantile (x, p, 1, m).';
+%! assert (stk_isequal_tolabs (q, a(m,:), 0.0001));
+%! end
+
+%!test
+%! p = [0.00, 0.25, 0.50, 0.75, 1.00];
+%! x = [-0.58851; 0.40048; 0.49527; -2.551500; -0.52057; ...
+%! -0.17841; 0.057322; -0.62523; 0.042906; 0.12337];
+%! a = [-2.551474 -0.588505 -0.178409 0.123366 0.495271
+%! -2.551474 -0.588505 -0.067751 0.123366 0.495271
+%! -2.551474 -0.625231 -0.178409 0.123366 0.495271
+%! -2.551474 -0.606868 -0.178409 0.090344 0.495271
+%! -2.551474 -0.588505 -0.067751 0.123366 0.495271
+%! -2.551474 -0.597687 -0.067751 0.192645 0.495271
+%! -2.551474 -0.571522 -0.067751 0.106855 0.495271
+%! -2.551474 -0.591566 -0.067751 0.146459 0.495271
+%! -2.551474 -0.590801 -0.067751 0.140686 0.495271];
+%! for m = [1:2 4:9]
+%! q = quantile (x, p, 1, m).';
+%! assert (stk_isequal_tolabs (q, a(m,:), 0.0001));
+%! end
+
+%!test
+%! p = 0.5;
+%! x = [0.112600, 0.114800, 0.052100, 0.236400, 0.139300
+%! 0.171800, 0.727300, 0.204100, 0.453100, 0.158500
+%! 0.279500, 0.797800, 0.329600, 0.556700, 0.730700
+%! 0.428800, 0.875300, 0.647700, 0.628700, 0.816500
+%! 0.933100, 0.931200, 0.963500, 0.779600, 0.846100];
+%! tol = 0.00001;
+%! x(5,5) = NaN;
+%! assert (stk_isequal_tolabs ...
+%! (quantile (x, p, 1), ...
+%! [0.27950, 0.79780, 0.32960, 0.55670, 0.44460], tol));
+%! x(1,1) = NaN;
+%! assert (stk_isequal_tolabs ...
+%! (quantile (x, p, 1), ...
+%! [0.35415, 0.79780, 0.32960, 0.55670, 0.44460], tol));
+%! x(3,3) = NaN;
+%! assert (stk_isequal_tolabs ...
+%! (quantile (x, p, 1), ...
+%! [0.35415, 0.79780, 0.42590, 0.55670, 0.44460], tol));
+
+%!test
+%! sx = [2, 3, 4];
+%! x = rand (sx);
+%! dim = 2;
+%! p = 0.5;
+%! yobs = quantile (x, p, dim);
+%! yexp = median (x, dim);
+%! assert (isequal (yobs, yexp));
+
+%% Test input validation
+%!error quantile ()
+%!error quantile (1, 2, 3, 4, 5)
+%!error quantile (['A'; 'B'], 10)
+%!error quantile (1:10, [true, false])
+%!error quantile (1:10, ones (2,2))
+%!error quantile (1, 1, 1.5)
+%!error quantile (1, 1, 0)
+%!error quantile (1, 1, 3)
+%!error quantile ((1:5)', 0.5, 1, 0)
+%!error quantile ((1:5)', 0.5, 1, 10)
+
+% ## For the cumulative probability values in @var{p}, compute the
+% ## quantiles, @var{q} (the inverse of the cdf), for the sample, @var{x}.
+% ##
+% ## The optional input, @var{method}, refers to nine methods available in R
+% ## (http://www.r-project.org/). The default is @var{method} = 7.
+% ## @seealso{prctile, quantile, statistics}
+%
+% ## Author: Ben Abbott <bpabbott@mac.com>
+% ## Vectorized version: Jaroslav Hajek <highegg@gmail.com>
+% ## Description: Quantile function of empirical samples
+
+function inv = octave__quantile__ (x, p, method)
+
+if (isinteger (x) || islogical (x))
+ x = double (x);
+end
+
+% set shape of quantiles to column vector.
+p = p(:);
+
+% Save length and set shape of samples.
+% FIXME: does sort guarantee that NaN's come at the end?
+x = sort (x);
+m = sum (~ isnan (x));
+[xr, xc] = size (x);
+
+% Initialize output values.
+inv = Inf (class (x)) * (-(p < 0) + (p > 1));
+inv = repmat (inv, 1, xc);
+
+% Do the work.
+k = find ((p >= 0) & (p <= 1));
+if (any (k))
+ n = length (k);
+ p = p(k);
+ % Special case of 1 row.
+ if (xr == 1)
+ inv(k,:) = repmat (x, n, 1);
+ return;
+ end
+
+ % The column-distribution indices.
+ pcd = kron (ones (n, 1), xr*(0:xc-1));
+ mm = kron (ones (n, 1), m);
+ switch (method)
+ case {1, 2, 3}
+ switch (method)
+ case 1
+ p = max (ceil (kron (p, m)), 1);
+ inv(k,:) = x(p + pcd);
+
+ case 2
+ p = kron (p, m);
+ p_lr = max (ceil (p), 1);
+ p_rl = min (floor (p + 1), mm);
+ inv(k,:) = (x(p_lr + pcd) + x(p_rl + pcd))/2;
+
+ case 3
+ % Used by SAS, method PCTLDEF=2.
+ % http://support.sas.com/onlinedoc/913/getDoc/en/statug.hlp/stdize_sect14.htm
+ t = max (kron (p, m), 1);
+ t = roundb (t);
+ inv(k,:) = x(t + pcd);
+ end
+
+ otherwise
+ switch (method)
+ case 4
+ p = kron (p, m);
+
+ case 5
+ % Used by Matlab.
+ p = kron (p, m) + 0.5;
+
+ case 6
+ % Used by Minitab and SPSS.
+ p = kron (p, m+1);
+
+ case 7
+ % Used by S and R.
+ p = kron (p, m-1) + 1;
+
+ case 8
+ % Median unbiased.
+ p = kron (p, m+1/3) + 1/3;
+
+ case 9
+ % Approximately unbiased respecting order statistics.
+ p = kron (p, m+0.25) + 0.375;
+
+ otherwise
+ error ('quantile: Unknown METHOD, ''%d''', method);
+ end
+
+ % Duplicate single values.
+ imm1 = (mm == 1);
+ x(2,imm1) = x(1,imm1);
+
+ % Interval indices.
+ pi = max (min (floor (p), mm-1), 1);
+ pr = max (min (p - pi, 1), 0);
+ pi = pi + pcd;
+ inv(k,:) = (1-pr) .* x(pi) + pr .* x(pi+1);
+ end
+end
+
+end % function
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..daa8210
--- /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 <julien.bect@supelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5848d61
--- /dev/null
+++ b/inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m
@@ -0,0 +1,75 @@
+% 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 <julien.bect@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function algo = stk_optim_fmincon (varargin)
+
+% Some default options
+options = 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 (options, 'algorithm', 'interior-point');
+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..59f025f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1d2fb7a
--- /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 <julien.bect@supelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a4ef3d5
--- /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 <julien.bect@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9f229ee
--- /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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+% 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
+% <http://www.gnu.org/licenses/>.
+
+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 (length (cif) > 0)
+ 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, ignd1, quadprog_exitflag, ignd2, lambda] = quadprog ...
+ (B, c, -C, -d, F, g, [], [], x, quadprog_options); %#ok<ASGLU> CG#07
+ 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..11ccb3c
--- /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 CentraleSupelec
+% Copyright (C) 2014 SUPELEC & A. Ravisankar
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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)
+
+[ignd, df] = f (u); %#ok<ASGLU> CG#07
+
+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..2021386
--- /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 <julien.bect@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..24789ad
--- /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 <julien.bect@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..89871da
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e23c18d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8f0c8bc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..692ccf7
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..2b5c758
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e816996
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<CTCH>
+
+ 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..dc5db1e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<CTCH>
+
+ 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/optim/stk_select_optimizer.m b/inst/misc/optim/stk_select_optimizer.m
new file mode 100644
index 0000000..ad00b43
--- /dev/null
+++ b/inst/misc/optim/stk_select_optimizer.m
@@ -0,0 +1,106 @@
+% STK_SELECT_OPTIMIZER is a deprecated function
+%
+% stk_select_optimizer is deprecated and will be removed
+% from future releases of STK. Use
+%
+% stk_options_get ('stk_param_estim', ...)
+% stk_options_set ('stk_param_estim', ...)
+%
+% instead to get/set optimizer algorithm objects.
+%
+% See also: stk_options_get, stk_options_set
+
+% Copyright Notice
+%
+% Copyright (C) 2015 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function optim_num = stk_select_optimizer (bounds_available, display)
+
+warning (help ('stk_select_optimizer'));
+
+% Get current optimization algorithm objects
+algo_con = stk_options_get ('stk_param_estim', 'stk_minimize_boxconstrained');
+algo_unc = stk_options_get ('stk_param_estim', 'stk_minimize_unconstrained');
+
+% Legacy: corresponding optim_num in stk <= 2.3.2
+optim_num_con = get_optim_num (algo_con);
+optim_num_unc = get_optim_num (algo_unc);
+
+% Return value
+if nargin > 0
+ if bounds_available,
+ optim_num = optim_num_con;
+ else
+ optim_num = optim_num_unc;
+ end
+else
+ optim_num = [];
+end
+
+% Display status
+if (nargin > 1) && display,
+
+ fprintf ('Constrained optimizer for stk_param_estim: ');
+ switch optim_num_con
+ case 1, % octave / sqp
+ fprintf ('sqp.\n');
+ case 2, % Matlab / fminsearch
+ fprintf ('NONE.\n');
+ case 3, % Matlab / fmincon
+ fprintf ('fmincon.\n');
+ otherwise
+ fprintf ('%s\n', class (algo_con));
+ end
+
+ fprintf ('Unconstrained optimizer for stk_param_estim: ');
+ switch optim_num_unc
+ case 1, % octave / sqp
+ fprintf ('sqp.\n');
+ case 2, % Matlab / fminsearch
+ fprintf ('fminsearch.\n');
+ otherwise
+ fprintf ('%s\n', class (algo_unc));
+ end
+
+end
+
+end % function
+
+
+function optim_num = get_optim_num (algo)
+
+switch class (algo)
+ case 'stk_optim_octavesqp'
+ optim_num = 1;
+ case 'stk_optim_fminsearch'
+ optim_num = 2;
+ case 'stk_optim_fmincon'
+ optim_num = 3;
+ otherwise
+ optim_num = [];
+end
+
+end % function
diff --git a/inst/misc/options/stk_options_get.m b/inst/misc/options/stk_options_get.m
new file mode 100644
index 0000000..9d24d20
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..85e594c
--- /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) 201 CentraleSupelec
+% Copyright (C) 2015-2017 CentraleSupelec
+% Copyright (C) 2014 SUPELEC & A. Ravisankar
+% Copyright (C) 2013 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1a370ca
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9fb910d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..7dc96d9
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function stk_parallel_stop(eng) %#ok<INUSD>
+
+% 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..029a071
--- /dev/null
+++ b/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m
@@ -0,0 +1,65 @@
+% STK_PARALLEL_ENGINE_PARFOR [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2017 CentraleSupelec
+% Copyright (C) 2013 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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>
+
+
+%!test
+%! if exist ('matlabpool') || exist ('parpool')
+%! stk_test_class ('stk_parallel_engine_parfor')
+%! end
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..54e8492
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..fab98e8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function stk_parallel_stop(eng) %#ok<INUSD>
+
+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..ae47957
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..dbf6441
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..02cc77a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d5ecaf0
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..17768d8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function eng = stk_parallel_start ()
+
+eng = stk_parallel_engine_get ();
+
+if strcmp (class (eng), 'stk_parallel_engine_none') %#ok<STISA>
+
+ % 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<WNTAG>
+
+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..a47b14a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9f7005d
--- /dev/null
+++ b/inst/misc/pareto/stk_dominatedhv.m
@@ -0,0 +1,370 @@
+% 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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 ~ ((isnumeric (y_ref)) && ((isempty (y_ref)) || (isrow (y_ref))))
+ stk_error ('y_ref should be a numeric row vector.', 'IncorrectSize');
+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<ISMAT> 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..303ba52
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..0494560
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..df2b385
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5b406b5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8bba4a7
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b69b8b9
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c4e6662
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<TRYNC>
+ 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..bf29391
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..662a390
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c98a7fa
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..68f02b1
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f10572c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..2b571df
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..955da88
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..38bd86e
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..012823d
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b45129f
--- /dev/null
+++ b/inst/misc/test/stk_runtests.m
@@ -0,0 +1,307 @@
+% 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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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_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, 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_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\n', res.n_pass, res.n_total);
+ 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_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_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] = 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;
+ % 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
+ 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\n', n_pass, n_total);
+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, nnt, nf, nd, err] = run_all_tests ...
+ (subdirs_class{i}, pwd(), err);
+
+ n_total = n_total + n;
+ n_pass = n_pass + p;
+ n_files = n_files + nf;
+ n_notest = n_notest + nnt;
+ n_dirs = n_dirs + nd;
+end
+
+for i = 1:(length (subdirs_private))
+
+ [p, n, 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_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
+% (this is not the case in Octave 3.8.2, for example;
+% 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..1d6c2f5
--- /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 <julien.bect@centralesupelec.fr>
+%
+% 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
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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, ', ');
+ 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 ());
+ x__success = 0;
+ end
+ 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<NASGU>
+
+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 <pattern> from '<pattern> 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> 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 <worry about> % 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 <unknown flag> 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 <wrong pattern> 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..f7cc800
--- /dev/null
+++ b/inst/misc/test/stk_test_class.m
@@ -0,0 +1,106 @@
+% STK_TEST_CLASS is a unit test that any STK class should pass
+
+% Copyright Notice
+%
+% Copyright (C) 2017 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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_dfbinaryop.m b/inst/misc/test/stk_test_dfbinaryop.m
new file mode 100644
index 0000000..8e5880f
--- /dev/null
+++ b/inst/misc/test/stk_test_dfbinaryop.m
@@ -0,0 +1,63 @@
+% STK_TEST_DFBINARYOP ...
+
+% Copyright Notice
+%
+% Copyright (C) 2013 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..79ecba1
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1de8a92
--- /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 CentraleSupelec
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+ [fmt, spc] = format (); %#ok<ASGLU> CG#07
+ 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..90a1e8e
--- /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 CentraleSupelec
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function b = stk_disp_isloose ()
+
+[fmt, spc] = stk_disp_getformat (); %#ok<ASGLU> CG#07
+
+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..3996382
--- /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 <emmanuel.vazquez@centralesupelec.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a2b2c8a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..bea7794
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..579574f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..91b5d68
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..944b359
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function varargout = cat (dim, varargin) %#ok<STOUT,INUSD>
+
+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..08ce46f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1f1564c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..964fe66
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function value = get (gn, propname) %#ok<STOUT,INUSL>
+
+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..39447d1
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function varargout = horzcat (varargin) %#ok<STOUT>
+
+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..fcc38cc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function gn = set (gn, propname, value) %#ok<INUSD>
+
+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..7606211
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5bb5915
--- /dev/null
+++ b/inst/model/@stk_model_/stk_get_input_data.m
@@ -0,0 +1,39 @@
+% STK_GET_INTPUT_DATA [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function input_data = stk_get_input_data (model) %#ok<INUSD>
+
+% 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 and stk_get_observation_variances.
+
+% 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..7fe6d61
--- /dev/null
+++ b/inst/model/@stk_model_/stk_get_observation_variances.m
@@ -0,0 +1,37 @@
+% STK_GET_OBSERVATION_VARIANCES [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function v = stk_get_observation_variances (model) %#ok<INUSD>
+
+% 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 and stk_get_observation_variances.
+
+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..f4ae2ab
--- /dev/null
+++ b/inst/model/@stk_model_/stk_get_output_data.m
@@ -0,0 +1,37 @@
+% STK_GET_OUTPUT_DATA [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function output_data = stk_get_output_data (model) %#ok<INUSD>
+
+% 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 and stk_get_observation_variances.
+
+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..b78a547
--- /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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 and stk_get_observation_variances.
+
+prior_model = model;
+
+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..34cddff
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function gn = stk_model_ ()
+
+gn = class (struct (), 'stk_model_');
+
+end % function
diff --git a/inst/model/@stk_model_/subsasgn.m b/inst/model/@stk_model_/subsasgn.m
new file mode 100644
index 0000000..33b46e8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..7f95b39
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8988e8e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function varargout = vertcat (varargin) %#ok<STOUT>
+
+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..505256c
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/disp.m
@@ -0,0 +1,79 @@
+% DISP [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2015-2017 CentraleSupelec
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 size (model.input_data, 1) == 0
+ str_input_data = '--';
+else
+ str_input_data = ['<' stk_sprintf_sizetype(model.input_data) '>'];
+end
+
+if size (model.output_data, 1) == 0
+ str_output_data = '--';
+else
+ str_output_data = ['<' stk_sprintf_sizetype(model.output_data) '>'];
+end
+
+fprintf ('| prior_model: %s\n', str_prior_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..add9b1c
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/fieldnames.m
@@ -0,0 +1,36 @@
+% FIELDNAMES [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2016 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function fn = fieldnames (model)
+
+fn = {'prior_model'; '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..fd6d3b7
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/get.m
@@ -0,0 +1,61 @@
+% GET [overload base function]
+
+% Copyright Notice
+%
+% Copyright (C) 2015, 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function value = get (model, propname)
+
+switch propname
+
+ case {'prior_model', 'input_data', 'output_data', 'kreq'}
+ % rem: kreq is a hidden property
+ value = model.(propname);
+
+ 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/get_input_data.m b/inst/model/@stk_model_gpposterior/get_input_data.m
new file mode 100644
index 0000000..287960c
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/get_input_data.m
@@ -0,0 +1,33 @@
+% GET_INTPUT_DATA [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2015, 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function input_data = get_input_data (model)
+
+input_data = model.input_data;
+
+end % function
diff --git a/inst/model/@stk_model_gpposterior/get_output_data.m b/inst/model/@stk_model_gpposterior/get_output_data.m
new file mode 100644
index 0000000..4cb1d66
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/get_output_data.m
@@ -0,0 +1,33 @@
+% GET_OUTPUT_DATA [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2015, 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function output_data = get_output_data (model)
+
+output_data = model.output_data;
+
+end % function
diff --git a/inst/model/@stk_model_gpposterior/get_prior_model.m b/inst/model/@stk_model_gpposterior/get_prior_model.m
new file mode 100644
index 0000000..76c662f
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/get_prior_model.m
@@ -0,0 +1,33 @@
+% GET_PRIOR_MODEL [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function prior_model = get_prior_model (model)
+
+prior_model = model.prior_model;
+
+end % function
diff --git a/inst/model/@stk_model_gpposterior/set.m b/inst/model/@stk_model_gpposterior/set.m
new file mode 100644
index 0000000..b93aac2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..71fe4c2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3af2da1
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..fea78a7
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..12efbeb
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c26f57f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6b3931f
--- /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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function value = stk_get_optimizable_parameters (model)
+
+value = stk_get_optimizable_parameters (model.prior);
+
+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..5f4efc8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..788c8e5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function prior_model = stk_get_prior_model (model)
+
+prior_model = model.prior_model;
+
+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..4d824b1
--- /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 <julien.bect@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f1a5716
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cd685de
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..4d19171
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/stk_model_update.m
@@ -0,0 +1,108 @@
+% STK_MODEL_UPDATE [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2016 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function M = stk_model_update (M, x_new, z_new, lnv_new)
+
+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
+
+ heteroscedastic = false;
+
+elseif ~ isempty (lnv_new) % lnv provided (heteroscedastic case only)
+
+ if (size (M.input_data, 1) ~= 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(:);
+
+ heteroscedastic = true;
+end
+
+M.input_data = [M.input_data; x_new];
+M.output_data = [M.output_data; z_new];
+
+if heteroscedastic
+ M.prior_model.lognoisevariance = [lnv_current; lnv_new];
+end
+
+% FIXME: use @stk_kreq/stk_update ?
+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..78c8ee2
--- /dev/null
+++ b/inst/model/@stk_model_gpposterior/stk_predict.m
@@ -0,0 +1,255 @@
+% STK_PREDICT [overload STK function]
+
+% Copyright Notice
+%
+% Copyright (C) 2015-2018 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 = size (M_post.input_data, 1);
+
+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..479077f
--- /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 <remi.stroh@lne.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 (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..2ad121c
--- /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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+% Stefano Duhamel <stefano.duhamel@supelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function [LOO_pred, LOO_res] = stk_predict_leaveoneout_direct (M_post)
+
+% Heteroscedatic noise ?
+heteroscedastic = ~ isscalar (M_post.prior_model.lognoisevariance);
+
+n = size (M_post.input_data, 1);
+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..fc40b8a
--- /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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function model = stk_set_optimizable_parameters (model, value)
+
+model.prior = stk_set_optimizable_parameters (model.prior, 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..2167e99
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..bad0727
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8b981c6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b21bc0f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..91576b5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function b = stk_isnoisy (model) %#ok<INUSD>
+
+b = true;
+
+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..5b132a2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..691de35
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function fn = fieldnames (gn) %#ok<INUSD>
+
+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..df019b2
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..bf7821c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6d4cb47
--- /dev/null
+++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_gaussiannoise_het0.m
@@ -0,0 +1,69 @@
+% 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, 2019 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function gn = stk_gaussiannoise_het0 (variance_function, dispersion)
+
+if (nargin < 2) || (isempty (dispersion))
+ log_dispersion = nan; % must be estimated
+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..3eb1c2e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ac945f8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f104234
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..73ff871
--- /dev/null
+++ b/inst/model/noise/@stk_gaussiannoise_het0/stk_variance_eval.m
@@ -0,0 +1,68 @@
+% 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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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"
+ v = exp (gn.log_dispersion) * feval (gn.variance_function, double (x));
+ otherwise
+ stk_error ('diff should be either -1 or +1', 'IncorrectArgument');
+end
+
+end % function
diff --git a/inst/model/prior_struct/@struct/get_input_data.m b/inst/model/prior_struct/@struct/get_input_data.m
new file mode 100644
index 0000000..83cccd7
--- /dev/null
+++ b/inst/model/prior_struct/@struct/get_input_data.m
@@ -0,0 +1,33 @@
+% GET_INTPUT_DATA [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function input_data = get_input_data (model)
+
+input_data = stk_get_input_data (model);
+
+end % function
diff --git a/inst/model/prior_struct/@struct/get_output_data.m b/inst/model/prior_struct/@struct/get_output_data.m
new file mode 100644
index 0000000..b2e4243
--- /dev/null
+++ b/inst/model/prior_struct/@struct/get_output_data.m
@@ -0,0 +1,33 @@
+% GET_OUTPUT_DATA [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function output_data = get_output_data (model)
+
+output_data = stk_get_output_data (model);
+
+end % function
diff --git a/inst/model/prior_struct/@struct/get_prior_model.m b/inst/model/prior_struct/@struct/get_prior_model.m
new file mode 100644
index 0000000..c3629e7
--- /dev/null
+++ b/inst/model/prior_struct/@struct/get_prior_model.m
@@ -0,0 +1,33 @@
+% GET_PRIOR_MODEL [deprecated]
+
+% Copyright Notice
+%
+% Copyright (C) 2018 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function prior_model = get_prior_model (model)
+
+prior_model = stk_get_prior_model (model);
+
+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..f2f5753
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..b18c917
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..518c113
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..7742f46
--- /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 <remi.stroh@lne.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f319242
--- /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 <remi.stroh@lne.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..34a5fc8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..bb9a1d6
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cdd3ac7
--- /dev/null
+++ b/inst/model/prior_struct/stk_isnoisy.m
@@ -0,0 +1,73 @@
+% STK_ISNOISY returns false for noiseless models
+%
+% 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 for
+% declaring 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 CentraleSupelec
+% Copyright (C) 2017-2018 LNE
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6422bd8
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1a3f46d
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c35f89e
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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_set_optimizable_model_parameters.m b/inst/model/prior_struct/stk_set_optimizable_model_parameters.m
new file mode 100644
index 0000000..4b04db1
--- /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 <remi.stroh@lne.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..9aadd28
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..ccf7828
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..3308cc1
--- /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 CentraleSupelec
+% Copyright (C) 2017 LNE
+% Copyright (C) 2014 A. Ravisankar
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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_length(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..3f64ef5
--- /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-2019 CentraleSupelec
+% Copyright (C) 2014 Ashwin Ravisankar
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 (part 1)
+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
+
+% Sanity check (part 2)
+if crit0 < crit_opt
+ s1 = '*** PANIC: Something went SERIOUSLY WRONG during the optimization ***';
+ s2 = sprintf ('crit0 = %f, crit_opt = %f: crit0 < crit_opt', crit0, crit_opt);
+ stk_error (sprintf ('%s\n%s\n', s1, s2), 'OptimizationFailure');
+end
+
+% Create outputs
+v_opt = v0;
+v_opt(select) = w_opt;
+model_opt = stk_set_optimizable_parameters (model0, v_opt);
+
+% 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..fe464c1
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8329aa4
--- /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 <emmanuel.vazquez@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function [lb_lnv, ub_lnv] = stk_param_getdefaultbounds_lnv ...
+ (model, lnv0, xi, zi) %#ok<INUSL>
+
+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..773b284
--- /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 the 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 CentraleSupelec
+% Copyright (C) 2014 SUPELEC & A. Ravisankar
+% Copyright (C) 2011-2013 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Ashwin Ravisankar <ashwinr1993@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 = L \ P;
+u = L \ zi;
+beta = (W' * W) \ (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 % end function stk_param_gls
+
+
+%!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..33dd531
--- /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 CentraleSupelec
+% Copyright (C) 2012-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<SPRINTFN>
+ 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), [size(xi, 1) 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..945716e
--- /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 CentraleSupelec
+% Copyright (C) 2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function lnv = stk_param_init_lnv (model, xi, zi)
+
+% size checking: xi, zi
+if ~ isequal (size (zi), [size(xi, 1) 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..484c023
--- /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 CentraleSupelec
+% Copyright (C) 2012-2014 SUPELEC
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+ [ignd, sigma2] = stk_param_gls (model, xi, zi); %#ok<ASGLU> CG#07
+ if ~ (sigma2 > 0), continue; end
+ log_sigma2 = log (sigma2);
+
+ elseif homoscedastic && (isnan (lnv)) % Unknown noise variance
+
+ model.lognoisevariance = log (eta);
+ [ignd, sigma2] = stk_param_gls (model, xi, zi); %#ok<ASGLU> CG#07
+ 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..a6646aa
--- /dev/null
+++ b/inst/param/estim/stk_param_relik.m
@@ -0,0 +1,255 @@
+% 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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<NASGU> %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);
+%! xi = stk_sampling_halton_rr2 (NI, DIM, BOX);
+%! zi = stk_feval (f, xi);
+%!
+%! model.param = [1 1];
+%! [C1 dC] = stk_param_relik (model, xi, zi);
+%!
+%! model.param = model.param + DELTA * [0 1];
+%! C2 = stk_param_relik (model, xi, zi);
+%!
+%! assert (stk_isequal_tolrel (dC(2), (C2 - C1) / DELTA, TOL_REL));
diff --git a/inst/sampling/@stk_function/disp.m b/inst/sampling/@stk_function/disp.m
new file mode 100644
index 0000000..09ed974
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<STISA>
+
+ 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..8873369
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..94318e5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function F_val = feval (F, x, varargin) %#ok<INUSD,STOUT>
+
+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..d4e9a5a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..2f361f1
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c1f53ef
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..68abfa9
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c0bc0ec
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a4fc8ad
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..93b5d08
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1aaa0d4
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cf4652e
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..08ace98
--- /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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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 = stk_get_input_data (crit.model);
+ 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..ffb70bf
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..938a9ee
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..867ab4c
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..d4e9a5a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..22e447a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..a684be5
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..89fa594
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..5646ed4
--- /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 CentraleSupelec
+% Copyright (C) 2016 EDF R&D
+%
+% Authors: Tom Assouline, Florent Autret & Stefano Duhamel (for EDF R&D)
+% Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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_length (get (crit.model, 'input_data'));
+ 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..d4e9a5a
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..4df80be
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..74a3784
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..af47570
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c63b802
--- /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 CentraleSupelec
+%
+% Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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, ignd1, ignd2, K] = stk_predict (M_prior, xi, zi, [xi; xc]); % See CG#07
+%!
+%! 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..9844769
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..e711619
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..395e25e
--- /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.D. and Santner T.J. Multiobjective optimization of
+% expensive black-box functions via expected maximin improvement.
+% Technical report, Tech. rep., 43210, Ohio University, Columbus,
+% Ohio, 2010
+%
+% See also: stk_sampcrit_ehvi_eval
+
+% Copyright Notice
+%
+% Copyright (C) 2017, 2018 CentraleSupelec
+% Copyright (C) 2016 IRT SystemX
+%
+% Author: Paul Feliot <paul.feliot@irt-systemx.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..6534b28
--- /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 <julien.bect@centralesupelec.fr>
+% Alexandra Krauth <alexandrakrauth@gmail.com>
+% Elham Rahali <elham.rahali@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..116a633
--- /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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+ [ignd, x(:,i)] = sort (rand (n,1)); %#ok<ASGLU> CG#07
+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..25d72bd
--- /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 LNE
+% Copyright (C) 2017, 2018 CentraleSupelec
+%
+% Authors: Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+ [ignd, ind_dist] = sort(dist_new_prev, 'descend'); %#ok<ASGLU> CG#07
+ 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..4795361
--- /dev/null
+++ b/inst/sampling/stk_sampling_nestedlhs.m
@@ -0,0 +1,277 @@
+% 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 LNE
+% Copyright (C) 2017, 2018 CentraleSupelec
+%
+% Authors: Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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
+
+ [ignd, random_index] = sort(rand(n_new_k, dim), 1); %#ok<ASGLU> CG#07
+ 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..d26a857
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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<AGROW>
+ end
+ for j = (i+1):r,
+ Z = zeros(size(Ai));
+ Ai = [Ai Z; Z Ai]; %#ok<AGROW>
+ 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<AGROW>
+ else
+ aj = [aj; aj]; %#ok<AGROW>
+ 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..fc0a629
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..cfd7ba9
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..f7f6062
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..1579dfc
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..c60be7b
--- /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 <julien.bect@centralesupelec.fr>
+% Alexandra Krauth <alexandrakrauth@gmail.com>
+% Elham Rahali <elham.rahali@gmail.com>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+%!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..2fe55c1
--- /dev/null
+++ b/inst/stk_init.m
@@ -0,0 +1,360 @@
+% STK_INIT initializes the STK
+%
+% CALL: stk_init ()
+%
+% STK_INIT sets paths and environment variables
+
+% Copyright Notice
+%
+% Copyright (C) 2015-2018 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+%% 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 script
+root = fileparts (mfilename ('fullpath'));
+
+switch command
+
+ case 'pkg_load'
+ stk_init__pkg_load (root);
+
+ case 'pkg_unload'
+ stk_init__pkg_unload (root);
+
+ case 'prune_mole'
+ stk_init__config_mole (root, false, true); % prune, but do not add to path
+
+ 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 ();
+
+% 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_gausscov_iso', ...
+ 'stk_gausscov_aniso', ...
+ 'stk_materncov_aniso', ...
+ 'stk_materncov_iso', ...
+ 'stk_materncov32_aniso', ...
+ 'stk_materncov32_iso', ...
+ 'stk_materncov52_aniso', ...
+ 'stk_materncov52_iso', ...
+ 'stk_optim_fmincon', ...
+ 'stk_options_set', ...
+ 'stk_parallel_engine_set' };
+
+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{:});
+
+% Selectively add MOLE subdirectories to compensate for missing functions
+stk_init__config_mole (root, true, false); % (add to path, but do not prune)
+
+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<STTOK>
+
+ 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
+
+
+function stk_init__config_mole (root, do_addpath, prune_unused)
+
+mole_dir = fullfile (root, 'misc', 'mole');
+isoctave = (exist ('OCTAVE_VERSION', 'builtin') == 5);
+
+if isoctave
+ recursive_rmdir_state = confirm_recursive_rmdir (0);
+end
+
+opts = {root, mole_dir, do_addpath, prune_unused};
+
+% Provide missing octave functions for Matlab users
+% TODO: extract functions that are REALLY needed in separate directories
+% and get rid of the others !
+if (exist ('OCTAVE_VERSION', 'builtin') ~= 5) % if Matlab
+ if do_addpath
+ addpath (fullfile (mole_dir, 'matlab'));
+ end
+elseif prune_unused
+ rmdir (fullfile (mole_dir, 'matlab'), 's');
+end
+
+% graphics_toolkit
+% * For Octave users: graphics_toolkit is missing in some old version of Octave
+% * For Matlab users: there is no function named graphics_toolkit in Matlab.
+% Our implementation returns either 'matlab-jvm' or 'matlab-nojvm'.
+install_mole_function ('graphics_toolkit', opts{:});
+
+% isrow
+% * For Octave users: ?
+% * For Matlab users: missing in R2007a
+install_mole_function ('isrow', opts{:});
+
+% linsolve
+% * For Octave users: linsolve has been missing in Octave for a long time
+% (up to 3.6.4)
+% * For Matlab users: ?
+install_mole_function ('linsolve', opts{:});
+
+% quantile
+% * For Octave users: ?
+% * For Matlab users: quantile is missing from Matlab itself, but it provided
+% by the Statistics toolbox if you're rich enough to afford it.
+install_mole_function ('quantile', opts{:});
+
+% cleanup
+if isoctave
+ confirm_recursive_rmdir (recursive_rmdir_state);
+end
+
+end % function
+
+
+function install_mole_function (funct_name, ...
+ root, mole_dir, do_addpath, prune_unused)
+
+function_dir = fullfile (mole_dir, funct_name);
+
+w = which (funct_name);
+
+if (isempty (w)) || (~ isempty (strfind (w, root))) % if the function is absent
+
+ function_mfile = fullfile (function_dir, [funct_name '.m']);
+
+ if exist (function_dir, 'dir') && exist (function_mfile, 'file')
+
+ % fprintf ('[MOLE] Providing function %s\n', function_name);
+ if do_addpath
+ addpath (function_dir);
+ end
+
+ else
+
+ warning (sprintf ('[MOLE] Missing function: %s\n', funct_name));
+
+ end
+
+elseif prune_unused && (exist (function_dir, 'dir'))
+
+ rmdir (function_dir, 's');
+
+end
+
+end % function
diff --git a/inst/stk_version.m b/inst/stk_version.m
new file mode 100644
index 0000000..760b942
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function v = stk_version ()
+
+v = '2.6.1';
+
+end % function
diff --git a/inst/utils/stk_conditioning.m b/inst/utils/stk_conditioning.m
new file mode 100644
index 0000000..12a7e66
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..165f3fd
--- /dev/null
+++ b/inst/utils/stk_generate_samplepaths.m
@@ -0,0 +1,238 @@
+% 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 CentraleSupelec
+% Copyright (C) 2011-2014 SUPELEC
+%
+% Authors: Julien Bect <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function zsim = stk_generate_samplepaths (model, varargin)
+
+% Note: we know that none of the input argument is an stk_dataframe object
+% (otherwise we would have ended up in @stk_dataframe/stk_generate_samplepaths)
+
+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 ---------------------------------------------------
+
+% Extract row names from xt
+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, ignd, j] = unique (xt, 'rows'); %#ok<ASGLU> CG#07
+
+% 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
+ [ignd, lambda] = stk_predict (model, xi, zi, xt); %#ok<ASGLU> CG#07
+
+ 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..f2826ed
--- /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 <julien.bect@centralesupelec.fr>
+% Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..8eafcaa
--- /dev/null
+++ b/inst/utils/stk_plot_histnormres.m
@@ -0,0 +1,82 @@
+% 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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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]);
+binsize = 2 * (q(3) -q(2)) * (n ^ (- 1/3));
+nbins = ceil ((q(4) - q(1)) / binsize);
+
+% 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--');
+
+% 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..25a0659
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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--');
+
+% 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..76cf3c8
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..777543f
--- /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 <julien.bect@centralesupelec.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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..7cd5879
--- /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 <julien.bect@centralesupelec.fr>
+% Remi Stroh <remi.stroh@lne.fr>
+
+% Copying Permission Statement
+%
+% This file is part of
+%
+% STK: a Small (Matlab/Octave) Toolbox for Kriging
+% (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+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/post_install.m b/post_install.m
new file mode 100644
index 0000000..8e6ee99
--- /dev/null
+++ b/post_install.m
@@ -0,0 +1,42 @@
+# POST_INSTALL is run after the installation of the package
+
+# Copyright Notice
+#
+# Copyright (C) 2014 SUPELEC
+# Copyright (C) 2015 CentraleSupelec
+#
+# Author: Julien Bect <julien.bect@centralesupelec.fr>
+
+# Copying Permission Statement
+#
+# This file is part of
+#
+# STK: a Small (Matlab/Octave) Toolbox for Kriging
+# (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>.
+
+function post_install (desc)
+
+ here = pwd ();
+
+ # Prune unused functions from the MOLE
+ unwind_protect
+ cd (desc.dir);
+ stk_init prune_mole
+ unwind_protect_cleanup
+ cd (here);
+ end_unwind_protect
+
+endfunction
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..975c898
--- /dev/null
+++ b/src/get_column_number.c
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ * *
+ * Small (Matlab/Octave) Toolbox for Kriging *
+ * *
+ * Copyright Notice *
+ * *
+ * Copyright (C) 2013 SUPELEC *
+ * *
+ * Author: Julien Bect <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#include "string.h"
+#include "stk_mex.h"
+
+#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;
+
+ 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..02423df
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..ee5a86d
--- /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 <julien.bect@centralesupelec.fr> *
+ * Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..1e5960f
--- /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 <julien.bect@centralesupelec.fr> *
+ * Emmanuel Vazquez <emmanuel.vazquez@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..d7d5d41
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..d708f0b
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * 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 *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..f57060a
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..734a733
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..b1cdf2d
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..b08a872
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..7204f75
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..6f3ac86
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..7951c49
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#ifndef ___STK_MEX_H___
+#define ___STK_MEX_H___
+
+#include <math.h>
+#include "mex.h"
+
+#if (defined __STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
+# include <stdbool.h>
+#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..d71f432
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..14852df
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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..bd85713
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * 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 *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#include <stdlib.h>
+#include <math.h>
+#include <limits.h>
+#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..422d5d7
--- /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 <julien.bect@centralesupelec.fr> *
+ * Alexandra Krauth <alexandrakrauth@gmail.com> *
+ * Elham Rahali <elham.rahali@gmail.com> *
+ * *
+ * Copying Permission Statement *
+ * *
+ * This file is part of *
+ * *
+ * STK: a Small (Matlab/Octave) Toolbox for Kriging *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#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..936c6c3
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * 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 *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+/* TODO: find out which of these includes are *REALLY* necessary */
+
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#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..5ae0b2c
--- /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 <julien.bect@centralesupelec.fr> *
+ * *
+ * 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 *
+ * (http://sourceforge.net/projects/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 <http://www.gnu.org/licenses/>. *
+ * *
+ ****************************************************************************/
+
+#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