Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
fdt
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
FSL
fdt
Commits
56e74e3e
Commit
56e74e3e
authored
14 years ago
by
Stamatios Sotiropoulos
Browse files
Options
Downloads
Patches
Plain Diff
Corrected bugs with references and initializations in Multifibre
parent
05774b17
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
fibre.h
+79
-274
79 additions, 274 deletions
fibre.h
with
79 additions
and
274 deletions
fibre.h
+
79
−
274
View file @
56e74e3e
...
@@ -23,32 +23,6 @@ const float minlogfloat=-23;
...
@@ -23,32 +23,6 @@ const float minlogfloat=-23;
namespace
FIBRE
{
namespace
FIBRE
{
//Returns the natural log of the 0th order modified Bessel function of first kind for an argument x
//Follows the exponential implementation of the Bessel function in Numerical Recipes, Ch. 6
float
logIo
(
const
float
&
x
){
float
y
,
b
;
b
=
std
::
fabs
(
x
);
if
(
b
<
3.75
){
float
a
=
x
/
3.75
;
a
*=
a
;
//Bessel function evaluation
y
=
1.0
+
a
*
(
3.5156229
+
a
*
(
3.0899424
+
a
*
(
1.2067492
+
a
*
(
0.2659732
+
a
*
(
0.0360768
+
a
*
0.0045813
)))));
y
=
std
::
log
(
y
);
}
else
{
float
a
=
3.75
/
b
;
//Bessel function evaluation
//y=(exp(b)/sqrt(b))*(0.39894228+a*(0.01328592+a*(0.00225319+a*(-0.00157565+a*(0.00916281+a*(-0.02057706+a*(0.02635537+a*(-0.01647633+a*0.00392377))))))));
//Logarithm of Bessel function
y
=
b
+
std
::
log
((
0.39894228
+
a
*
(
0.01328592
+
a
*
(
0.00225319
+
a
*
(
-
0.00157565
+
a
*
(
0.00916281
+
a
*
(
-
0.02057706
+
a
*
(
0.02635537
+
a
*
(
-
0.01647633
+
a
*
0.00392377
))))))))
/
std
::
sqrt
(
b
));
}
return
y
;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
////Class that represents one anisotropic compartment of the PVM model in an MCMC framework
////Class that represents one anisotropic compartment of the PVM model in an MCMC framework
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
...
@@ -163,6 +137,8 @@ namespace FIBRE{
...
@@ -163,6 +137,8 @@ namespace FIBRE{
m_f_prior
=
0
;
m_f_prior
=
0
;
compute_f_prior
();
compute_f_prior
();
//cc OUT(m_f_prior);
//cc OUT(m_ardfudge);
m_lam_prior
=
0
;
m_lam_prior
=
0
;
compute_lam_prior
();
compute_lam_prior
();
...
@@ -302,22 +278,27 @@ namespace FIBRE{
...
@@ -302,22 +278,27 @@ namespace FIBRE{
return
true
;
return
true
;
else
{
else
{
//m_f_prior=-(log(m_lam) + (m_lam-1)*log(1-m_f));
//m_f_prior=-(log(m_lam) + (m_lam-1)*log(1-m_f));
if
(
!
can_use_ard
)
if
(
!
can_use_ard
){
m_f_prior
=
0
;
m_f_prior
=
0
;
}
else
{
else
{
if
(
m_lam_jump
){
if
(
m_lam_jump
){
// m_f_prior=log(1-m_f)+2*log(fabs(log(1-m_f))); //marginalised with uniform prior on lambda
// m_f_prior=log(1-m_f)+2*log(fabs(log(1-m_f))); //marginalised with uniform prior on lambda
m_f_prior
=
std
::
log
(
m_f
);
m_f_prior
=
std
::
log
(
m_f
);
//cc OUT(m_f);
//cc OUT(m_f);
//cc OUT(m_ardfudge);
//cc OUT(m_ardfudge);
//cc float mmk=m_ardfudge*m_f_prior;
//cc float mmk=m_ardfudge*m_f_prior;
//cc OUT(mmk);
//cc OUT(mmk);
//cc OUT(m_f_old_prior);
//cc OUT(m_f_old_prior);
}
}
else
else
m_f_prior
=
0
;
m_f_prior
=
0
;
}
}
m_f_prior
=
m_ardfudge
*
m_f_prior
;
m_f_prior
=
m_ardfudge
*
m_f_prior
;
return
false
;
return
false
;
}
}
}
}
...
@@ -456,6 +437,7 @@ namespace FIBRE{
...
@@ -456,6 +437,7 @@ namespace FIBRE{
inline
bool
propose_f
(
bool
can_use_ard
=
true
){
inline
bool
propose_f
(
bool
can_use_ard
=
true
){
//cout<<"f"<<endl;
m_f_old
=
m_f
;
m_f_old
=
m_f
;
m_f
+=
normrnd
().
AsScalar
()
*
m_f_prop
;
m_f
+=
normrnd
().
AsScalar
()
*
m_f_prop
;
bool
rejflag
=
compute_f_prior
(
can_use_ard
);
bool
rejflag
=
compute_f_prior
(
can_use_ard
);
...
@@ -478,6 +460,7 @@ namespace FIBRE{
...
@@ -478,6 +460,7 @@ namespace FIBRE{
inline
bool
propose_lam
(){
inline
bool
propose_lam
(){
//cout<<"lam"<<endl;
if
(
m_lam_jump
){
if
(
m_lam_jump
){
m_lam_old
=
m_lam
;
m_lam_old
=
m_lam
;
m_lam
+=
normrnd
().
AsScalar
()
*
m_lam_prop
;
m_lam
+=
normrnd
().
AsScalar
()
*
m_lam_prop
;
...
@@ -566,7 +549,6 @@ namespace FIBRE{
...
@@ -566,7 +549,6 @@ namespace FIBRE{
float
m_d_old_prior
;
float
m_d_old_prior
;
float
m_d_acc
;
float
m_d_acc
;
float
m_d_rej
;
float
m_d_rej
;
float
m_d_std
;
//second d param in multi-shell model - std in gamma dist of diffusivities - to get non-monoexponential decay.
float
m_d_std
;
//second d param in multi-shell model - std in gamma dist of diffusivities - to get non-monoexponential decay.
float
m_d_std_old
;
float
m_d_std_old
;
float
m_d_std_prop
;
float
m_d_std_prop
;
...
@@ -574,7 +556,6 @@ namespace FIBRE{
...
@@ -574,7 +556,6 @@ namespace FIBRE{
float
m_d_std_old_prior
;
float
m_d_std_old_prior
;
float
m_d_std_acc
;
float
m_d_std_acc
;
float
m_d_std_rej
;
float
m_d_std_rej
;
float
m_S0
;
float
m_S0
;
float
m_S0_old
;
float
m_S0_old
;
float
m_S0_prop
;
float
m_S0_prop
;
...
@@ -582,23 +563,6 @@ namespace FIBRE{
...
@@ -582,23 +563,6 @@ namespace FIBRE{
float
m_S0_old_prior
;
float
m_S0_old_prior
;
float
m_S0_acc
;
float
m_S0_acc
;
float
m_S0_rej
;
float
m_S0_rej
;
float
m_tau
;
//Precision parameter (1/sigma^2) for Rician noise
float
m_tau_old
;
float
m_tau_prop
;
float
m_tau_prior
;
float
m_tau_old_prior
;
float
m_tau_acc
;
float
m_tau_rej
;
float
m_f0
;
//Volume fraction for the unattenuated signal compartment
float
m_f0_old
;
float
m_f0_prop
;
float
m_f0_prior
;
float
m_f0_old_prior
;
float
m_f0_acc
;
float
m_f0_rej
;
float
m_prior_en
;
//Joint Prior
float
m_prior_en
;
//Joint Prior
float
m_old_prior_en
;
float
m_old_prior_en
;
float
m_likelihood_en
;
//Likelihood
float
m_likelihood_en
;
//Likelihood
...
@@ -613,29 +577,20 @@ namespace FIBRE{
...
@@ -613,29 +577,20 @@ namespace FIBRE{
const
ColumnVector
&
m_alpha
;
//Theta angles of bvecs
const
ColumnVector
&
m_alpha
;
//Theta angles of bvecs
const
ColumnVector
&
m_beta
;
//Phi angles of bvecs
const
ColumnVector
&
m_beta
;
//Phi angles of bvecs
const
Matrix
&
m_bvals
;
//b values
const
Matrix
&
m_bvals
;
//b values
const
int
m_modelnum
;
//1 for single-shell, 2 for multi-shell model
const
int
&
m_modelnum
;
//1 for single-shell, 2 for multi-shell model
const
bool
&
m_rician
;
//If true, use Rician noise model
const
bool
&
m_includef0
;
//If true, include an unattenuated signal compartment in the model with fraction f0
const
bool
&
m_ardf0
;
//If true, use ard on the f0 compartment
public:
public:
//Constructor
// empty constructor
Multifibre
(
const
ColumnVector
&
data
,
const
ColumnVector
&
alpha
,
Multifibre
(
const
ColumnVector
&
data
,
const
ColumnVector
&
alpha
,
const
ColumnVector
&
beta
,
const
Matrix
&
b
,
int
N
,
float
ardfudge
=
1
,
int
modelnum
=
1
,
bool
rician
=
false
,
bool
inclf0
=
false
,
bool
ardf0
=
false
)
:
const
ColumnVector
&
beta
,
const
Matrix
&
b
,
int
N
,
float
ardfudge
=
1
,
int
modelnum
=
1
)
:
m_ardfudge
(
ardfudge
),
m_data
(
data
),
m_alpha
(
alpha
),
m_beta
(
beta
),
m_bvals
(
b
),
m_modelnum
(
modelnum
),
m_rician
(
rician
),
m_includef0
(
inclf0
),
m_ardf0
(
ardf0
){
m_ardfudge
(
ardfudge
),
m_data
(
data
),
m_alpha
(
alpha
),
m_beta
(
beta
),
m_bvals
(
b
),
m_modelnum
(
modelnum
){
// initialise(Amat,N);
m_iso_Signal
.
ReSize
(
alpha
.
Nrows
());
m_iso_Signal
.
ReSize
(
alpha
.
Nrows
());
m_iso_Signal
=
0
;
m_iso_Signal
=
0
;
m_iso_Signal_old
=
m_iso_Signal
;
//Initialize vectors that keep the signal from the isotropic compartment
m_iso_Signal_old
=
m_iso_Signal
;
//Initialize vectors that keep the signal from the isotropic compartment
}
/* m_d_acc=0; m_d_rej=0;
m_d_std_acc=0; m_d_std_rej=0;
m_S0_acc=0; m_S0_rej=0;
m_tau_acc=0; m_tau_rej=0;
m_f0_acc=0; m_f0_rej=0;
m_d_prior=0; m_d_std_prior=0; m_S0_prior=0; m_f0_prior=0; m_tau_prior=0; */
m_f0
=
0.0
;
//Set this parameter to 0, it will be initialized later only if m_includef0 is true
}
~
Multifibre
(){}
~
Multifibre
(){}
...
@@ -656,16 +611,11 @@ namespace FIBRE{
...
@@ -656,16 +611,11 @@ namespace FIBRE{
Fibre
fib
(
m_alpha
,
m_beta
,
m_bvals
,
m_d
,
m_ardfudge
,
m_modelnum
,
m_d_std
);
Fibre
fib
(
m_alpha
,
m_beta
,
m_bvals
,
m_d
,
m_ardfudge
,
m_modelnum
,
m_d_std
);
m_fibres
.
push_back
(
fib
);
m_fibres
.
push_back
(
fib
);
}
}
void
initialise_energies
(){
void
initialise_energies
(){
compute_d_prior
();
compute_d_prior
();
if
(
m_modelnum
==
2
)
if
(
m_modelnum
==
2
)
compute_d_std_prior
();
compute_d_std_prior
();
if
(
m_rician
){
compute_tau_prior
();
}
if
(
m_includef0
)
compute_f0_prior
();
compute_S0_prior
();
compute_S0_prior
();
m_prior_en
=
0
;
m_prior_en
=
0
;
compute_prior
();
compute_prior
();
...
@@ -678,11 +628,9 @@ namespace FIBRE{
...
@@ -678,11 +628,9 @@ namespace FIBRE{
//Initialize standard deviations for the proposal distributions
//Initialize standard deviations for the proposal distributions
void
initialise_props
(){
void
initialise_props
(){
m_S0_prop
=
m_S0
/
10.0
;
//must have set init
i
al values before this is called;
m_S0_prop
=
m_S0
/
10.0
;
//must have set inital values before this is called;
m_d_prop
=
m_d
/
10.0
;
m_d_prop
=
m_d
/
10.0
;
m_d_std_prop
=
m_d_std
/
10.0
;
m_d_std_prop
=
m_d_std
/
10.0
;
m_tau_prop
=
m_tau
/
2.0
;
m_f0_prop
=
0.2
;
}
}
...
@@ -701,12 +649,6 @@ namespace FIBRE{
...
@@ -701,12 +649,6 @@ namespace FIBRE{
inline
float
get_S0
()
const
{
return
m_S0
;}
inline
float
get_S0
()
const
{
return
m_S0
;}
inline
void
set_S0
(
const
float
S0
){
m_S0
=
S0
;
}
inline
void
set_S0
(
const
float
S0
){
m_S0
=
S0
;
}
inline
float
get_tau
()
const
{
return
m_tau
;
}
inline
void
set_tau
(
const
float
tau
){
m_tau
=
tau
;}
inline
float
get_f0
()
const
{
return
m_f0
;}
inline
void
set_f0
(
const
float
f0
){
m_f0
=
f0
;
}
inline
void
report
()
const
{
inline
void
report
()
const
{
OUT
(
m_d
);
OUT
(
m_d
);
OUT
(
m_d_old
);
OUT
(
m_d_old
);
...
@@ -749,20 +691,6 @@ namespace FIBRE{
...
@@ -749,20 +691,6 @@ namespace FIBRE{
}
}
}
}
//More restrictive prior for the model with f0
//particularly useful for the CSF voxels
inline
bool
compute_d_prior_f0
(){
m_d_old_prior
=
m_d_prior
;
if
(
m_d
<
0
||
m_d
>
0.008
)
return
true
;
else
{
m_d_prior
=
0
;
return
false
;
}
}
inline
bool
compute_d_std_prior
(){
inline
bool
compute_d_std_prior
(){
m_d_std_old_prior
=
m_d_std_prior
;
m_d_std_old_prior
=
m_d_std_prior
;
if
(
m_d_std
<
0
)
if
(
m_d_std
<
0
)
...
@@ -784,34 +712,9 @@ namespace FIBRE{
...
@@ -784,34 +712,9 @@ namespace FIBRE{
}
}
inline
bool
compute_tau_prior
(){
m_tau_old_prior
=
m_tau_prior
;
if
(
m_tau
<=
0
)
return
true
;
else
{
m_tau_prior
=
0
;
return
false
;
}
}
inline
bool
compute_f0_prior
(){
m_f0_old_prior
=
m_f0_prior
;
if
(
m_f0
<=
0
||
m_f0
>=
1
)
return
true
;
else
{
if
(
!
m_ardf0
)
//Without ARD
m_f0_prior
=
0
;
else
//With ARD
m_f0_prior
=
std
::
log
(
m_f0
);
return
false
;
}
}
//Check if sum of volume fractions is >1
//Check if sum of volume fractions is >1
bool
reject_f_sum
(){
bool
reject_f_sum
(){
float
fsum
=
m_f
0
;
float
fsum
=
0
;
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
fsum
+=
m_fibres
[
f
].
get_f
();
fsum
+=
m_fibres
[
f
].
get_f
();
}
}
...
@@ -825,10 +728,6 @@ namespace FIBRE{
...
@@ -825,10 +728,6 @@ namespace FIBRE{
m_prior_en
=
m_d_prior
+
m_S0_prior
;
m_prior_en
=
m_d_prior
+
m_S0_prior
;
if
(
m_modelnum
==
2
)
if
(
m_modelnum
==
2
)
m_prior_en
=
m_prior_en
+
m_d_std_prior
;
m_prior_en
=
m_prior_en
+
m_d_std_prior
;
if
(
m_rician
)
m_prior_en
=
m_prior_en
+
m_tau_prior
;
if
(
m_includef0
)
m_prior_en
=
m_prior_en
+
m_f0_prior
;
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
m_prior_en
=
m_prior_en
+
m_fibres
[
f
].
get_prior
();
m_prior_en
=
m_prior_en
+
m_fibres
[
f
].
get_prior
();
}
}
...
@@ -853,37 +752,29 @@ namespace FIBRE{
...
@@ -853,37 +752,29 @@ namespace FIBRE{
void
compute_likelihood
(){
void
compute_likelihood
(){
m_old_likelihood_en
=
m_likelihood_en
;
m_old_likelihood_en
=
m_likelihood_en
;
ColumnVector
pred
(
m_alpha
.
Nrows
())
,
pred2
;
ColumnVector
pred
(
m_alpha
.
Nrows
());
pred
=
0
;
pred2
=
pred
;
pred
=
0
;
float
fsum
=
m_f
0
;
float
fsum
=
0
;
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
//Signal from the anisotropic compartments
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
//Signal from the anisotropic compartments
pred
=
pred
+
m_fibres
[
f
].
get_f
()
*
m_fibres
[
f
].
getSignal
();
pred
=
pred
+
m_fibres
[
f
].
get_f
()
*
m_fibres
[
f
].
getSignal
();
fsum
+=
m_fibres
[
f
].
get_f
();
//Total anisotropic volume fraction
fsum
+=
m_fibres
[
f
].
get_f
();
//Total anisotropic volume fraction
}
}
for
(
int
i
=
1
;
i
<=
pred
.
Nrows
();
i
++
){
for
(
int
i
=
1
;
i
<=
pred
.
Nrows
();
i
++
){
pred
(
i
)
=
m_S0
*
(
pred
(
i
)
+
(
1
-
fsum
)
*
m_iso_Signal
(
i
)
+
m_f0
);
//Add the signal from the isotropic compartment
pred
(
i
)
=
m_S0
*
(
pred
(
i
)
+
(
1
-
fsum
)
*
m_iso_Signal
(
i
));
//Add the signal from the isotropic compartment
}
//and multiply by S0 to get the total signal
}
//and multiply by S0 to get the total signal
if
(
!
m_rician
){
//Likelihood energy for Gaussian noise
float
sumsquares
=
(
m_data
-
pred
).
SumSquare
();
//Sum of squared residuals
float
sumsquares
=
(
m_data
-
pred
).
SumSquare
();
//Sum of squared residuals
m_likelihood_en
=
(
m_data
.
Nrows
()
/
2.0
)
*
log
(
sumsquares
/
2.0
);
m_likelihood_en
=
(
m_data
.
Nrows
()
/
2.0
)
*
log
(
sumsquares
/
2.0
);
}
}
else
{
//Likelihood energy for Rician noise
for
(
int
i
=
1
;
i
<=
pred
.
Nrows
();
i
++
)
pred2
(
i
)
=
std
::
log
(
m_data
(
i
))
-
0.5
*
m_tau
*
(
m_data
(
i
)
*
m_data
(
i
)
+
pred
(
i
)
*
pred
(
i
))
+
logIo
(
m_tau
*
pred
(
i
)
*
m_data
(
i
));
m_likelihood_en
=-
m_data
.
Nrows
()
*
std
::
log
(
m_tau
)
-
pred2
.
Sum
();
}
}
inline
void
compute_energy
(){
inline
void
compute_energy
(){
m_old_energy
=
m_energy
;
m_old_energy
=
m_energy
;
m_energy
=
m_prior_en
+
m_likelihood_en
;
m_energy
=
m_prior_en
+
m_likelihood_en
;
//cout<<m_prior_en<<" "<<m_likelihood_en<<endl;
}
}
/*
void
evaluate_energy
(){
void
evaluate_energy
(){
m_old_energy
=
m_energy
;
m_old_energy
=
m_energy
;
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
...
@@ -897,12 +788,13 @@ namespace FIBRE{
...
@@ -897,12 +788,13 @@ namespace FIBRE{
compute_prior
();
compute_prior
();
compute_likelihood
();
compute_likelihood
();
m_energy
=
m_prior_en
+
m_likelihood_en
;
m_energy
=
m_prior_en
+
m_likelihood_en
;
} */
}
//Test whether the candidate state will be accepted
//Test whether the candidate state will be accepted
bool
test_energy
(){
bool
test_energy
(){
float
tmp
=
exp
(
m_old_energy
-
m_energy
);
float
tmp
=
exp
(
m_old_energy
-
m_energy
);
//cout<<m_old_energy<< " " << m_energy <<endl;
return
(
tmp
>
unifrnd
().
AsScalar
());
return
(
tmp
>
unifrnd
().
AsScalar
());
}
}
...
@@ -922,13 +814,9 @@ namespace FIBRE{
...
@@ -922,13 +814,9 @@ namespace FIBRE{
inline
bool
propose_d
(){
inline
bool
propose_d
(){
//cout<<"d"<<endl;
//cout<<"d"<<endl;
bool
rejflag
;
m_d_old
=
m_d
;
m_d_old
=
m_d
;
m_d
+=
normrnd
().
AsScalar
()
*
m_d_prop
;
m_d
+=
normrnd
().
AsScalar
()
*
m_d_prop
;
if
(
m_includef0
)
bool
rejflag
=
compute_d_prior
();
//inside this it stores the old prior
rejflag
=
compute_d_prior_f0
();
else
rejflag
=
compute_d_prior
();
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
)
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
)
m_fibres
[
f
].
compute_signal
();
m_fibres
[
f
].
compute_signal
();
compute_iso_signal
();
compute_iso_signal
();
...
@@ -953,6 +841,7 @@ namespace FIBRE{
...
@@ -953,6 +841,7 @@ namespace FIBRE{
inline
bool
propose_d_std
(){
inline
bool
propose_d_std
(){
//cout<<"d_std"<<endl;
m_d_std_old
=
m_d_std
;
m_d_std_old
=
m_d_std
;
m_d_std
+=
normrnd
().
AsScalar
()
*
m_d_std_prop
;
m_d_std
+=
normrnd
().
AsScalar
()
*
m_d_std_prop
;
bool
rejflag
=
compute_d_std_prior
();
//inside this it stores the old prior
bool
rejflag
=
compute_d_std_prior
();
//inside this it stores the old prior
...
@@ -980,6 +869,7 @@ namespace FIBRE{
...
@@ -980,6 +869,7 @@ namespace FIBRE{
inline
bool
propose_S0
(){
inline
bool
propose_S0
(){
//cout<<"S0"<<endl;
m_S0_old
=
m_S0
;
m_S0_old
=
m_S0
;
m_S0
+=
normrnd
().
AsScalar
()
*
m_S0_prop
;
m_S0
+=
normrnd
().
AsScalar
()
*
m_S0_prop
;
bool
rejflag
=
compute_S0_prior
();
//inside this it stores the old prior
bool
rejflag
=
compute_S0_prior
();
//inside this it stores the old prior
...
@@ -1000,47 +890,6 @@ namespace FIBRE{
...
@@ -1000,47 +890,6 @@ namespace FIBRE{
}
}
inline
bool
propose_tau
(){
m_tau_old
=
m_tau
;
m_tau
+=
normrnd
().
AsScalar
()
*
m_tau_prop
;
bool
rejflag
=
compute_tau_prior
();
//inside this it stores the old prior
return
rejflag
;
};
inline
void
accept_tau
(){
m_tau_acc
++
;
}
inline
void
reject_tau
(){
m_tau
=
m_tau_old
;
m_tau_prior
=
m_tau_old_prior
;
m_prior_en
=
m_old_prior_en
;
m_tau_rej
++
;
}
inline
bool
propose_f0
(){
m_f0_old
=
m_f0
;
m_f0
+=
normrnd
().
AsScalar
()
*
m_f0_prop
;
bool
rejflag
=
compute_f0_prior
();
compute_prior
();
return
rejflag
;
};
inline
void
accept_f0
(){
m_f0_acc
++
;
}
inline
void
reject_f0
(){
m_f0
=
m_f0_old
;
m_f0_prior
=
m_f0_old_prior
;
m_prior_en
=
m_old_prior_en
;
m_f0_rej
++
;
}
//Adapt standard deviation of proposal distributions during MCMC execution
//Adapt standard deviation of proposal distributions during MCMC execution
//to avoid over-rejection/over-acceptance of MCMC samples
//to avoid over-rejection/over-acceptance of MCMC samples
inline
void
update_proposals
(){
inline
void
update_proposals
(){
...
@@ -1052,18 +901,6 @@ namespace FIBRE{
...
@@ -1052,18 +901,6 @@ namespace FIBRE{
m_d_std_acc
=
0
;
m_d_std_acc
=
0
;
m_d_std_rej
=
0
;
m_d_std_rej
=
0
;
}
}
if
(
m_rician
){
m_tau_prop
*=
sqrt
(
float
(
m_tau_acc
+
1
)
/
float
(
m_tau_rej
+
1
));
m_tau_prop
=
min
(
m_tau_prop
,
maxfloat
);
m_tau_acc
=
0
;
m_tau_rej
=
0
;
}
if
(
m_includef0
){
m_f0_prop
*=
sqrt
(
float
(
m_f0_acc
+
1
)
/
float
(
m_f0_rej
+
1
));
m_f0_prop
=
min
(
m_f0_prop
,
maxfloat
);
m_f0_acc
=
0
;
m_f0_rej
=
0
;
}
m_S0_prop
*=
sqrt
(
float
(
m_S0_acc
+
1
)
/
float
(
m_S0_rej
+
1
));
m_S0_prop
*=
sqrt
(
float
(
m_S0_acc
+
1
)
/
float
(
m_S0_rej
+
1
));
m_S0_prop
=
min
(
m_S0_prop
,
maxfloat
);
m_S0_prop
=
min
(
m_S0_prop
,
maxfloat
);
m_d_acc
=
0
;
m_d_acc
=
0
;
...
@@ -1079,43 +916,9 @@ namespace FIBRE{
...
@@ -1079,43 +916,9 @@ namespace FIBRE{
//Function that performs a single MCMC iteration
//Function that performs a single MCMC iteration
void
jump
(
bool
can_use_ard
=
true
){
void
jump
(
bool
can_use_ard
=
true
){
if
(
m_includef0
){
//Try f0
// cout<<"modelnum "<<m_modelnum<<endl;
if
(
!
propose_f0
()){
// cout<<"fmodelnum "<<m_fibres[0].get_modelnum()<<endl;
if
(
!
reject_f_sum
()){
// cout<<"fmodelnum2 "<<m_fibres[1].get_modelnum()<<endl;
compute_prior
();
compute_likelihood
();
compute_energy
();
if
(
test_energy
())
accept_f0
();
else
{
reject_f0
();
restore_energy
();
}
}
else
//else for rejecting fsum>1
reject_f0
();
}
else
//else for rejecting rejflag returned from propose_f()
reject_f0
();
}
if
(
m_rician
){
//Try tau
if
(
!
propose_tau
()){
compute_prior
();
compute_likelihood
();
compute_energy
();
if
(
test_energy
())
accept_tau
();
else
{
reject_tau
();
restore_energy
();
}
}
else
reject_tau
();
}
if
(
!
propose_d
()){
//Try d
if
(
!
propose_d
()){
//Try d
compute_prior
();
compute_prior
();
compute_likelihood
();
compute_likelihood
();
...
@@ -1128,9 +931,9 @@ namespace FIBRE{
...
@@ -1128,9 +931,9 @@ namespace FIBRE{
restore_energy
();
restore_energy
();
}
}
}
}
else
else
{
reject_d
();
reject_d
();
}
if
(
m_modelnum
==
2
){
//Try d_std
if
(
m_modelnum
==
2
){
//Try d_std
if
(
!
propose_d_std
()){
if
(
!
propose_d_std
()){
...
@@ -1145,11 +948,10 @@ namespace FIBRE{
...
@@ -1145,11 +948,10 @@ namespace FIBRE{
restore_energy
();
restore_energy
();
}
}
}
}
else
else
{
reject_d_std
();
reject_d_std
();
}
}
}
if
(
!
propose_S0
()){
//Try S0
if
(
!
propose_S0
()){
//Try S0
compute_prior
();
compute_prior
();
compute_likelihood
();
compute_likelihood
();
...
@@ -1161,29 +963,44 @@ namespace FIBRE{
...
@@ -1161,29 +963,44 @@ namespace FIBRE{
restore_energy
();
restore_energy
();
}
}
}
}
else
else
{
reject_S0
();
reject_S0
();
}
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
//For each fibre
for
(
unsigned
int
f
=
0
;
f
<
m_fibres
.
size
();
f
++
){
//For each fibre
//cout<<"pre th "<<m_fibres[f].get_th()<<endl;
//cout << m_fibres[f].getSignal()<<endl;
//cout<<"prior"<<m_prior_en<<endl;
//cout<<"lik"<<m_likelihood_en<<endl;
//cout<<"energy"<<m_energy<<endl;
//cout <<endl;
if
(
!
m_fibres
[
f
].
propose_th
()){
//Try theta
if
(
!
m_fibres
[
f
].
propose_th
()){
//Try theta
compute_prior
();
compute_prior
();
compute_likelihood
();
compute_likelihood
();
compute_energy
();
compute_energy
();
if
(
test_energy
())
//cout<<"post th "<<m_fibres[f].get_th()<<endl;
//cout<< m_d<< " " <<m_d_std<<endl;
//cout << m_fibres[f].getSignal()<<endl;
//cout<<"prior"<<m_prior_en<<endl;
//cout<<"lik"<<m_likelihood_en<<endl;
//cout<<"energy"<<m_energy<<endl;
if
(
test_energy
()){
m_fibres
[
f
].
accept_th
();
m_fibres
[
f
].
accept_th
();
//cout<<"Accepted"<<endl;}
}
else
{
else
{
m_fibres
[
f
].
reject_th
();
m_fibres
[
f
].
reject_th
();
restore_energy
();
restore_energy
();
//cout<<"rejected"<<endl;
}
}
//cout <<endl<<endl;
}
}
else
else
{
m_fibres
[
f
].
reject_th
();
m_fibres
[
f
].
reject_th
();
}
if
(
!
m_fibres
[
f
].
propose_ph
()){
//Try phi
if
(
!
m_fibres
[
f
].
propose_ph
()){
//Try phi
compute_prior
();
compute_prior
();
...
@@ -1196,28 +1013,30 @@ namespace FIBRE{
...
@@ -1196,28 +1013,30 @@ namespace FIBRE{
restore_energy
();
restore_energy
();
}
}
}
}
else
else
{
m_fibres
[
f
].
reject_ph
();
m_fibres
[
f
].
reject_ph
();
}
if
(
!
m_fibres
[
f
].
propose_f
(
can_use_ard
)){
//Try f
if
(
!
m_fibres
[
f
].
propose_f
(
can_use_ard
)){
//Try f
if
(
!
reject_f_sum
()){
if
(
!
reject_f_sum
()){
compute_prior
();
compute_prior
();
compute_likelihood
();
compute_likelihood
();
compute_energy
();
compute_energy
();
if
(
test_energy
())
if
(
test_energy
())
{
m_fibres
[
f
].
accept_f
();
m_fibres
[
f
].
accept_f
();
}
else
{
else
{
m_fibres
[
f
].
reject_f
();
m_fibres
[
f
].
reject_f
();
restore_energy
();
restore_energy
();
}
}
}
}
else
//else for rejectin fsum>1
else
{
//else for rejectin fsum>1
m_fibres
[
f
].
reject_f
();
m_fibres
[
f
].
reject_f
();
}
}
else
//else for rejecting rejflag returned from propose_f()
}
m_fibres
[
f
].
reject_f
();
else
{
//else for rejecting rejflag returned from propose_f()
m_fibres
[
f
].
reject_f
();
}
// if(!m_fibres[f].propose_lam()){
// if(!m_fibres[f].propose_lam()){
// compute_prior();
// compute_prior();
...
@@ -1236,7 +1055,7 @@ namespace FIBRE{
...
@@ -1236,7 +1055,7 @@ namespace FIBRE{
}
}
}
}
Multifibre
&
operator
=
(
const
Multifibre
&
rhs
){
Multifibre
&
operator
=
(
const
Multifibre
&
rhs
){
m_fibres
=
rhs
.
m_fibres
;
m_fibres
=
rhs
.
m_fibres
;
m_d
=
rhs
.
m_d
;
m_d
=
rhs
.
m_d
;
...
@@ -1260,20 +1079,6 @@ namespace FIBRE{
...
@@ -1260,20 +1079,6 @@ namespace FIBRE{
m_S0_old_prior
=
rhs
.
m_S0_old_prior
;
m_S0_old_prior
=
rhs
.
m_S0_old_prior
;
m_S0_acc
=
rhs
.
m_S0_acc
;
m_S0_acc
=
rhs
.
m_S0_acc
;
m_S0_rej
=
rhs
.
m_S0_rej
;
m_S0_rej
=
rhs
.
m_S0_rej
;
m_f0
=
rhs
.
m_f0
;
m_f0_old
=
rhs
.
m_f0_old
;
m_f0_prop
=
rhs
.
m_f0_prop
;
m_f0_prior
=
rhs
.
m_f0_prior
;
m_f0_old_prior
=
rhs
.
m_f0_old_prior
;
m_f0_acc
=
rhs
.
m_f0_acc
;
m_f0_rej
=
rhs
.
m_f0_rej
;
m_tau
=
rhs
.
m_tau
;
m_tau_old
=
rhs
.
m_tau_old
;
m_tau_prop
=
rhs
.
m_tau_prop
;
m_tau_prior
=
rhs
.
m_tau_prior
;
m_tau_old_prior
=
rhs
.
m_tau_old_prior
;
m_tau_acc
=
rhs
.
m_tau_acc
;
m_tau_rej
=
rhs
.
m_tau_rej
;
m_prior_en
=
rhs
.
m_prior_en
;
m_prior_en
=
rhs
.
m_prior_en
;
m_old_prior_en
=
rhs
.
m_old_prior_en
;
m_old_prior_en
=
rhs
.
m_old_prior_en
;
m_likelihood_en
=
rhs
.
m_likelihood_en
;
m_likelihood_en
=
rhs
.
m_likelihood_en
;
...
@@ -1284,7 +1089,7 @@ namespace FIBRE{
...
@@ -1284,7 +1089,7 @@ namespace FIBRE{
m_iso_Signal
=
rhs
.
m_iso_Signal
;
m_iso_Signal
=
rhs
.
m_iso_Signal
;
m_iso_Signal_old
=
rhs
.
m_iso_Signal_old
;
m_iso_Signal_old
=
rhs
.
m_iso_Signal_old
;
return
*
this
;
return
*
this
;
}
}
};
};
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment