diff --git a/matlab/DSMH_sampler.m b/matlab/DSMH_sampler.m
new file mode 100644
index 000000000..f1724a560
--- /dev/null
+++ b/matlab/DSMH_sampler.m
@@ -0,0 +1,303 @@
+function DSMH_sampler(TargetFun,xparam1,mh_bounds,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_)
+% function DSMH_sampler(TargetFun,xparam1,mh_bounds,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_)
+% Dynamic Striated Metropolis-Hastings algorithm.
+%
+% INPUTS
+% o TargetFun [char] string specifying the name of the objective
+% function (posterior kernel).
+% o xparam1 [double] (p*1) vector of parameters to be estimated (initial values).
+% o mh_bounds [double] (p*2) matrix defining lower and upper bounds for the parameters.
+% o dataset_ data structure
+% o dataset_info dataset info structure
+% o options_ options structure
+% o M_ model structure
+% o estim_params_ estimated parameters structure
+% o bayestopt_ estimation options structure
+% o oo_ outputs structure
+%
+% SPECIAL REQUIREMENTS
+% None.
+%
+% PARALLEL CONTEXT
+% The most computationally intensive part of this function may be executed
+% in parallel. The code suitable to be executed in
+% parallel on multi core or cluster machine (in general a 'for' cycle)
+% has been removed from this function and been placed in the posterior_sampler_core.m funtion.
+%
+% The DYNARE parallel packages comprise a i) set of pairs of Matlab functions that can be executed in
+% parallel and called name_function.m and name_function_core.m and ii) a second set of functions used
+% to manage the parallel computations.
+%
+% This function was the first function to be parallelized. Later, other
+% functions have been parallelized using the same methodology.
+% Then the comments write here can be used for all the other pairs of
+% parallel functions and also for management functions.
+
+% Copyright © 2006-2022 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare. If not, see .
+
+
+lambda = exp(bsxfun(@minus,options_.posterior_sampler_options.dsmh.H,1:1:options_.posterior_sampler_options.dsmh.H)/(options_.posterior_sampler_options.dsmh.H-1)*log(options_.posterior_sampler_options.dsmh.lambda1));
+c = 0.055 ;
+MM = int64(options_.posterior_sampler_options.dsmh.N*options_.posterior_sampler_options.dsmh.G/10) ;
+
+% Step 0: Initialization of the sampler
+[ param, tlogpost_iminus1, loglik, bayestopt_] = ...
+ SMC_samplers_initialization(TargetFun, xparam1, mh_bounds, dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_,options_.posterior_sampler_options.dsmh.nparticles);
+
+ESS = zeros(options_.posterior_sampler_options.dsmh.H,1) ;
+zhat = 1 ;
+
+% The DSMH starts here
+for i=2:options_.posterior_sampler_options.dsmh.H
+ disp('');
+ disp('Tempered iteration');
+ disp(i) ;
+ % Step 1: sort the densities and compute IS weigths
+ [tlogpost_iminus1,loglik,param] = sort_matrices(tlogpost_iminus1,loglik,param) ;
+ [tlogpost_i,weights,zhat,ESS,Omegachol] = compute_IS_weights_and_moments(param,tlogpost_iminus1,loglik,lambda,i,zhat,ESS) ;
+ % Step 2: tune c_i
+ c = tune_c(TargetFun,param,tlogpost_i,lambda,i,c,Omegachol,weights,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+ % Step 3: Metropolis step
+ [param,tlogpost_iminus1,loglik] = mutation_DSMH(TargetFun,param,tlogpost_i,tlogpost_iminus1,loglik,lambda,i,c,MM,Omegachol,weights,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+end
+
+weights = exp(loglik*(lambda(end)-lambda(end-1)));
+weights = weights/sum(weights);
+indx_resmpl = smc_resampling(weights,rand(1,1),options_.posterior_sampler_options.dsmh.nparticles);
+distrib_param = param(:,indx_resmpl);
+
+mean_xparam = mean(distrib_param,2);
+npar = length(xparam1);
+%mat_var_cov = bsxfun(@minus,distrib_param,mean_xparam) ;
+%mat_var_cov = (mat_var_cov*mat_var_cov')/(options_.HSsmc.nparticles-1) ;
+%std_xparam = sqrt(diag(mat_var_cov)) ;
+lb95_xparam = zeros(npar,1) ;
+ub95_xparam = zeros(npar,1) ;
+for i=1:npar
+ temp = sortrows(distrib_param(i,:)') ;
+ lb95_xparam(i) = temp(0.025*options_.posterior_sampler_options.dsmh.nparticles) ;
+ ub95_xparam(i) = temp(0.975*options_.posterior_sampler_options.dsmh.nparticles) ;
+end
+
+TeX = options_.TeX;
+
+str = sprintf(' Param. \t Lower Bound (95%%) \t Mean \t Upper Bound (95%%)');
+for l=1:npar
+ [name,~] = get_the_name(l,TeX,M_,estim_params_,options_);
+ str = sprintf('%s\n %s \t\t %5.4f \t\t %7.5f \t\t %5.4f', str, name, lb95_xparam(l), mean_xparam(l), ub95_xparam(l));
+end
+disp([str])
+disp('')
+
+%% Plot parameters densities
+
+[nbplt,nr,nc,lr,lc,nstar] = pltorg(npar);
+
+if TeX
+ fidTeX = fopen([M_.fname '_param_density.tex'],'w');
+ fprintf(fidTeX,'%% TeX eps-loader file generated by DSMH.m (Dynare).\n');
+ fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
+ fprintf(fidTeX,' \n');
+end
+
+number_of_grid_points = 2^9; % 2^9 = 512 !... Must be a power of two.
+bandwidth = 0; % Rule of thumb optimal bandwidth parameter.
+kernel_function = 'gaussian'; % Gaussian kernel for Fast Fourier Transform approximation.
+
+plt = 1 ;
+%for plt = 1:nbplt,
+if TeX
+ NAMES = [];
+ TeXNAMES = [];
+end
+hh = dyn_figure(options_.nodisplay,'Name','Parameters Densities');
+for k=1:npar %min(nstar,npar-(plt-1)*nstar)
+ subplot(ceil(sqrt(npar)),floor(sqrt(npar)),k)
+ %kk = (plt-1)*nstar+k;
+ [name,texname] = get_the_name(k,TeX,M_,estim_params_,options_);
+ optimal_bandwidth = mh_optimal_bandwidth(distrib_param(k,:)',options_.posterior_sampler_options.dsmh.nparticles,bandwidth,kernel_function);
+ [density(:,1),density(:,2)] = kernel_density_estimate(distrib_param(k,:)',number_of_grid_points,...
+ options_.posterior_sampler_options.dsmh.nparticles,optimal_bandwidth,kernel_function);
+ plot(density(:,1),density(:,2));
+ hold on
+ if TeX
+ title(texname,'interpreter','latex')
+ else
+ title(name,'interpreter','none')
+ end
+ hold off
+ axis tight
+ drawnow
+end
+dyn_saveas(hh,[ M_.fname '_param_density' int2str(plt) ],options_.nodisplay,options_.graph_format);
+if TeX && any(strcmp('eps',cellstr(options_.graph_format)))
+ % TeX eps loader file
+ fprintf(fidTeX,'\\begin{figure}[H]\n');
+ fprintf(fidTeX,'\\centering \n');
+ fprintf(fidTeX,'\\includegraphics[width=%2.2f\\textwidth]{%_param_density%s}\n',min(k/floor(sqrt(npar)),1),M_.fname,int2str(plt));
+ fprintf(fidTeX,'\\caption{Parameter densities based on the Dynamic Striated Metropolis-Hastings algorithm.}');
+ fprintf(fidTeX,'\\label{Fig:ParametersDensities:%s}\n',int2str(plt));
+ fprintf(fidTeX,'\\end{figure}\n');
+ fprintf(fidTeX,' \n');
+end
+%end
+
+function [tlogpost_iminus1,loglik,param] = sort_matrices(tlogpost_iminus1,loglik,param)
+[~,indx_ord] = sortrows(tlogpost_iminus1);
+tlogpost_iminus1 = tlogpost_iminus1(indx_ord);
+param = param(:,indx_ord);
+loglik = loglik(indx_ord);
+
+function [tlogpost_i,weights,zhat,ESS,Omegachol] = compute_IS_weights_and_moments(param,tlogpost_iminus1,loglik,lambda,i,zhat,ESS)
+if i==1
+ tlogpost_i = tlogpost_iminus1 + loglik*lambda(i);
+else
+ tlogpost_i = tlogpost_iminus1 + loglik*(lambda(i)-lambda(i-1));
+end
+weights = exp(tlogpost_i-tlogpost_iminus1);
+zhat = (mean(weights))*zhat ;
+weights = weights/sum(weights);
+ESS(i) = 1/sum(weights.^2);
+% estimates of mean and variance
+mu = param*weights;
+z = bsxfun(@minus,param,mu);
+Omega = z*diag(weights)*z';
+Omegachol = chol(Omega)';
+
+function c = tune_c(TargetFun,param,tlogpost_i,lambda,i,c,Omegachol,weights,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_)
+disp('tuning c_i...');
+disp('Initial value =');
+disp(c) ;
+npar = size(param,1);
+lower_prob = (.5*(options_.posterior_sampler_options.dsmh.alpha0+options_.posterior_sampler_options.dsmh.alpha1))^5;
+upper_prob = (.5*(options_.posterior_sampler_options.dsmh.alpha0+options_.posterior_sampler_options.dsmh.alpha1))^(1/5);
+stop=0 ;
+while stop==0
+ acpt = 0.0;
+ indx_resmpl = smc_resampling(weights,rand(1,1),options_.posterior_sampler_options.dsmh.G);
+ param0 = param(:,indx_resmpl);
+ tlogpost0 = tlogpost_i(indx_resmpl);
+ for j=1:options_.posterior_sampler_options.dsmh.G
+ for l=1:options_.posterior_sampler_options.dsmh.K
+ validate = 0;
+ while validate == 0
+ candidate = param0(:,j) + sqrt(c)*Omegachol*randn(npar,1);
+ if all(candidate >= mh_bounds.lb) && all(candidate <= mh_bounds.ub)
+ [tlogpostx,loglikx] = tempered_likelihood(TargetFun,candidate,lambda(i),dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+ if isfinite(loglikx) % if returned log-density is not Inf or Nan (penalized value)
+ validate = 1;
+ if rand(1,1)= mh_bounds.lb) && all(candidate(:) <= mh_bounds.ub)
+ [tlogpostx,loglikx] = tempered_likelihood(TargetFun,candidate,lambda(i),dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+ if isfinite(loglikx) % if returned log-density is not Inf or Nan (penalized value)
+ validate = 1;
+ if u2.
+
+
+% Create the tempering schedule
+phi = bsxfun(@power,(bsxfun(@minus,1:1:options_.posterior_sampler_options.HSsmc.nphi,1)/(options_.posterior_sampler_options.HSsmc.nphi-1)),options_.posterior_sampler_options.HSsmc.lambda) ;
+% tuning for MH algorithms matrices
+zhat = 0 ; % normalization constant
+csim = zeros(options_.posterior_sampler_options.HSsmc.nphi,1) ; % scale parameter
+ESSsim = zeros(options_.posterior_sampler_options.HSsmc.nphi,1) ; % ESS
+acptsim = zeros(options_.posterior_sampler_options.HSsmc.nphi,1) ; % average acceptance rate
+% Step 0: Initialization of the sampler
+[ param, tlogpost_i, loglik, bayestopt_] = ...
+ SMC_samplers_initialization(TargetFun, xparam1, mh_bounds, dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_,options_.posterior_sampler_options.HSsmc.nparticles);
+weights = ones(options_.posterior_sampler_options.HSsmc.nparticles,1)/options_.posterior_sampler_options.HSsmc.nparticles ;
+% The Herbst and Schorfheide sampler starts here
+for i=2:options_.posterior_sampler_options.HSsmc.nphi
+ % (a) Correction
+ % incremental weights
+ incwt = exp((phi(i)-phi(i-1))*loglik) ;
+ % update weights
+ weights = bsxfun(@times,weights,incwt) ;
+ sum_weights = sum(weights) ;
+ zhat = zhat + log(sum_weights) ;
+ % normalize weights
+ weights = weights/sum_weights ;
+ % (b) Selection
+ ESSsim(i) = 1/sum(weights.^2) ;
+ if (ESSsim(i) < options_.posterior_sampler_options.HSsmc.nparticles/2)
+ indx_resmpl = smc_resampling(weights,rand(1,1),options_.posterior_sampler_options.HSsmc.nparticles) ;
+ param = param(:,indx_resmpl) ;
+ loglik = loglik(indx_resmpl) ;
+ tlogpost_i = tlogpost_i(indx_resmpl) ;
+ weights = ones(options_.posterior_sampler_options.HSsmc.nparticles,1)/options_.posterior_sampler_options.HSsmc.nparticles ;
+ end
+ % (c) Mutation
+ options_.posterior_sampler_options.HSsmc.c = options_.posterior_sampler_options.HSsmc.c*modified_logit(0.95,0.1,16.0,options_.posterior_sampler_options.HSsmc.acpt-options_.posterior_sampler_options.HSsmc.trgt) ;
+ % Calculate estimates of mean and variance
+ mu = param*weights ;
+ z = bsxfun(@minus,param,mu) ;
+ R = z*(bsxfun(@times,z',weights)) ;
+ Rchol = chol(R)' ;
+ % Mutation
+ if options_.posterior_sampler_options.HSsmc.option_mutation==1
+ [param,tlogpost_i,loglik,options_.posterior_sampler_options.HSsmc.acpt] = mutation_RW(TargetFun,param,tlogpost_i,loglik,phi,i,options_.posterior_sampler_options.HSsmc.c*Rchol,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_) ;
+ elseif options_.posterior_sampler_options.HSsmc.option_mutation==2
+ inv_R = inv(options_.posterior_sampler_options.HSsmc.c^2*R) ;
+ Rdiagchol = sqrt(diag(R)) ;
+ [param,tlogpost_i,loglik,options_.posterior_sampler_options.HSsmc.acpt] = mutation_Mixture(TargetFun,param,tlogpost_i,loglik,phi,i,options_.posterior_sampler_options.HSsmc.c*Rchol,options_.posterior_sampler_options.HSsmc.c*Rdiagchol,inv_R,mu,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_) ;
+ end
+ acptsim(i) = options_.posterior_sampler_options.HSsmc.acpt ;
+ csim(i) = options_.posterior_sampler_options.HSsmc.c ;
+ % print information
+ fprintf(' Iteration = %5.0f / %5.0f \n', i, options_.posterior_sampler_options.HSsmc.nphi);
+ fprintf(' phi = %5.4f \n', phi(i));
+ fprintf(' Neff = %5.4f \n', ESSsim(i));
+ fprintf(' %accept. = %5.4f \n', acptsim(i));
+end
+indx_resmpl = smc_resampling(weights,rand(1,1),options_.posterior_sampler_options.HSsmc.nparticles);
+distrib_param = param(:,indx_resmpl);
+fprintf(' Log_lik = %5.4f \n', zhat);
+
+mean_xparam = mean(distrib_param,2);
+npar = length(xparam1) ;
+%mat_var_cov = bsxfun(@minus,distrib_param,mean_xparam) ;
+%mat_var_cov = (mat_var_cov*mat_var_cov')/(options_.posterior_sampler_options.HSsmc.nparticles-1) ;
+%std_xparam = sqrt(diag(mat_var_cov)) ;
+lb95_xparam = zeros(npar,1) ;
+ub95_xparam = zeros(npar,1) ;
+for i=1:npar
+ temp = sortrows(distrib_param(i,:)') ;
+ lb95_xparam(i) = temp(0.025*options_.posterior_sampler_options.HSsmc.nparticles) ;
+ ub95_xparam(i) = temp(0.975*options_.posterior_sampler_options.HSsmc.nparticles) ;
+end
+
+TeX = options_.TeX;
+
+str = sprintf(' Param. \t Lower Bound (95%%) \t Mean \t Upper Bound (95%%)');
+for l=1:npar
+ [name,~] = get_the_name(l,TeX,M_,estim_params_,options_);
+ str = sprintf('%s\n %s \t\t %5.4f \t\t %7.5f \t\t %5.4f', str, name, lb95_xparam(l), mean_xparam(l), ub95_xparam(l));
+end
+disp([str])
+disp('')
+
+%% Plot parameters densities
+
+[nbplt,nr,nc,lr,lc,nstar] = pltorg(npar);
+
+if TeX
+ fidTeX = fopen([M_.fname '_param_density.tex'],'w');
+ fprintf(fidTeX,'%% TeX eps-loader file generated by DSMH.m (Dynare).\n');
+ fprintf(fidTeX,['%% ' datestr(now,0) '\n']);
+ fprintf(fidTeX,' \n');
+end
+
+number_of_grid_points = 2^9; % 2^9 = 512 !... Must be a power of two.
+bandwidth = 0; % Rule of thumb optimal bandwidth parameter.
+kernel_function = 'gaussian'; % Gaussian kernel for Fast Fourier Transform approximation.
+plt = 1 ;
+%for plt = 1:nbplt,
+if TeX
+ NAMES = [];
+ TeXNAMES = [];
+end
+hh = dyn_figure(options_.nodisplay,'Name','Parameters Densities');
+for k=1:npar %min(nstar,npar-(plt-1)*nstar)
+ subplot(ceil(sqrt(npar)),floor(sqrt(npar)),k)
+ %kk = (plt-1)*nstar+k;
+ [name,texname] = get_the_name(k,TeX,M_,estim_params_,options_);
+ optimal_bandwidth = mh_optimal_bandwidth(distrib_param(k,:)',options_.posterior_sampler_options.HSsmc.nparticles,bandwidth,kernel_function);
+ [density(:,1),density(:,2)] = kernel_density_estimate(distrib_param(k,:)',number_of_grid_points,...
+ options_.posterior_sampler_options.HSsmc.nparticles,optimal_bandwidth,kernel_function);
+ plot(density(:,1),density(:,2));
+ hold on
+ if TeX
+ title(texname,'interpreter','latex')
+ else
+ title(name,'interpreter','none')
+ end
+ hold off
+ axis tight
+ drawnow
+end
+dyn_saveas(hh,[ M_.fname '_param_density' int2str(plt) ],options_.nodisplay,options_.graph_format);
+if TeX && any(strcmp('eps',cellstr(options_.graph_format)))
+ % TeX eps loader file
+ fprintf(fidTeX,'\\begin{figure}[H]\n');
+ fprintf(fidTeX,'\\centering \n');
+ fprintf(fidTeX,'\\includegraphics[width=%2.2f\\textwidth]{%_param_density%s}\n',min(k/floor(sqrt(npar)),1),M_.fname,int2str(plt));
+ fprintf(fidTeX,'\\caption{Parameter densities based on the Herbst/Schorfheide sampler.}');
+ fprintf(fidTeX,'\\label{Fig:ParametersDensities:%s}\n',int2str(plt));
+ fprintf(fidTeX,'\\end{figure}\n');
+ fprintf(fidTeX,' \n');
+end
+%end
+
+function [param,tlogpost_i,loglik,acpt] = mutation_RW(TargetFun,param,tlogpost_i,loglik,phi,i,cRchol,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_)
+acpt = 0.0 ;
+tlogpost_i = tlogpost_i + (phi(i)-phi(i-1))*loglik ;
+for j=1:options_.posterior_sampler_options.HSsmc.nparticles
+ validate= 0;
+ while validate==0
+ candidate = param(:,j) + cRchol*randn(size(param,1),1) ;
+ if all(candidate(:) >= mh_bounds.lb) && all(candidate(:) <= mh_bounds.ub)
+ [tlogpostx,loglikx] = tempered_likelihood(TargetFun,candidate,phi(i),dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+ if isfinite(loglikx) % if returned log-density is not Inf or Nan (penalized value)
+ validate = 1;
+ if rand(1,1)= mh_bounds.lb) && all(candidate(:) <= mh_bounds.ub)
+ [tlogpostx,loglikx] = tempered_likelihood(TargetFun,candidate,phi(i),dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+ if isfinite(loglikx) % if returned log-density is not Inf or Nan (penalized value)
+ validate = 1;
+ if rand(1,1).
+
+%Initialize outputs
+ix2 = [];
+ilogpo2 = [];
+iloglik2 = [];
+ModelName = [];
+MetropolisFolder = [];
+
+ModelName = M_.fname;
+if ~isempty(M_.bvar)
+ ModelName = [ModelName '_bvar'];
+end
+
+MetropolisFolder = CheckPath('dsmh',M_.dname);
+BaseName = [MetropolisFolder filesep ModelName];
+
+npar = length(xparam1);
+
+% Here we start a new DS Metropolis-Hastings, previous draws are discarded.
+disp('Estimation:: Initialization...')
+% Delete old dsmh files if any...
+files = dir([BaseName '_dsmh*_blck*.mat']);
+%if length(files)
+% delete([BaseName '_dsmh*_blck*.mat']);
+% disp('Estimation::smc: Old dsmh-files successfully erased!')
+%end
+% Delete old log file.
+file = dir([ MetropolisFolder '/dsmh.log']);
+%if length(file)
+% delete([ MetropolisFolder '/dsmh.log']);
+% disp('Estimation::dsmh: Old dsmh.log file successfully erased!')
+% disp('Estimation::dsmh: Creation of a new dsmh.log file.')
+%end
+fidlog = fopen([MetropolisFolder '/dsmh.log'],'w');
+fprintf(fidlog,'%% DSMH log file (Dynare).\n');
+fprintf(fidlog,['%% ' datestr(now,0) '.\n']);
+fprintf(fidlog,' \n\n');
+fprintf(fidlog,'%% Session 1.\n');
+fprintf(fidlog,' \n');
+prior_draw(bayestopt_,options_.prior_trunc);
+% Find initial values for the NumberOfParticles chains...
+set_dynare_seed('default');
+fprintf(fidlog,[' Initial values of the parameters:\n']);
+disp('Estimation::dsmh: Searching for initial values...');
+ix2 = zeros(npar,NumberOfParticles);
+temperedlogpost = zeros(NumberOfParticles,1);
+loglik = zeros(NumberOfParticles,1);
+%stderr = sqrt(bsxfun(@power,mh_bounds.ub-mh_bounds.lb,2)/12)/10;
+for j=1:NumberOfParticles
+ validate = 0;
+ while validate == 0
+ candidate = prior_draw()';
+% candidate = xparam1(:) + 0.001*randn(npar,1);%bsxfun(@times,stderr,randn(npar,1)) ;
+ if all(candidate(:) >= mh_bounds.lb) && all(candidate(:) <= mh_bounds.ub)
+ ix2(:,j) = candidate ;
+ [temperedlogpost(j),loglik(j)] = tempered_likelihood(TargetFun,candidate,0.0,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,mh_bounds,oo_);
+ if isfinite(loglik(j)) % if returned log-density is Inf or Nan (penalized value)
+ validate = 1;
+ end
+ end
+ end
+end
+fprintf(fidlog,' \n');
+disp('Estimation:: Initial values found!')
+skipline()
+
+
diff --git a/matlab/default_option_values.m b/matlab/default_option_values.m
index 85e350889..5dae852c5 100644
--- a/matlab/default_option_values.m
+++ b/matlab/default_option_values.m
@@ -474,6 +474,27 @@ options_.posterior_sampler_options.slice.save_tmp_file=1;
options_.posterior_sampler_options.imh.proposal_distribution = 'rand_multivariate_normal';
options_.posterior_sampler_options.imh.use_mh_covariance_matrix=0;
options_.posterior_sampler_options.imh.save_tmp_file=0;
+% Herbst and Schorfeide SMC Sampler
+%options_.posterior_sampler = 'Herbst_Schorfheide' ;
+options_.posterior_sampler_options.HSsmc.nphi= 25 ;
+options_.posterior_sampler_options.HSsmc.lambda = 2 ;
+options_.posterior_sampler_options.HSsmc.nparticles = 20000 ;
+options_.posterior_sampler_options.HSsmc.c = 0.5 ;
+options_.posterior_sampler_options.HSsmc.acpt = 0.25 ;
+options_.posterior_sampler_options.HSsmc.trgt = 0.25 ;
+options_.posterior_sampler_options.HSsmc.option_mutation = 1 ;
+options_.posterior_sampler_options.HSsmc.alp = .9 ;
+% DSMH: Dynamic Striated Metropolis-Hastings algorithm
+%options_.posterior_sampler = 'DSMH' ;
+options_.posterior_sampler_options.dsmh.H = 25 ;
+options_.posterior_sampler_options.dsmh.N = 20 ;
+options_.posterior_sampler_options.dsmh.G = 10 ;
+options_.posterior_sampler_options.dsmh.K = 50 ;
+options_.posterior_sampler_options.dsmh.lambda1 = 0.1 ;
+options_.posterior_sampler_options.dsmh.nparticles = 20000 ;
+options_.posterior_sampler_options.dsmh.alpha0 = 0.2 ;
+options_.posterior_sampler_options.dsmh.alpha1 = 0.3 ;
+options_.posterior_sampler_options.dsmh.tau = 10 ;
options_.trace_plot_ma = 200;
options_.mh_autocorrelation_function_size = 30;
diff --git a/matlab/particles b/matlab/particles
index d20be2c27..d71f8be6e 160000
--- a/matlab/particles
+++ b/matlab/particles
@@ -1 +1 @@
-Subproject commit d20be2c271b442d91bd36aea300e4837a066ae2d
+Subproject commit d71f8be6e777fd3e08f1ab2cb74bbf9621ad2d8e
diff --git a/matlab/smc_resampling.m b/matlab/smc_resampling.m
new file mode 100644
index 000000000..4518f2c2d
--- /dev/null
+++ b/matlab/smc_resampling.m
@@ -0,0 +1,30 @@
+function indx = smc_resampling(weights,noise,number)
+% function indx = smc_resampling(weights,noise,number)
+
+% Copyright © 2022 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare. If not, see .
+
+ indx = zeros(number,1);
+ cumweights = cumsum(weights);
+ randvec = (transpose(1:number)-1+noise(:))/number;
+ j = 1;
+ for i=1:number
+ while (randvec(i)>cumweights(j))
+ j = j+1;
+ end
+ indx(i) = j;
+ end
diff --git a/matlab/tempered_likelihood.m b/matlab/tempered_likelihood.m
new file mode 100644
index 000000000..34df1f64f
--- /dev/null
+++ b/matlab/tempered_likelihood.m
@@ -0,0 +1,24 @@
+function [tlogpostkern,loglik] = tempered_likelihood(TargetFun,xparam1,lambda,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_)
+% function [tlogpostkern,loglik] = tempered_likelihood(TargetFun,xparam1,lambda,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_)
+
+% Copyright © 2022 Dynare Team
+%
+% This file is part of Dynare.
+%
+% Dynare is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% Dynare is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with Dynare. If not, see .
+
+ logpostkern = -feval(TargetFun,xparam1,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_);
+ logprior = priordens(xparam1,bayestopt_.pshape,bayestopt_.p6,bayestopt_.p7,bayestopt_.p3,bayestopt_.p4);
+ loglik = logpostkern-logprior ;
+ tlogpostkern = lambda*loglik + logprior;