-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathsippi_forward.m
119 lines (93 loc) · 3.87 KB
/
sippi_forward.m
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
115
116
117
118
119
% sippi_forward Simple forward wrapper for SIPPI
%
% Assumes that the actual forward solver has been defined by
% forward.forward_function
%
% Call:
% [d,forward,prior,data]=sippi_forward(m,forward)
%
% Optional:
% [d,forward,prior,data]=sippi_forward(m,forward,prior)
% [d,forward,prior,data]=sippi_forward(m,forward,prior,data)
% [d,forward,prior,data]=sippi_forward(m,forward,prior,data,options)
%
function [d,forward,prior,data,options]=sippi_forward(m,forward,prior,data,options)
if nargin<4; data{1}.null='';end
% make sure to initilize the prior if it has not allready been done
% TMH: can this be ignored?
if exist('prior','var')
for ip=1:length(prior)
if ~isfield(prior{ip},'init');
prior=sippi_prior_init(prior);
end
end
end
if isfield(forward,'forward_function');
if nargin==2;
[d,forward]=feval(forward.forward_function,m,forward);
elseif nargin==3
[d,forward,prior]=feval(forward.forward_function,m,forward,prior);
elseif nargin==4
[d,forward,prior,data]=feval(forward.forward_function,m,forward,prior,data);
elseif nargin==5
[d,forward,prior,data,options]=feval(forward.forward_function,m,forward,prior,data,options);
end
else
disp(sprintf('%s : No forward_function specified in ''forward'' structure',mfilename))
d=[];
end
%% Optionally adjust the noise model
if nargin>=4
for im=1:length(prior);
if ~isfield(prior{im},'is_perturbed');
prior{im}.is_perturbed=0;
end
% adjust uncorrelated noise
if ( (strcmp(lower(prior{im}.name),'d_std')||strcmp(lower(prior{im}.name),'d_var')) && (prior{im}.is_perturbed==1));
if ~isfield(prior{im},'perturb_noise');
prior{im}.perturb_noise=0;
end
if ~isfield(prior{im},'perturb_noise_i_data');
prior{im}.perturb_noise_i_data=1;
end
id=prior{im}.perturb_noise_i_data;
% UPDATE UNCORREALTED NOISE MODEL
if prior{im}.perturb_noise==1;
if isfield(data{id},'Cd');
data{id}=rmfield(data{id},'Cd');
end
if strcmp(lower(prior{im}.name),'d_std')
data{id}.d_std=m{im};
sippi_verbose(sprintf('%s: updating noise on data to d_std=%6.2g',mfilename,data{id}.d_std),2);
else
data{id}.d_var=m{im};
sippi_verbose(sprintf('%s: updating noise on data to d_var=%6.2g',mfilename,data{id}.d_var),2);
end
data{id}.recomputeCD=1;
data{id}.full_likelihood=1;
end
end
% adjust uncorrelated noise
if (strcmp(lower(prior{im}.name),'ct') && (prior{im}.is_perturbed==1));
if ~isfield(prior{im},'perturb_noise');
prior{im}.perturb_noise=0;
end
if ~isfield(prior{im},'perturb_noise_i_data');
prior{im}.perturb_noise_i_data=1;
end
id=prior{im}.perturb_noise_i_data;
if prior{im}.perturb_noise==1;
if isfield(data{id},'Ct');
data{id}=rmfield(data{id},'Ct');
end
if ~isfield(prior{im},'Ct_base');
prior{im}.Ct_base=eye(length(data{1}.d_obs));
end
d_fac=m{im};
data{id}.Ct=d_fac.*prior{im}.Ct_base;
data{id}.recomputeCD=1;
data{id}.full_likelihood=1;
end
end
end
end