import pytest from decimal import Decimal from src.contribution_util import prod, system_availability, get_all_components, birnbaum_importance def test_prod(): assert prod([1, 2, 3]) == 6.0 assert prod([0.5, 0.5]) == 0.25 assert prod([]) == 1.0 def test_system_availability_series(): structure = {"series": ["A", "B"]} availabilities = {"A": 0.9, "B": 0.8} # 0.9 * 0.8 = 0.72 assert system_availability(structure, availabilities) == pytest.approx(0.72) def test_system_availability_parallel(): structure = {"parallel": ["A", "B"]} availabilities = {"A": 0.9, "B": 0.8} # 1 - (1-0.9)*(1-0.8) = 1 - 0.1*0.2 = 1 - 0.02 = 0.98 assert system_availability(structure, availabilities) == pytest.approx(0.98) def test_system_availability_nested(): # (A in series with (B in parallel with C)) structure = { "series": [ "A", {"parallel": ["B", "C"]} ] } availabilities = {"A": 0.9, "B": 0.8, "C": 0.7} # B||C = 1 - (1-0.8)*(1-0.7) = 1 - 0.2*0.3 = 0.94 # A && (B||C) = 0.9 * 0.94 = 0.846 assert system_availability(structure, availabilities) == pytest.approx(0.846) def test_get_all_components(): structure = { "series": [ "A", {"parallel": ["B", "C"]} ] } assert get_all_components(structure) == {"A", "B", "C"} def test_birnbaum_importance(): structure = {"series": ["A", "B"]} availabilities = {"A": 0.9, "B": 0.8} # I_B(A) = A_sys(A=1) - A_sys(A=0) # A_sys(A=1, B=0.8) = 1 * 0.8 = 0.8 # A_sys(A=0, B=0.8) = 0 * 0.8 = 0 # I_B(A) = 0.8 assert birnbaum_importance(structure, availabilities, "A") == pytest.approx(0.8) # I_B(B) = A_sys(B=1, A=0.9) - A_sys(B=0, A=0.9) = 0.9 - 0 = 0.9 assert birnbaum_importance(structure, availabilities, "B") == pytest.approx(0.9)