source: issm/trunk-jpl/src/m/classes/qmu/uniform_uncertain.py

Last change on this file was 27458, checked in by jdquinn, 2 years ago

CHG: MATLAB > Python translation; cleanup

File size: 9.5 KB
Line 
1import numpy as np
2
3from MatlabArray import *
4from MatlabFuncs import *
5from fielddisplay import fielddisplay
6from pairoptions import pairoptions
7from partition_npart import *
8from qmupart2npart import qmupart2npart
9
10
11class uniform_uncertain(object):
12 '''
13 UNIFORM_UNCERTAIN class definition
14
15 Usage:
16 [uuv] = uniform_uncertain(
17 'descriptor', descriptor,
18 'lower', lower,
19 'upper', upper,
20 'partition', partition
21 )
22
23 where uuv is the uniform_uncertain object returned by the constructor,
24 lower and upper are the pdf distribution bounds, and partition is the
25 partition vector for distributed variables. Can be a partition vector
26 over elements or vertices.
27
28 Example:
29 md.qmu.variables.rheology = uniform_uncertain(
30 'descriptor', 'RheologyBBar',
31 'lower', 1e8,
32 'upper', 1e9
33 )
34 md.qmu.variables.rheology = uniform_uncertain(
35 'descriptor', 'RheologyBBar',
36 'lower', 1e8,
37 'upper', 1e9,
38 'partition', vpartition
39 )
40 '''
41 def __init__(self): # {{{
42 self.descriptor = ''
43 self.lower = -np.inf
44 self.upper = np.inf
45 self.partition = []
46 self.nsteps = 0
47 # }}}
48
49 @staticmethod
50 def uniform_uncertain(*args): # {{{
51 nargin = len(args)
52
53 # create a default object
54 if nargin == 0:
55 return uniform_uncertain()
56
57 # copy the object
58 elif nargin == 1:
59 if isinstance(args[0], uniform_uncertain):
60 uuv = args[0]
61 else:
62 raise Exception('Object ' + str(args[0]) + ' is a ' + str(type(args[0])) + ' class object, not "uniform_uncertain".')
63
64 # create the object from the input
65 else:
66 uuv = uniform_uncertain()
67
68 #recover options:
69 options = pairoptions(*args)
70
71 #initialize fields:
72 uuv.descriptor = options.getfieldvalue('descriptor')
73 uuv.lower = options.getfieldvalue('lower')
74 uuv.upper = options.getfieldvalue('upper')
75
76 #if the variable is scaled, a partition vector should have been
77 #supplied, and that partition vector should have as many
78 #partitions as the lower and upper vectors:
79 if uuv.isscaled():
80 uuv.partition = options.getfieldvalue('partition')
81 uuv.nsteps = options.getfieldvalue('nsteps', 1)
82 npart = qmupart2npart(uuv.partition)
83 if npart != uuv.upper.shape[0]:
84 raise Exception("uniform_uncertain constructor: for the scaled variable %s the upper field is not currently a vector of values for all the partitions described in the partition vector" % uuv.descriptor)
85 if npart != uuv.lower.shape[0]:
86 raise Exception("uniform_uncertain constructor: for the scaled variable %s the lower field is not currently a vector of values for all the partitions described in the partition vector" % uuv.descriptor)
87 if uuv.nsteps != uuv.upper.shape[1]:
88 raise Exception("uniform_uncertain constructor: for the scaled variable %s the col size of the upper field should be identical to the number of time steps" % uuv.descriptor)
89 if uuv.nsteps != uuv.lower.shape[1]:
90 raise Exception("uniform_uncertain constructor: for the scaled variable %s the col size of the lower field should be identical to the number of time steps" % uuv.descriptor)
91
92 return [uuv] # Always return a list, so we have something akin to a MATLAB single row matrix
93 # }}}
94
95 def __repr__(self): # {{{
96 string = ' uniform uncertain variable: '
97 string = "%s\n%s" % (string, fielddisplay(self, 'descriptor', 'name tag'))
98 string = "%s\n%s" % (string, fielddisplay(self, 'lower', 'pdf lower bound'))
99 string = "%s\n%s" % (string, fielddisplay(self, 'upper', 'pdf upper bound'))
100 if self.partition != []:
101 string = "%s\n%s" % (string, fielddisplay(self, 'partition', 'partition vector defining where sampling will occur'))
102 string = "%s\n%s" % (string, fielddisplay(self, 'nsteps', 'number of time steps'))
103
104 return string
105 # }}}
106
107 def __len__(self): # {{{
108 if type(self.lower) in [list, np.ndarray]:
109 return len(self.lower)
110 else:
111 return 1
112 # }}}
113
114 def checkconsistency(self, md, solution, analyses): # {{{
115 md = checkfield(md, 'field', self.upper, 'fieldname', 'uniform_uncertain.upper', 'NaN', 1, 'Inf', 1, '>', self.lower, 'numel', len(self.lower))
116 md = checkfield(md, 'field', self.lower, 'fieldname', 'uniform_uncertain.upper', 'NaN', 1, 'Inf', 1, '<', self.upper, 'numel', len(self.upper))
117 if self.isscaled():
118 if self.partition == []:
119 raise Exception("uniform_uncertain is a scaled variable, but it's missing a partition vector")
120 #better have a partition vector that has as many partitions as
121 #upper and lower's size:
122 if self.upper.shape[0] != partition_npart(self.partititon):
123 raise Exception("uniform_uncertain error message: row size of upper and partition size should be identical")
124 if self.lower.shape[0] != partition_npart(self.partition):
125 raise Exception("uniform_uncertain error message: row size of lower and partition size should be identical")
126 #we need as steps in upper and lower as there are time steps
127 if self.stddev.shape[1] != self.nsteps:
128 raise Exception("uniform_uncertain error message: col size of upper and partition size should be identical")
129 if self.mean.shape[1] != self.nsteps:
130 raise Exception("uniform_uncertain error message: col size of lower and partition size should be identical")
131 md = checkfield(md, 'field', self.partition, 'fieldname', 'uniform_uncertain.partition', 'NaN', 1, 'Inf', 1, '>=', -1, 'numel', [md.mesh.numberofvertices, md.mesh.numberofvertices])
132 if self.partition.shape[1] > 1:
133 raise Exception("uniform_uncertain error message: partition should be a column vector")
134 partcheck = np.unique(self.partition)
135 partmin = min(partcheck)
136 partmax = max(partcheck)
137 if partmax < -1:
138 raise Exception("uniform_uncertain error message: partition vector's min value should be -1 (for no partition), or start at 0")
139 nmax = max(md.mesh.numberofelements, md.mesh.numberofvertices)
140 if partmax > nmax:
141 raise Exception("uniform_uncertain error message: partition vector's values cannot go over the number of vertices or elements")
142 # }}}
143
144 #virtual functions needed by qmu processing algorithms:
145 #implemented:
146
147 @staticmethod
148 def prop_desc(uuv, dstr): # {{{
149 desc = ['' for i in range(np.size(uuv))]
150 for i in range(np.size(uuv)):
151 if uuv[i].descriptor != '' or type(uuv[i].descriptor) != str:
152 desc[i] = str(uuv[i].descriptor)
153 elif dstr != '':
154 desc[i] = str(dstr) + str(string_dim(uuv, i, 'vector'))
155 else:
156 desc[i] = 'uuv' + str(string_dim(uuv, i, 'vector'))
157
158 desc = allempty(desc)
159
160 return desc
161 # }}}
162
163 @staticmethod
164 def prop_stddev(uuv): # {{{
165 stddev = []
166 return stddev
167 # }}}
168
169 @staticmethod
170 def prop_mean(uuv): # {{{
171 mean = []
172 return mean
173 # }}}
174
175 @staticmethod
176 def prop_lower(uuv): # {{{
177 lower = np.zeros(np.size(uuv))
178 for i in range(np.size(uuv)):
179 lower[i] = uuv[i].lower
180
181 lower = allequal(lower, -np.inf)
182
183 return lower
184 # }}}
185
186 @staticmethod
187 def prop_upper(uuv): # {{{
188 upper = np.zeros(np.size(uuv))
189 for i in range(np.size(uuv)):
190 upper[i] = uuv[i].upper
191
192 #upper = allequal(upper, np.inf)
193
194 return upper
195 # }}}
196
197 @staticmethod
198 def prop_abscissas(hbu): # {{{
199 abscissas = []
200 return abscissas
201 # }}}
202
203 @staticmethod
204 def prop_pairs_per_variable(hbu): # {{{
205 pairs_per_variable = []
206 return pairs_per_variable
207 # }}}
208
209 @staticmethod
210 def prop_counts(hbu): # {{{
211 counts = []
212 return counts
213 # }}}
214
215 @staticmethod
216 def prop_initpt(uuv): # {{{
217 initpt = []
218 return initpt
219 # }}}
220
221 @staticmethod
222 def prop_initst(uuv): # {{{
223 initst = []
224 return initst
225 # }}}
226
227 @staticmethod
228 def prop_stype(uuv): # {{{
229 stype = []
230 return stype
231 # }}}
232
233 @staticmethod
234 def prop_scale(uuv): # {{{
235 scale = []
236 return scale
237 # }}}
238
239 #new methods:
240 def isscaled(self): # {{{
241 if strncmp(self.descriptor, 'scaled_', 7):
242 return True
243 else:
244 return False
245 # }}}
246
247 @staticmethod
248 def dakota_write(fidi, dvar): # {{{
249 # possible namespace pollution, the above import seems not to work
250 from vlist_write import vlist_write
251 # collect only the variables of the appropriate class
252 uuv = deepcopy(dvar)
253 fields = fieldnames(uuv)
254 for field in fields:
255 if getattr(uuv, field)[0].__class__.__name__ != 'uniform_uncertain':
256 delattr(uuv, field)
257 if len(uuv) > 0:
258 vlist_write(fidi, 'uniform_uncertain', 'uuv', uuv)
259 # }}}
Note: See TracBrowser for help on using the repository browser.