@@ -5,6 +5,7 @@ export Observable
5
5
export Uncertainties
6
6
export Correlation
7
7
export createmodel
8
+ export ObservableBlock
8
9
9
10
using FunctionWrappers
10
11
import FunctionWrappers: FunctionWrapper
@@ -16,10 +17,16 @@ struct RealRealFunc
16
17
end
17
18
(cb:: RealRealFunc )(v) = cb. f (v)
18
19
20
+ struct ObservableBlock
21
+ f:: Function
22
+ ObsandCoeffs:: NamedTuple
23
+ end
24
+
19
25
20
26
struct Model
21
27
observable_names:: Vector{String}
22
28
observable_functions:: Vector{RealRealFunc}
29
+ observable_blocks:: Array{ObservableBlock}
23
30
24
31
measurement_names:: Vector{String}
25
32
measurement_observables:: Vector{Int}
@@ -33,13 +40,22 @@ struct Model
33
40
end
34
41
35
42
43
+
36
44
struct Observable
37
45
name:: String
38
46
func:: Function
47
+ coeff:: Array{Real}
39
48
# TODO min::Real
40
49
# TODO max::Real
41
50
end
42
51
52
+ function Observable (
53
+ name:: String ,
54
+ func:: Function
55
+ )
56
+
57
+ Observable (name, func, [])
58
+ end
43
59
44
60
struct Measurement
45
61
name:: String
@@ -85,14 +101,17 @@ function createmodel(
85
101
correlations:: AbstractArray{Correlation}
86
102
)
87
103
88
- observable_names, observable_functions = createobservables (observables)
104
+ observable_names, observable_functions, unique_funcs = createobservables (observables)
89
105
90
106
measurement_names, measurement_observables, measurement_values, active_measurements = createmeasurements (measurements, observable_names)
91
107
108
+ observable_block = createblock (unique_funcs,observables,measurement_observables)
109
+
92
110
uncertainty_names, uncertainties, correlationmatrices = createuncertainties (measurements, correlations, active_measurements)
93
111
94
112
Model (observable_names,
95
113
observable_functions,
114
+ observable_block,
96
115
measurement_names,
97
116
measurement_observables,
98
117
measurement_values,
@@ -102,25 +121,55 @@ function createmodel(
102
121
correlationmatrices)
103
122
end
104
123
124
+ function createblock (unique_funcs:: Vector{Function} ,observables:: AbstractArray{Observable} ,measuredobs:: Vector{Int} )
125
+
126
+ nunique_funcs = length (unique_funcs)
127
+ blocks = Array {ObservableBlock} (undef,nunique_funcs)
128
+
129
+
130
+ for i_unique_function in 1 : nunique_funcs
131
+ nobs = sum ([observables[i]. func == unique_funcs[i_unique_function] for i in measuredobs])
132
+ names = Vector {String} (undef, nobs)
133
+ coeffs = Vector {Array{Real}} (undef,nobs)
134
+ i_obs = 1
135
+ for i in measuredobs
136
+ if (observables[i]. func == unique_funcs[i_unique_function])
137
+ names[i_obs] = observables[i]. name
138
+ coeffs[i_obs] = observables[i]. coeff
139
+ i_obs += 1
140
+ end
141
+ end
142
+ blocks[i_unique_function] = ObservableBlock (unique_funcs[i_unique_function],(Names = names, Coeff = coeffs))
143
+ end
144
+ blocks
145
+ end
105
146
106
147
107
148
function createobservables (observables:: AbstractArray{Observable} )
108
149
nobs = length (observables)
109
150
110
151
names = Vector {String} (undef, nobs)
111
152
funcs = Vector {RealRealFunc} (undef, nobs)
153
+
112
154
113
- for i in 1 : nobs
114
- names[i] = observables[i]. name
115
- funcs[i] = RealRealFunc (observables[i]. func)
155
+ unique_funcs = convert (Array{Function,1 },unique ([observables[i]. func for i in 1 : nobs]))
156
+
157
+ for j in unique_funcs
158
+ for k in 1 : nobs
159
+ if observables[k]. func == j
160
+ names[k] = observables[k]. name
161
+ funcs[k] = RealRealFunc (observables[k]. func)
162
+ end
163
+ end
116
164
end
165
+
117
166
118
167
duplicates = findfirstduplicate (names)
119
168
if (duplicates[1 ])
120
169
throw (ArgumentError (" Observable with the name \" " * duplicates[2 ] * " \" already exists." ))
121
170
end
122
171
123
- names, funcs
172
+ names, funcs, unique_funcs
124
173
end
125
174
126
175
@@ -140,12 +189,7 @@ function createmeasurements(
140
189
141
190
nmeas = length (measurements)
142
191
143
- nactives= 0
144
- for i in 1 : nmeas
145
- if (measurements[i]. activity)
146
- nactives += 1
147
- end
148
- end
192
+ nactives= sum ([measurements[i]. activity for i in 1 : nmeas])
149
193
150
194
names = Vector {String} (undef, nactives)
151
195
measuredobs = Vector {Int} (undef, nactives)
@@ -163,6 +207,12 @@ function createmeasurements(
163
207
end
164
208
end
165
209
210
+ sort_pattern = sortperm (measuredobs)
211
+ names = names[sort_pattern]
212
+ values = values[sort_pattern]
213
+ actives = actives[sort_pattern]
214
+ sort! (measuredobs)
215
+
166
216
names, measuredobs, values, actives
167
217
end
168
218
0 commit comments