tadd inversion function which writes status to file - cosmo - front and backend for Markov-Chain Monte Carlo inversion of cosmogenic nuclide concentrations (HTM) git clone git://src.adamsgaard.dk/cosmo (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit b2f33379dadeee42f0285c5678d4a43d7a726a2b (DIR) parent 212f61573d02611aaccda37ce4d01a3b05cdd345 (HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk> Date: Tue, 29 Sep 2015 13:53:43 +0200 add inversion function which writes status to file Diffstat: A matlab/m_pakke2014maj11/MetHasLong… | 248 +++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+), 0 deletions(-) --- (DIR) diff --git a/matlab/m_pakke2014maj11/MetHasLongstep4.m b/matlab/m_pakke2014maj11/MetHasLongstep4.m t@@ -0,0 +1,247 @@ +%file: MetHasLongstep4.m +%'cosmolongstep' changed to 'CosmoLongsteps'. + +%Developed from MetHasLongstep2 +%Developed from MetHasLongstep +%But now including +% - linearized inspiration proposer using partial derivatives +% - computed either separately or +% - computed from from previous samples +% +%Metropolis-Hastings iterations +%Inside a function call +% d = g(m_prop,fixed_stuff) +%computes the data to be compared to the measured data, d_obs. +%Make sure to let function g be availble at run-time. +%Make sure that the paramater fixed_stuff (possibly a structure) is defined +%properly, including measurement geometry etc. +%INPUTS: +% m_start: First current model +% seed: if ~isempty(seed), setseed(seed), end Makes walks repeatable +% fixed-stuff: A variable, possible a structure which defines non-variable +% parameters for function g +%OUTPUTS: +% ms: Each column is a stored state. Note that only one out of N_skip +% states were stored. +% accepts: accepts(i)=1 if this proposal was accepted, else accepts(i)=0 +% Qs: Qds(i) + Qps(i) +% Qds: Qds(i) = (d_obs-g(ms(i))'*inv(C_obs)*(d_obs-g(ms(i)) +% Qps: Qps(i) = (m_prior - ms(i))'*inv(C_prior)*(m_prior-ms(i)) +% lump: A number of additional diagnostics + +% function [ms,accepts,Qs,Qds,lump]=MetHasLongstep3(... +% m_start,d_obs,seed,fixed_stuff); +function [ms,accepts,Qs,Qds,lump]=MetHasLongstep(... + m_start,seed,isBurnIn,fixed_stuff, ... + statusfile) %%%% ADDED BY ANDERS +d_obs = fixed_stuff.d_obs; +if isBurnIn + fsSampling = fixed_stuff.BurnIn; +else + fsSampling = fixed_stuff.Sampling; +end + +%Initializations +diagCobs = fixed_stuff.ErrorStdObs.^2; %the variances +C_obs = diag(diagCobs); +iCobs = inv(C_obs); +StepFact = fsSampling.StepFactor; +sqrtCpostpr = []; %We have to bootstrap + +if ~isempty(seed) + setseed(seed); +end + +%Preallocations +M = length(m_start); +N_run = fsSampling.Nsamp; +N_skip = fsSampling.Nskip; +ms = NaN*ones(M,floor(N_run/N_skip)); +Qs = NaN*ones(1,floor(N_run/N_skip)); +Qds = Qs; +% Qps = Qs; + +accepts = zeros(N_run,1); +propaccepts = accepts; + +mprops = zeros(M,N_run); +Qprops = zeros(1,N_run); +Qdprops = Qprops; +% Qpprops = Qprops; + +mcurs = zeros(M,N_run); +Qcurs = zeros(1,N_run); +Qdcurs = Qcurs; +% Qpcurs = Qcurs; + +dprops = NaN(length(d_obs),N_run); +dcurs = dprops; + +%Initializing mcur as m_start +mcur = m_start; +mprops(:,1)=m_start; %Just to make updateCpost have something to start with +[dcur,lumpprop] = g(mcur,fixed_stuff); +dd_obs = d_obs - dcur; +Qdcur = dd_obs'*iCobs*dd_obs; + +% dm_pri = m_prior - mcur; +% Qpcur = dm_pri'*iCpri*dm_pri; + +Qcur = Qdcur; %+Qpcur; +if strcmp(fixed_stuff.g_case,'CosmoLongsteps') + zsss{1}=lumpprop.zss; + tss{1}=lumpprop.ts; + ExposureTimeSinceNows{1}=lumpprop.ExposureTimeSinceNow; + c14Csss{1}=lumpprop.c14Css; + c10Besss{1}=lumpprop.c10Bess; + c26Alsss{1}=lumpprop.c26Alss; + c21Nesss{1}=lumpprop.c21Ness; + +end +i_keep = 0; %index of the so far last stored model +iCpostUpdate = 0; + +%................... The main iteration loop +for it=1:N_run + if rem(it,1000)==0, + [ElapsedTime,RemainingTime,TotalTime,EndTime,IterationsPerSecond,PrintString] = ... + RuntimeStatus(it,isBurnIn,fixed_stuff); + disp([num2str(it),': ',PrintString]) + end + + + +%%% INSERTED BY ANDERS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + fid = fopen(statusfile, 'w'); + statusinfo = strcat(... + 'Elapsed: ', num2str(datestr(ElapsedTime,13)), ... + ', Remaining: ', num2str(datestr(RemainingTime,13))); + fprintf(fid, statusinfo); + fclose(fid); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + + if rem(it,fsSampling.StepsPerFactorUpdate)==0 + %update StepFact + acc=accepts((it-fsSampling.StepsPerFactorUpdate+1):it); %recent accepts + StepFact = UpdateStepFact(StepFact,acc,fsSampling); + disp(['StepFact updated to ',num2str(StepFact),'. It=',num2str(it)]) + end + if rem(it,fsSampling.StepsPerCpostUpdate)==1 + %update sqrtCpost already at the start of the first iterations + is = max(1,it-fsSampling.StepsPerCpostUpdate-1):it; + [sqrtCpostpr,Cpostpr,Gestpr]=updateCpost(mprops(:,is),dprops(:,is),fsSampling,fixed_stuff); +% disp(['sqrtCpost updated. Cond(sqrtCpost)=',num2str(cond(sqrtCpostpr)),'. It=',num2str(it)]) + iCpostUpdate = iCpostUpdate+1; + sqrtCposts{iCpostUpdate}=sqrtCpostpr; + end + + [mprop,propaccepts(it)] = propLongstep(mcur,StepFact,fsSampling,fixed_stuff,sqrtCpostpr); %Mads' proposer, takes care of hard limits + dmpropspr(:,it) = m2mpr(mprop,fixed_stuff) - m2mpr(mcur,fixed_stuff); + + [dprop,lumpprop] = g(mprop,fixed_stuff); + dd_obs = d_obs - dprop; + Qdprop = dd_obs'*iCobs*dd_obs; + Qprop = Qdprop; %+Qpprop; + + alpha = rand; + + if alpha < exp(-0.5*(Qprop-Qcur)) + if propaccepts(it) + accepts(it)=1; + end + mcur=mprop; + dcur=dprop; + Qdcur = Qdprop; + % Qpcur = Qpprop; + Qcur = Qprop; + end + if strcmp(fixed_stuff.g_case,'CosmoLongsteps') + if accepts(it) + zsss{it+1}=lumpprop.zss; %note: varying length + tss{it+1}=lumpprop.ts; + ExposureTimeSinceNows{it+1}=lumpprop.ExposureTimeSinceNow; + c14Csss{it+1}=lumpprop.c14Css; + c10Besss{it+1}=lumpprop.c10Bess; + c26Alsss{it+1}=lumpprop.c26Alss; + c21Nesss{it+1}=lumpprop.c21Ness; + + + else %mcur remains; take the previous model + zsss{it+1}=zsss{it}; + tss{it+1}=tss{it}; + ExposureTimeSinceNows{it+1}=ExposureTimeSinceNows{it}; + c14Csss{it+1}=c14Csss{it}; + c10Besss{it+1}=c10Besss{it}; + c26Alsss{it+1}=c26Alsss{it}; + c21Nesss{it+1}=c21Nesss{it}; + end + end + dmcurspr(:,it) = dmpropspr(:,it)*accepts(it); + + if mod(it,N_skip)==0 + %pick out sample to keep + i_keep = i_keep+1; + ms(:,i_keep)=mcur; + Qds(i_keep)=Qdcur; + % Qps(i_keep)=Qpcur; + Qs(i_keep)=Qcur; + end + + mcurs(:,it) = mcur; + dcurs(:,it) = dcur; + Qcurs(it) = Qcur; + Qdcurs(it) = Qdcur; + % Qpcurs(it) = Qpcur; + + mprops(:,it) = mprop; + dprops(:,it) = dprop; + Qprops(:,it) = Qprop; + Qdprops(:,it) = Qdprop; + % Qpprops(:,it) = Qpprop; + StepFacts(it) = StepFact; +end + +if nargout==5 + + lump.StepFacts = StepFacts; + + lump.mcurs = mcurs; + lump.Qcurs = Qcurs; + lump.Qdcurs = Qdcurs; + lump.dmcurspr = dmcurspr; + % lump.Qpcurs = Qpcurs; + + lump.mprops = mprops; + lump.Qprops = Qprops; + lump.Qdprops = Qdprops; + lump.dmpropspr = dmpropspr; + % lump.Qpprops = Qpprops; + + if strcmp(fixed_stuff.g_case,'CosmoLongsteps') + lump.zsss = zsss; + lump.tss = tss; + lump.ExposureTimeSinceNows=ExposureTimeSinceNows; + lump.c14Csss=c14Csss; + lump.c10Besss=c10Besss; + lump.c26Alsss=c26Alsss; + lump.c21Nesss=c21Nesss; + end +end + + +%{ +function u = prop(proposer_type,sqrtC) +switch proposer_type + case 1 % isotropic unit coordinate variances: + u = randn(size(sqrtC,1),1); + case 2 % box-shaped coordinate variances: + u = sqrt(12)*(rand(size(sqrtC,1))-0.5); + case {3,4} %prior proposer: + u = sqrtC*randn(size(m)); + case 5 %proposer defined by external function + u = prop_external; +end +%} +\ No newline at end of file