///|
pub(all) enum RiskRatio {
Finite(Double)
Undefined
Unbounded
}
///|
pub(all) struct EventImportance {
event : Int32
forced_failed : Double
forced_working : Double
birnbaum : Double
fussell_vesely_dif : RiskRatio
raw : RiskRatio
rrw : RiskRatio
}
///|
fn risk_ratio(numerator : Double, denominator : Double) -> RiskRatio {
if denominator == 0.0 {
if numerator == 0.0 {
Undefined
} else {
Unbounded
}
} else {
let ratio = numerator / denominator
if ratio - ratio != 0.0 {
Unbounded
} else {
Finite(ratio)
}
}
}
///|
/// FV uses SCRAM's diagnosis importance convention P(event AND top)/P(top).
/// The two forced probabilities are interventions, including at input p=0 or p=1.
pub fn FaultGraph::event_importance(
self : FaultGraph,
probabilities : Array[Double],
) -> Array[EventImportance] raise GraphError {
let baseline = self.probability(probabilities)
let scenario = probabilities.copy()
let result : Array[EventImportance] = []
for event in 0..