import numpy as np
from itertools import product
t=720.
lam=np.array([2e-5,1e-5,3e-5]) # veronderstelde h^-1, geen FIT-data
r=np.exp(-lam*t)
serie=np.prod(r)
sensor=np.exp(-1e-5*t)
parallel=1-(1-sensor)**2
lc=2e-6; li=8e-6
gemeen=np.exp(-lc*t)*(1-(1-np.exp(-li*t))**2)
print("component R",np.round(r,8))
print("serie",round(serie,8),"sensorpaar onafhankelijk",round(parallel,8))
print("sensorpaar gemeenschappelijke oorzaak",round(gemeen,8))
# Foutenboom T=(A of B) en C, drie onafhankelijke basisevents.
q=[.002,.001,.0005]
exact=0.
for a,b,c in product((0,1),repeat=3):
    kans=np.prod([p if e else 1-p for p,e in zip(q,(a,b,c))])
    if (a or b) and c: exact+=kans
qc=.0001
print("foutenboom onafhankelijk",exact,"metgemeen",qc+(1-qc)*exact)
# Monte Carlo controle van het kansmodel, geen componentproef.
rng=np.random.default_rng(46); n=200000
leven=rng.exponential(1/lam,(n,3))
mc=np.mean(np.all(leven>t,axis=1))
se=np.sqrt(mc*(1-mc)/n)
print("MC serie",round(mc,6),"standaardfout",round(se,6))
totale_uren=400000; falen=8
mtbf=totale_uren/falen; mdt=2.
print("model MTBF",mtbf,"h beschikbaarheid",mtbf/(mtbf+mdt))
# Nul falen: eenzijdige95%-bovengrens bij constant faalproces.
duur=1000.
lambda95=-np.log(.05)/duur
print("nulfaalproef1000h lambda95",lambda95,"ondergrensMTBF",1/lambda95)
