Changeset 983
- Timestamp:
- 10/24/08 15:58:30 (2 months ago)
- Files:
-
- branches/lebrun/devel/lib/src/Base/Type/Description.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Base/Type/Description.hxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Base/Type/DescriptionImplementation.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Base/Type/DescriptionImplementation.hxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Algorithm/Analytical/AnalyticalResult.cxx (modified) (17 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Algorithm/IsoProbabilisticTransformation/MarginalTransformation/InverseMarginalTransformationEvaluation.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Algorithm/IsoProbabilisticTransformation/MarginalTransformation/MarginalTransformationEvaluation.cxx (modified) (3 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Algorithm/QuadraticCumul/QuadraticCumul.cxx (modified) (10 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Algorithm/QuadraticCumul/QuadraticCumul.hxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/ComposedDistribution.cxx (modified) (5 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/Epanechnikov.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/ExtraFunc/DistFunc.cxx (modified) (2 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/ExtraFunc/DistFunc.hxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/IndependentCopula.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/KernelMixture.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/Mixture.cxx (modified) (3 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/MultiNomial.cxx (modified) (14 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/NormalCopula.cxx (modified) (16 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/RandomMixture.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Distribution/StudentND.cxx (modified) (1 diff)
- branches/lebrun/devel/lib/src/Uncertainty/Model/DistributionImplementation.cxx (modified) (2 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/Model/EllipticalDistribution.cxx (modified) (10 diffs)
- branches/lebrun/devel/lib/src/Uncertainty/StatTests/FittingTest.cxx (modified) (3 diffs)
- branches/lebrun/devel/lib/test/t_ComposedDistribution_std.at (modified) (2 diffs)
- branches/lebrun/devel/lib/test/t_FORM_sensitivity.at (modified) (1 diff)
- branches/lebrun/devel/lib/test/t_FittingTest_std.at (modified) (1 diff)
- branches/lebrun/devel/lib/test/t_FittingTest_std.cxx (modified) (3 diffs)
- branches/lebrun/devel/lib/test/t_Mixture_std.at (modified) (1 diff)
- branches/lebrun/devel/lib/test/t_QuadraticCumul_importanceFactors.at (modified) (1 diff)
- branches/lebrun/devel/python/test/t_ComposedDistribution_std.atpy (modified) (2 diffs)
- branches/lebrun/devel/python/test/t_FittingTest_std.atpy (modified) (1 diff)
- branches/lebrun/devel/python/test/t_FittingTest_std.py (modified) (4 diffs)
- branches/lebrun/devel/python/test/t_Mixture_std.atpy (modified) (1 diff)
- branches/lebrun/devel/python/test/t_QuadraticCumul_importanceFactors.atpy (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/lebrun/devel/lib/src/Base/Type/Description.cxx
r924 r983 53 53 54 54 55 /* Constructor with value */ 56 Description::Description(const String & value) 57 : Common::TypedCollectionInterfaceObject<DescriptionImplementation>(new DescriptionImplementation(value)) 58 { 59 // Nothing to do 60 } 61 62 55 63 /* Constructor with size and default value */ 56 64 Description::Description(const UnsignedLong size, branches/lebrun/devel/lib/src/Base/Type/Description.hxx
r924 r983 57 57 Description(const UnsignedLong size); 58 58 59 /** Constructor with value */ 60 Description(const String & value); 61 59 62 /** Constructor with size and default value */ 60 63 Description(const UnsignedLong size, branches/lebrun/devel/lib/src/Base/Type/DescriptionImplementation.cxx
r924 r983 63 63 64 64 65 /* Constructor with size */ 66 DescriptionImplementation::DescriptionImplementation(const String & value) 67 : PersistentCollection<String>(1, value) 68 { 69 // Nothing to do 70 } 71 72 65 73 /* Constructor with size and default value */ 66 74 DescriptionImplementation::DescriptionImplementation(const UnsignedLong size, branches/lebrun/devel/lib/src/Base/Type/DescriptionImplementation.hxx
r924 r983 59 59 /** Constructor with size */ 60 60 DescriptionImplementation(const UnsignedLong size); 61 62 /** Constructor with default value */ 63 DescriptionImplementation(const String & value); 61 64 62 65 /** Constructor with size and default value */ branches/lebrun/devel/lib/src/Uncertainty/Algorithm/Analytical/AnalyticalResult.cxx
r943 r983 81 81 const String & name): 82 82 PersistentObject(name), 83 physicalSpaceDesignPoint_( NumericalPoint(standardSpaceDesignPoint.getDimension(), 0.0)),83 physicalSpaceDesignPoint_(standardSpaceDesignPoint.getDimension()), 84 84 limitStateVariable_(limitStateVariable), 85 85 isStandardPointOriginInFailureSpace_(isStandardPointOriginInFailureSpace), 86 hasoferReliabilityIndex_(0. ),87 importanceFactors_( NumericalPoint(standardSpaceDesignPoint.getDimension(), 0.0)),88 hasoferReliabilityIndexSensitivity_( Sensitivity(0)),86 hasoferReliabilityIndex_(0.0), 87 importanceFactors_(standardSpaceDesignPoint.getDimension()), 88 hasoferReliabilityIndexSensitivity_(0), 89 89 isAlreadyComputedImportanceFactors_(false), 90 90 isAlreadyComputedHasoferReliabilityIndexSensitivity_(false) … … 97 97 AnalyticalResult::AnalyticalResult(): 98 98 PersistentObject(), 99 standardSpaceDesignPoint_( NumericalPoint(0)),100 physicalSpaceDesignPoint_( NumericalPoint(0)),99 standardSpaceDesignPoint_(0), 100 physicalSpaceDesignPoint_(0), 101 101 // Fake event based on a fake 1D composite random vector, which requires a fake 1D NumericalMathFunction 102 102 limitStateVariable_(RandomVector(new CompositeRandomVector(NumericalMathFunction(Description(0),Description(1),Description(1)), 103 103 new ConstantRandomVector(NumericalPoint(0)))), 104 Less(), 0. ),104 Less(), 0.0), 105 105 isStandardPointOriginInFailureSpace_(false), 106 hasoferReliabilityIndex_(0. ),107 importanceFactors_( NumericalPoint(0)),108 hasoferReliabilityIndexSensitivity_( Sensitivity(0)),106 hasoferReliabilityIndex_(0.0), 107 importanceFactors_(0), 108 hasoferReliabilityIndexSensitivity_(0), 109 109 isAlreadyComputedImportanceFactors_(false), 110 110 isAlreadyComputedHasoferReliabilityIndexSensitivity_(false) … … 179 179 void AnalyticalResult::computeImportanceFactors() 180 180 { 181 UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());181 const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension()); 182 182 importanceFactors_ = NumericalPoint(dimension, -1.0); 183 183 /* First, check that the importance factors are well-defined */ … … 185 185 { 186 186 /* get the input distribution */ 187 Distribution inputDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());187 const Distribution inputDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution()); 188 188 /* get the input standard distribution */ 189 Distribution standardDistribution(inputDistribution.getStandardDistribution());189 const Distribution standardDistribution(inputDistribution.getStandardDistribution()); 190 190 /* get the marginal 1D from in the standard space where all marginals are identical */ 191 Distribution standardMarginalDistribution(standardDistribution.getMarginal(0));191 const Distribution standardMarginalDistribution(standardDistribution.getMarginal(0)); 192 192 193 193 /* evaluate the corresponding vector in the importance factors space */ … … 195 195 /* if Rosenblatt Transformation : Z = Phi^(-1)o F_{Xi}(Xi*) */ 196 196 // for each marginals */ 197 for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; marginalIndex++)198 { 199 NumericalScalar y = inputDistribution.getMarginal(marginalIndex).computeCDF(NumericalPoint(1, physicalSpaceDesignPoint_[marginalIndex]));197 for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex) 198 { 199 const NumericalScalar y(inputDistribution.getMarginal(marginalIndex).computeCDF(NumericalPoint(1, physicalSpaceDesignPoint_[marginalIndex]))); 200 200 importanceFactors_[marginalIndex] = standardMarginalDistribution.computeQuantile(y)[0]; 201 201 } 202 202 /* compute square norm of importanceFactors vector */ 203 NumericalScalar inorm2(1.0 / importanceFactors_.norm2());203 const NumericalScalar inorm2(1.0 / importanceFactors_.norm2()); 204 204 /* compute final importance factors */ 205 for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; marginalIndex++)205 for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex) 206 206 { 207 207 importanceFactors_[marginalIndex] *= importanceFactors_[marginalIndex] * inorm2; … … 235 235 computeImportanceFactors(); 236 236 } 237 UnsignedLong dimension(importanceFactors_.getDimension());237 const UnsignedLong dimension(importanceFactors_.getDimension()); 238 238 NumericalSample data(dimension, 1); 239 239 240 240 /* build data for the pie */ 241 for (UnsignedLong i = 0; i < dimension; i++)241 for (UnsignedLong i = 0; i < dimension; ++i) 242 242 { 243 243 data[i]=NumericalPoint(1, importanceFactors_[i]); … … 249 249 Description palette(dimension); 250 250 Description labels(dimension); 251 Description colors(DrawableImplementation::GetValidColors());251 const Description colors(DrawableImplementation::GetValidColors()); 252 252 Description::const_iterator colorsIterator; 253 253 colorsIterator = colors.begin(); … … 257 257 { 258 258 description = Description(dimension); 259 for (UnsignedLong i = 0; i < dimension; i++)259 for (UnsignedLong i = 0; i < dimension; ++i) 260 260 { 261 261 OSS oss; … … 264 264 } 265 265 } 266 for (UnsignedLong i = 0; i < dimension; i++)266 for (UnsignedLong i = 0; i < dimension; ++i) 267 267 { 268 268 OSS oss; … … 272 272 labels[i] = oss; 273 273 palette[i] = (*colorsIterator); 274 colorsIterator++;274 ++colorsIterator; 275 275 if (colorsIterator == colors.end()) 276 276 { … … 325 325 { 326 326 /* get Set1 : parameters of the physical distribution */ 327 Distribution physicalDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution());328 NumericalPointWithDescriptionCollection set1(physicalDistribution.getParametersCollection());327 const Distribution physicalDistribution(limitStateVariable_.getImplementation()->getAntecedent()->getDistribution()); 328 const NumericalPointWithDescriptionCollection set1(physicalDistribution.getParametersCollection()); 329 329 /* get Set2 : parameters of the physical model */ 330 NumericalMathFunction physicalModel(limitStateVariable_.getImplementation()->getFunction());331 NumericalPointset2(physicalModel.getParameters());332 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); 333 333 334 334 /* get SetIso : parameters included in the isoprobabilistic transformation which is a subset of Set1 */ 335 InverseIsoProbabilisticTransformation inverseIsoProbabilisticTransformation(physicalDistribution.getInverseIsoProbabilisticTransformation());336 NumericalPointWithDescription setIso(inverseIsoProbabilisticTransformation.getParameters());335 const InverseIsoProbabilisticTransformation inverseIsoProbabilisticTransformation(physicalDistribution.getInverseIsoProbabilisticTransformation()); 336 const NumericalPointWithDescription setIso(inverseIsoProbabilisticTransformation.getParameters()); 337 337 /* scaling factor between sensitivity and gradients (ref doc : factor = -lambda/beta) */ 338 338 /* gradient of the standard limite state function */ 339 Matrix physicalGradientMatrix(physicalModel.gradient(physicalSpaceDesignPoint_));340 NumericalPoint standardFunctionGradient(inverseIsoProbabilisticTransformation.gradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0)));341 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()); 342 342 /* evaluate the gradients of the physical model with respect to Set2 (ref doc : K2) */ 343 343 NumericalPoint physicalGradient; … … 350 350 if (setIso.getDimension() > 0) 351 351 { 352 isoProbabilisticGradient = inverseIsoProbabilisticTransformation.parametersGradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0));352 isoProbabilisticGradient = inverseIsoProbabilisticTransformation.parametersGradient(standardSpaceDesignPoint_) * (physicalGradientMatrix * NumericalPoint(1, 1.0)); 353 353 } 354 354 /* associate to each element of Set1 the gradient value */ 355 355 356 356 /* hasoferReliabilityIndexSensitivity is the collection Set1 + one other collection wich is Set2 */ 357 UnsignedLong set1Size(set1.getSize());358 UnsignedLong size(set1Size + (isSet2Empty ? 0 : 1));357 const UnsignedLong set1Size(set1.getSize()); 358 const UnsignedLong size(set1Size + (isSet2Empty ? 0 : 1)); 359 359 hasoferReliabilityIndexSensitivity_ = Sensitivity(size); 360 360 361 for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < set1Size; sensitivityIndex++)362 { 363 NumericalPointWithDescription currentParameters(set1[sensitivityIndex]);364 UnsignedLong currentDimension(currentParameters.getDimension());361 for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < set1Size; ++sensitivityIndex) 362 { 363 const NumericalPointWithDescription currentParameters(set1[sensitivityIndex]); 364 const UnsignedLong currentDimension(currentParameters.getDimension()); 365 365 NumericalPointWithDescription currentSensitivity(currentDimension); 366 Description currentDescription(currentParameters.getDescription());366 const Description currentDescription(currentParameters.getDescription()); 367 367 // the currentSensitivity gets the description and the name from set1 368 368 currentSensitivity.setDescription(currentDescription); 369 String currentName(currentParameters.getName());369 const String currentName(currentParameters.getName()); 370 370 currentSensitivity.setName(currentName); 371 Description isoDescription(setIso.getDescription());372 for (UnsignedLong currentIndex = 0; currentIndex < currentDimension; currentIndex++)373 { 374 UnsignedLong position(computePosition(currentName, currentDescription[currentIndex], isoDescription));371 const Description isoDescription(setIso.getDescription()); 372 for (UnsignedLong currentIndex = 0; currentIndex < currentDimension; ++currentIndex) 373 { 374 const UnsignedLong position(computePosition(currentName, currentDescription[currentIndex], isoDescription)); 375 375 /* if currentParameters[currentIndex] is into setIso, then we get the sensitivity value in the corresponding isoProbabilisticGradient */ 376 376 if (position < setIso.getDimension()) … … 396 396 UnsignedLong AnalyticalResult::computePosition(const String & marginalName, const String & marginalParameterName, const Description & parameterSetNames) const 397 397 { 398 UnsignedLong dimension(parameterSetNames.getSize());399 String fullName(OSS() << marginalName << "_" << marginalParameterName);400 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) 401 401 { 402 402 if ( parameterSetNames[index] == fullName ) return index; … … 416 416 computeHasoferReliabilityIndexSensitivity(); 417 417 } 418 UnsignedLong dimension(standardSpaceDesignPoint_.getDimension());419 UnsignedLong size(hasoferReliabilityIndexSensitivity_.getSize());418 const UnsignedLong dimension(standardSpaceDesignPoint_.getDimension()); 419 const UnsignedLong size(hasoferReliabilityIndexSensitivity_.getSize()); 420 420 // The first graph shows the sensitivities with respect to the marginal parameters if there exist 421 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 422 Sensitivity marginalSensitivity(dimension); 423 for(UnsignedLong i = 0; i < dimension; i++)423 for(UnsignedLong i = 0; i < dimension; ++i) 424 424 { 425 425 marginalSensitivity[i] = hasoferReliabilityIndexSensitivity_[i]; … … 434 434 { 435 435 Sensitivity otherSensitivity(size - dimension); 436 for(UnsignedLong i = dimension; i < size; i++)436 for(UnsignedLong i = dimension; i < size; ++i) 437 437 { 438 438 otherSensitivity[i - dimension] = hasoferReliabilityIndexSensitivity_[i]; … … 458 458 BarPlot sensitivityBarPlot(NumericalSample(0, 2), shift, ""); 459 459 460 Description colors(DrawableImplementation::GetValidColors());460 const Description colors(DrawableImplementation::GetValidColors()); 461 461 Description::const_iterator colorsIterator; 462 462 colorsIterator = colors.begin(); 463 463 464 464 // Create the barplots 465 UnsignedLong sensitivitySize(sensitivity.getSize());466 for (UnsignedLong collectionIndex = 0; collectionIndex < sensitivitySize; collectionIndex++)465 const UnsignedLong sensitivitySize(sensitivity.getSize()); 466 for (UnsignedLong collectionIndex = 0; collectionIndex < sensitivitySize; ++collectionIndex) 467 467 { 468 468 NumericalSample data(sensitivity[collectionIndex].getDimension(), 2); 469 UnsignedLong dataSize(data.getSize());470 for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < dataSize; sensitivityIndex++)469 const UnsignedLong dataSize(data.getSize()); 470 for (UnsignedLong sensitivityIndex = 0; sensitivityIndex < dataSize; ++sensitivityIndex) 471 471 { 472 472 data[sensitivityIndex][0] = width; … … 477 477 oss << sensitivity[collectionIndex].getName() << " " << sensitivity[collectionIndex].getDescription(); 478 478 sensitivityGraph.addDrawable(BarPlot(data, shift, (*colorsIterator), "solid", "solid", oss)); 479 colorsIterator++;479 ++colorsIterator; 480 480 if (colorsIterator == colors.end()) 481 481 { branches/lebrun/devel/lib/src/Uncertainty/Algorithm/IsoProbabilisticTransformation/MarginalTransformation/InverseMarginalTransformationEvaluation.cxx
r975 r983 90 90 InverseMarginalTransformationEvaluation::Matrix InverseMarginalTransformationEvaluation::parametersGradient(const NumericalPoint & in) const 91 91 { 92 NumericalPoint parameters(getParameters());93 UnsignedLong parametersDimension(parameters.getDimension());94 UnsignedLong inputDimension(getInputNumericalPointDimension());92 const NumericalPoint parameters(getParameters()); 93 const UnsignedLong parametersDimension(parameters.getDimension()); 94 const UnsignedLong inputDimension(getInputNumericalPointDimension()); 95 95 Matrix result(parametersDimension, inputDimension); 96 96 UnsignedLong rowIndex(0); 97 97 for (UnsignedLong j = 0; j < inputDimension; ++j) 98 98 { 99 NumericalPoint x(distributionCollection_[j].computeQuantile(in[j]));100 NumericalPoint marginalCDFGradient(distributionCollection_[j].computeCDFGradient(x));101 NumericalScalar pdf(distributionCollection_[j].computePDF(x));102 NumericalPoint marginalQuantileGradient((-1.0 / pdf) * marginalCDFGradient);103 UnsignedLong marginalParametersDimension(marginalCDFGradient.getDimension());99 const NumericalPoint x(distributionCollection_[j].computeQuantile(in[j])); 100 const NumericalPoint marginalCDFGradient(distributionCollection_[j].computeCDFGradient(x)); 101 const NumericalScalar pdf(distributionCollection_[j].computePDF(x)); 102 const NumericalPoint marginalQuantileGradient((-1.0 / pdf) * marginalCDFGradient); 103 const UnsignedLong marginalParametersDimension(marginalCDFGradient.getDimension()); 104 104 for (UnsignedLong i = 0; i < marginalParametersDimension; ++i) 105 105 { branches/lebrun/devel/lib/src/Uncertainty/Algorithm/IsoProbabilisticTransformation/MarginalTransformation/MarginalTransformationEvaluation.cxx
r975 r983 42 42 { 43 43 Description description; 44 UnsignedLong size(distributionCollection.getSize());44 const UnsignedLong size(distributionCollection.getSize()); 45 45 for (UnsignedLong i = 0; i < size; ++i) 46 46 { … … 68 68 throw (InvalidArgumentException, InternalException) 69 69 { 70 UnsignedLong dimension(getOutputNumericalPointDimension());70 const UnsignedLong dimension(getOutputNumericalPointDimension()); 71 71 NumericalPoint result(dimension); 72 72 // Apply CDF over the components … … 81 81 MarginalTransformationEvaluation::Matrix MarginalTransformationEvaluation::parametersGradient(const NumericalPoint & in) const 82 82 { 83 NumericalPoint parameters(getParameters());84 UnsignedLong parametersDimension(parameters.getDimension());85 UnsignedLong inputDimension(getInputNumericalPointDimension());83 const NumericalPoint parameters(getParameters()); 84 const UnsignedLong parametersDimension(parameters.getDimension()); 85 const UnsignedLong inputDimension(getInputNumericalPointDimension()); 86 86 Matrix result(parametersDimension, inputDimension); 87 87 UnsignedLong rowIndex(0); 88 88 for (UnsignedLong j = 0; j < inputDimension; ++j) 89 89 { 90 NumericalPoint marginalCDFGradient(distributionCollection_[j].computeCDFGradient(NumericalPoint(1, in[j])));91 UnsignedLong marginalParametersDimension(marginalCDFGradient.getDimension());90 const NumericalPoint marginalCDFGradient(distributionCollection_[j].computeCDFGradient(NumericalPoint(1, in[j]))); 91 const UnsignedLong marginalParametersDimension(marginalCDFGradient.getDimension()); 92 92 for (UnsignedLong i = 0; i < marginalParametersDimension; ++i) 93 93 { branches/lebrun/devel/lib/src/Uncertainty/Algorithm/QuadraticCumul/QuadraticCumul.cxx
r807 r983 63 63 : Base::Common::PersistentObject(name), 64 64 limitStateVariable_(limitStateVariable), 65 meanInputVector_( NumericalPoint(0)),66 valueAtMean_( NumericalPoint(0)),67 gradientAtMean_( Matrix(0, 0)),68 hessianAtMean_( SymmetricTensor(0, 0)),65 meanInputVector_(0), 66 valueAtMean_(0), 67 gradientAtMean_(0, 0), 68 hessianAtMean_(0, 0), 69 69 isAlreadyComputedValue_(false), 70 70 isAlreadyComputedGradient_(false), … … 74 74 isAlreadyComputedCovariance_(false), 75 75 isAlreadyComputedImportanceFactors_(false), 76 inputCovariance_( CovarianceMatrix(0)),77 meanFirstOrder_( NumericalPoint(0)),78 meanSecondOrder_( NumericalPoint(0)),79 covariance_( CovarianceMatrix(0)),80 importanceFactors_( NumericalPoint(0))76 inputCovariance_(0), 77 meanFirstOrder_(0), 78 meanSecondOrder_(0), 79 covariance_(0), 80 importanceFactors_(0) 81 81 { 82 82 /* Check if the given random vector is a composite random vector, which is mandatory */ … … 153 153 154 154 /* importance factors accessor */ 155 QuadraticCumul::NumericalPoint QuadraticCumul::getImportanceFactors()155 QuadraticCumul::NumericalPointWithDescription QuadraticCumul::getImportanceFactors() 156 156 { 157 157 if(!isAlreadyComputedImportanceFactors_) … … 168 168 { 169 169 // To ensure that the importance factors are up to date 170 importanceFactors_ =getImportanceFactors();171 UnsignedLong dimension(importanceFactors_.getDimension());170 getImportanceFactors(); 171 const UnsignedLong dimension(importanceFactors_.getDimension()); 172 172 NumericalSample data(dimension, 1); 173 173 174 174 /* build data for the pie */ 175 for (UnsignedLong i = 0; i < dimension; i++)175 for (UnsignedLong i = 0; i < dimension; ++i) 176 176 { 177 177 data[i]=NumericalPoint(1, importanceFactors_[i]); … … 186 186 Description::const_iterator colorsIterator; 187 187 colorsIterator = colors.begin(); 188 for (UnsignedLong i = 0; i < dimension; i++)188 for (UnsignedLong i = 0; i < dimension; ++i) 189 189 { 190 190 OSS oss; … … 193 193 oss << 100.0 * data[i][0] << "%"; 194 194 palette[i] = (*colorsIterator); 195 colorsIterator++;195 ++colorsIterator; 196 196 if (colorsIterator == colors.end()) 197 197 { … … 254 254 covariance_ = CovarianceMatrix(gradientAtMean_.getNbColumns()); 255 255 /* we unroll the matrix multiplications transpose(gradient).covariance.gradient */ 256 for (UnsignedLong i = 0; i < covariance_.getDimension(); i++)257 { 258 for (UnsignedLong j = 0; j < covariance_.getDimension(); j++)256 for (UnsignedLong i = 0; i < covariance_.getDimension(); ++i) 257 { 258 for (UnsignedLong j = 0; j < covariance_.getDimension(); ++j) 259 259 { 260 260 covariance_(i, j) = 0; 261 for (UnsignedLong k = 0; k < gradientAtMean_.getNbRows(); k++)261 for (UnsignedLong k = 0; k < gradientAtMean_.getNbRows(); ++k) 262 262 { 263 for (UnsignedLong l = 0; l < gradientAtMean_.getNbRows(); l++)263 for (UnsignedLong l = 0; l < gradientAtMean_.getNbRows(); ++l) 264 264 { 265 265 covariance_(i, j) += gradientAtMean_(l, i) * inputCovariance_(l, k) * gradientAtMean_(k, j); … … 283 283 /* we compute here the importance factors */ 284 284 /* in this scalar case, gradientAtMean is a NumericalPoint */ 285 UnsignedLong dimension(gradientAtMean_.getNbRows());285 const UnsignedLong dimension(gradientAtMean_.getNbRows()); 286 286 287 287 /* in this scalar case, importance factors is a NumericalPoint, defined as importanceFactors = gradient .* inputCovariance * gradient / outputCovariance, where .* means an element-wise multiplication between vectors */ 288 288 importanceFactors_ = NumericalPoint(dimension, 0.0); 289 289 // This line looks strange, but it is here to ensure that the covariance has actually been computed 290 covariance_ =getCovariance();291 for (UnsignedLong i = 0; i < dimension; i++)292 { 293 for (UnsignedLong j = 0; j < dimension; j++)290 getCovariance(); 291 for (UnsignedLong i = 0; i < dimension; ++i) 292 { 293 for (UnsignedLong j = 0; j < dimension; ++j) 294 294 { 295 295 importanceFactors_[i] += inputCovariance_(i, j) * gradientAtMean_(j, 0); … … 298 298 } 299 299 importanceFactors_.setDescription(limitStateVariable_.getImplementation()->getAntecedent()->getDescription()); 300 301 300 isAlreadyComputedImportanceFactors_ = true; 302 301 } // QuadraticCumul::computeImportanceFactors() … … 323 322 /* developped formula */ 324 323 325 UnsignedLong rowDimension(hessianAtMean_.getNbRows());324 const UnsignedLong rowDimension(hessianAtMean_.getNbRows()); 326 325 /* i */ 327 UnsignedLong sheetDimension(hessianAtMean_.getNbSheets());326 const UnsignedLong sheetDimension(hessianAtMean_.getNbSheets()); 328 327 /* k */ 329 328 meanSecondOrder_ = valueAtMean_; 330 329 /* loop on k */ 331 for (UnsignedLong k = 0; k < sheetDimension; k++)330 for (UnsignedLong k = 0; k < sheetDimension; ++k) 332 331 { 333 332 NumericalScalar kSecondOrderContribution(0.0); 334 333 /* loop on i */ 335 for (UnsignedLong i = 0; i < rowDimension; i++)334 for (UnsignedLong i = 0; i < rowDimension; ++i) 336 335 { 337 336 kSecondOrderContribution += 0.5 * inputCovariance_(i, i) * hessianAtMean_(i, i, k); 338 337 /* loop on j */ 339 for (UnsignedLong j = 0; j < i; j++)338 for (UnsignedLong j = 0; j < i; ++j) 340 339 { 341 340 kSecondOrderContribution += inputCovariance_(i, j) * hessianAtMean_(i, j, k); branches/lebrun/devel/lib/src/Uncertainty/Algorithm/QuadraticCumul/QuadraticCumul.hxx
r867 r983 104 104 105 105 /** importance factors accessor */ 106 NumericalPoint getImportanceFactors();106 NumericalPointWithDescription getImportanceFactors(); 107 107 108 108 /** ImportanceFactors graph */ branches/lebrun/devel/lib/src/Uncertainty/Distribution/ComposedDistribution.cxx
r975 r983 616 616 parameters[index] = marginalParameters[j]; 617 617 description[index] = OSS() << marginalName << "_" << marginalDescription[j]; 618 index++;618 ++index; 619 619 } 620 620 } … … 633 633 IsoProbabilisticTransformation right(p_rightFunction, p_rightGradient, p_rightHessian); 634 634 right.setParameters(parameters); 635 636 635 IsoProbabilisticTransformation transformation(isoprobabilistic, right); 637 636 … … 664 663 parameters[index] = marginalParameters[j]; 665 664 description[index] = OSS() << marginalName << "_" << marginalDescription[j]; 666 index++;665 ++index; 667 666 } 668 667 } … … 700 699 const Description description(getDescription()); 701 700 // First put the marginal parameters 702 for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; marginalIndex++)701 for (UnsignedLong marginalIndex = 0; marginalIndex < dimension; ++marginalIndex) 703 702 { 704 703 // Each marginal distribution must output a collection of parameters of size 1, even if it contains an empty NumericalPoint 705 704 const NumericalPointWithDescriptionCollection marginalParameters(distributionCollection_[marginalIndex].getParametersCollection()); 706 NumericalPoint point(marginalParameters[0]);705 NumericalPointWithDescription point(marginalParameters[0]); 707 706 point.setName(description[marginalIndex]); 708 707 parameters[marginalIndex] = point; … … 713 712 // Second put the dependence parameters 714 713 const NumericalPointWithDescriptionCollection copulaParameters(copula_.getParametersCollection()); 715 NumericalPoint point(0);714 NumericalPointWithDescription point(0); 716 715 if (copulaParameters.getSize() != 0) 717 716 { branches/lebrun/devel/lib/src/Uncertainty/Distribution/Epanechnikov.cxx
r924 r983 166 166 Epanechnikov::NumericalPointWithDescriptionCollection Epanechnikov::getParametersCollection() const 167 167 { 168 // No parameter 168 169 return NumericalPointWithDescriptionCollection(0); 169 170 } branches/lebrun/devel/lib/src/Uncertainty/Distribution/ExtraFunc/DistFunc.cxx
r924 r983 25 25 */ 26 26 #include <iostream> 27 #include <cstdio> 28 #include <cstdlib> 27 29 #include <cmath> 28 30 #include "DistFunc.hxx" … … 267 269 } // End of rGamma 268 270 271 /*********************************************/ 272 /* Kolmogorov distribution */ 273 /*********************************************/ 274 static double K(int n, double d); 275 static void m_multiply(double *A, double *B, double *C, int m); 276 static void m_power(double *A, int eA, double *V, int *eV, int m, int n); 277 static double 278 K(int n, double d) 279 { 280 /* Compute Kolmogorov's distribution. 281 Code published in 282 George Marsaglia and Wai Wan Tsang and Jingbo Wang (2003), 283 "Evaluating Kolmogorov's distribution". 284 Journal of Statistical Software, Volume 8, 2003, Issue 18. 285 URL: http://www.jstatsoft.org/v08/i18/. 286 */ 287 288 int k, m, i, j, g, eH, eQ; 289 double h, s, *H, *Q; 290 291 k = (int) (n * d) + 1; 292 m = 2 * k - 1; 293 h = k - n * d; 294 H = (double*) calloc(m * m, sizeof(double)); 295 Q = (double*) calloc(m * m, sizeof(double)); 296 for(i = 0; i < m; i++) 297 for(j = 0; j < m; j++) 298 if(i - j + 1 < 0) 299 H[i * m + j] = 0; 300 else 301 H[i * m + j] = 1; 302 for(i = 0; i < m; i++) { 303 H[i * m] -= pow(h, i + 1); 304 H[(m - 1) * m + i] -= pow(h, (m - i)); 305 } 306 H[(m - 1) * m] += ((2 * h - 1 > 0) ? pow(2 * h - 1, m) : 0); 307 for(i = 0; i < m; i++) 308 for(j=0; j < m; j++) 309 if(i - j + 1 > 0) 310 for(g = 1; g <= i - j + 1; g++) 311 H[i * m + j] /= g; 312 eH = 0; 313 m_power(H, eH, Q, &eQ, m, n); 314 s = Q[(k - 1) * m + k - 1]; 315 for(i = 1; i <= n; i++) { 316 s = s * i / n; 317 if(s < 1e-140) { 318 s *= 1e140; 319 eQ -= 140; 320 } 321 } 322 s *= pow(10., eQ); 323 free(H); 324 free(Q); 325 return(s); 326 } 327 328 static void 329 m_multiply(double *A, double *B, double *C, int m) 330 { 331 /* Auxiliary routine used by K(). 332 Matrix multiplication. 333 */ 334 int i, j, k; 335 double s; 336 for(i = 0; i < m; i++) 337 for(j = 0; j < m; j++) { 338 s = 0.; 339 for(k = 0; k < m; k++) 340 s+= A[i * m + k] * B[k * m + j]; 341 C[i * m + j] = s; 342 } 343 } 344 345 static void 346 m_power(double *A, int eA, double *V, int *eV, int m, int n) 347 { 348 /* Auxiliary routine used by K(). 349 Matrix power. 350 */ 351 double *B; 352 int eB , i; 353 354 if(n == 1) { 355 for(i = 0; i < m * m; i++) 356 V[i] = A[i]; 357 *eV = eA; 358 return; 359 } 360 m_power(A, eA, V, eV, m, n / 2); 361 B = (double*) calloc(m * m, sizeof(double)); 362 m_multiply(V, V, B, m); 363 eB = 2 * (*eV); 364 if((n % 2) == 0) { 365 for(i = 0; i < m * m; i++) 366 V[i] = B[i]; 367 *eV = eB; 368 } 369 else { 370 m_multiply(A, B, V, m); 371 *eV = eA + eB; 372 } 373 if(V[(m / 2) * m + (m / 2)] > 1e140) { 374 for(i = 0; i < m * m; i++) 375 V[i] = V[i] * 1e-140; 376 *eV += 140; 377 } 378 free(B); 379 } 380 NumericalScalar DistFunc::pKolmogorov(const UnsignedLong n, const NumericalScalar x, const Bool tail) 381 { 382 // If x <= 0, we are at the left of the support 383 if (x <= 0.0) return (tail ? 1.0 : 0.0); 384 // If x >= 1, we are at the right of the support 385 if (x >= 1.0) return (tail ? 0.0 : 1.0); 386 // // We use the summation formula of R. Von Mises 387 // const UnsignedLong kmax(floor(n * (1.0 - x))); 388 // NumericalScalar sum(pow(1.0 - x, n) / x); 389 // NumericalScalar logBinomial(log(n)); 390 // for (UnsignedLong k = 1; k <= kmax; ++k) 391 // { 392 // const NumericalScalar term(x + k / static_cast<NumericalScalar>(n)); 393 // sum += exp(logBinomial + (k - 1) * log(term) + (n - k) * log(1.0 - term)); 394 // logBinomial += log(n - k) - log (k + 1); 395 // } 396 // NumericalScalar result((tail ? 2.0 * x * sum : 1.0 - 2.0 * x * sum)); 397 NumericalScalar result2((tail ? 1.0 - K(n, x) : K(n, x))); 398 return result2; 399 } 400 401 NumericalScalar DistFunc::pKolmogorovAsymptotic(const UnsignedLong n, const NumericalScalar x, const Bool tail) 402 { 403 // If x <= 0, we are at the left of the support
