-
Notifications
You must be signed in to change notification settings - Fork 15
/
MCMC_run.F90
114 lines (97 loc) · 3.69 KB
/
MCMC_run.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
!!! $Id: MCMC_run.F90,v 1.14 2012/07/03 10:57:33 mjlaine Exp $
!!! ------------------------------------------------------------------------
!!! mcmc library
!!! File: MCMC_run.F90
!!! Purpose: the actual mcmc simulation loop
!!!
!!!
!!! Marko Laine 2001 <[email protected]>
!!! Copyrights licensed under a MIT License.
!!! See the accompanying LICENSE.txt file for terms.
!!!
subroutine MCMC_run()
implicit none
real(kind=dbl), dimension(nycol) :: ss1, ss2, ss3
real(kind=dbl), dimension(npar) :: oldpar, newpar, newpar2
real(kind=dbl) :: sspri1, sspri2, sspri3
real(kind=dbl) :: alpha12, alpha13
integer :: i
logical :: reject, inbounds
if (inited /= 1) call doerror('we have not inited')
if (verbosity>0.and.dodr) write(*,*) 'note: running DRAM with drscale',real(drscale)
if (verbosity>0.and..not.dodr) write(*,*) 'note: running AM'
oldpar = par0 ! par0 is global in mcmcmod and inited in MCMC_init
if (verbosity>2) write(*,*) 'note: calling ssfunction for the first time'
sspri1 = MCMC_priorfun(oldpar)
ss1 = MCMC_ssfunction(oldpar)
if (verbosity>0) write(*,*) 'note: ss1 = ',real(ss1), &
' sspri1 = ',real(sspri1)
reject = .false.
call MCMC_savechain(oldpar,ss1,sspri1,sigma2,reject)
call MCMC_userfun(oldpar)
call MCMC_dump_init()
!! the simulation loop
MCMC_LOOP: do i = 2, nsimu
simuind = i ! global simuind
if (verbosity>2) write(*,*) 'isimu:', i
newpar = MCMC_propose(oldpar,R)
inbounds = MCMC_checkbounds(newpar) ! constraints
if (.not.inbounds) then
if (.not.dodr) bndstayed = bndstayed + 1
ss2 = huge(0.0d0) ! realmax
sspri2 = huge(0.0d0)
alpha12 = 0.0d0
reject =.true.
else
sspri2 = MCMC_priorfun(newpar)
ss2 = MCMC_ssfunction(newpar)
alpha12 = MCMC_alpha(oldpar, ss1, sspri1, newpar, ss2, sspri2)
reject = MCMC_reject(alpha12)
end if
if (verbosity>3) write(*,*) 'oldpar:', real(oldpar)
if (verbosity>3) write(*,*) 'newpar:', real(newpar)
if (verbosity>2) write(*,*) 'ss1:', real(ss1),' ss2:', real(ss2), 'alpha12:', real(alpha12),.not.reject
if (reject .and. dodr) then ! We reject but make one new DR try
if (verbosity>2) write(*,*) 'dr try'
drtries = drtries+1
newpar2 = MCMC_propose(oldpar,R2)
inbounds = MCMC_checkbounds(newpar2)
if (.not.inbounds) then
bndstayed = bndstayed + 1
reject = .true.
else
sspri3 = MCMC_priorfun(newpar2)
ss3 = MCMC_ssfunction(newpar2)
alpha13 = MCMC_DR_alpha13(oldpar, ss1, sspri1, &
newpar,ss2, sspri2, alpha12, &
newpar2,ss3, sspri3)
reject = MCMC_reject(alpha13)
if (.not.reject) then ! DR accepted
draccepted = draccepted + 1
newpar = newpar2
ss2 = ss3
sspri2 = sspri3
end if
end if
if (verbosity>3) write(*,*) 'newpar2:', real(newpar2)
if (verbosity>2) write(*,*) 'ss1:', real(ss1),'ss2:', real(ss2),'ss3:', &
real(ss3), 'alpha13:', real(alpha13),.not.reject
end if ! DR
if (reject) then
stayed = stayed + 1
else
ss1 = ss2
sspri1 = sspri2
oldpar = newpar
call MCMC_userfun(newpar)
end if
call MCMC_dump(oldpar)
call MCMC_updatesigma2(ss1)
call MCMC_savechain(oldpar,ss1,sspri1,sigma2,reject)
call MCMC_adapt(i) ! adapt R if necessary, called on every simuloop
end do MCMC_LOOP
if (dodr) then
if (verbosity>0) write(*,*) 'note: draccepted=',draccepted,'drtries = ',drtries
end if
return
end subroutine MCMC_run