- Fixed a bug which caused the LHS technique to fail when the number samples is large (>1E8).
Fortuna.jl
package now can solve reliability problems defined using Tcl-basedOpenSees
andAbaqus
software. A simple example with a cantilever beam can be found inexamples/OpenSees
andexample/Abaqus
. A detailed description of the general procedure is described in the documentation.- A lot of optional keyword arguments are switched to lowercase to conform to the community standards. Most notably,
Differentiation
keyword insolve()
is changed todiff
to conform to community standards. The possible arguments are:automatic
and:numeric
. solve()
function invoked withAnalysisMethod
of typeSORM
now accepts a new optionalFORMSolution
keyword argument, which can be used to pass an existing solution of a reliability problem obtained using FORM, significantly speeding up the SORM.- Fixed a problem with SORM prematurely erroring out if Hohenbichler-Rackwitz and/or Breitung conditions are not satisfied.
solve()
function invoked withAnalysisMethod
of typeMC
andIS
now accepts a new optionalshowprogressbar
keyword argument, which can be used to track the progress of the progress in real time. Is in it nice?!- Small code optimizations here and there.
- Implementation of FORM's gradient-based descent optimization submethods is now more standardized and follows a better code-implementation practice.
- Before, if FORM failed converge, it would throw an error stating that the solution did not converge and give no other output. Now, if FORM fails to converge to a satisfactory solution, it will throw a warning stating that the solution did not converge and provide the solution cache history to help diagnose the problem. Additionally, a new
Convergance
field was added to cache histories of HLRF, iHLRF, and RF methods, which can be used to check whether the convergence was achieved.
Solution = solve(Problem, FORM())
if Solution.Convergance == true
# Solution converged...
# Proceed with the post-processing...
else
# Solution did not converge...
# Diagnose the problem and try to solve again...
end
- Relaxed default tolerances in FORM's submethods from
$10^{-9}$ to$10^{-6}$ .
- Added functionality to solve inverse reliability problems.
- Added an option to choose a desired FORM's submethod for SORM.
- Fixed a bug with the iHLRF method stalling in very specific cases.
- Added precompilation of the source code for performance purposes.
- Added more examples with FEM solvers and generally clean up the documentation.
- Added fallback onto numerical differentiation for non-linear problem solver. Fixes a problem with Rackwitz-Fiessler and Point-Fitting methods stalling if a non-differentiable limit state function is encountered.
- Limit state functions can now be given by OpenSeesPy models directly in Julia! This is made possible by using the
PyCall.jl
andConda.jl
packages that allow to bring Python functionality into Julia. - If
ForwardDiff.jl
package fails to compute gradients, jacobians, etc., thenFortuna.jl
package will attempt to useFiniteDiff.jl
package before erroring out. This fixes a problem of differentiating some functions outside ofFortuna.jl
package that are implemented in specific precisions which are not compatible withDual()
numbers. - A new
Differentiation
keyword was added tosolve()
function to indicate the desired differentiation scheme:Differentiation
=:Automatic
, then the function will use automatic differentiation (ForwardDiff.jl
) to compute gradients, jacobians, etc.Differentiation
=:Numeric
, then the function will use numeric differentiation (FiniteDiff.jl
) to compute gradients, jacobians, etc.- Important to note that if your limit state function is given by an OpenSeesPy model, solving the reliability problem with
Differentiation
=:Automatic
will not fail because of the fallback ontoFiniteDiff.jl
package; however, it is highly recommended to useDifferentiation
=:Numeric
from the start to avoid even attempting to use automatic differentiation before falling back onto numeric differentiation.
- Sampling technique for
rand()
function now must be given by symbols, i.e.:ITS
or:LHS
.
Dual()
number can now be propagated as moments of random variables.- Fixed a bug with
randomvariables()
function. - Transformation direction for
transformsamples()
andgetjacobian()
functions now must be given by symbols, i.e.:X2U
or:U2X
, which seems to be a more acceptable way of defining keyword arguments in Julia. - Added proper error handling and optimized some parts of the code.
- Added Frechet distribution.
- Added functionality to perform sensitivity analysis w.r.t. to parameters of distributions involved in the reliability problem. To avoid confusion with sensitivity analysis w.r.t. to parameters of limit state function, the following categorization of sensitivity problems was employed:
SensitivityProblemTypeI
: Sensitivities w.r.t. the parameters of the limit state function.SensitivityProblemTypeII
: Sensitivities w.r.t. the parameters of the random vector.
- Cleaned up the documentation.
- Added more examples to the documentation and cleaned up a few bugs.
- Added functionality to solve reliability problems using Rackwitz-Fiessler (RF) method.
- The internals of the module were completely reworked to use
import
instead ofusing
for most of the dependencies to avoid pollution of the global variable scope of the module and improve its performance. The code was also completely reorganized to allow for easier contributions from other people in the future. - The following function and types were completely reworked:
-
generaterv()
is replaced withrandomvariable()
. -
samplerv()
is replaced by extendingrand()
fromDistributions.jl
package. -
jointpdf()
is replaced by extendingpdf()
fromDistributions.jl
package. -
analyze()
is replaced withsolve()
. -
MCS()
is replated withMC()
. Consequently,MCSCache()
is replaced withMCCache()
.
-
-
rand()
method is now completely compatible withRandom.jl
andDistributions.jl
packages, i.e. you can now generate reproducible sequence of numbers if RNG seed is provided. -
pdf()
method is now completely compatible withDistributions.jl
package. - HLRF and iHLRF methods can now be started from any arbitrary point
$x_{0}$ .
solve(Problem, FORM( HLRF(x₀ = [150, 275])))
solve(Problem, FORM(iHLRF(x₀ = [150, 275])))
- Added functionality to solve reliability problems with extremely small probabilities of failure using the Importance Sampling method.
ISSolution = solve(Problem, IS())
-
Updated the Subset Simulation Method. It is now slightly faster and more tested.
-
Isoprobabilistic transformation objects (
NatafTransformation
andRosenblattTransformation
) are now broadcastable.
pdf.(TransformationObject, x)
- Documentation is updated to include all possible functionality.
- Added functionality to perform sensitivity analysis.
- Sped up the calculations of the importance vector
$\gamma$ .
- Added measure of importance of random variables
$\gamma$ to FORM. Note that the importance vector$\gamma$ is only available if the reliability analysis was carried out using HLRF or iHLRF methods.
# Plain Hasofer-Lind-Rackwitz-Fiessler method:
FORMSolution = analyze(Problem, FORM(HLRF()))
FORMSolution.γ
# Improved Hasofer-Lind-Rackwitz-Fiessler method:
FORMSolution = analyze(Problem, FORM(iHLRF()))
FORMSolution.γ
- Added functionality to probabilities of failure by means of Monte Carlo Simulations.
MCSSolution = analyze(Problem, MCS())
- Added Point-Fitting method that falls within a broader class of the Second-Order Reliability Methods (SORM).
SORMSolution = analyze(Problem, SORM(PF()))
- Added an option to sample random variables with correlated marginal random variables
$\vec{X}$ using any implemented sampling technique. Note that your choice of the sampling technique pertains to the sampling technique that is used to generate samples in the space of uncorrelated standard normal random variables$\vec{U}$ . The generated samples are then transformed from$\vec{U}$ - to$\vec{X}$ -space according to transformation you use to define a random vector with correlated marginal random variables$\vec{X}$ , i.e., either Nataf or Rosennblatt (not yet implemented) transformation.
XSamples, ZSamples, USamples = samplerv(TransformationObject, 1000, ITS())
XSamples, ZSamples, USamples = samplerv(TransformationObject, 1000, LHS())
- Updated the documentation.
- Added Dependabot to automatically take care of GitHub Actions' versions.
- Accelerate the Subset Simulation Method.
SSMSolution = analyze(Problem, SSM())
- Added the Subset Simulation Method to compute probabilities of rare failure events.
- General housekeeping and bug hunting.
- Added a simple documentation describing the basic functionality of the package.
Fortuna.jl
package now reexportsDistributions.jl
package. This allows to access basic functions, likemean()
,std()
,params()
, etc., without loadingDistributions.jl
package separately.
- Removed
println()
statement fromsamplerv()
function that was left there by accident.
- Fixed the generalized reliability index calculation in the SORM.
- Added error-catching for the SORM's probability of failure approximations.
- Added Curve-Fitting method that falls within a broader class of the Second-Order Reliability Methods (SORM).
- Added cache output system for analysis results for easier work in the future. You can now access a lot of iterative data related to the reliability analysis, such as the value of the limit state function, its gradient, merit function, and more at each iteration.
FORMSolution = analyze(Problem, FORM())
SORMSolution = analyze(Problem, SORM())
- Benchmarked FORM, SORM, and Nataf Transformation functionalities against various sources. The sources for the benchmarks are indicated.
- Added support for Weibull distribution.
- Sampling function
samplerv()
now uses nativerand()
andrandn()
functions from theRandom
package to perform ITS and LHS sampling. SamplingTechnique
argument's options insamplerv()
function have been changed from strings ("ITS"
,"LHS"
) to their own types (ITS()
,LHS()
).- Added
analyze()
function that replacesMCFOSM()
andFORM()
functions. The deprecated functionsMCFOSM()
andFORM()
are nowAnalysisMethod
argument's options inanalyze()
function with their own types. For example, to perform reliability analysis using FORM use the following syntax:
β = analyze(Problem, FORM(MCFOSM()))
β, x, u = analyze(Problem, FORM(HLRF()))
β, x, u = analyze(Problem, FORM(iHLRF()))
- Initial release of
Fortuna.jl
.