20
20
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
22
* @author: $LastChangedBy: dutka $
23
* @date: $LastChangedDate: 2008-06-26 13:50:17 +0200 (jeu, 26 jun 2008) $
24
* Id: $Id: AnalyticalResult.cxx 862 2008-06-26 11:50:17Z dutka $
23
* @date: $LastChangedDate: 2008-10-31 11:52:04 +0100 (ven 31 oct 2008) $
24
* Id: $Id: AnalyticalResult.cxx 995 2008-10-31 10:52:04Z dutka $
49
51
typedef Base::Type::Description Description;
50
52
typedef Base::Stat::NumericalSample NumericalSample;
51
54
typedef Base::Graph::Pie Pie;
52
55
typedef Base::Graph::BarPlot BarPlot;
53
56
typedef Base::Graph::DrawableImplementation DrawableImplementation;
54
57
typedef DrawableImplementation::Description Description;
55
typedef Analytical::NumericalMathFunction::Matrix Matrix;
58
typedef Base::Func::NumericalMathFunction NumericalMathFunction;
59
typedef NumericalMathFunction::Matrix Matrix;
56
60
typedef Base::Common::Less Less;
57
61
typedef Model::RandomVector RandomVector;
58
62
typedef Model::ConstantRandomVector ConstantRandomVector;
62
66
typedef Distribution::InverseIsoProbabilisticTransformation InverseIsoProbabilisticTransformation;
63
67
typedef Base::Type::PersistentCollection<Base::Type::NumericalPointWithDescription> PersistentSensitivity;
65
const NumericalScalar Analytical::Result::DefaultWidth;
67
CLASSNAMEINIT(Analytical::Result);
69
static Base::Common::Factory<Analytical::Result> RegisteredFactory("Analytical::Result");
69
const NumericalScalar AnalyticalResult::DefaultWidth;
71
CLASSNAMEINIT(AnalyticalResult);
73
static Base::Common::Factory<AnalyticalResult> RegisteredFactory("AnalyticalResult");
72
76
* @brief Standard constructor
74
Analytical::Result::Result(const NumericalPoint & standardSpaceDesignPoint,
75
const Event & limitStateVariable,
76
const Bool isStandardPointOriginInFailureSpace,
78
AnalyticalResult::AnalyticalResult(const NumericalPoint & standardSpaceDesignPoint,
79
const Event & limitStateVariable,
80
const Bool isStandardPointOriginInFailureSpace,
78
82
PersistentObject(name),
79
physicalSpaceDesignPoint_(NumericalPoint(standardSpaceDesignPoint.getDimension(), 0.0)),
83
physicalSpaceDesignPoint_(standardSpaceDesignPoint.getDimension()),
80
84
limitStateVariable_(limitStateVariable),
81
85
isStandardPointOriginInFailureSpace_(isStandardPointOriginInFailureSpace),
82
hasoferReliabilityIndex_(0.),
83
importanceFactors_(NumericalPoint(standardSpaceDesignPoint.getDimension(), 0.0)),
84
hasoferReliabilityIndexSensitivity_(Sensitivity(0)),
86
hasoferReliabilityIndex_(0.0),
87
importanceFactors_(standardSpaceDesignPoint.getDimension()),
88
hasoferReliabilityIndexSensitivity_(0),
85
89
isAlreadyComputedImportanceFactors_(false),
86
90
isAlreadyComputedHasoferReliabilityIndexSensitivity_(false)
92
96
/* Default constructor, needed by SWIG */
93
Analytical::Result::Result():
97
AnalyticalResult::AnalyticalResult():
94
98
PersistentObject(),
95
standardSpaceDesignPoint_(NumericalPoint(0)),
96
physicalSpaceDesignPoint_(NumericalPoint(0)),
99
standardSpaceDesignPoint_(0),
100
physicalSpaceDesignPoint_(0),
97
101
// Fake event based on a fake 1D composite random vector, which requires a fake 1D NumericalMathFunction
98
102
limitStateVariable_(RandomVector(new CompositeRandomVector(NumericalMathFunction(Description(0),Description(1),Description(1)),
99
103
new ConstantRandomVector(NumericalPoint(0)))),
101
105
isStandardPointOriginInFailureSpace_(false),
102
hasoferReliabilityIndex_(0.),
103
importanceFactors_(NumericalPoint(0)),
104
hasoferReliabilityIndexSensitivity_(Sensitivity(0)),
106
hasoferReliabilityIndex_(0.0),
107
importanceFactors_(0),
108
hasoferReliabilityIndexSensitivity_(0),
105
109
isAlreadyComputedImportanceFactors_(false),
106
110
isAlreadyComputedHasoferReliabilityIndexSensitivity_(false)
111
115
/* Virtual constructor */
112
Analytical::Result * Analytical::Result::clone() const
114
return new Result(*this);
118
Analytical::Result::~Result()
116
AnalyticalResult * AnalyticalResult::clone() const
118
return new AnalyticalResult(*this);
123
121
/* StandardSpaceDesignPoint accessor */
124
Analytical::NumericalPoint Analytical::Result::getStandardSpaceDesignPoint() const
122
AnalyticalResult::NumericalPoint AnalyticalResult::getStandardSpaceDesignPoint() const
126
124
return standardSpaceDesignPoint_;
130
128
/* StandardSpaceDesignPoint accessor */
131
void Analytical::Result::setStandardSpaceDesignPoint(const NumericalPoint & standardSpaceDesignPoint)
129
void AnalyticalResult::setStandardSpaceDesignPoint(const NumericalPoint & standardSpaceDesignPoint)
133
131
standardSpaceDesignPoint_ = standardSpaceDesignPoint;
134
132
computePhysicalSpaceDesignPoint();
150
148
/* PhysicalSpaceDesignPoint accessor */
151
void Analytical::Result::setPhysicalSpaceDesignPoint(const NumericalPoint & physicalSpaceDesignPoint)
149
void AnalyticalResult::setPhysicalSpaceDesignPoint(const NumericalPoint & physicalSpaceDesignPoint)
153
151
physicalSpaceDesignPoint_ = physicalSpaceDesignPoint;
156
154
/* PhysicalSpaceDesignPoint accessor */
157
Analytical::NumericalPoint Analytical::Result::getPhysicalSpaceDesignPoint() const
155
AnalyticalResult::NumericalPoint AnalyticalResult::getPhysicalSpaceDesignPoint() const
159
157
return physicalSpaceDesignPoint_;
162
160
/* LimitStateVariable accessor */
163
Analytical::Event Analytical::Result::getLimitStateVariable() const
161
AnalyticalResult::Event AnalyticalResult::getLimitStateVariable() const
165
163
return limitStateVariable_;
168
166
/* IsStandardPointOriginInFailureSpace accessor */
169
Bool Analytical::Result::getIsStandardPointOriginInFailureSpace() const
167
Bool AnalyticalResult::getIsStandardPointOriginInFailureSpace() const
171
169
return isStandardPointOriginInFailureSpace_;
174
172
/* IsStandardPointOriginInFailureSpace accessor */
175
void Analytical::Result::setIsStandardPointOriginInFailureSpace(const Bool isStandardPointOriginInFailureSpace)
173
void AnalyticalResult::setIsStandardPointOriginInFailureSpace(const Bool isStandardPointOriginInFailureSpace)
177
175
isStandardPointOriginInFailureSpace_ = isStandardPointOriginInFailureSpace;
180
178
/* ImportanceFactors evaluation */
181
void Analytical::Result::computeImportanceFactors()
179
void AnalyticalResult::computeImportanceFactors()
183
UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
181
const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
184
182
importanceFactors_ = NumericalPoint(dimension, -1.0);
185
183
/* First, check that the importance factors are well-defined */
186
184
if (standardSpaceDesignPoint_.norm() > 0.0)
188
186
/* get the input distribution */
189
Distribution inputDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
187
const Distribution inputDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
190
188
/* get the input standard distribution */
191
Distribution standardDistribution(inputDistribution.getStandardDistribution());
189
const Distribution standardDistribution(inputDistribution.getStandardDistribution());
192
190
/* get the marginal 1D from in the standard space where all marginals are identical */
193
Distribution standardMarginalDistribution(standardDistribution.getMarginal(0));
191
const Distribution standardMarginalDistribution(standardDistribution.getMarginal(0));
195
193
/* evaluate the corresponding vector in the importance factors space */
196
194
/* if Generalised Nataf Transformation : Z = E1^(-1)o F_{Xi}(Xi*) */
197
195
/* if Rosenblatt Transformation : Z = Phi^(-1)o F_{Xi}(Xi*) */
198
196
// for each marginals */
199
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; marginalIndex++)
197
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex)
201
NumericalScalar y = inputDistribution.getMarginal(marginalIndex).computeCDF(NumericalPoint(1, physicalSpaceDesignPoint_[marginalIndex]));
199
const NumericalScalar y(inputDistribution.getMarginal(marginalIndex).computeCDF(NumericalPoint(1, physicalSpaceDesignPoint_[marginalIndex])));
202
200
importanceFactors_[marginalIndex] = standardMarginalDistribution.computeQuantile(y)[0];
204
202
/* compute square norm of importanceFactors vector */
205
NumericalScalar inorm2(1.0 / importanceFactors_.norm2());
203
const NumericalScalar inorm2(1.0 / importanceFactors_.norm2());
206
204
/* compute final importance factors */
207
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; marginalIndex++)
205
for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex)
209
207
importanceFactors_[marginalIndex] *= importanceFactors_[marginalIndex] * inorm2;
231
229
/* ImportanceFactors graph */
232
Analytical::Result::Graph Analytical::Result::drawImportanceFactors()
230
AnalyticalResult::Graph AnalyticalResult::drawImportanceFactors()
234
232
// To ensure that the importance factors are up to date
235
233
if (!isAlreadyComputedImportanceFactors_)
237
235
computeImportanceFactors();
239
UnsignedLong dimension(importanceFactors_.getDimension());
237
const UnsignedLong dimension(importanceFactors_.getDimension());
240
238
NumericalSample data(dimension, 1);
242
240
/* build data for the pie */
243
for (UnsignedLong i = 0; i < dimension; i++)
241
for (UnsignedLong i = 0; i < dimension; ++i)
245
243
data[i]=NumericalPoint(1, importanceFactors_[i]);
305
303
/* HasoferReliabilityIndex evaluation */
306
void Analytical::Result::computeHasoferReliabilityIndex()
304
void AnalyticalResult::computeHasoferReliabilityIndex()
308
306
/* evaluate the HasoferReliabilityIndex */
309
307
if (standardSpaceDesignPoint_.getDimension() > 0) hasoferReliabilityIndex_ = standardSpaceDesignPoint_.norm();
312
310
/* HasoferReliabilityIndex accessor */
313
NumericalScalar Analytical::Result::getHasoferReliabilityIndex() const
311
NumericalScalar AnalyticalResult::getHasoferReliabilityIndex() const
315
313
return hasoferReliabilityIndex_;
319
317
/* HasoferReliabilityIndex accessor */
320
void Analytical::Result::setHasoferReliabilityIndex(const NumericalScalar & hasoferReliabilityIndex)
318
void AnalyticalResult::setHasoferReliabilityIndex(const NumericalScalar & hasoferReliabilityIndex)
322
320
hasoferReliabilityIndex_ = hasoferReliabilityIndex;
325
323
/* HasoferReliabilityIndex evaluation */
326
void Analytical::Result::computeHasoferReliabilityIndexSensitivity()
324
void AnalyticalResult::computeHasoferReliabilityIndexSensitivity()
328
326
/* get Set1 : parameters of the physical distribution */
329
Distribution physicalDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
330
NumericalPointWithDescriptionCollection set1(physicalDistribution.getParametersCollection());
327
const Distribution physicalDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());
328
const NumericalPointWithDescriptionCollection set1(physicalDistribution.getParametersCollection());
331
329
/* get Set2 : parameters of the physical model */
332
NumericalMathFunction physicalModel(limitStateVariable_.getImplementation()->getFunction());
333
NumericalPoint set2(physicalModel.getParameters());
334
Bool isSet2Empty(set2.getDimension() == 0);
330
const NumericalMathFunction physicalModel(limitStateVariable_.getImplementation()->getFunction());
331
const NumericalPointWithDescription set2(physicalModel.getParameters());
332
const Bool isSet2Empty(set2.getDimension() == 0);
336
334
/* get SetIso : parameters included in the isoprobabilistic transformation which is a subset of Set1 */
337
InverseIsoProbabilisticTransformation inverseIsoProbabilisticTransformation(physicalDistribution.getInverseIsoProbabilisticTransformation());
338
NumericalPointWithDescription setIso(inverseIsoProbabilisticTransformation.getParameters());
335
const InverseIsoProbabilisticTransformation inverseIsoProbabilisticTransformation(physicalDistribution.getInverseIsoProbabilisticTransformation());
336
const NumericalPointWithDescription setIso(inverseIsoProbabilisticTransformation.getParameters());
339
337
/* scaling factor between sensitivity and gradients (ref doc : factor = -lambda/beta) */
340
338
/* gradient of the standard limite state function */
341
Matrix physicalGradientMatrix(physicalModel.gradient(physicalSpaceDesignPoint_));
342
NumericalPoint standardFunctionGradient(inverseIsoProbabilisticTransformation.gradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0)));
343
NumericalScalar gradientToSensitivity(-(limitStateVariable_.getOperator().compare(1.0, 0.0) ? 1.0 : -1.0) / standardFunctionGradient.norm());
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());
344
342
/* evaluate the gradients of the physical model with respect to Set2 (ref doc : K2) */
345
343
NumericalPoint physicalGradient;
346
344
if (!isSet2Empty)
351
349
NumericalPoint isoProbabilisticGradient;
352
350
if (setIso.getDimension() > 0)
354
isoProbabilisticGradient =inverseIsoProbabilisticTransformation.parametersGradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0));
352
isoProbabilisticGradient = inverseIsoProbabilisticTransformation.parametersGradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0));
356
354
/* associate to each element of Set1 the gradient value */
358
356
/* hasoferReliabilityIndexSensitivity is the collection Set1 + one other collection wich is Set2 */
359
UnsignedLong set1Size(set1.getSize());
360
UnsignedLong size(set1Size + (isSet2Empty ? 0 : 1));
357
const UnsignedLong set1Size(set1.getSize());
358
const UnsignedLong size(set1Size + (isSet2Empty ? 0 : 1));
361
359
hasoferReliabilityIndexSensitivity_ = Sensitivity(size);
363
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < set1Size; sensitivityIndex++)
361
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < set1Size; ++sensitivityIndex)
365
NumericalPointWithDescription currentParameters(set1[sensitivityIndex]);
366
UnsignedLong currentDimension(currentParameters.getDimension());
363
const NumericalPointWithDescription currentParameters(set1[sensitivityIndex]);
364
const UnsignedLong currentDimension(currentParameters.getDimension());
367
365
NumericalPointWithDescription currentSensitivity(currentDimension);
368
Description currentDescription(currentParameters.getDescription());
366
const Description currentDescription(currentParameters.getDescription());
369
367
// the currentSensitivity gets the description and the name from set1
370
368
currentSensitivity.setDescription(currentDescription);
371
String currentName(currentParameters.getName());
369
const String currentName(currentParameters.getName());
372
370
currentSensitivity.setName(currentName);
373
Description isoDescription(setIso.getDescription());
374
for (UnsignedLong currentIndex = 0; currentIndex < currentDimension; currentIndex++)
371
const Description isoDescription(setIso.getDescription());
372
for (UnsignedLong currentIndex = 0; currentIndex < currentDimension; ++currentIndex)
376
UnsignedLong position(computePosition(currentName, currentDescription[currentIndex], isoDescription));
374
const UnsignedLong position(computePosition(currentName, currentDescription[currentIndex], isoDescription));
377
375
/* if currentParameters[currentIndex] is into setIso, then we get the sensitivity value in the corresponding isoProbabilisticGradient */
378
376
if (position < setIso.getDimension())
397
395
/* Returns the position of the given (value, name) into the NumericalPoint or the dimension of the NumericalPoint if failed */
398
UnsignedLong Analytical::Result::computePosition(const String & marginalName, const String & marginalParameterName, const Description & parameterSetNames) const
396
UnsignedLong AnalyticalResult::computePosition(const String & marginalName, const String & marginalParameterName, const Description & parameterSetNames) const
400
UnsignedLong dimension(parameterSetNames.getSize());
401
String fullName(OSS() << marginalName << "_" << marginalParameterName);
402
for (UnsignedLong index = 0; index < dimension; index++)
398
const UnsignedLong dimension(parameterSetNames.getSize());
399
const String fullName(OSS() << marginalName << "_" << marginalParameterName);
400
for (UnsignedLong index = 0; index < dimension; ++index)
404
402
if ( parameterSetNames[index] == fullName ) return index;
418
416
computeHasoferReliabilityIndexSensitivity();
420
UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
421
UnsignedLong size(hasoferReliabilityIndexSensitivity_.getSize());
418
const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());
419
const UnsignedLong size(hasoferReliabilityIndexSensitivity_.getSize());
422
420
// The first graph shows the sensitivities with respect to the marginal parameters if there exist
423
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
424
422
Sensitivity marginalSensitivity(dimension);
425
for(UnsignedLong i = 0; i < dimension; i++)
423
for(UnsignedLong i = 0; i < dimension; ++i)
427
425
marginalSensitivity[i] = hasoferReliabilityIndexSensitivity_[i];
460
458
BarPlot sensitivityBarPlot(NumericalSample(0, 2), shift, "");
462
Description colors(DrawableImplementation::GetValidColors());
460
const Description colors(DrawableImplementation::GetValidColors());
463
461
Description::const_iterator colorsIterator;
464
462
colorsIterator = colors.begin();
466
464
// Create the barplots
467
UnsignedLong sensitivitySize(sensitivity.getSize());
468
for (UnsignedLong collectionIndex = 0; collectionIndex < sensitivitySize; collectionIndex++)
465
const UnsignedLong sensitivitySize(sensitivity.getSize());
466
for (UnsignedLong collectionIndex = 0; collectionIndex < sensitivitySize; ++collectionIndex)
470
468
NumericalSample data(sensitivity[collectionIndex].getDimension(), 2);
471
UnsignedLong dataSize(data.getSize());
472
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < dataSize; sensitivityIndex++)
469
const UnsignedLong dataSize(data.getSize());
470
for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < dataSize; ++sensitivityIndex)
474
472
data[sensitivityIndex][0] = width;
475
473
data[sensitivityIndex][1] = sensitivity[collectionIndex][sensitivityIndex];