Skip to content

RePyability

Reliability engineering tools for Python.

RePyability is the computational reliability engine for building and analysing systems as Reliability Block Diagrams (RBDs). It consumes already-fitted lifetime models (from surpyval or any equivalent that exposes sf/ff) as node inputs and computes system reliability, availability, importance measures, and more.

Scope notes:

  • Fitting lives in surpyval, not here. RePyability consumes fitted models; fit your failure data in surpyval and pass the models in.
  • Visualisation lives in the Reliafy app, not here. RePyability returns numbers and typed result objects; plotting/dashboards are a separate layer.

Install

pip install repyability

Quickstart

System reliability over time

import surpyval as surv
from repyability import NonRepairableRBD

# Two pumps in parallel feeding a valve in series:
#   start -> (pump1 | pump2) -> valve -> end
edges = [
    ("start", "pump1"), ("start", "pump2"),
    ("pump1", "valve"), ("pump2", "valve"),
    ("valve", "end"),
]
reliabilities = {
    "pump1": surv.Weibull.from_params([100, 2]),
    "pump2": surv.Weibull.from_params([100, 2]),
    "valve": surv.Weibull.from_params([200, 1.5]),
}
rbd = NonRepairableRBD(edges, reliabilities)

rbd.sf(50)                       # system reliability at t=50   -> 0.839...
rbd.ff([50, 100])                # system unreliability at t=50, 100 (array)
rbd.mean_time_to_failure(seed=0) # MTTF via Monte-Carlo (seed for reproducibility)
rbd.birnbaum_importance(50)      # per-node Birnbaum importance at t=50

Minimal path and cut sets are available too:

rbd.get_min_path_sets(include_in_out_nodes=False)
rbd.get_min_cut_sets()

You can force nodes working or failed to explore conditional behaviour:

rbd.sf(50, working_nodes=["pump1"])   # reliability given pump1 is perfect
rbd.sf(50, broken_nodes=["valve"])    # reliability given valve has failed (-> 0)

Repairable systems: availability

For repairable systems, give each component a reliability and a repairability (time-to-repair) distribution and simulate availability:

import surpyval as surv
from repyability import RepairableRBD

components = {
    "A": {
        "reliability": surv.Exponential.from_params([0.1]),
        "repairability": surv.Exponential.from_params([1.0]),
    },
    "B": {
        "reliability": surv.Exponential.from_params([0.2]),
        "repairability": surv.Exponential.from_params([1.0]),
    },
}
rbd = RepairableRBD([("s", "A"), ("s", "B"), ("A", "t"), ("B", "t")], components)

result = rbd.availability(t_simulation=100.0, N=10_000, seed=0)

result.availability          # mean availability at each event time
result.timeline              # the event times
result.criticalities.iou.up  # intersection-over-union importance (system up)

availability() returns a typed AvailabilityResult — see the user guide and API reference.

Long-run (steady-state) availability has a closed form and needs no simulation:

rbd.mean_availability()

Where to next

  • Tutorial — a start-to-finish worked example: model a system, find its weak link, and read its remaining life from live state.
  • User guide — building RBDs, reliability, importance measures, forcing nodes, condition-based evaluation, and availability results.
  • Concepts — the theory: path/cut sets, choosing an importance measure, and how conditioning works.
  • API reference — every public class and method.