File size: 3,398 Bytes
ce05002
 
2baf94a
ce04ad4
2273894
ce05002
90bcf50
2baf94a
90bcf50
2baf94a
 
5f704da
 
e5d5105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
695fe89
e5d5105
 
 
 
9c6afa0
2baf94a
e5d5105
 
 
 
 
 
 
 
 
 
695fe89
2baf94a
e5d5105
 
 
 
 
 
9c6afa0
695fe89
 
 
451e5be
f04f86a
402c271
 
 
9c6afa0
 
451e5be
695fe89
9c6afa0
695fe89
9c6afa0
695fe89
9c6afa0
695fe89
9c6afa0
451e5be
 
 
 
f04f86a
 
9c6afa0
f04f86a
9c6afa0
f04f86a
9c6afa0
f04f86a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
108
import gradio as gr
import matplotlib.pyplot as plt
from matplotlib_venn import venn3
from io import BytesIO
from PIL import Image

def validate_inputs(A, B, C, AB, AC, BC, ABC, U):
    total_needed = A + B + C - AB - AC - BC + ABC
    errors = []
    if total_needed > U:
        errors.append("El conjunto universal U debe ser mayor o igual a la suma de los subconjuntos y sus intersecciones.")
    return errors

def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
    total = U
    P_A = A / total
    P_B = B / total
    P_C = C / total
    P_AB = AB / total
    P_AC = AC / total
    P_BC = BC / total
    P_ABC = ABC / total

    formatted_probs = {
        "P(A)": f"{P_A:.2%} ({A}/{total})",
        "P(B)": f"{P_B:.2%} ({B}/{total})",
        "P(C)": f"{P_C:.2%} ({C}/{total})",
        "P(A ∩ B)": f"{P_AB:.2%} ({AB}/{total})",
        "P(A ∩ C)": f"{P_AC:.2%} ({AC}/{total})",
        "P(B ∩ C)": f"{P_BC:.2%} ({BC}/{total})",
        "P(A ∩ B ∩ C)": f"{P_ABC:.2%} ({ABC}/{total})"
    }
    
    return formatted_probs

def plot_venn(A, B, C, AB, AC, BC, ABC):
    plt.figure(figsize=(8, 8))
    subsets = {
        '100': A - AB - AC + ABC,
        '010': B - AB - BC + ABC,
        '001': C - AC - BC + ABC,
        '110': AB - ABC,
        '101': AC - ABC,
        '011': BC - ABC,
        '111': ABC
    }
    venn = venn3(subsets=subsets, set_labels=('A', 'B', 'C'))
    plt.title(f"Diagrama de Venn")

    buf = BytesIO()
    plt.savefig(buf, format='png')
    buf.seek(0)
    img = Image.open(buf)
    return img

def suggest_intersections(A, B, C, AB, AC, BC, ABC):
    max_AB = min(A, B)
    max_AC = min(A, C)
    max_BC = min(B, C)
    max_ABC = min(max_AB, max_AC, max_BC)

    min_AB = max(0, AB)
    min_AC = max(0, AC)
    min_BC = max(0, BC)
    min_ABC = max(0, ABC)

    suggestions = {
        "Máximo valor sugerido para A ∩ B": max_AB,
        "Mínimo valor sugerido para A ∩ B": min_AB,
        "Máximo valor sugerido para A ∩ C": max_AC,
        "Mínimo valor sugerido para A ∩ C": min_AC,
        "Máximo valor sugerido para B ∩ C": max_BC,
        "Mínimo valor sugerido para B ∩ C": min_BC,
        "Máximo valor sugerido para A ∩ B ∩ C": max_ABC,
        "Mínimo valor sugerido para A ∩ B ∩ C": min_ABC,
    }
    return suggestions

def main(A, B, C, AB, AC, BC, ABC, U):
    errors = validate_inputs(A, B, C, AB, AC, BC, ABC, U)
    if errors:
        return None, {"error": "\n".join(errors), "sugerencias": suggest_intersections(A, B, C, AB, AC, BC, ABC)}
    
    venn_diagram = plot_venn(A, B, C, AB, AC, BC, ABC)
    probabilities = calculate_probabilities(A, B, C, AB, AC, BC, ABC, U)
    return venn_diagram, {"probabilidades": probabilities, "sugerencias": suggest_intersections(A, B, C, AB, AC, BC, ABC)}

iface = gr.Interface(
    fn=main,
    inputs=[
        gr.Number(label="Conjunto Universal (U)", value=0),
        gr.Number(label="Cantidad en A"),
        gr.Number(label="Cantidad en B"),
        gr.Number(label="Cantidad en C"),
        gr.Number(label="Cantidad en A ∩ B"),
        gr.Number(label="Cantidad en A ∩ C"),
        gr.Number(label="Cantidad en B ∩ C"),
        gr.Number(label="Cantidad en A ∩ B ∩ C")
    ],
    outputs=[
        gr.Image(type="pil", label="Diagrama de Venn"),
        gr.JSON(label="Resultados y Sugerencias")
    ],
    live=True
)

iface.launch()