hedtorresca commited on
Commit
451e5be
·
verified ·
1 Parent(s): 9d96355

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -57
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 main(A, B, C, AB, AC, BC, ABC, U):
135
- if U == 0:
136
- U = A + B + C
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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": suggestions}
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": suggestions}
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,