-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreliability.py
107 lines (88 loc) · 3.32 KB
/
reliability.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Copyright © 2020 Aleksandr Kolbasov
"""
Позволяет вычислять вероятность безотказной работы соединённых узлов
"""
class Node:
"""Узел в цепи"""
@classmethod
def list(cls, *probabilities: float) -> list:
"""
Возвращает list из Nodes с заданными вероятностями
"""
return list(cls(
node[1], str(node[0])
) for node in enumerate(probabilities))
@classmethod
def parallel(cls, *probabilities: float):
"""
Соединить узлы параллельно в единый блок
:param probabilities: Вероятность безотказной работы присоединяемого узла
:return: Единый блок
"""
nodes = cls.list(*probabilities)
final_node = cls(0)
for node in nodes:
final_node |= node
return final_node
@classmethod
def serial(cls, *probabilities: float):
"""
Соединить узлы последовательно в единый блок
:param probabilities: Вероятность безотказной работы присоединяемого узла
:return: Единый блок
"""
nodes = cls.list(*probabilities)
final_node = cls(1)
for node in nodes:
final_node &= node
return final_node
@property
def p(self) -> float:
"""Вероятность безотказной работы"""
return self._p
@p.setter
def p(self, probability: float):
"""Вероятность безотказной работы"""
assert 0 <= probability <= 1
self._p = probability
@property
def q(self):
"""Вероятность отказа"""
return 1 - self.p
@q.setter
def q(self, probability):
"""Вероятность отказа"""
self.p = 1 - probability
def __init__(self, p: float, name: str = ''):
"""
Узел в цепи
:param p: Вероятность безотказной работы
:param name: Имя узла
"""
if p is None:
raise Exception("Не задана вероятность")
p = float(p)
if 0 <= p <= 1:
self.p = p
self.name = str(name)
else:
raise Exception("Неверная вероятность")
def __add__(self, other):
"""Параллельное соединение"""
return self | other
def __mul__(self, other):
"""Последовательное соединение"""
return self & other
def __or__(self, other):
"""Параллельное соединение"""
q = self.q * other.q
return self.__class__(1 - q)
def __and__(self, other):
"""Последовательное соединение"""
p = self.p * other.p
return self.__class__(p)
def __str__(self):
return "P{name} = {p}".format(p=self.p, name="({})".format(self.name) if self.name != '' else '')
def __float__(self):
"""Вероятность безотказной работы узла"""
return self.p