Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -17,54 +17,8 @@ def validate_inputs(A, B, C, AB, AC, BC, ABC, U):
|
|
17 |
errors.append("El conjunto universal U es menor que la suma total de los conjuntos y sus intersecciones.")
|
18 |
return errors
|
19 |
|
20 |
-
def suggest_intersections(A, B, C, AB, AC, BC, ABC, U):
|
21 |
-
max_AB = min(A, B, U - (A + B + C - AB - AC - BC + ABC))
|
22 |
-
max_AC = min(A, C, U - (A + B + C - AB - AC - BC + ABC))
|
23 |
-
max_BC = min(B, C, U - (A + B + C - AB - AC - BC + ABC))
|
24 |
-
max_ABC = min(max_AB, max_AC, max_BC)
|
25 |
-
|
26 |
-
min_AB = max(0, A + B - U + C)
|
27 |
-
min_AC = max(0, A + C - U + B)
|
28 |
-
min_BC = max(0, B + C - U + A)
|
29 |
-
min_ABC = max(0, A + B + C - U)
|
30 |
-
|
31 |
-
max_A = U - (B + C - BC)
|
32 |
-
max_B = U - (A + C - AC)
|
33 |
-
max_C = U - (A + B - AB)
|
34 |
-
min_A = max(AB + AC - ABC, 0)
|
35 |
-
min_B = max(AB + BC - ABC, 0)
|
36 |
-
min_C = max(AC + BC - ABC, 0)
|
37 |
-
|
38 |
-
suggestions = {
|
39 |
-
"Máximo valor sugerido para A": max_A,
|
40 |
-
"Mínimo valor sugerido para A": min_A,
|
41 |
-
"Máximo valor sugerido para B": max_B,
|
42 |
-
"Mínimo valor sugerido para B": min_B,
|
43 |
-
"Máximo valor sugerido para C": max_C,
|
44 |
-
"Mínimo valor sugerido para C": min_C,
|
45 |
-
"Máximo valor sugerido para A ∩ B": max_AB,
|
46 |
-
"Mínimo valor sugerido para A ∩ B": min_AB,
|
47 |
-
"Máximo valor sugerido para A ∩ C": max_AC,
|
48 |
-
"Mínimo valor sugerido para A ∩ C": min_AC,
|
49 |
-
"Máximo valor sugerido para B ∩ C": max_BC,
|
50 |
-
"Mínimo valor sugerido para B ∩ C": min_BC,
|
51 |
-
"Máximo valor sugerido para A ∩ B ∩ C": max_ABC,
|
52 |
-
"Mínimo valor sugerido para A ∩ B ∩ C": min_ABC,
|
53 |
-
}
|
54 |
-
return suggestions
|
55 |
-
|
56 |
def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
|
57 |
total = U
|
58 |
-
if total == 0:
|
59 |
-
return {
|
60 |
-
"P(A)": 0,
|
61 |
-
"P(B)": 0,
|
62 |
-
"P(C)": 0,
|
63 |
-
"P(A ∩ B)": 0,
|
64 |
-
"P(A ∩ C)": 0,
|
65 |
-
"P(B ∩ C)": 0,
|
66 |
-
"P(A ∩ B ∩ C)": 0,
|
67 |
-
}
|
68 |
|
69 |
P_A = A / total
|
70 |
P_B = B / total
|
@@ -74,7 +28,6 @@ def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
|
|
74 |
P_BC = BC / total
|
75 |
P_ABC = ABC / total
|
76 |
|
77 |
-
# Probabilidades condicionales
|
78 |
P_A_given_B = P_AB / P_B if P_B > 0 else 0
|
79 |
P_B_given_A = P_AB / P_A if P_A > 0 else 0
|
80 |
P_A_given_C = P_AC / P_C if P_C > 0 else 0
|
@@ -82,7 +35,6 @@ def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
|
|
82 |
P_B_given_C = P_BC / P_C if P_C > 0 else 0
|
83 |
P_C_given_B = P_BC / P_B if P_B > 0 else 0
|
84 |
|
85 |
-
# Teorema de Bayes
|
86 |
P_B_given_A_bayes = (P_A_given_B * P_B) / P_A if P_A > 0 else 0
|
87 |
|
88 |
formatted_probs = {
|
@@ -107,12 +59,11 @@ def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
|
|
107 |
def plot_venn(A, B, C, AB, AC, BC, ABC, U):
|
108 |
plt.figure(figsize=(8, 8))
|
109 |
|
110 |
-
# Dibujar el conjunto universal
|
111 |
ax = plt.gca()
|
112 |
ax.add_patch(Rectangle((0, 0), 1, 1, fill=None, edgecolor='black', linewidth=2))
|
113 |
-
ax.set_xlim(-0.1, 1.1)
|
114 |
-
ax.set_ylim(-0.1, 1.1)
|
115 |
|
|
|
116 |
subsets = {
|
117 |
'100': A - AB - AC + ABC,
|
118 |
'010': B - AB - BC + ABC,
|
@@ -123,6 +74,13 @@ def plot_venn(A, B, C, AB, AC, BC, ABC, U):
|
|
123 |
'111': ABC
|
124 |
}
|
125 |
venn = venn3(subsets=subsets, set_labels=('A', 'B', 'C'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
plt.title(f"Diagrama de Venn con U = {U}")
|
127 |
|
128 |
buf = BytesIO()
|
@@ -131,18 +89,50 @@ def plot_venn(A, B, C, AB, AC, BC, ABC, U):
|
|
131 |
img = Image.open(buf)
|
132 |
return img
|
133 |
|
134 |
-
def
|
135 |
-
|
136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
errors = validate_inputs(A, B, C, AB, AC, BC, ABC, U)
|
139 |
-
suggestions = suggest_intersections(A, B, C, AB, AC, BC, ABC, U)
|
140 |
if errors:
|
141 |
-
return None, {"error": "\n".join(errors), "sugerencias":
|
142 |
|
143 |
venn_diagram = plot_venn(A, B, C, AB, AC, BC, ABC, U)
|
144 |
probabilities = calculate_probabilities(A, B, C, AB, AC, BC, ABC, U)
|
145 |
-
return venn_diagram, {"probabilidades": probabilities, "sugerencias":
|
146 |
|
147 |
iface = gr.Interface(
|
148 |
fn=main,
|
|
|
17 |
errors.append("El conjunto universal U es menor que la suma total de los conjuntos y sus intersecciones.")
|
18 |
return errors
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
def calculate_probabilities(A, B, C, AB, AC, BC, ABC, U):
|
21 |
total = U
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
P_A = A / total
|
24 |
P_B = B / total
|
|
|
28 |
P_BC = BC / total
|
29 |
P_ABC = ABC / total
|
30 |
|
|
|
31 |
P_A_given_B = P_AB / P_B if P_B > 0 else 0
|
32 |
P_B_given_A = P_AB / P_A if P_A > 0 else 0
|
33 |
P_A_given_C = P_AC / P_C if P_C > 0 else 0
|
|
|
35 |
P_B_given_C = P_BC / P_C if P_C > 0 else 0
|
36 |
P_C_given_B = P_BC / P_B if P_B > 0 else 0
|
37 |
|
|
|
38 |
P_B_given_A_bayes = (P_A_given_B * P_B) / P_A if P_A > 0 else 0
|
39 |
|
40 |
formatted_probs = {
|
|
|
59 |
def plot_venn(A, B, C, AB, AC, BC, ABC, U):
|
60 |
plt.figure(figsize=(8, 8))
|
61 |
|
62 |
+
# Dibujar el conjunto universal como un rectángulo
|
63 |
ax = plt.gca()
|
64 |
ax.add_patch(Rectangle((0, 0), 1, 1, fill=None, edgecolor='black', linewidth=2))
|
|
|
|
|
65 |
|
66 |
+
# Dibujar el diagrama de Venn
|
67 |
subsets = {
|
68 |
'100': A - AB - AC + ABC,
|
69 |
'010': B - AB - BC + ABC,
|
|
|
74 |
'111': ABC
|
75 |
}
|
76 |
venn = venn3(subsets=subsets, set_labels=('A', 'B', 'C'))
|
77 |
+
|
78 |
+
# Mostrar la cantidad fuera de A, B y C si no coincide con U
|
79 |
+
suma_subconjuntos = A + B + C - AB - AC - BC + ABC
|
80 |
+
if U > suma_subconjuntos:
|
81 |
+
faltante = U - suma_subconjuntos
|
82 |
+
plt.text(0.5, 0.9, f"Fuera de A, B y C: {faltante}", horizontalalignment='center', fontsize=12, bbox=dict(facecolor='white', alpha=0.5))
|
83 |
+
|
84 |
plt.title(f"Diagrama de Venn con U = {U}")
|
85 |
|
86 |
buf = BytesIO()
|
|
|
89 |
img = Image.open(buf)
|
90 |
return img
|
91 |
|
92 |
+
def suggest_intersections(A, B, C, AB, AC, BC, ABC, U):
|
93 |
+
max_AB = min(A, B, U - (A + B + C - AB - AC - BC + ABC))
|
94 |
+
max_AC = min(A, C, U - (A + B + C - AB - AC - BC + ABC))
|
95 |
+
max_BC = min(B, C, U - (A + B + C - AB - AC - BC + ABC))
|
96 |
+
max_ABC = min(max_AB, max_AC, max_BC)
|
97 |
+
|
98 |
+
min_AB = max(0, A + B - U + C)
|
99 |
+
min_AC = max(0, A + C - U + B)
|
100 |
+
min_BC = max(0, B + C - U + A)
|
101 |
+
min_ABC = max(0, A + B + C - U)
|
102 |
+
|
103 |
+
max_A = U - (B + C - BC)
|
104 |
+
max_B = U - (A + C - AC)
|
105 |
+
max_C = U - (A + B - AB)
|
106 |
+
min_A = max(AB + AC - ABC, 0)
|
107 |
+
min_B = max(AB + BC - ABC, 0)
|
108 |
+
min_C = max(AC + BC - ABC, 0)
|
109 |
|
110 |
+
suggestions = {
|
111 |
+
"Máximo valor sugerido para A": max_A,
|
112 |
+
"Mínimo valor sugerido para A": min_A,
|
113 |
+
"Máximo valor sugerido para B": max_B,
|
114 |
+
"Mínimo valor sugerido para B": min_B,
|
115 |
+
"Máximo valor sugerido para C": max_C,
|
116 |
+
"Mínimo valor sugerido para C": min_C,
|
117 |
+
"Máximo valor sugerido para A ∩ B": max_AB,
|
118 |
+
"Mínimo valor sugerido para A ∩ B": min_AB,
|
119 |
+
"Máximo valor sugerido para A ∩ C": max_AC,
|
120 |
+
"Mínimo valor sugerido para A ∩ C": min_AC,
|
121 |
+
"Máximo valor sugerido para B ∩ C": max_BC,
|
122 |
+
"Mínimo valor sugerido para B ∩ C": min_BC,
|
123 |
+
"Máximo valor sugerido para A ∩ B ∩ C": max_ABC,
|
124 |
+
"Mínimo valor sugerido para A ∩ B ∩ C": min_ABC,
|
125 |
+
}
|
126 |
+
return suggestions
|
127 |
+
|
128 |
+
def main(A, B, C, AB, AC, BC, ABC, U):
|
129 |
errors = validate_inputs(A, B, C, AB, AC, BC, ABC, U)
|
|
|
130 |
if errors:
|
131 |
+
return None, {"error": "\n".join(errors), "sugerencias": suggest_intersections(A, B, C, AB, AC, BC, ABC, U)}
|
132 |
|
133 |
venn_diagram = plot_venn(A, B, C, AB, AC, BC, ABC, U)
|
134 |
probabilities = calculate_probabilities(A, B, C, AB, AC, BC, ABC, U)
|
135 |
+
return venn_diagram, {"probabilidades": probabilities, "sugerencias": suggest_intersections(A, B, C, AB, AC, BC, ABC, U)}
|
136 |
|
137 |
iface = gr.Interface(
|
138 |
fn=main,
|