77
77
* @brief Standard constructor
79
79
AnalyticalResult::AnalyticalResult(const NumericalPoint & standardSpaceDesignPoint,
80
const Event & limitStateVariable,
81
const Bool isStandardPointOriginInFailureSpace,
83
PersistentObject(name),
80
const Event & limitStateVariable,
81
const Bool isStandardPointOriginInFailureSpace,
83
PersistentObject(name),
84
84
physicalSpaceDesignPoint_(standardSpaceDesignPoint.getDimension()),
85
limitStateVariable_(limitStateVariable),
86
isStandardPointOriginInFailureSpace_(isStandardPointOriginInFailureSpace),
87
hasoferReliabilityIndex_(0.0),
88
importanceFactors_(standardSpaceDesignPoint.getDimension()),
89
hasoferReliabilityIndexSensitivity_(0),
90
isAlreadyComputedImportanceFactors_(false),
91
isAlreadyComputedHasoferReliabilityIndexSensitivity_(false)
85
limitStateVariable_(limitStateVariable),
86
isStandardPointOriginInFailureSpace_(isStandardPointOriginInFailureSpace),
87
hasoferReliabilityIndex_(0.0),
88
importanceFactors_(standardSpaceDesignPoint.getDimension()),
89
hasoferReliabilityIndexSensitivity_(0),
90
isAlreadyComputedImportanceFactors_(false),
91
isAlreadyComputedHasoferReliabilityIndexSensitivity_(false)
93
/* we use the attribute accessor in order to compute automatically all the other attributes */
94
setStandardSpaceDesignPoint(standardSpaceDesignPoint);
93
/* we use the attribute accessor in order to compute automatically all the other attributes */
94
setStandardSpaceDesignPoint(standardSpaceDesignPoint);
97
97
/* Default constructor, needed by SWIG */
98
98
AnalyticalResult::AnalyticalResult():
100
standardSpaceDesignPoint_(0),
101
physicalSpaceDesignPoint_(0),
102
// Fake event based on a fake 1D composite random vector, which requires a fake 1D NumericalMathFunction
103
limitStateVariable_(RandomVector(new CompositeRandomVector(NumericalMathFunction(Description(0),Description(1),Description(1)),
104
new ConstantRandomVector(NumericalPoint(0)))),
106
isStandardPointOriginInFailureSpace_(false),
107
hasoferReliabilityIndex_(0.0),
108
importanceFactors_(0),
109
hasoferReliabilityIndexSensitivity_(0),
110
isAlreadyComputedImportanceFactors_(false),
111
isAlreadyComputedHasoferReliabilityIndexSensitivity_(false)
100
standardSpaceDesignPoint_(0),
101
physicalSpaceDesignPoint_(0),
102
// Fake event based on a fake 1D composite random vector, which requires a fake 1D NumericalMathFunction
103
limitStateVariable_(RandomVector(CompositeRandomVector(NumericalMathFunction(Description(0),Description(1),Description(1)),
104
ConstantRandomVector(NumericalPoint(0)))),
106
isStandardPointOriginInFailureSpace_(false),
107
hasoferReliabilityIndex_(0.0),
108
importanceFactors_(0),
109
hasoferReliabilityIndexSensitivity_(0),
110
isAlreadyComputedImportanceFactors_(false),
111
isAlreadyComputedHasoferReliabilityIndexSensitivity_(false)
116
116
/* Virtual constructor */
117
117
AnalyticalResult * AnalyticalResult::clone() const
119
return new AnalyticalResult(*this);
119
return new AnalyticalResult(*this);
122
122
/* StandardSpaceDesignPoint accessor */
123
123
AnalyticalResult::NumericalPoint AnalyticalResult::getStandardSpaceDesignPoint() const
125
return standardSpaceDesignPoint_;
125
return standardSpaceDesignPoint_;
129
129
/* StandardSpaceDesignPoint accessor */
130
130
void AnalyticalResult::setStandardSpaceDesignPoint(const NumericalPoint & standardSpaceDesignPoint)
132
standardSpaceDesignPoint_ = standardSpaceDesignPoint;
133
computePhysicalSpaceDesignPoint();
134
computeHasoferReliabilityIndex();
132
standardSpaceDesignPoint_ = standardSpaceDesignPoint;
133
computePhysicalSpaceDesignPoint();
134
computeHasoferReliabilityIndex();
137
137
/* PhysicalSpaceDesignPoint evaluation */
138
138
void AnalyticalResult::computePhysicalSpaceDesignPoint()
140
/* Compute the physical design point */
141
physicalSpaceDesignPoint_ = limitStateVariable_.getImplementation()->getAntecedent()->getDistribution().getInverseIsoProbabilisticTransformation().operator()(standardSpaceDesignPoint_);
142
/* we give to the physical space design point the description of the input random vector */
143
//physicalSpaceDesignPoint_.setDescription(limitStateVariable_.getImplementation()->getAntecedent()->getDescription());
140
/* Compute the physical design point */
141
physicalSpaceDesignPoint_ = limitStateVariable_.getImplementation()->getAntecedent()->getDistribution().getInverseIsoProbabilisticTransformation().operator()(standardSpaceDesignPoint_);
142
/* we give to the physical space design point the description of the input random vector */
143
//physicalSpaceDesignPoint_.setDescription(limitStateVariable_.getImplementation()->getAntecedent()->getDescription());
145
/* we give to the physical space design point the name Physical Design Point */
146
physicalSpaceDesignPoint_.setName("Physical Space Design Point");
145
/* we give to the physical space design point the name Physical Design Point */
146
physicalSpaceDesignPoint_.setName("Physical Space Design Point");
149
149
/* PhysicalSpaceDesignPoint accessor */
150
150
void AnalyticalResult::setPhysicalSpaceDesignPoint(const NumericalPoint & physicalSpaceDesignPoint)
152
physicalSpaceDesignPoint_ = physicalSpaceDesignPoint;
152
physicalSpaceDesignPoint_ = physicalSpaceDesignPoint;
155
155
/* PhysicalSpaceDesignPoint accessor */
156
156
AnalyticalResult::NumericalPoint AnalyticalResult::getPhysicalSpaceDesignPoint() const
158
return physicalSpaceDesignPoint_;
158
return physicalSpaceDesignPoint_;
161
161
/* LimitStateVariable accessor */
162
162
AnalyticalResult::Event AnalyticalResult::getLimitStateVariable() const
164
return limitStateVariable_;
164
return limitStateVariable_;
167
167
/* IsStandardPointOriginInFailureSpace accessor */
168
168
Bool AnalyticalResult::getIsStandardPointOriginInFailureSpace() const
170
return isStandardPointOriginInFailureSpace_;
170
return isStandardPointOriginInFailureSpace_;
173
173
/* IsStandardPointOriginInFailureSpace accessor */
174
174
void AnalyticalResult::setIsStandardPointOriginInFailureSpace(const Bool isStandardPointOriginInFailureSpace)
176
isStandardPointOriginInFailureSpace_ = isStandardPointOriginInFailureSpace;
176
isStandardPointOriginInFailureSpace_ = isStandardPointOriginInFailureSpace;
179
179
/* ImportanceFactors evaluation */
180
180
void AnalyticalResult::computeImportanceFactors()
182
const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
183
importanceFactors_ = NumericalPoint(dimension, -1.0);
184
/* First, check that the importance factors are well-defined */
185
if (standardSpaceDesignPoint_.norm() > 0.0)
187
/* get the input distribution */
188
const Distribution inputDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
189
/* get the input standard distribution */
190
const Distribution standardDistribution(inputDistribution.getStandardDistribution());
191
/* get the marginal 1D from in the standard space where all marginals are identical */
192
const Distribution standardMarginalDistribution(standardDistribution.getMarginal(0));
194
/* evaluate the corresponding vector in the importance factors space */
195
/* if Generalised Nataf Transformation : Z = E1^(-1)o F_{Xi}(Xi*) */
196
/* if Rosenblatt Transformation : Z = Phi^(-1)o F_{Xi}(Xi*) */
197
// for each marginals */
198
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex)
200
const NumericalScalar y(inputDistribution.getMarginal(marginalIndex).computeCDF(NumericalPoint(1, physicalSpaceDesignPoint_[marginalIndex])));
201
importanceFactors_[marginalIndex] = standardMarginalDistribution.computeQuantile(y)[0];
203
/* compute square norm of importanceFactors vector */
204
const NumericalScalar inorm2(1.0 / importanceFactors_.norm2());
205
/* compute final importance factors */
206
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex)
208
importanceFactors_[marginalIndex] *= importanceFactors_[marginalIndex] * inorm2;
211
/* we give a name to the importance factors vector */
212
importanceFactors_.setName("Importance Factors");
214
/* we give to the importance factors vector the description of the input random vector */
215
importanceFactors_.setDescription(limitStateVariable_.getImplementation()->getAntecedent()->getDescription());
217
isAlreadyComputedImportanceFactors_ = true;
182
const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
183
importanceFactors_ = NumericalPoint(dimension, -1.0);
184
/* First, check that the importance factors are well-defined */
185
if (standardSpaceDesignPoint_.norm() > 0.0)
187
/* get the input distribution */
188
const Distribution inputDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
189
/* get the input standard distribution */
190
const Distribution standardDistribution(inputDistribution.getStandardDistribution());
191
/* get the marginal 1D from in the standard space where all marginals are identical */
192
const Distribution standardMarginalDistribution(standardDistribution.getMarginal(0));
193
/* evaluate the corresponding vector in the importance factors space */
194
/* if Generalised Nataf Transformation : Z = E1^(-1)o F_{Xi}(Xi*) */
195
/* if Rosenblatt Transformation : Z = Phi^(-1)o F_{Xi}(Xi*) */
196
// for each marginals */
197
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex)
199
const NumericalScalar y(inputDistribution.getMarginal(marginalIndex).computeCDF(NumericalPoint(1, physicalSpaceDesignPoint_[marginalIndex])));
200
importanceFactors_[marginalIndex] = standardMarginalDistribution.computeQuantile(y)[0];
202
/* compute square norm of importanceFactors vector */
203
const NumericalScalar inorm2(1.0 / importanceFactors_.norm2());
204
/* compute final importance factors */
205
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex)
207
importanceFactors_[marginalIndex] *= importanceFactors_[marginalIndex] * inorm2;
210
/* we give a name to the importance factors vector */
211
importanceFactors_.setName("Importance Factors");
213
/* we give to the importance factors vector the description of the input random vector */
214
importanceFactors_.setDescription(limitStateVariable_.getImplementation()->getAntecedent()->getDescription());
216
isAlreadyComputedImportanceFactors_ = true;
220
219
/* ImportanceFactors accessor */
221
220
AnalyticalResult::NumericalPoint AnalyticalResult::getImportanceFactors()
223
if (!isAlreadyComputedImportanceFactors_)
225
computeImportanceFactors();
227
return importanceFactors_;
222
if (!isAlreadyComputedImportanceFactors_)
224
computeImportanceFactors();
226
return importanceFactors_;
230
229
/* ImportanceFactors graph */
231
230
AnalyticalResult::Graph AnalyticalResult::drawImportanceFactors()
233
// To ensure that the importance factors are up to date
234
if (!isAlreadyComputedImportanceFactors_)
236
computeImportanceFactors();
238
const UnsignedLong dimension(importanceFactors_.getDimension());
239
NumericalSample data(dimension, 1);
241
/* build data for the pie */
242
for (UnsignedLong i = 0; i < dimension; ++i)
244
data[i]=NumericalPoint(1, importanceFactors_[i]);
246
/* we build the pie */
247
Pie importanceFactorsPie(data);
249
/* build labels and colors for the pie */
250
Description palette(dimension);
251
Description labels(dimension);
252
const Description colors(DrawableImplementation::GetValidColors());
253
Description::const_iterator colorsIterator;
254
colorsIterator = colors.begin();
255
Description description(importanceFactors_.getDescription());
256
// If no description has been given for the input distribution components, give standard ones
257
if (description.getSize() != dimension)
259
description = Description(dimension);
260
for (UnsignedLong i = 0; i < dimension; ++i)
263
oss << "Component " << i;
264
description[i] = oss;
267
for (UnsignedLong i = 0; i < dimension; ++i)
270
oss << description[i] << " : " << std::fixed;
272
oss << 100.0 * data[i][0] << "%";
274
palette[i] = (*colorsIterator);
276
if (colorsIterator == colors.end())
278
colorsIterator == colors.begin();
281
/* we complete the pie */
282
importanceFactorsPie.setLabels(labels);
283
importanceFactorsPie.setPalette(palette);
285
/* we build the graph with a title */
287
oss << "Importance Factors from Design Point - " << limitStateVariable_.getName();
288
Graph importanceFactorsGraph(oss, "", "", false,"");
290
/* we embed the pie into the graph */
291
importanceFactorsGraph.addDrawable(importanceFactorsPie);
292
return importanceFactorsGraph;
232
// To ensure that the importance factors are up to date
233
if (!isAlreadyComputedImportanceFactors_)
235
computeImportanceFactors();
237
const UnsignedLong dimension(importanceFactors_.getDimension());
238
NumericalSample data(dimension, 1);
240
/* build data for the pie */
241
for (UnsignedLong i = 0; i < dimension; ++i)
243
data[i]=NumericalPoint(1, importanceFactors_[i]);
245
/* we build the pie */
246
Pie importanceFactorsPie(data);
248
/* build labels and colors for the pie */
249
Description palette(dimension);
250
Description labels(dimension);
251
const Description colors(DrawableImplementation::GetValidColors());
252
Description::const_iterator colorsIterator;
253
colorsIterator = colors.begin();
254
Description description(importanceFactors_.getDescription());
255
// If no description has been given for the input distribution components, give standard ones
256
if (description.getSize() != dimension)
258
description = Description(dimension);
259
for (UnsignedLong i = 0; i < dimension; ++i)
262
oss << "Component " << i;
263
description[i] = oss;
266
for (UnsignedLong i = 0; i < dimension; ++i)
269
oss << description[i] << " : " << std::fixed;
271
oss << 100.0 * data[i][0] << "%";
273
palette[i] = (*colorsIterator);
275
if (colorsIterator == colors.end())
277
colorsIterator == colors.begin();
280
/* we complete the pie */
281
importanceFactorsPie.setLabels(labels);
282
importanceFactorsPie.setPalette(palette);
284
/* we build the graph with a title */
286
oss << "Importance Factors from Design Point - " << limitStateVariable_.getName();
287
Graph importanceFactorsGraph(oss, "", "", false,"");
289
/* we embed the pie into the graph */
290
importanceFactorsGraph.addDrawable(importanceFactorsPie);
291
return importanceFactorsGraph;
296
295
/* ImportanceFactors accessor */
297
296
void AnalyticalResult::setImportanceFactors(const NumericalPoint & importanceFactors)
299
importanceFactors_ = importanceFactors;
300
isAlreadyComputedImportanceFactors_ = true;
298
importanceFactors_ = importanceFactors;
299
isAlreadyComputedImportanceFactors_ = true;
304
303
/* HasoferReliabilityIndex evaluation */
305
304
void AnalyticalResult::computeHasoferReliabilityIndex()
307
/* evaluate the HasoferReliabilityIndex */
308
if (standardSpaceDesignPoint_.getDimension() > 0) hasoferReliabilityIndex_ = standardSpaceDesignPoint_.norm();
306
/* evaluate the HasoferReliabilityIndex */
307
if (standardSpaceDesignPoint_.getDimension() > 0) hasoferReliabilityIndex_ = standardSpaceDesignPoint_.norm();
311
310
/* HasoferReliabilityIndex accessor */
312
311
NumericalScalar AnalyticalResult::getHasoferReliabilityIndex() const
314
return hasoferReliabilityIndex_;
313
return hasoferReliabilityIndex_;
318
317
/* HasoferReliabilityIndex accessor */
319
318
void AnalyticalResult::setHasoferReliabilityIndex(const NumericalScalar & hasoferReliabilityIndex)
321
hasoferReliabilityIndex_ = hasoferReliabilityIndex;
320
hasoferReliabilityIndex_ = hasoferReliabilityIndex;
324
323
/* HasoferReliabilityIndex evaluation */
325
324
void AnalyticalResult::computeHasoferReliabilityIndexSensitivity()
327
/* get Set1 : parameters of the physical distribution */
328
const Distribution physicalDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
329
const NumericalPointWithDescriptionCollection set1(physicalDistribution.getParametersCollection());
330
/* get Set2 : parameters of the physical model */
331
const NumericalMathFunction physicalModel(limitStateVariable_.getImplementation()->getFunction());
332
const NumericalPointWithDescription set2(physicalModel.getParameters());
333
const Bool isSet2Empty(set2.getDimension() == 0);
335
/* get SetIso : parameters included in the isoprobabilistic transformation which is a subset of Set1 */
336
const InverseIsoProbabilisticTransformation inverseIsoProbabilisticTransformation(physicalDistribution.getInverseIsoProbabilisticTransformation());
337
const NumericalPointWithDescription setIso(inverseIsoProbabilisticTransformation.getParameters());
338
/* scaling factor between sensitivity and gradients (ref doc : factor = -lambda/beta) */
339
/* gradient of the standard limite state function */
340
const Matrix physicalGradientMatrix(physicalModel.gradient(physicalSpaceDesignPoint_));
341
const NumericalPoint standardFunctionGradient(inverseIsoProbabilisticTransformation.gradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0)));
342
const NumericalScalar gradientToSensitivity(-(limitStateVariable_.getOperator().compare(1.0, 0.0) ? 1.0 : -1.0) / standardFunctionGradient.norm());
343
/* evaluate the gradients of the physical model with respect to Set2 (ref doc : K2) */
344
NumericalPoint physicalGradient;
347
physicalGradient = physicalModel.parametersGradient(physicalSpaceDesignPoint_) * NumericalPoint(1, 1.0);
349
/* evaluate the gradients of the isoprobabilistic transformation with respect to SetIso (ref doc : KS) */
350
NumericalPoint isoProbabilisticGradient;
351
if (setIso.getDimension() > 0)
353
isoProbabilisticGradient = inverseIsoProbabilisticTransformation.parametersGradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0));
355
/* associate to each element of Set1 the gradient value */
357
/* hasoferReliabilityIndexSensitivity is the collection Set1 + one other collection wich is Set2 */
358
const UnsignedLong set1Size(set1.getSize());
359
const UnsignedLong size(set1Size + (isSet2Empty ? 0 : 1));
360
hasoferReliabilityIndexSensitivity_ = Sensitivity(size);
362
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < set1Size; ++sensitivityIndex)
364
const NumericalPointWithDescription currentParameters(set1[sensitivityIndex]);
365
const UnsignedLong currentDimension(currentParameters.getDimension());
366
NumericalPointWithDescription currentSensitivity(currentDimension);
367
const Description currentDescription(currentParameters.getDescription());
368
// the currentSensitivity gets the description and the name from set1
369
currentSensitivity.setDescription(currentDescription);
370
const String currentName(currentParameters.getName());
371
currentSensitivity.setName(currentName);
372
const Description isoDescription(setIso.getDescription());
373
for (UnsignedLong currentIndex = 0; currentIndex < currentDimension; ++currentIndex)
375
const UnsignedLong position(computePosition(currentName, currentDescription[currentIndex], isoDescription));
376
/* if currentParameters[currentIndex] is into setIso, then we get the sensitivity value in the corresponding isoProbabilisticGradient */
377
if (position < setIso.getDimension())
379
currentSensitivity[currentIndex] = gradientToSensitivity * isoProbabilisticGradient[position];
381
/* else the sensitivity value is null */
383
hasoferReliabilityIndexSensitivity_[sensitivityIndex] = currentSensitivity;
384
} // sensitivityIndex
386
/* if set2 is not empty : convert the matrix isoProbabilisticGradient, which has n rows and 1 column, into a NumericalPoint */
389
hasoferReliabilityIndexSensitivity_[set1Size] = gradientToSensitivity * physicalGradient;
390
hasoferReliabilityIndexSensitivity_[set1Size].setName(physicalGradient.getName());
326
/* get Set1 : parameters of the physical distribution */
327
const Distribution physicalDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
328
const NumericalPointWithDescriptionCollection set1(physicalDistribution.getParametersCollection());
329
/* get Set2 : parameters of the physical model */
330
const NumericalMathFunction physicalModel(limitStateVariable_.getImplementation()->getFunction());
331
const NumericalPointWithDescription set2(physicalModel.getParameters());
332
const Bool isSet2Empty(set2.getDimension() == 0);
334
/* get SetIso : parameters included in the isoprobabilistic transformation which is a subset of Set1 */
335
const InverseIsoProbabilisticTransformation inverseIsoProbabilisticTransformation(physicalDistribution.getInverseIsoProbabilisticTransformation());
336
const NumericalPointWithDescription setIso(inverseIsoProbabilisticTransformation.getParameters());
337
/* scaling factor between sensitivity and gradients (ref doc : factor = -lambda/beta) */
338
/* gradient of the standard limite state function */
339
const Matrix physicalGradientMatrix(physicalModel.gradient(physicalSpaceDesignPoint_));
340
const NumericalPoint standardFunctionGradient(inverseIsoProbabilisticTransformation.gradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0)));
341
const NumericalScalar gradientToSensitivity(-(limitStateVariable_.getOperator().compare(1.0, 0.0) ? 1.0 : -1.0) / standardFunctionGradient.norm());
342
/* evaluate the gradients of the physical model with respect to Set2 (ref doc : K2) */
343
NumericalPoint physicalGradient;
346
physicalGradient = physicalModel.parametersGradient(physicalSpaceDesignPoint_) * NumericalPoint(1, 1.0);
348
/* evaluate the gradients of the isoprobabilistic transformation with respect to SetIso (ref doc : KS) */
349
NumericalPoint isoProbabilisticGradient;
350
if (setIso.getDimension() > 0)
352
isoProbabilisticGradient = inverseIsoProbabilisticTransformation.parametersGradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0));
354
/* associate to each element of Set1 the gradient value */
356
/* hasoferReliabilityIndexSensitivity is the collection Set1 + one other collection wich is Set2 */
357
const UnsignedLong set1Size(set1.getSize());
358
const UnsignedLong size(set1Size + (isSet2Empty ? 0 : 1));
359
hasoferReliabilityIndexSensitivity_ = Sensitivity(size);
361
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < set1Size; ++sensitivityIndex)
363
const NumericalPointWithDescription currentParameters(set1[sensitivityIndex]);
364
const UnsignedLong currentDimension(currentParameters.getDimension());
365
NumericalPointWithDescription currentSensitivity(currentDimension);
366
const Description currentDescription(currentParameters.getDescription());
367
// the currentSensitivity gets the description and the name from set1
368
currentSensitivity.setDescription(currentDescription);
369
const String currentName(currentParameters.getName());
370
currentSensitivity.setName(currentName);
371
const Description isoDescription(setIso.getDescription());
372
for (UnsignedLong currentIndex = 0; currentIndex < currentDimension; ++currentIndex)
374
const UnsignedLong position(computePosition(currentName, currentDescription[currentIndex], isoDescription));
375
/* if currentParameters[currentIndex] is into setIso, then we get the sensitivity value in the corresponding isoProbabilisticGradient */
376
if (position < setIso.getDimension())
378
currentSensitivity[currentIndex] = gradientToSensitivity * isoProbabilisticGradient[position];
380
/* else the sensitivity value is null */
382
hasoferReliabilityIndexSensitivity_[sensitivityIndex] = currentSensitivity;
383
} // sensitivityIndex
385
/* if set2 is not empty : convert the matrix isoProbabilisticGradient, which has n rows and 1 column, into a NumericalPoint */
388
hasoferReliabilityIndexSensitivity_[set1Size] = gradientToSensitivity * physicalGradient;
389
hasoferReliabilityIndexSensitivity_[set1Size].setName(physicalGradient.getName());
392
391
isAlreadyComputedHasoferReliabilityIndexSensitivity_ = true;
393
392
} // end computeHasoferReliabilityIndexSensitivity()
410
409
/* HasoferReliabilityIndexSensitivity Graph */
411
410
AnalyticalResult::GraphCollection AnalyticalResult::drawHasoferReliabilityIndexSensitivity(NumericalScalar width)
413
GraphCollection hasoferReliabilityIndexSensitivityGraphCollection(0);
414
// To ensure that the hasoferReliabilityIndexSensitivity_ are up to date
415
if (! isAlreadyComputedHasoferReliabilityIndexSensitivity_)
417
computeHasoferReliabilityIndexSensitivity();
419
const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
420
const UnsignedLong size(hasoferReliabilityIndexSensitivity_.getSize());
421
// The first graph shows the sensitivities with respect to the marginal parameters if there exist
422
// in the cas where the distribution or some marginals are defined by user, it may not have parameters : we create a empty sensitivity graph
423
Sensitivity marginalSensitivity(dimension);
424
for(UnsignedLong i = 0; i < dimension; ++i)
426
marginalSensitivity[i] = hasoferReliabilityIndexSensitivity_[i];
412
GraphCollection hasoferReliabilityIndexSensitivityGraphCollection(0);
413
// To ensure that the hasoferReliabilityIndexSensitivity_ are up to date
414
if (! isAlreadyComputedHasoferReliabilityIndexSensitivity_)
416
computeHasoferReliabilityIndexSensitivity();
418
const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
419
const UnsignedLong size(hasoferReliabilityIndexSensitivity_.getSize());
420
// The first graph shows the sensitivities with respect to the marginal parameters if there exist
421
// in the cas where the distribution or some marginals are defined by user, it may not have parameters : we create a empty sensitivity graph
422
Sensitivity marginalSensitivity(dimension);
423
for(UnsignedLong i = 0; i < dimension; ++i)
425
marginalSensitivity[i] = hasoferReliabilityIndexSensitivity_[i];
428
427
Graph hasoferReliabilityIndexSensitivityGraphMarginal(drawSensitivity(marginalSensitivity, width));
430
oss1 << "Hasofer Reliability Index Sensitivities - Marginal parameters - " << limitStateVariable_.getName();
431
hasoferReliabilityIndexSensitivityGraphMarginal.setTitle(oss1);
432
hasoferReliabilityIndexSensitivityGraphCollection.add(hasoferReliabilityIndexSensitivityGraphMarginal);
433
// The second graph shows the sensitivities with respect to the other parameters if there exist
434
if (size > dimension)
436
Sensitivity otherSensitivity(size - dimension);
437
for(UnsignedLong i = dimension; i < size; ++i)
439
otherSensitivity[i - dimension] = hasoferReliabilityIndexSensitivity_[i];
441
Graph hasoferReliabilityIndexSensitivityGraphOther(drawSensitivity(otherSensitivity, width));
443
oss2 << "Hasofer Reliability Index Sensitivities - Other parameters - " << limitStateVariable_.getName();
444
hasoferReliabilityIndexSensitivityGraphOther.setTitle(oss2);
445
hasoferReliabilityIndexSensitivityGraphCollection.add(hasoferReliabilityIndexSensitivityGraphOther);
447
return hasoferReliabilityIndexSensitivityGraphCollection;
429
oss1 << "Hasofer Reliability Index Sensitivities - Marginal parameters - " << limitStateVariable_.getName();
430
hasoferReliabilityIndexSensitivityGraphMarginal.setTitle(oss1);
431
hasoferReliabilityIndexSensitivityGraphCollection.add(hasoferReliabilityIndexSensitivityGraphMarginal);
432
// The second graph shows the sensitivities with respect to the other parameters if there exist
433
if (size > dimension)
435
Sensitivity otherSensitivity(size - dimension);
436
for(UnsignedLong i = dimension; i < size; ++i)
438
otherSensitivity[i - dimension] = hasoferReliabilityIndexSensitivity_[i];
440
Graph hasoferReliabilityIndexSensitivityGraphOther(drawSensitivity(otherSensitivity, width));
442
oss2 << "Hasofer Reliability Index Sensitivities - Other parameters - " << limitStateVariable_.getName();
443
hasoferReliabilityIndexSensitivityGraphOther.setTitle(oss2);
444
hasoferReliabilityIndexSensitivityGraphCollection.add(hasoferReliabilityIndexSensitivityGraphOther);
446
return hasoferReliabilityIndexSensitivityGraphCollection;
450
449
/* Sensitivity Graph */
451
450
AnalyticalResult::Graph AnalyticalResult::drawSensitivity(const Sensitivity & sensitivity, NumericalScalar width) const
453
// shift position of the barplots
454
NumericalScalar shift(0.0);
456
// Create an empty graph
457
Graph sensitivityGraph("Sensitivity", "parameters", "sensitivities", true, "topright");
459
BarPlot sensitivityBarPlot(NumericalSample(0, 2), shift, "");
461
const Description colors(DrawableImplementation::GetValidColors());
462
Description::const_iterator colorsIterator;
463
colorsIterator = colors.begin();
465
// Create the barplots
466
const UnsignedLong sensitivitySize(sensitivity.getSize());
467
for (UnsignedLong collectionIndex = 0; collectionIndex < sensitivitySize; ++collectionIndex)
469
NumericalSample data(sensitivity[collectionIndex].getDimension(), 2);
470
const UnsignedLong dataSize(data.getSize());
471
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < dataSize; ++sensitivityIndex)
473
data[sensitivityIndex][0] = width;
474
data[sensitivityIndex][1] = sensitivity[collectionIndex][sensitivityIndex];
476
// Add the barplot to the graph
478
oss << sensitivity[collectionIndex].getName() << " " << sensitivity[collectionIndex].getDescription();
479
sensitivityGraph.addDrawable(BarPlot(data, shift, (*colorsIterator), "solid", "solid", oss));
481
if (colorsIterator == colors.end())
483
colorsIterator == colors.begin();
485
shift += width * (1 + dataSize);
487
return sensitivityGraph;
452
// shift position of the barplots
453
NumericalScalar shift(0.0);
455
// Create an empty graph
456
Graph sensitivityGraph("Sensitivity", "parameters", "sensitivities", true, "topright");
458
BarPlot sensitivityBarPlot(NumericalSample(0, 2), shift, "");
460
const Description colors(DrawableImplementation::GetValidColors());
461
Description::const_iterator colorsIterator;
462
colorsIterator = colors.begin();
464
// Create the barplots
465
const UnsignedLong sensitivitySize(sensitivity.getSize());
466
for (UnsignedLong collectionIndex = 0; collectionIndex < sensitivitySize; ++collectionIndex)
468
NumericalSample data(sensitivity[collectionIndex].getDimension(), 2);
469
const UnsignedLong dataSize(data.getSize());
470
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < dataSize; ++sensitivityIndex)
472
data[sensitivityIndex][0] = width;
473
data[sensitivityIndex][1] = sensitivity[collectionIndex][sensitivityIndex];
475
// Add the barplot to the graph
477
oss << sensitivity[collectionIndex].getName() << " " << sensitivity[collectionIndex].getDescription();
478
sensitivityGraph.addDrawable(BarPlot(data, shift, (*colorsIterator), "solid", "solid", oss));
480
if (colorsIterator == colors.end())
482
colorsIterator == colors.begin();
484
shift += width * (1 + dataSize);
486
return sensitivityGraph;
488
487
} //drawSensitivity
491
490
/* HasoferReliabilityIndexSensitivity accessor */
492
491
AnalyticalResult::Sensitivity AnalyticalResult::getHasoferReliabilityIndexSensitivity()
494
if (! isAlreadyComputedHasoferReliabilityIndexSensitivity_)
496
computeHasoferReliabilityIndexSensitivity();
498
return hasoferReliabilityIndexSensitivity_;
493
if (! isAlreadyComputedHasoferReliabilityIndexSensitivity_)
495
computeHasoferReliabilityIndexSensitivity();
497
return hasoferReliabilityIndexSensitivity_;
501
500
/* String converter */
502
501
String AnalyticalResult::__repr__() const
505
oss << "class=" << AnalyticalResult::GetClassName()
506
<< " standardSpaceDesignPoint=" << standardSpaceDesignPoint_
507
<< " physicalSpaceDesignPoint=" << physicalSpaceDesignPoint_
508
<< " limitStateVariable=" << limitStateVariable_
509
<< " isStandardPointOriginInFailureSpace=" << isStandardPointOriginInFailureSpace_
510
<< " hasoferReliabilityIndex=" << hasoferReliabilityIndex_
511
<< " importanceFactors=" << importanceFactors_
512
<< " hasoferReliabilityIndexSensitivity=" << hasoferReliabilityIndexSensitivity_;
504
oss << "class=" << AnalyticalResult::GetClassName()
505
<< " standardSpaceDesignPoint=" << standardSpaceDesignPoint_
506
<< " physicalSpaceDesignPoint=" << physicalSpaceDesignPoint_
507
<< " limitStateVariable=" << limitStateVariable_
508
<< " isStandardPointOriginInFailureSpace=" << isStandardPointOriginInFailureSpace_
509
<< " hasoferReliabilityIndex=" << hasoferReliabilityIndex_
510
<< " importanceFactors=" << importanceFactors_
511
<< " hasoferReliabilityIndexSensitivity=" << hasoferReliabilityIndexSensitivity_;
516
515
/* Method save() stores the object through the StorageManager */
517
void AnalyticalResult::save(const StorageManager::Advocate & adv) const
516
void AnalyticalResult::save(StorageManager::Advocate & adv) const
519
PersistentObject::save(adv);
520
adv.writeValue(standardSpaceDesignPoint_, StorageManager::MemberNameAttribute, "standardSpaceDesignPoint_");
521
adv.writeValue(physicalSpaceDesignPoint_, StorageManager::MemberNameAttribute, "physicalSpaceDesignPoint_");
522
adv.writeValue(limitStateVariable_, StorageManager::MemberNameAttribute, "limitStateVariable_");
523
adv.writeValue("isStandardPointOriginInFailureSpace_", isStandardPointOriginInFailureSpace_);
524
adv.writeValue("hasoferReliabilityIndex_", hasoferReliabilityIndex_);
525
adv.writeValue(importanceFactors_, StorageManager::MemberNameAttribute, "importanceFactors_");
526
PersistentSensitivity sensitivity(hasoferReliabilityIndexSensitivity_);
527
adv.writeValue(sensitivity, StorageManager::MemberNameAttribute, "hasoferReliabilityIndexSensitivity_");
528
adv.writeValue("isAlreadyComputedImportanceFactors_", isAlreadyComputedImportanceFactors_);
529
adv.writeValue("isAlreadyComputedHasoferReliabilityIndexSensitivity_", isAlreadyComputedHasoferReliabilityIndexSensitivity_);
518
PersistentSensitivity sensitivity(hasoferReliabilityIndexSensitivity_ );
519
PersistentObject::save(adv);
520
adv.saveAttribute( "standardSpaceDesignPoint_", standardSpaceDesignPoint_ );
521
adv.saveAttribute( "physicalSpaceDesignPoint_", physicalSpaceDesignPoint_ );
522
adv.saveAttribute( "limitStateVariable_", limitStateVariable_ );
523
adv.saveAttribute( "isStandardPointOriginInFailureSpace_", isStandardPointOriginInFailureSpace_ );
524
adv.saveAttribute( "hasoferReliabilityIndex_", hasoferReliabilityIndex_ );
525
adv.saveAttribute( "importanceFactors_", importanceFactors_ );
526
adv.saveAttribute( "hasoferReliabilityIndexSensitivity_", sensitivity );
527
adv.saveAttribute( "isAlreadyComputedImportanceFactors_", isAlreadyComputedImportanceFactors_ );
528
adv.saveAttribute( "isAlreadyComputedHasoferReliabilityIndexSensitivity_", isAlreadyComputedHasoferReliabilityIndexSensitivity_ );
532
531
/* Method load() reloads the object from the StorageManager */
533
void AnalyticalResult::load(const StorageManager::Advocate & adv)
532
void AnalyticalResult::load(StorageManager::Advocate & adv)
535
PersistentObject::load(adv);
536
adv.readValue(standardSpaceDesignPoint_, StorageManager::MemberNameAttribute, "standardSpaceDesignPoint_");
537
adv.readValue(physicalSpaceDesignPoint_, StorageManager::MemberNameAttribute, "physicalSpaceDesignPoint_");
538
adv.readValue(limitStateVariable_, StorageManager::MemberNameAttribute, "limitStateVariable_");
539
adv.readValue(importanceFactors_, StorageManager::MemberNameAttribute, "importanceFactors_");
540
PersistentSensitivity sensitivity;
541
adv.readValue(sensitivity, StorageManager::MemberNameAttribute, "hasoferReliabilityIndexSensitivity_");
542
hasoferReliabilityIndexSensitivity_ = sensitivity;
544
NumericalScalar scalarValue;
545
StorageManager::List objList = adv.getList(StorageManager::NumericalScalarEntity);
546
for(objList.firstValueToRead(); objList.moreValuesToRead(); objList.nextValueToRead()) {
547
if (objList.readValue(name, scalarValue)) {
548
if (name == "hasoferReliabilityIndex_") hasoferReliabilityIndex_ = scalarValue;
552
objList = adv.getList(StorageManager::BoolEntity);
553
for(objList.firstValueToRead(); objList.moreValuesToRead(); objList.nextValueToRead()) {
554
if (objList.readValue(name, boolValue)) {
555
if (name == "isStandardPointOriginInFailureSpace_") isStandardPointOriginInFailureSpace_ = boolValue;
556
if (name == "isAlreadyComputedImportanceFactors_") isAlreadyComputedImportanceFactors_ = boolValue;
557
if (name == "isAlreadyComputedHasoferReliabilityIndexSensitivity_") isAlreadyComputedHasoferReliabilityIndexSensitivity_ = boolValue;
534
PersistentSensitivity sensitivity;
535
PersistentObject::load(adv);
536
adv.loadAttribute( "standardSpaceDesignPoint_", standardSpaceDesignPoint_ );
537
adv.loadAttribute( "physicalSpaceDesignPoint_", physicalSpaceDesignPoint_ );
538
adv.loadAttribute( "limitStateVariable_", limitStateVariable_ );
539
adv.loadAttribute( "isStandardPointOriginInFailureSpace_", isStandardPointOriginInFailureSpace_ );
540
adv.loadAttribute( "hasoferReliabilityIndex_", hasoferReliabilityIndex_ );
541
adv.loadAttribute( "importanceFactors_", importanceFactors_ );
542
adv.loadAttribute( "hasoferReliabilityIndexSensitivity_", sensitivity );
543
adv.loadAttribute( "isAlreadyComputedImportanceFactors_", isAlreadyComputedImportanceFactors_ );
544
adv.loadAttribute( "isAlreadyComputedHasoferReliabilityIndexSensitivity_", isAlreadyComputedHasoferReliabilityIndexSensitivity_ );
545
hasoferReliabilityIndexSensitivity_ = sensitivity;
562
548
} /* namespace Algorithm*/